changeset 3960:5293d4bbb1ea

Merged dev into stable/default/master branch
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 07 Jun 2013 00:31:11 +0200
parents 51596d9ef2f8 (current diff) e1a0fdaecf63 (diff)
children 60900e877b31
files .hgignore CONTRIBUTORS README.rst development.ini docs/api/api.rst docs/changelog.rst docs/setup.rst docs/usage/general.rst production.ini rhodecode/__init__.py rhodecode/config/deployment.ini_tmpl rhodecode/config/environment.py rhodecode/config/routing.py rhodecode/controllers/admin/admin.py rhodecode/controllers/admin/ldap_settings.py rhodecode/controllers/admin/permissions.py rhodecode/controllers/admin/repos.py rhodecode/controllers/admin/settings.py rhodecode/controllers/admin/users.py rhodecode/controllers/api/api.py rhodecode/controllers/branches.py rhodecode/controllers/changelog.py rhodecode/controllers/changeset.py rhodecode/controllers/error.py rhodecode/controllers/feed.py rhodecode/controllers/files.py rhodecode/controllers/forks.py rhodecode/controllers/home.py rhodecode/controllers/journal.py rhodecode/controllers/login.py rhodecode/controllers/pullrequests.py rhodecode/controllers/search.py rhodecode/controllers/shortlog.py rhodecode/controllers/summary.py rhodecode/controllers/tags.py rhodecode/i18n/rhodecode.pot rhodecode/lib/__init__.py rhodecode/lib/auth.py rhodecode/lib/base.py rhodecode/lib/db_manage.py rhodecode/lib/dbmigrate/schema/db_1_6_0.py rhodecode/lib/exceptions.py rhodecode/lib/helpers.py rhodecode/lib/hooks.py rhodecode/lib/indexers/__init__.py rhodecode/lib/indexers/daemon.py rhodecode/lib/middleware/https_fixup.py rhodecode/lib/middleware/simplegit.py rhodecode/lib/middleware/simplehg.py rhodecode/lib/paster_commands/cleanup.py rhodecode/lib/subprocessio.py rhodecode/lib/utils.py rhodecode/lib/utils2.py rhodecode/lib/vcs/nodes.py rhodecode/model/__init__.py rhodecode/model/db.py rhodecode/model/forms.py rhodecode/model/permission.py rhodecode/model/repo.py rhodecode/model/repos_group.py rhodecode/model/scm.py rhodecode/model/user.py rhodecode/model/validators.py rhodecode/public/css/style.css rhodecode/templates/admin/permissions/permissions.html rhodecode/templates/admin/repos/repo_edit.html rhodecode/templates/admin/repos/repos.html rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html rhodecode/templates/admin/settings/settings.html rhodecode/templates/admin/users/user_edit.html rhodecode/templates/admin/users/user_edit_my_account.html rhodecode/templates/base/base.html rhodecode/templates/changelog/changelog.html rhodecode/templates/changeset/changeset.html rhodecode/templates/changeset/changeset_range.html rhodecode/templates/errors/error_document.html rhodecode/templates/journal/journal.html rhodecode/templates/shortlog/shortlog.html rhodecode/templates/shortlog/shortlog_data.html rhodecode/templates/summary/summary.html rhodecode/tests/__init__.py rhodecode/tests/functional/test_changelog.py rhodecode/tests/functional/test_shortlog.py rhodecode/tests/functional/test_summary.py rhodecode/tests/models/test_repos_groups.py rhodecode/tests/scripts/test_vcs_operations.py rhodecode/tests/test_libs.py rhodecode/tests/test_validators.py rhodecode/tests/vcs/test_repository.py rhodecode/tests/vcs_test_git.tar.gz rhodecode/tests/vcs_test_hg.tar.gz setup.cfg setup.py test.ini
diffstat 250 files changed, 25750 insertions(+), 12893 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Mon May 20 12:26:09 2013 +0200
+++ b/.hgignore	Fri Jun 07 00:31:11 2013 +0200
@@ -12,6 +12,7 @@
 ^docs/build/
 ^docs/_build/
 ^data$
+^sql_dumps/
 ^\.settings$
 ^\.project$
 ^\.pydevproject$
@@ -22,3 +23,4 @@
 ^rc.*\.ini$
 ^fabfile.py
 ^\.rhodecode$
+^\.idea$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.tx/config	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,15 @@
+[main]
+host = https://www.transifex.com
+
+[RhodeCode.pot]
+source_file = rhodecode/i18n/rhodecode.pot
+source_lang = en
+
+trans.pl    = rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po
+trans.ru    = rhodecode/i18n/ru/LC_MESSAGES/rhodecode.po
+trans.fr    = rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po
+trans.ja    = rhodecode/i18n/ja/LC_MESSAGES/rhodecode.po
+trans.pt_BR = rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po
+trans.zh_CN = rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po
+trans.zh_TW = rhodecode/i18n/zh_TW/LC_MESSAGES/rhodecode.po
+type = PO
--- a/CONTRIBUTORS	Mon May 20 12:26:09 2013 +0200
+++ b/CONTRIBUTORS	Fri Jun 07 00:31:11 2013 +0200
@@ -34,3 +34,5 @@
     Mads Kiilerich <madski@unity3d.com>
     Dan Sheridan <djs@adelard.com>
     Dennis Brakhane <brakhane@googlemail.com>
+    Simon Lopez <simon.lopez@slopez.org>
+
--- a/README.rst	Mon May 20 12:26:09 2013 +0200
+++ b/README.rst	Fri Jun 07 00:31:11 2013 +0200
@@ -74,10 +74,12 @@
   Proven to work with 1000s of repositories and users
 - Supports http/https, LDAP, AD, proxy-pass authentication.
 - Full permissions (private/read/write/admin) together with IP restrictions for each repository,
-  additional explicit forking and repository creation permissions.
-- User groups for easier permission management
-- Repository groups let you group repos and manage them easier.
+  additional explicit forking, repositories group and repository creation permissions.
+- User groups for easier permission management.
+- Repository groups let you group repos and manage them easier. They come with
+  permission delegation features, so you can delegate groups management.
 - Users can fork other users repos, and compare them at any time.
+- Built in Gist functionality for sharing code snippets.
 - Integrates easily with other systems, with custom created mappers you can connect it to almost
   any issue tracker, and with an JSON-RPC API you can make much more
 - Build in commit-api let's you add, edit and commit files right from RhodeCode
@@ -118,7 +120,6 @@
 - Simple issue tracker
 - SSH based authentication with server side key management
 - Commit based built in wiki system
-- Gist server
 - More statistics and graph (global annotation + some more statistics)
 - Other advancements as development continues (or you can of course make
   additions and or requests)
--- a/development.ini	Mon May 20 12:26:09 2013 +0200
+++ b/development.ini	Fri Jun 07 00:31:11 2013 +0200
@@ -29,24 +29,38 @@
 #smtp_auth = 
 
 [server:main]
-## PASTE
-## nr of threads to spawn
+## PASTE ##
+#use = egg:Paste#http
+## nr of worker threads to spawn
 #threadpool_workers = 5
-
 ## max request before thread respawn
 #threadpool_max_requests = 10
-
 ## option to use threads of process
 #use_threadpool = true
 
-#use = egg:Paste#http
-
-## WAITRESS
+## WAITRESS ##
+use = egg:waitress#main
+## number of worker threads
 threads = 5
-## 100GB
+## MAX BODY SIZE 100GB
 max_request_body_size = 107374182400
-use = egg:waitress#main
+## use poll instead of select, fixes fd limits, may not work on old
+## windows systems.
+#asyncore_use_poll = True
 
+## GUNICORN ##
+#use = egg:gunicorn#main
+## number of process workers. You must set `instance_id = *` when this option
+## is set to more than one worker
+#workers = 1
+## process name
+#proc_name = rhodecode
+## type of worker class, one of sync, eventlet, gevent, tornado
+## recommended for bigger setup is using of of other than sync one
+#worker_class = sync
+#max_requests = 5
+
+## COMMON ##
 host = 0.0.0.0
 port = 5000
 
@@ -68,6 +82,10 @@
 cache_dir = %(here)s/data
 index_dir = %(here)s/data/index
 
+## perform a full repository scan on each server start, this should be
+## set to false after first startup, to allow faster server restarts.
+initial_repo_scan = true
+
 ## uncomment and set this path to use archive download cache
 #archive_cache_dir = /tmp/tarballcache
 
@@ -89,9 +107,6 @@
 ## number of commits stats will parse on each iteration
 commit_parse_limit = 25
 
-## number of items displayed in lightweight dashboard before paginating is shown
-dashboard_items = 100
-
 ## use gravatar service to display avatars
 use_gravatar = true
 
@@ -111,6 +126,18 @@
 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.rhodecode.org/{gistid}. Empty means use the internal
+## RhodeCode url, ie. http[s]://rhodecode.server/_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
+## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
+api_access_controllers_whitelist =
 
 ## alternative_gravatar_url allows you to use your own avatar server application
 ## the following parts of the URL will be replaced
@@ -186,6 +213,7 @@
 ## codes don't break the transactions while 4XX codes do
 lock_ret_code = 423
 
+allow_repo_location_change = True
 
 ####################################
 ###        CELERY CONFIG        ####
--- a/docs/api/api.rst	Mon May 20 12:26:09 2013 +0200
+++ b/docs/api/api.rst	Fri Jun 07 00:31:11 2013 +0200
@@ -16,9 +16,24 @@
 API access can also be turned on for each web view in RhodeCode that is
 decorated with `@LoginRequired` decorator. To enable API access simple change
 the standard login decorator to `@LoginRequired(api_access=True)`.
+
+To make this operation easier, starting from version 1.7.0 there's a white list
+of views that will have API access enabled. Simply edit `api_access_controllers_whitelist`
+option in your .ini file, and define views that should have API access enabled.
+Following example shows how to enable API access to patch/diff raw file and archive
+in RhodeCode::
+
+    api_access_controllers_whitelist =
+        ChangesetController:changeset_patch,
+        ChangesetController:changeset_raw,
+        FilesController:raw,
+        FilesController:archivefile
+
+
 After this change, a rhodecode view can be accessed without login by adding a
 GET parameter `?api_key=<api_key>` to url. By default this is only
-enabled on RSS/ATOM feed views.
+enabled on RSS/ATOM feed views. Exposing raw diffs is a good way to integrate with
+3rd party services like code review, or build farms that could download archives.
 
 
 API ACCESS
@@ -171,7 +186,7 @@
 OUTPUT::
 
     id : <id_given_in_input>
-    result : "Cache for repository `<reponame>` was invalidated: invalidated cache keys: <list_of_cache_keys>"
+    result : "Caches of repository `<reponame>`"
     error :  null
 
 lock
@@ -197,7 +212,13 @@
 OUTPUT::
 
     id : <id_given_in_input>
-    result : "User `<username>` set lock state for repo `<reponame>` to `true|false`"
+    result : {
+                 "repo": "<reponame>",
+                 "locked": "<bool true|false>",
+                 "locked_since": "<float lock_time>",
+                 "locked_by": "<username>",
+                 "msg": "User `<username>` set lock state for repo `<reponame>` to `<false|true>`"
+             }
     error :  null
 
 
@@ -302,6 +323,7 @@
     result: [
               {
                 "user_id" :     "<user_id>",
+                "api_key" :     "<api_key>",
                 "username" :    "<username>",
                 "firstname":    "<firstname>",
                 "lastname" :    "<lastname>",
@@ -333,7 +355,7 @@
     args :    {
                 "username" :  "<username>",
                 "email" :     "<useremail>",
-                "password" :  "<password>",
+                "password" :  "<password = Optional(None)>",
                 "firstname" : "<firstname> = Optional(None)",
                 "lastname" :  "<lastname> = Optional(None)",
                 "active" :    "<bool> = Optional(True)",
@@ -393,6 +415,7 @@
               "msg" : "updated user ID:<userid> <username>",
               "user": {
                 "user_id" :  "<user_id>",
+                "api_key" :  "<api_key>",
                 "username" : "<username>",
                 "firstname": "<firstname>",
                 "lastname" : "<lastname>",
@@ -461,6 +484,7 @@
                "members" :  [
                               {
                                 "user_id" :  "<user_id>",
+                                "api_key" :  "<api_key>",
                                 "username" : "<username>",
                                 "firstname": "<firstname>",
                                 "lastname" : "<lastname>",
@@ -518,8 +542,9 @@
     api_key : "<api_key>"
     method :  "create_users_group"
     args:     {
-                "group_name":  "<groupname>",
-                "active":"<bool> = Optional(True)"
+                "group_name": "<groupname>",
+                "owner" :     "<onwer_name_or_id = Optional(=apiuser)>",
+                "active":     "<bool> = Optional(True)"
               }
 
 OUTPUT::
@@ -642,6 +667,7 @@
                                   {
                                     "type":        "user",
                                     "user_id" :    "<user_id>",
+                                    "api_key" :    "<api_key>",
                                     "username" :   "<username>",
                                     "firstname":   "<firstname>",
                                     "lastname" :   "<lastname>",
@@ -667,6 +693,7 @@
                                   {
                                     "user_id" :     "<user_id>",
                                     "username" :    "<username>",
+                                    "api_key" :     "<api_key>",
                                     "firstname":    "<firstname>",
                                     "lastname" :    "<lastname>",
                                     "email" :       "<email>",
--- a/docs/changelog.rst	Mon May 20 12:26:09 2013 +0200
+++ b/docs/changelog.rst	Fri Jun 07 00:31:11 2013 +0200
@@ -4,6 +4,45 @@
 Changelog
 =========
 
+1.7.0 (**2013-05-XX**)
+----------------------
+
+news
+++++
+
+- Manage User’s Groups(teams): create, delete, rename, add/remove users inside.
+  by delegated user group admins.
+- Implemented simple Gist functionality.
+- External authentication got special flag to controll user activation.
+- Created whitelist for API access. Each view can now be accessed by api_key
+  if added to whitelist.
+- Added dedicated file history page.
+- Added compare option into bookmarks
+- Improved diff display for binary files and renames.
+- Archive downloading are now stored in main action journal.
+- Switch gravatar to always use ssl.
+- Implements #842 RhodeCode version disclosure.
+- Allow underscore to be the optionally first character of username.
+
+fixes
++++++
+
+- #818: Bookmarks Do Not Display on Changeset View.
+- Fixed default permissions population during upgrades.
+- Fixed overwrite default user group permission flag.
+- Fixed issue with h.person() function returned prematurly giving only email
+  info from changeset metadata.
+- get_changeset uses now mercurial revrange to filter out branches.
+  Switch to branch it's around 20% faster this way.
+- Fixed some issues with paginators on chrome.
+- Forbid changing of repository type.
+- Adde missing permission checks in list of forks in repository settings.
+- Fixes #834 hooks error on remote pulling.
+- Fixes issues #849. Web Commits functionality failed for non-ascii files.
+- Fixed #850. Whoosh indexer should use the default revision when doing index.
+- Fixed #851 and #563 make-index crashes on non-ascii files.
+- Fixes #852, flash messages had issies with non-ascii messages
+
 1.6.0 (**2013-05-12**)
 ----------------------
 
@@ -20,7 +59,7 @@
   permissions when doing upgrades
 - Fixed some unicode problems with git file path
 - Fixed broken handling of adding an htsts headers.
-- Fixed redirection loop on changelog for empty repository 
+- Fixed redirection loop on changelog for empty repository
 - Fixed issue with web-editor that didn't preserve executable bit
   after editing files
 
@@ -29,7 +68,7 @@
 
 news
 ++++
- 
+
  - Redesign UI, with lots of small improvements.
  - Group management delegation. Group admin can manage a group, and repos
    under it, admin can create child groups inside group he manages.
@@ -57,7 +96,7 @@
  - Linaro's ldap sync scripts.
  - #797 git refs filter is now configurable via .ini file.
  - New ishell paster command for easier administrative tasks.
- 
+
 fixes
 +++++
 
@@ -68,8 +107,8 @@
  - #731 update-repoinfo sometimes failed to update data when changesets were
    initial commits.
  - #749,#805 and #516 Removed duplication of repo settings for rhodecode admins
-   and repo admins. 
- - Global permission update with "overwrite existing settings" shouldn't 
+   and repo admins.
+ - Global permission update with "overwrite existing settings" shouldn't
    override private repositories.
  - #642 added recursion limit for stats gathering.
  - #739 Delete/Edit repositories should only point to admin links if the user
@@ -99,7 +138,7 @@
  - Automatically assign instance_id for host and process if it has been set to *
  - Fixed multiple IP addresses in each of extracted IP.
  - Lot of other small bug fixes and improvements.
-  
+
 1.5.4 (**2013-03-13**)
 ----------------------
 
--- a/docs/setup.rst	Mon May 20 12:26:09 2013 +0200
+++ b/docs/setup.rst	Fri Jun 07 00:31:11 2013 +0200
@@ -196,6 +196,13 @@
  Last Name Attribute  = lastName
  E-mail Attribute     = mail
 
+If your user groups are placed in a Organisation Unit (OU) structure the Search Settings configuration differs::
+
+ Search settings
+ Base DN              = DC=host,DC=example,DC=org
+ LDAP Filter          = (&(memberOf=CN=your user group,OU=subunit,OU=unit,DC=host,DC=example,DC=org)(objectClass=user))
+ LDAP Search Scope    = SUBTREE
+
 .. _enable_ldap:
 
 Enable LDAP : required
@@ -444,11 +451,11 @@
 messages and replace that with an url to this issue. To enable this simply
 uncomment following variables in the ini file::
 
-    url_pat = (?:^#|\s#)(\w+)
+    issue_pat = (?:^#|\s#)(\w+)
     issue_server_link = https://myissueserver.com/{repo}/issue/{id}
     issue_prefix = #
 
-`url_pat` is the regular expression that will fetch issues from commit messages.
+`issue_pat` is the regular expression that will fetch issues from commit messages.
 Default regex will match issues in format of #<number> eg. #300.
 
 Matched issues will be replace with the link specified as `issue_server_link`
@@ -527,6 +534,27 @@
         #server 127.0.0.1:5002;
     }
 
+    ## gist alias
+    server {
+       listen          443;
+       server_name     gist.myserver.com;
+       access_log      /var/log/nginx/gist.access.log;
+       error_log       /var/log/nginx/gist.error.log;
+
+       ssl on;
+       ssl_certificate     gist.rhodecode.myserver.com.crt;
+       ssl_certificate_key gist.rhodecode.myserver.com.key;
+
+       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://rhodecode.myserver.com/_admin/gists/$1;
+       rewrite (.*)    https://rhodecode.myserver.com/_admin/gists;
+    }
+
     server {
        listen          443;
        server_name     rhodecode.myserver.com;
@@ -543,25 +571,16 @@
        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;
 
-       # uncomment if you have nginx with chunking module compiled
-       # fixes the issues of having to put postBuffer data for large git
-       # pushes
-       #chunkin on;
-       #error_page 411 = @my_411_error;
-       #location @my_411_error {
-       #    chunkin_resume;
-       #}
-
-       # uncomment if you want to serve static files by nginx
+       ## uncomment root directive if you want to serve static files by nginx
+       ## requires static_files = false in .ini file
        #root /path/to/installation/rhodecode/public;
-
+       include         /etc/nginx/proxy.conf;
        location / {
             try_files $uri @rhode;
        }
 
        location @rhode {
             proxy_pass      http://rc;
-            include         /etc/nginx/proxy.conf;
        }
 
     }
@@ -576,25 +595,14 @@
     proxy_set_header            X-Real-IP $remote_addr;
     proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header            Proxy-host $proxy_host;
-    client_max_body_size        400m;
-    client_body_buffer_size     128k;
     proxy_buffering             off;
     proxy_connect_timeout       7200;
     proxy_send_timeout          7200;
     proxy_read_timeout          7200;
     proxy_buffers               8 32k;
-
-Also, when using root path with nginx you might set the static files to false
-in the production.ini file::
-
-    [app:main]
-      use = egg:rhodecode
-      full_stack = true
-      static_files = false
-      lang=en
-      cache_dir = %(here)s/data
-
-In order to not have the statics served by the application. This improves speed.
+    client_max_body_size        1024m;
+    client_body_buffer_size     128k;
+    large_client_header_buffers 8 64k;
 
 
 Apache virtual host reverse proxy example
--- a/docs/usage/general.rst	Mon May 20 12:26:09 2013 +0200
+++ b/docs/usage/general.rst	Fri Jun 07 00:31:11 2013 +0200
@@ -113,3 +113,54 @@
 using given credentials. Please take a note that they will be stored as
 plaintext inside the database. RhodeCode will remove auth info when showing the
 clone url in summary page.
+
+
+
+Visual settings in admin pannel
+-------------------------------
+
+
+Visualisation settings in RhodeCode settings view are extra customizations
+of server behavior. There are 3 main section in the settings.
+
+General
+~~~~~~~
+
+`Use repository extra fields` option allows to set a custom fields for each
+repository in the system. Each new field consists of 3 attributes `field key`,
+`field label`, `field description`. Example usage of such fields would be to
+define company specific information into repositories eg. defining repo_manager
+key that would add give info about a manager of each repository. There's no
+limit for adding custom fields. Newly created fields are accessible via API.
+
+`Show RhodeCode version` option toggles displaying exact RhodeCode version in
+the footer
+
+
+Dashboard items
+~~~~~~~~~~~~~~~
+
+Number if items in main page dashboard before pagination is displayed
+
+
+Icons
+~~~~~
+
+Show public repo icon / Show private repo icon on repositories - defines if
+public/private icons should be shown in the UI.
+
+
+Meta-Tagging
+~~~~~~~~~~~~
+
+With this option enabled, special metatags that are recognisible by RhodeCode
+will be turned into colored tags. Currently available tags are::
+
+    [featured]
+    [stale]
+    [dead]
+    [lang => lang]
+    [license => License]
+    [requires => Repo]
+    [recommends => Repo]
+    [see => URI]
--- a/production.ini	Mon May 20 12:26:09 2013 +0200
+++ b/production.ini	Fri Jun 07 00:31:11 2013 +0200
@@ -29,26 +29,40 @@
 #smtp_auth = 
 
 [server:main]
-## PASTE
-## nr of threads to spawn
+## PASTE ##
+#use = egg:Paste#http
+## nr of worker threads to spawn
 #threadpool_workers = 5
-
 ## max request before thread respawn
 #threadpool_max_requests = 10
-
 ## option to use threads of process
 #use_threadpool = true
 
-#use = egg:Paste#http
-
-## WAITRESS
+## WAITRESS ##
+use = egg:waitress#main
+## number of worker threads
 threads = 5
-## 100GB
+## MAX BODY SIZE 100GB
 max_request_body_size = 107374182400
-use = egg:waitress#main
+## use poll instead of select, fixes fd limits, may not work on old
+## windows systems.
+#asyncore_use_poll = True
 
+## GUNICORN ##
+#use = egg:gunicorn#main
+## number of process workers. You must set `instance_id = *` when this option
+## is set to more than one worker
+#workers = 1
+## process name
+#proc_name = rhodecode
+## type of worker class, one of sync, eventlet, gevent, tornado
+## recommended for bigger setup is using of of other than sync one
+#worker_class = sync
+#max_requests = 5
+
+## COMMON ##
 host = 127.0.0.1
-port = 8001
+port = 5000
 
 ## prefix middleware for rc
 #[filter:proxy-prefix]
@@ -68,6 +82,10 @@
 cache_dir = %(here)s/data
 index_dir = %(here)s/data/index
 
+## perform a full repository scan on each server start, this should be
+## set to false after first startup, to allow faster server restarts.
+initial_repo_scan = true
+
 ## uncomment and set this path to use archive download cache
 #archive_cache_dir = /tmp/tarballcache
 
@@ -89,9 +107,6 @@
 ## number of commits stats will parse on each iteration
 commit_parse_limit = 25
 
-## number of items displayed in lightweight dashboard before paginating is shown
-dashboard_items = 100
-
 ## use gravatar service to display avatars
 use_gravatar = true
 
@@ -111,6 +126,18 @@
 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.rhodecode.org/{gistid}. Empty means use the internal
+## RhodeCode url, ie. http[s]://rhodecode.server/_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
+## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
+api_access_controllers_whitelist =
 
 ## alternative_gravatar_url allows you to use your own avatar server application
 ## the following parts of the URL will be replaced
@@ -186,6 +213,7 @@
 ## codes don't break the transactions while 4XX codes do
 lock_ret_code = 423
 
+allow_repo_location_change = True
 
 ####################################
 ###        CELERY CONFIG        ####
--- a/rhodecode/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -26,32 +26,7 @@
 import sys
 import platform
 
-VERSION = (1, 6, 1)
-
-try:
-    from rhodecode.lib import get_current_revision
-    _rev = get_current_revision(quiet=True)
-    if _rev and len(VERSION) > 3:
-        VERSION += ('dev%s' % _rev[0],)
-except ImportError:
-    pass
-
-__version__ = ('.'.join((str(each) for each in VERSION[:3])) +
-               '.'.join(VERSION[3:]))
-__dbversion__ = 11  # defines current db version for migrations
-__platform__ = platform.system()
-__license__ = 'GPLv3'
-__py_version__ = sys.version_info
-__author__ = 'Marcin Kuzminski'
-__url__ = 'http://rhodecode.org'
-
-PLATFORM_WIN = ('Windows')
-PLATFORM_OTHERS = ('Linux', 'Darwin', 'FreeBSD', 'OpenBSD', 'SunOS') #depracated
-
-is_windows = __platform__ in PLATFORM_WIN
-is_unix = not is_windows
-
-
+VERSION = (1, 7, 0)
 BACKENDS = {
     'hg': 'Mercurial repository',
     'git': 'Git repository',
@@ -65,3 +40,23 @@
 
 # Linked module for extensions
 EXTENSIONS = {}
+
+try:
+    from rhodecode.lib import get_current_revision
+    _rev = get_current_revision(quiet=True)
+    if _rev and len(VERSION) > 3:
+        VERSION += ('%s' % _rev[0],)
+except ImportError:
+    pass
+
+__version__ = ('.'.join((str(each) for each in VERSION[:3])) +
+               '.'.join(VERSION[3:]))
+__dbversion__ = 13  # defines current db version for migrations
+__platform__ = platform.system()
+__license__ = 'GPLv3'
+__py_version__ = sys.version_info
+__author__ = 'Marcin Kuzminski'
+__url__ = 'http://rhodecode.org'
+
+is_windows = __platform__ in ['Windows']
+is_unix = not is_windows
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/bin/base.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,145 @@
+"""
+Base utils for shell scripts
+"""
+import os
+import sys
+import random
+import urllib2
+import pprint
+
+try:
+    from rhodecode.lib.ext_json import json
+except ImportError:
+    try:
+        import simplejson as json
+    except ImportError:
+        import json
+
+CONFIG_NAME = '.rhodecode'
+FORMAT_PRETTY = 'pretty'
+FORMAT_JSON = 'json'
+
+
+def api_call(apikey, apihost, method=None, **kw):
+    """
+    Api_call wrapper for RhodeCode.
+
+    :param apikey:
+    :param apihost:
+    :param format: formatting, pretty means prints and pprint of json
+     json returns unparsed json
+    :param method:
+    :returns: json response from server
+    """
+    def _build_data(random_id):
+        """
+        Builds API data with given random ID
+
+        :param random_id:
+        """
+        return {
+            "id": random_id,
+            "api_key": apikey,
+            "method": method,
+            "args": kw
+        }
+
+    if not method:
+        raise Exception('please specify method name !')
+
+    id_ = random.randrange(1, 9999)
+    req = urllib2.Request('%s/_admin/api' % apihost,
+                      data=json.dumps(_build_data(id_)),
+                      headers={'content-type': 'text/plain'})
+    ret = urllib2.urlopen(req)
+    raw_json = ret.read()
+    json_data = json.loads(raw_json)
+    id_ret = json_data['id']
+    if id_ret == id_:
+        return json_data
+
+    else:
+        _formatted_json = pprint.pformat(json_data)
+        raise Exception('something went wrong. '
+                        'ID mismatch got %s, expected %s | %s' % (
+                                            id_ret, id_, _formatted_json))
+
+
+class RcConf(object):
+    """
+    RhodeCode config for API
+
+    conf = RcConf()
+    conf['key']
+
+    """
+
+    def __init__(self, config_location=None, autoload=True, autocreate=False,
+                 config=None):
+        HOME = os.getenv('HOME', os.getenv('USERPROFILE')) or ''
+        HOME_CONF = os.path.abspath(os.path.join(HOME, CONFIG_NAME))
+        self._conf_name = HOME_CONF if not config_location else config_location
+        self._conf = {}
+        if autocreate:
+            self.make_config(config)
+        if autoload:
+            self._conf = self.load_config()
+
+    def __getitem__(self, key):
+        return self._conf[key]
+
+    def __nonzero__(self):
+        if self._conf:
+            return True
+        return False
+
+    def __eq__(self):
+        return self._conf.__eq__()
+
+    def __repr__(self):
+        return 'RcConf<%s>' % self._conf.__repr__()
+
+    def make_config(self, config):
+        """
+        Saves given config as a JSON dump in the _conf_name location
+
+        :param config:
+        """
+        update = False
+        if os.path.exists(self._conf_name):
+            update = True
+        with open(self._conf_name, 'wb') as f:
+            json.dump(config, f, indent=4)
+
+        if update:
+            sys.stdout.write('Updated config in %s\n' % self._conf_name)
+        else:
+            sys.stdout.write('Created new config in %s\n' % self._conf_name)
+
+    def update_config(self, new_config):
+        """
+        Reads the JSON config updates it's values with new_config and
+        saves it back as JSON dump
+
+        :param new_config:
+        """
+        config = {}
+        try:
+            with open(self._conf_name, 'rb') as conf:
+                config = json.load(conf)
+        except IOError, e:
+            sys.stderr.write(str(e) + '\n')
+
+        config.update(new_config)
+        self.make_config(config)
+
+    def load_config(self):
+        """
+        Loads config from file and returns loaded JSON object
+        """
+        try:
+            with open(self._conf_name, 'rb') as conf:
+                return  json.load(conf)
+        except IOError, e:
+            #sys.stderr.write(str(e) + '\n')
+            pass
--- a/rhodecode/bin/ldap_sync.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/bin/ldap_sync.py	Fri Jun 07 00:31:11 2013 +0200
@@ -14,7 +14,14 @@
 import ldap
 import urllib2
 import uuid
-import json
+
+try:
+    from rhodecode.lib.compat import json
+except ImportError:
+    try:
+        import simplejson as json
+    except ImportError:
+        import json
 
 from ConfigParser import ConfigParser
 
@@ -72,7 +79,7 @@
         if uid != response["id"]:
             raise InvalidResponseIDError("UUID does not match.")
 
-        if response["error"] != None:
+        if response["error"] is not None:
             raise RhodecodeResponseError(response["error"])
 
         return response["result"]
--- a/rhodecode/bin/rhodecode_api.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/bin/rhodecode_api.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 """
-    rhodecode.bin.backup_manager
-    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    rhodecode.bin.api
+    ~~~~~~~~~~~~~~~~~
 
     Api CLI client for RhodeCode
 
@@ -24,160 +24,18 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from __future__ import with_statement
-import os
 import sys
-import random
-import urllib2
-import pprint
 import argparse
 
-try:
-    from rhodecode.lib.ext_json import json
-except ImportError:
-    try:
-        import simplejson as json
-    except ImportError:
-        import json
-
-
-CONFIG_NAME = '.rhodecode'
-FORMAT_PRETTY = 'pretty'
-FORMAT_JSON = 'json'
-
-
-class RcConf(object):
-    """
-    RhodeCode config for API
-
-    conf = RcConf()
-    conf['key']
-
-    """
-
-    def __init__(self, config_location=None, autoload=True, autocreate=False,
-                 config=None):
-        self._conf_name = CONFIG_NAME if not config_location else config_location
-        self._conf = {}
-        if autocreate:
-            self.make_config(config)
-        if autoload:
-            self._conf = self.load_config()
-
-    def __getitem__(self, key):
-        return self._conf[key]
-
-    def __nonzero__(self):
-        if self._conf:
-            return True
-        return False
-
-    def __eq__(self):
-        return self._conf.__eq__()
-
-    def __repr__(self):
-        return 'RcConf<%s>' % self._conf.__repr__()
-
-    def make_config(self, config):
-        """
-        Saves given config as a JSON dump in the _conf_name location
-
-        :param config:
-        :type config:
-        """
-        update = False
-        if os.path.exists(self._conf_name):
-            update = True
-        with open(self._conf_name, 'wb') as f:
-            json.dump(config, f, indent=4)
-
-        if update:
-            sys.stdout.write('Updated config in %s\n' % self._conf_name)
-        else:
-            sys.stdout.write('Created new config in %s\n' % self._conf_name)
-
-    def update_config(self, new_config):
-        """
-        Reads the JSON config updates it's values with new_config and
-        saves it back as JSON dump
-
-        :param new_config:
-        """
-        config = {}
-        try:
-            with open(self._conf_name, 'rb') as conf:
-                config = json.load(conf)
-        except IOError, e:
-            sys.stderr.write(str(e) + '\n')
-
-        config.update(new_config)
-        self.make_config(config)
-
-    def load_config(self):
-        """
-        Loads config from file and returns loaded JSON object
-        """
-        try:
-            with open(self._conf_name, 'rb') as conf:
-                return  json.load(conf)
-        except IOError, e:
-            #sys.stderr.write(str(e) + '\n')
-            pass
-
-
-def api_call(apikey, apihost, format, method=None, **kw):
-    """
-    Api_call wrapper for RhodeCode
-
-    :param apikey:
-    :param apihost:
-    :param format: formatting, pretty means prints and pprint of json
-     json returns unparsed json
-    :param method:
-    """
-    def _build_data(random_id):
-        """
-        Builds API data with given random ID
-
-        :param random_id:
-        :type random_id:
-        """
-        return {
-            "id": random_id,
-            "api_key": apikey,
-            "method": method,
-            "args": kw
-        }
-
-    if not method:
-        raise Exception('please specify method name !')
-    id_ = random.randrange(1, 9999)
-    req = urllib2.Request('%s/_admin/api' % apihost,
-                      data=json.dumps(_build_data(id_)),
-                      headers={'content-type': 'text/plain'})
-    if format == FORMAT_PRETTY:
-        sys.stdout.write('calling %s to %s \n' % (req.get_data(), apihost))
-    ret = urllib2.urlopen(req)
-    raw_json = ret.read()
-    json_data = json.loads(raw_json)
-    id_ret = json_data['id']
-    _formatted_json = pprint.pformat(json_data)
-    if id_ret == id_:
-        if format == FORMAT_JSON:
-            sys.stdout.write(str(raw_json))
-        else:
-            sys.stdout.write('rhodecode returned:\n%s\n' % (_formatted_json))
-
-    else:
-        raise Exception('something went wrong. '
-                        'ID mismatch got %s, expected %s | %s' % (
-                                            id_ret, id_, _formatted_json))
+from rhodecode.bin.base import json, api_call, RcConf, FORMAT_JSON, FORMAT_PRETTY
 
 
 def argparser(argv):
     usage = (
-      "rhodecode_api [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
-      " [--config=CONFIG] "
-      "_create_config or METHOD <key:val> <key2:val> ..."
+      "rhodecode-api [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
+      "[--config=CONFIG] [--save-config] "
+      "METHOD <key:val> <key2:val> ...\n"
+      "Create config file: rhodecode-gist --apikey=<key> --apihost=http://rhodecode.server --save-config"
     )
 
     parser = argparse.ArgumentParser(description='RhodeCode API cli',
@@ -188,14 +46,15 @@
     group.add_argument('--apikey', help='api access key')
     group.add_argument('--apihost', help='api host')
     group.add_argument('--config', help='config file')
+    group.add_argument('--save-config', action='store_true', help='save the given config into a file')
 
     group = parser.add_argument_group('API')
-    group.add_argument('method', metavar='METHOD', type=str,
+    group.add_argument('method', metavar='METHOD', nargs='?', type=str, default=None,
             help='API method name to call followed by key:value attributes',
     )
     group.add_argument('--format', dest='format', type=str,
-            help='output format default: `pretty` can '
-                 'be also `%s`' % FORMAT_JSON,
+            help='output format default: `%s` can '
+                 'be also `%s`' % (FORMAT_PRETTY, FORMAT_JSON),
             default=FORMAT_PRETTY
     )
     args, other = parser.parse_known_args()
@@ -207,7 +66,6 @@
     Main execution function for cli
 
     :param argv:
-    :type argv:
     """
     if argv is None:
         argv = sys.argv
@@ -216,12 +74,13 @@
     parser, args, other = argparser(argv)
 
     api_credentials_given = (args.apikey and args.apihost)
-    if args.method == '_create_config':
+    if args.save_config:
         if not api_credentials_given:
-            raise parser.error('_create_config requires --apikey and --apihost')
+            raise parser.error('--save-config requires --apikey and --apihost')
         conf = RcConf(config_location=args.config,
                       autocreate=True, config={'apikey': args.apikey,
                                                'apihost': args.apihost})
+        sys.exit()
 
     if not conf:
         conf = RcConf(config_location=args.config, autoload=True)
@@ -231,18 +90,31 @@
                              '--apikey or --apihost in params')
 
     apikey = args.apikey or conf['apikey']
-    host = args.apihost or conf['apihost']
+    apihost = args.apihost or conf['apihost']
     method = args.method
-    if method == '_create_config':
-        sys.exit()
+
+    # if we don't have method here it's an error
+    if not method:
+        parser.error('Please specify method name')
 
     try:
         margs = dict(map(lambda s: s.split(':', 1), other))
     except Exception:
         sys.stderr.write('Error parsing arguments \n')
         sys.exit()
+    if args.format == FORMAT_PRETTY:
+        print 'Calling method %s => %s' % (method, apihost)
 
-    api_call(apikey, host, args.format, method, **margs)
+    json_resp = api_call(apikey, apihost, method, **margs)
+    if json_resp['error']:
+        json_data = json_resp['error']
+    else:
+        json_data = json_resp['result']
+    if args.format == FORMAT_JSON:
+        print json.dumps(json_data)
+    elif args.format == FORMAT_PRETTY:
+        print 'Server response \n%s' % (
+                json.dumps(json_data, indent=4, sort_keys=True))
     return 0
 
 if __name__ == '__main__':
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/bin/rhodecode_gist.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.bin.gist
+    ~~~~~~~~~~~~~~~~~~
+
+    Gist CLI client for RhodeCode
+
+    :created_on: May 9, 2013
+    :author: marcink
+    :copyright: (C) 2010-2013 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import with_statement
+import os
+import sys
+import stat
+import argparse
+import fileinput
+
+from rhodecode.bin.base import json, api_call, RcConf, FORMAT_JSON, FORMAT_PRETTY
+
+
+def argparser(argv):
+    usage = (
+      "rhodecode-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: rhodecode-gist --apikey=<key> --apihost=http://rhodecode.server --save-config"
+    )
+
+    parser = argparse.ArgumentParser(description='RhodeCode Gist cli',
+                                     usage=usage)
+
+    ## config
+    group = parser.add_argument_group('config')
+    group.add_argument('--apikey', help='api access key')
+    group.add_argument('--apihost', help='api host')
+    group.add_argument('--config', help='config file path DEFAULT: ~/.rhodecode')
+    group.add_argument('--save-config', action='store_true',
+                       help='save the given config into a file')
+
+    group = parser.add_argument_group('GIST')
+    group.add_argument('-p', '--private', action='store_true',
+                       help='create private Gist')
+    group.add_argument('-f', '--filename',
+                       help='set uploaded gist filename, '
+                            'also defines syntax highlighting')
+    group.add_argument('-d', '--description', help='Gist description')
+    group.add_argument('-l', '--lifetime', metavar='MINUTES',
+                       help='gist lifetime in minutes, -1 (DEFAULT) is forever')
+    group.add_argument('--format', dest='format', type=str,
+                       help='output format DEFAULT: `%s` can '
+                       'be also `%s`' % (FORMAT_PRETTY, FORMAT_JSON),
+            default=FORMAT_PRETTY
+    )
+    args, other = parser.parse_known_args()
+    return parser, args, other
+
+
+def _run(argv):
+    conf = None
+    parser, args, other = argparser(argv)
+
+    api_credentials_given = (args.apikey and args.apihost)
+    if args.save_config:
+        if not api_credentials_given:
+            raise parser.error('--save-config requires --apikey and --apihost')
+        conf = RcConf(config_location=args.config,
+                      autocreate=True, config={'apikey': args.apikey,
+                                               'apihost': args.apihost})
+        sys.exit()
+
+    if not conf:
+        conf = RcConf(config_location=args.config, autoload=True)
+        if not conf:
+            if not api_credentials_given:
+                parser.error('Could not find config file and missing '
+                             '--apikey or --apihost in params')
+
+    apikey = args.apikey or conf['apikey']
+    host = args.apihost or conf['apihost']
+    DEFAULT_FILENAME = 'gistfile1.txt'
+    if other:
+        # skip multifiles for now
+        filename = other[0]
+        if filename == '-':
+            filename = DEFAULT_FILENAME
+            gist_content = ''
+            for line in fileinput.input('-'):
+                gist_content += line
+        else:
+            with open(filename, 'rb') as f:
+                gist_content = f.read()
+
+    else:
+        filename = DEFAULT_FILENAME
+        gist_content = None
+        # little bit hacky but cross platform check where the
+        # stdin comes from we skip the terminal case it can be handled by '-'
+        mode = os.fstat(0).st_mode
+        if stat.S_ISFIFO(mode):
+            # "stdin is piped"
+            gist_content = sys.stdin.read()
+        elif stat.S_ISREG(mode):
+            # "stdin is redirected"
+            gist_content = sys.stdin.read()
+        else:
+            # "stdin is terminal"
+            pass
+
+    # make sure we don't upload binary stuff
+    if gist_content and '\0' in gist_content:
+        raise Exception('Error: binary files upload is not possible')
+
+    filename = os.path.basename(args.filename or filename)
+    if gist_content:
+        files = {
+            filename: {
+                'content': gist_content,
+                'lexer': None
+            }
+        }
+
+        margs = dict(
+            lifetime=args.lifetime,
+            description=args.description,
+            gist_type='private' if args.private else 'public',
+            files=files
+        )
+
+        json_data = api_call(apikey, host, 'create_gist', **margs)['result']
+        if args.format == FORMAT_JSON:
+            print json.dumps(json_data)
+        elif args.format == FORMAT_PRETTY:
+            print json_data
+            print 'Created %s gist %s' % (json_data['gist']['type'],
+                                          json_data['gist']['url'])
+    return 0
+
+
+def main(argv=None):
+    """
+    Main execution function for cli
+
+    :param argv:
+    """
+    if argv is None:
+        argv = sys.argv
+
+    try:
+        return _run(argv)
+    except Exception, e:
+        print e
+        return 1
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
--- a/rhodecode/config/deployment.ini_tmpl	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/config/deployment.ini_tmpl	Fri Jun 07 00:31:11 2013 +0200
@@ -29,24 +29,38 @@
 #smtp_auth = 
 
 [server:main]
-## PASTE
-## nr of threads to spawn
+## PASTE ##
+#use = egg:Paste#http
+## nr of worker threads to spawn
 #threadpool_workers = 5
-
 ## max request before thread respawn
 #threadpool_max_requests = 10
-
 ## option to use threads of process
 #use_threadpool = true
 
-#use = egg:Paste#http
-
-## WAITRESS
+## WAITRESS ##
+use = egg:waitress#main
+## number of worker threads
 threads = 5
-## 100GB
+## MAX BODY SIZE 100GB
 max_request_body_size = 107374182400
-use = egg:waitress#main
+## use poll instead of select, fixes fd limits, may not work on old
+## windows systems.
+#asyncore_use_poll = True
 
+## GUNICORN ##
+#use = egg:gunicorn#main
+## number of process workers. You must set `instance_id = *` when this option
+## is set to more than one worker
+#workers = 1
+## process name
+#proc_name = rhodecode
+## type of worker class, one of sync, eventlet, gevent, tornado
+## recommended for bigger setup is using of of other than sync one
+#worker_class = sync
+#max_requests = 5
+
+## COMMON ##
 host = 127.0.0.1
 port = 5000
 
@@ -68,6 +82,10 @@
 cache_dir = %(here)s/data
 index_dir = %(here)s/data/index
 
+## perform a full repository scan on each server start, this should be
+## set to false after first startup, to allow faster server restarts.
+initial_repo_scan = true
+
 ## uncomment and set this path to use archive download cache
 #archive_cache_dir = /tmp/tarballcache
 
@@ -89,9 +107,6 @@
 ## number of commits stats will parse on each iteration
 commit_parse_limit = 25
 
-## number of items displayed in lightweight dashboard before paginating is shown
-dashboard_items = 100
-
 ## use gravatar service to display avatars
 use_gravatar = true
 
@@ -111,6 +126,18 @@
 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.rhodecode.org/{gistid}. Empty means use the internal
+## RhodeCode url, ie. http[s]://rhodecode.server/_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
+## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
+api_access_controllers_whitelist =
 
 ## alternative_gravatar_url allows you to use your own avatar server application
 ## the following parts of the URL will be replaced
@@ -186,6 +213,7 @@
 ## codes don't break the transactions while 4XX codes do
 lock_ret_code = 423
 
+allow_repo_location_change = True
 
 ####################################
 ###        CELERY CONFIG        ####
--- a/rhodecode/config/environment.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/config/environment.py	Fri Jun 07 00:31:11 2013 +0200
@@ -18,7 +18,7 @@
 from rhodecode.lib import helpers
 from rhodecode.lib.auth import set_available_permissions
 from rhodecode.lib.utils import repo2db_mapper, make_ui, set_rhodecode_config,\
-    load_rcextensions, check_git_version
+    load_rcextensions, check_git_version, set_vcs_config
 from rhodecode.lib.utils2 import engine_from_config, str2bool
 from rhodecode.lib.db_manage import DbManage
 from rhodecode.model import init_model
@@ -87,18 +87,14 @@
         if not int(os.environ.get('RC_WHOOSH_TEST_DISABLE', 0)):
             create_test_index(TESTS_TMP_PATH, config, True)
 
-    #check git version
-    check_git_version()
     DbManage.check_waitress()
     # MULTIPLE DB configs
     # Setup the SQLAlchemy database engine
     sa_engine_db1 = engine_from_config(config, 'sqlalchemy.db1.')
     init_model(sa_engine_db1)
 
+    set_available_permissions(config)
     repos_path = make_ui('db').configitems('paths')[0][1]
-    repo2db_mapper(ScmModel().repo_scan(repos_path),
-                   remove_obsolete=False, install_git_hook=False)
-    set_available_permissions(config)
     config['base_path'] = repos_path
     set_rhodecode_config(config)
 
@@ -113,4 +109,12 @@
     # store config reference into our module to skip import magic of
     # pylons
     rhodecode.CONFIG.update(config)
+    set_vcs_config(rhodecode.CONFIG)
+
+    #check git version
+    check_git_version()
+
+    if str2bool(config.get('initial_repo_scan', True)):
+        repo2db_mapper(ScmModel().repo_scan(repos_path),
+                       remove_obsolete=False, install_git_hook=False)
     return config
--- a/rhodecode/config/routing.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/config/routing.py	Fri Jun 07 00:31:11 2013 +0200
@@ -68,6 +68,15 @@
         return is_valid_repos_group(repos_group_name, config['base_path'],
                                     skip_path_check=True)
 
+    def check_user_group(environ, match_dict):
+        """
+        check for valid user group for proper 404 handling
+
+        :param environ:
+        :param match_dict:
+        """
+        return True
+
     def check_int(environ, match_dict):
         return match_dict.get('id').isdigit()
 
@@ -122,19 +131,15 @@
              action="show", conditions=dict(method=["GET"],
                                             function=check_repo))
         #add repo perm member
-        m.connect('set_repo_perm_member', "/set_repo_perm_member/{repo_name:.*?}",
-             action="set_repo_perm_member",
-             conditions=dict(method=["POST"], function=check_repo))
+        m.connect('set_repo_perm_member',
+                  "/repos/{repo_name:.*?}/grant_perm",
+                  action="set_repo_perm_member",
+                  conditions=dict(method=["POST"], function=check_repo))
 
         #ajax delete repo perm user
-        m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*?}",
-             action="delete_perm_user",
-             conditions=dict(method=["DELETE"], function=check_repo))
-
-        #ajax delete repo perm users_group
-        m.connect('delete_repo_users_group',
-                  "/repos_delete_users_group/{repo_name:.*?}",
-                  action="delete_perm_users_group",
+        m.connect('delete_repo_perm_member',
+                  "/repos/{repo_name:.*?}/revoke_perm",
+                  action="delete_repo_perm_member",
                   conditions=dict(method=["DELETE"], function=check_repo))
 
         #settings actions
@@ -184,6 +189,18 @@
         m.connect("update_repos_group", "/repos_groups/{group_name:.*?}",
                   action="update", conditions=dict(method=["PUT"],
                                                    function=check_group))
+        #add repo group perm member
+        m.connect('set_repo_group_perm_member',
+                  "/repos_groups/{group_name:.*?}/grant_perm",
+                  action="set_repo_group_perm_member",
+                  conditions=dict(method=["POST"], function=check_group))
+
+        #ajax delete repo group perm
+        m.connect('delete_repo_group_perm_member',
+                  "/repos_groups/{group_name:.*?}/revoke_perm",
+                  action="delete_repo_group_perm_member",
+                  conditions=dict(method=["DELETE"], function=check_group))
+
         m.connect("delete_repos_group", "/repos_groups/{group_name:.*?}",
                   action="delete", conditions=dict(method=["DELETE"],
                                                    function=check_group_skip_path))
@@ -200,17 +217,6 @@
         m.connect("formatted_repos_group", "/repos_groups/{group_name:.*?}.{format}",
                   action="show", conditions=dict(method=["GET"],
                                                  function=check_group))
-        # ajax delete repository group perm user
-        m.connect('delete_repos_group_user_perm',
-                  "/delete_repos_group_user_perm/{group_name:.*?}",
-             action="delete_repos_group_user_perm",
-             conditions=dict(method=["DELETE"], function=check_group))
-
-        # ajax delete repository group perm users_group
-        m.connect('delete_repos_group_users_group_perm',
-                  "/delete_repos_group_users_group_perm/{group_name:.*?}",
-                  action="delete_repos_group_users_group_perm",
-                  conditions=dict(method=["DELETE"], function=check_group))
 
     #ADMIN USER REST ROUTES
     with rmap.submapper(path_prefix=ADMIN_PREFIX,
@@ -269,7 +275,8 @@
         m.connect("delete_users_group", "/users_groups/{id}",
                   action="delete", conditions=dict(method=["DELETE"]))
         m.connect("edit_users_group", "/users_groups/{id}/edit",
-                  action="edit", conditions=dict(method=["GET"]))
+                  action="edit", conditions=dict(method=["GET"]),
+                  function=check_user_group)
         m.connect("formatted_edit_users_group",
                   "/users_groups/{id}.{format}/edit",
                   action="edit", conditions=dict(method=["GET"]))
@@ -279,9 +286,20 @@
                   action="show", conditions=dict(method=["GET"]))
 
         #EXTRAS USER ROUTES
-        m.connect("users_group_perm", "/users_groups_perm/{id}",
+        # update
+        m.connect("users_group_perm", "/users_groups/{id}/update_global_perm",
                   action="update_perm", conditions=dict(method=["PUT"]))
 
+        #add user group perm member
+        m.connect('set_user_group_perm_member', "/users_groups/{id}/grant_perm",
+             action="set_user_group_perm_member",
+             conditions=dict(method=["POST"]))
+
+        #ajax delete user group perm
+        m.connect('delete_user_group_perm_member', "/users_groups/{id}/revoke_perm",
+             action="delete_user_group_perm_member",
+             conditions=dict(method=["DELETE"]))
+
     #ADMIN GROUP REST ROUTES
     rmap.resource('group', 'groups',
                   controller='admin/groups', path_prefix=ADMIN_PREFIX)
@@ -352,27 +370,55 @@
                   action="new", conditions=dict(method=["GET"]))
         m.connect("formatted_new_notification", "/notifications/new.{format}",
                   action="new", conditions=dict(method=["GET"]))
-        m.connect("/notification/{notification_id}",
+        m.connect("/notifications/{notification_id}",
                   action="update", conditions=dict(method=["PUT"]))
-        m.connect("/notification/{notification_id}",
+        m.connect("/notifications/{notification_id}",
                   action="delete", conditions=dict(method=["DELETE"]))
-        m.connect("edit_notification", "/notification/{notification_id}/edit",
+        m.connect("edit_notification", "/notifications/{notification_id}/edit",
                   action="edit", conditions=dict(method=["GET"]))
         m.connect("formatted_edit_notification",
-                  "/notification/{notification_id}.{format}/edit",
+                  "/notifications/{notification_id}.{format}/edit",
                   action="edit", conditions=dict(method=["GET"]))
-        m.connect("notification", "/notification/{notification_id}",
+        m.connect("notification", "/notifications/{notification_id}",
                   action="show", conditions=dict(method=["GET"]))
         m.connect("formatted_notification", "/notifications/{notification_id}.{format}",
                   action="show", conditions=dict(method=["GET"]))
 
+    #ADMIN GIST
+    with rmap.submapper(path_prefix=ADMIN_PREFIX,
+                        controller='admin/gists') as m:
+        m.connect("gists", "/gists",
+                  action="create", conditions=dict(method=["POST"]))
+        m.connect("gists", "/gists",
+                  action="index", conditions=dict(method=["GET"]))
+        m.connect("new_gist", "/gists/new",
+                  action="new", conditions=dict(method=["GET"]))
+        m.connect("formatted_new_gist", "/gists/new.{format}",
+                  action="new", conditions=dict(method=["GET"]))
+        m.connect("formatted_gists", "/gists.{format}",
+                  action="index", conditions=dict(method=["GET"]))
+        m.connect("/gists/{gist_id}",
+                  action="update", conditions=dict(method=["PUT"]))
+        m.connect("/gists/{gist_id}",
+                  action="delete", conditions=dict(method=["DELETE"]))
+        m.connect("edit_gist", "/gists/{gist_id}/edit",
+                  action="edit", conditions=dict(method=["GET"]))
+        m.connect("formatted_edit_gist",
+                  "/gists/{gist_id}/{format}/edit",
+                  action="edit", conditions=dict(method=["GET"]))
+        m.connect("gist", "/gists/{gist_id}",
+                  action="show", conditions=dict(method=["GET"]))
+        m.connect("formatted_gist", "/gists/{gist_id}/{format}",
+                  action="show", conditions=dict(method=["GET"]))
+        m.connect("formatted_gist_file", "/gists/{gist_id}/{format}/{revision}/{f_path:.*}",
+                  action="show", conditions=dict(method=["GET"]))
+
     #ADMIN MAIN PAGES
     with rmap.submapper(path_prefix=ADMIN_PREFIX,
                         controller='admin/admin') as m:
         m.connect('admin_home', '', action='index')
         m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
                   action='add_repo')
-
     #==========================================================================
     # API V2
     #==========================================================================
@@ -500,6 +546,11 @@
                 controller='changeset', revision='tip', action='comment',
                 conditions=dict(function=check_repo))
 
+    rmap.connect('changeset_comment_preview',
+                 '/{repo_name:.*?}/changeset/comment/preview',
+                controller='changeset', action='preview_comment',
+                conditions=dict(function=check_repo, method=["POST"]))
+
     rmap.connect('changeset_comment_delete',
                  '/{repo_name:.*?}/changeset/comment/{comment_id}/delete',
                 controller='changeset', action='delete_comment',
@@ -563,13 +614,6 @@
     rmap.connect('summary_home_summary', '/{repo_name:.*?}/summary',
                 controller='summary', conditions=dict(function=check_repo))
 
-    rmap.connect('shortlog_home', '/{repo_name:.*?}/shortlog',
-                controller='shortlog', conditions=dict(function=check_repo))
-
-    rmap.connect('shortlog_file_home', '/{repo_name:.*?}/shortlog/{revision}/{f_path:.*}',
-                controller='shortlog', f_path=None,
-                conditions=dict(function=check_repo))
-
     rmap.connect('branches_home', '/{repo_name:.*?}/branches',
                 controller='branches', conditions=dict(function=check_repo))
 
@@ -582,6 +626,14 @@
     rmap.connect('changelog_home', '/{repo_name:.*?}/changelog',
                 controller='changelog', conditions=dict(function=check_repo))
 
+    rmap.connect('changelog_summary_home', '/{repo_name:.*?}/changelog_summary',
+                controller='changelog', action='changelog_summary',
+                conditions=dict(function=check_repo))
+
+    rmap.connect('changelog_file_home', '/{repo_name:.*?}/changelog/{revision}/{f_path:.*}',
+                controller='changelog', f_path=None,
+                conditions=dict(function=check_repo))
+
     rmap.connect('changelog_details', '/{repo_name:.*?}/changelog_details/{cs}',
                 controller='changelog', action='changelog_details',
                 conditions=dict(function=check_repo))
--- a/rhodecode/controllers/admin/admin.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/admin.py	Fri Jun 07 00:31:11 2013 +0200
@@ -27,17 +27,17 @@
 
 from pylons import request, tmpl_context as c, url
 from sqlalchemy.orm import joinedload
-from webhelpers.paginate import Page
 from whoosh.qparser.default import QueryParser
+from whoosh.qparser.dateparse import DateParserPlugin
 from whoosh import query
 from sqlalchemy.sql.expression import or_, and_, func
 
+from rhodecode.model.db import UserLog, User
 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
 from rhodecode.lib.base import BaseController, render
-from rhodecode.model.db import UserLog, User
 from rhodecode.lib.utils2 import safe_int, remove_prefix, remove_suffix
 from rhodecode.lib.indexers import JOURNAL_SCHEMA
-from whoosh.qparser.dateparse import DateParserPlugin
+from rhodecode.lib.helpers import Page
 
 
 log = logging.getLogger(__name__)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/controllers/admin/gists.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.controllers.admin.gist
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    gist controller for RhodeCode
+
+    :created_on: May 9, 2013
+    :author: marcink
+    :copyright: (C) 2010-2013 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+import time
+import logging
+import traceback
+import formencode
+from formencode import htmlfill
+
+from pylons import request, response, tmpl_context as c, url
+from pylons.controllers.util import abort, redirect
+from pylons.i18n.translation import _
+
+from rhodecode.model.forms import GistForm
+from rhodecode.model.gist import GistModel
+from rhodecode.model.meta import Session
+from rhodecode.model.db import Gist
+from rhodecode.lib import helpers as h
+from rhodecode.lib.base import BaseController, render
+from rhodecode.lib.auth import LoginRequired, NotAnonymous
+from rhodecode.lib.utils2 import safe_str, safe_int, time_to_datetime
+from rhodecode.lib.helpers import Page
+from webob.exc import HTTPNotFound, HTTPForbidden
+from sqlalchemy.sql.expression import or_
+from rhodecode.lib.vcs.exceptions import VCSError
+
+log = logging.getLogger(__name__)
+
+
+class GistsController(BaseController):
+    """REST Controller styled on the Atom Publishing Protocol"""
+
+    def __load_defaults(self):
+        c.lifetime_values = [
+            (str(-1), _('forever')),
+            (str(5), _('5 minutes')),
+            (str(60), _('1 hour')),
+            (str(60 * 24), _('1 day')),
+            (str(60 * 24 * 30), _('1 month')),
+        ]
+        c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
+
+    @LoginRequired()
+    def index(self, format='html'):
+        """GET /admin/gists: All items in the collection"""
+        # url('gists')
+        c.show_private = request.GET.get('private') and c.rhodecode_user.username != 'default'
+        c.show_public = request.GET.get('public') and c.rhodecode_user.username != 'default'
+
+        gists = Gist().query()\
+            .filter(or_(Gist.gist_expires == -1, Gist.gist_expires >= time.time()))\
+            .order_by(Gist.created_on.desc())
+        if c.show_private:
+            c.gists = gists.filter(Gist.gist_type == Gist.GIST_PRIVATE)\
+                             .filter(Gist.gist_owner == c.rhodecode_user.user_id)
+        elif c.show_public:
+            c.gists = gists.filter(Gist.gist_type == Gist.GIST_PUBLIC)\
+                             .filter(Gist.gist_owner == c.rhodecode_user.user_id)
+
+        else:
+            c.gists = gists.filter(Gist.gist_type == Gist.GIST_PUBLIC)
+        p = safe_int(request.GET.get('page', 1), 1)
+        c.gists_pager = Page(c.gists, page=p, items_per_page=10)
+        return render('admin/gists/index.html')
+
+    @LoginRequired()
+    @NotAnonymous()
+    def create(self):
+        """POST /admin/gists: Create a new item"""
+        # url('gists')
+        self.__load_defaults()
+        gist_form = GistForm([x[0] for x in c.lifetime_values])()
+        try:
+            form_result = gist_form.to_python(dict(request.POST))
+            #TODO: multiple files support, from the form
+            nodes = {
+                form_result['filename'] or 'gistfile1.txt': {
+                    'content': form_result['content'],
+                    'lexer': None  # autodetect
+                }
+            }
+            _public = form_result['public']
+            gist_type = Gist.GIST_PUBLIC if _public else Gist.GIST_PRIVATE
+            gist = GistModel().create(
+                description=form_result['description'],
+                owner=c.rhodecode_user,
+                gist_mapping=nodes,
+                gist_type=gist_type,
+                lifetime=form_result['lifetime']
+            )
+            Session().commit()
+            new_gist_id = gist.gist_access_id
+        except formencode.Invalid, errors:
+            defaults = errors.value
+
+            return formencode.htmlfill.render(
+                render('admin/gists/new.html'),
+                defaults=defaults,
+                errors=errors.error_dict or {},
+                prefix_error=False,
+                encoding="UTF-8"
+            )
+
+        except Exception, e:
+            log.error(traceback.format_exc())
+            h.flash(_('Error occurred during gist creation'), category='error')
+            return redirect(url('new_gist'))
+        return redirect(url('gist', gist_id=new_gist_id))
+
+    @LoginRequired()
+    @NotAnonymous()
+    def new(self, format='html'):
+        """GET /admin/gists/new: Form to create a new item"""
+        # url('new_gist')
+        self.__load_defaults()
+        return render('admin/gists/new.html')
+
+    @LoginRequired()
+    @NotAnonymous()
+    def update(self, gist_id):
+        """PUT /admin/gists/gist_id: Update an existing item"""
+        # Forms posted to this method should contain a hidden field:
+        #    <input type="hidden" name="_method" value="PUT" />
+        # Or using helpers:
+        #    h.form(url('gist', gist_id=ID),
+        #           method='put')
+        # url('gist', gist_id=ID)
+
+    @LoginRequired()
+    @NotAnonymous()
+    def delete(self, gist_id):
+        """DELETE /admin/gists/gist_id: Delete an existing item"""
+        # Forms posted to this method should contain a hidden field:
+        #    <input type="hidden" name="_method" value="DELETE" />
+        # Or using helpers:
+        #    h.form(url('gist', gist_id=ID),
+        #           method='delete')
+        # url('gist', gist_id=ID)
+        gist = GistModel().get_gist(gist_id)
+        owner = gist.gist_owner == c.rhodecode_user.user_id
+        if h.HasPermissionAny('hg.admin')() or owner:
+            GistModel().delete(gist)
+            Session().commit()
+            h.flash(_('Deleted gist %s') % gist.gist_access_id, category='success')
+        else:
+            raise HTTPForbidden()
+
+        return redirect(url('gists'))
+
+    @LoginRequired()
+    def show(self, gist_id, format='html', revision='tip', f_path=None):
+        """GET /admin/gists/gist_id: Show a specific item"""
+        # url('gist', gist_id=ID)
+        c.gist = Gist.get_or_404(gist_id)
+
+        #check if this gist is not expired
+        if c.gist.gist_expires != -1:
+            if time.time() > c.gist.gist_expires:
+                log.error('Gist expired at %s' %
+                          (time_to_datetime(c.gist.gist_expires)))
+                raise HTTPNotFound()
+        try:
+            c.file_changeset, c.files = GistModel().get_gist_files(gist_id)
+        except VCSError:
+            log.error(traceback.format_exc())
+            raise HTTPNotFound()
+        if format == 'raw':
+            content = '\n\n'.join([f.content for f in c.files if (f_path is None or f.path == f_path)])
+            response.content_type = 'text/plain'
+            return content
+        return render('admin/gists/show.html')
+
+    @LoginRequired()
+    @NotAnonymous()
+    def edit(self, gist_id, format='html'):
+        """GET /admin/gists/gist_id/edit: Form to edit an existing item"""
+        # url('edit_gist', gist_id=ID)
--- a/rhodecode/controllers/admin/ldap_settings.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/ldap_settings.py	Fri Jun 07 00:31:11 2013 +0200
@@ -71,8 +71,6 @@
     @LoginRequired()
     @HasPermissionAllDecorator('hg.admin')
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
         c.search_scope_choices = self.search_scope_choices
         c.tls_reqcert_choices = self.tls_reqcert_choices
         c.tls_kind_choices = self.tls_kind_choices
--- a/rhodecode/controllers/admin/notifications.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/notifications.py	Fri Jun 07 00:31:11 2013 +0200
@@ -30,15 +30,13 @@
 from pylons import tmpl_context as c, url
 from pylons.controllers.util import redirect, abort
 
-from webhelpers.paginate import Page
-
+from rhodecode.model.db import Notification
+from rhodecode.model.notification import NotificationModel
+from rhodecode.model.meta import Session
+from rhodecode.lib.auth import LoginRequired, NotAnonymous
 from rhodecode.lib.base import BaseController, render
-from rhodecode.model.db import Notification
-
-from rhodecode.model.notification import NotificationModel
-from rhodecode.lib.auth import LoginRequired, NotAnonymous
 from rhodecode.lib import helpers as h
-from rhodecode.model.meta import Session
+from rhodecode.lib.helpers import Page
 from rhodecode.lib.utils2 import safe_int
 
 
--- a/rhodecode/controllers/admin/permissions.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/permissions.py	Fri Jun 07 00:31:11 2013 +0200
@@ -38,7 +38,7 @@
 from rhodecode.lib.base import BaseController, render
 from rhodecode.model.forms import DefaultPermissionsForm
 from rhodecode.model.permission import PermissionModel
-from rhodecode.model.db import User, UserIpMap
+from rhodecode.model.db import User, UserIpMap, Permission
 from rhodecode.model.meta import Session
 
 log = logging.getLogger(__name__)
@@ -53,19 +53,21 @@
     @LoginRequired()
     @HasPermissionAllDecorator('hg.admin')
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
         super(PermissionsController, self).__before__()
 
-        self.repo_perms_choices = [('repository.none', _('None'),),
+        c.repo_perms_choices = [('repository.none', _('None'),),
                                    ('repository.read', _('Read'),),
                                    ('repository.write', _('Write'),),
                                    ('repository.admin', _('Admin'),)]
-        self.group_perms_choices = [('group.none', _('None'),),
-                                    ('group.read', _('Read'),),
-                                    ('group.write', _('Write'),),
-                                    ('group.admin', _('Admin'),)]
-        self.register_choices = [
+        c.group_perms_choices = [('group.none', _('None'),),
+                                 ('group.read', _('Read'),),
+                                 ('group.write', _('Write'),),
+                                 ('group.admin', _('Admin'),)]
+        c.user_group_perms_choices = [('usergroup.none', _('None'),),
+                                      ('usergroup.read', _('Read'),),
+                                      ('usergroup.write', _('Write'),),
+                                      ('usergroup.admin', _('Admin'),)]
+        c.register_choices = [
             ('hg.register.none',
                 _('Disabled')),
             ('hg.register.manual_activate',
@@ -73,18 +75,22 @@
             ('hg.register.auto_activate',
                 _('Allowed with automatic account activation')), ]
 
-        self.create_choices = [('hg.create.none', _('Disabled')),
-                               ('hg.create.repository', _('Enabled'))]
+        c.extern_activate_choices = [
+            ('hg.extern_activate.manual', _('Manual activation of external account')),
+            ('hg.extern_activate.auto', _('Automatic activation of external account')),
+        ]
 
-        self.fork_choices = [('hg.fork.none', _('Disabled')),
-                             ('hg.fork.repository', _('Enabled'))]
+        c.repo_create_choices = [('hg.create.none', _('Disabled')),
+                                 ('hg.create.repository', _('Enabled'))]
 
-        # set the global template variables
-        c.repo_perms_choices = self.repo_perms_choices
-        c.group_perms_choices = self.group_perms_choices
-        c.register_choices = self.register_choices
-        c.create_choices = self.create_choices
-        c.fork_choices = self.fork_choices
+        c.user_group_create_choices = [('hg.usergroup.create.false', _('Disabled')),
+                                       ('hg.usergroup.create.true', _('Enabled'))]
+
+        c.repo_group_create_choices = [('hg.repogroup.create.false', _('Disabled')),
+                                       ('hg.repogroup.create.true', _('Enabled'))]
+
+        c.fork_choices = [('hg.fork.none', _('Disabled')),
+                          ('hg.fork.repository', _('Enabled'))]
 
     def index(self, format='html'):
         """GET /permissions: All items in the collection"""
@@ -107,23 +113,27 @@
         #           method='put')
         # url('permission', id=ID)
         if id == 'default':
-            c.user = default_user = User.get_by_username('default')
+            c.user = default_user = User.get_default_user()
             c.perm_user = AuthUser(user_id=default_user.user_id)
             c.user_ip_map = UserIpMap.query()\
                             .filter(UserIpMap.user == default_user).all()
-            permission_model = PermissionModel()
 
             _form = DefaultPermissionsForm(
-                    [x[0] for x in self.repo_perms_choices],
-                    [x[0] for x in self.group_perms_choices],
-                    [x[0] for x in self.register_choices],
-                    [x[0] for x in self.create_choices],
-                    [x[0] for x in self.fork_choices])()
+                    [x[0] for x in c.repo_perms_choices],
+                    [x[0] for x in c.group_perms_choices],
+                    [x[0] for x in c.user_group_perms_choices],
+                    [x[0] for x in c.repo_create_choices],
+                    [x[0] for x in c.repo_group_create_choices],
+                    [x[0] for x in c.user_group_create_choices],
+                    [x[0] for x in c.fork_choices],
+                    [x[0] for x in c.register_choices],
+                    [x[0] for x in c.extern_activate_choices],
+            )()
 
             try:
                 form_result = _form.to_python(dict(request.POST))
                 form_result.update({'perm_user_name': id})
-                permission_model.update(form_result)
+                PermissionModel().update(form_result)
                 Session().commit()
                 h.flash(_('Default permissions updated successfully'),
                         category='success')
@@ -156,6 +166,7 @@
     def show(self, id, format='html'):
         """GET /permissions/id: Show a specific item"""
         # url('permission', id=ID)
+        Permission.get_or_404(-1)
 
     def edit(self, id, format='html'):
         """GET /permissions/id/edit: Form to edit an existing item"""
@@ -163,23 +174,35 @@
 
         #this form can only edit default user permissions
         if id == 'default':
-            c.user = default_user = User.get_by_username('default')
-            defaults = {'anonymous': default_user.active}
-            c.perm_user = AuthUser(user_id=default_user.user_id)
+            c.user = User.get_default_user()
+            defaults = {'anonymous': c.user.active}
+            c.perm_user = c.user.AuthUser
             c.user_ip_map = UserIpMap.query()\
-                            .filter(UserIpMap.user == default_user).all()
-            for p in default_user.user_perms:
+                            .filter(UserIpMap.user == c.user).all()
+            for p in c.user.user_perms:
                 if p.permission.permission_name.startswith('repository.'):
                     defaults['default_repo_perm'] = p.permission.permission_name
 
                 if p.permission.permission_name.startswith('group.'):
                     defaults['default_group_perm'] = p.permission.permission_name
 
+                if p.permission.permission_name.startswith('usergroup.'):
+                    defaults['default_user_group_perm'] = p.permission.permission_name
+
+                if p.permission.permission_name.startswith('hg.create.'):
+                    defaults['default_repo_create'] = p.permission.permission_name
+
+                if p.permission.permission_name.startswith('hg.repogroup.'):
+                    defaults['default_repo_group_create'] = p.permission.permission_name
+
+                if p.permission.permission_name.startswith('hg.usergroup.'):
+                    defaults['default_user_group_create'] = p.permission.permission_name
+
                 if p.permission.permission_name.startswith('hg.register.'):
                     defaults['default_register'] = p.permission.permission_name
 
-                if p.permission.permission_name.startswith('hg.create.'):
-                    defaults['default_create'] = p.permission.permission_name
+                if p.permission.permission_name.startswith('hg.extern_activate.'):
+                    defaults['default_extern_activate'] = p.permission.permission_name
 
                 if p.permission.permission_name.startswith('hg.fork.'):
                     defaults['default_fork'] = p.permission.permission_name
--- a/rhodecode/controllers/admin/repos.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/repos.py	Fri Jun 07 00:31:11 2013 +0200
@@ -40,17 +40,18 @@
     HasPermissionAnyDecorator, HasRepoPermissionAllDecorator, NotAnonymous,\
     HasPermissionAny, HasReposGroupPermissionAny, HasRepoPermissionAnyDecorator
 from rhodecode.lib.base import BaseRepoController, render
-from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
+from rhodecode.lib.utils import action_logger, repo_name_slug
 from rhodecode.lib.helpers import get_token
 from rhodecode.model.meta import Session
 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup,\
     RhodeCodeSetting, RepositoryField
 from rhodecode.model.forms import RepoForm, RepoFieldForm, RepoPermsForm
-from rhodecode.model.scm import ScmModel, GroupList
+from rhodecode.model.scm import ScmModel, RepoGroupList, RepoList
 from rhodecode.model.repo import RepoModel
 from rhodecode.lib.compat import json
 from sqlalchemy.sql.expression import func
 from rhodecode.lib.exceptions import AttachedForksError
+from rhodecode.lib.utils2 import safe_int
 
 log = logging.getLogger(__name__)
 
@@ -64,12 +65,10 @@
 
     @LoginRequired()
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
         super(ReposController, self).__before__()
 
     def __load_defaults(self):
-        acl_groups = GroupList(RepoGroup.query().all(),
+        acl_groups = RepoGroupList(RepoGroup.query().all(),
                                perm_set=['group.write', 'group.admin'])
         c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
@@ -99,7 +98,7 @@
         choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
         c.landing_revs_choices = choices
 
-        c.default_user_id = User.get_by_username('default').user_id
+        c.default_user_id = User.get_default_user().user_id
         c.in_public_journal = UserFollowing.query()\
             .filter(UserFollowing.user_id == c.default_user_id)\
             .filter(UserFollowing.follows_repository == c.repo_info).scalar()
@@ -124,23 +123,24 @@
 
         defaults = RepoModel()._get_defaults(repo_name)
 
+        _repos = Repository.query().order_by(Repository.repo_name).all()
+        read_access_repos = RepoList(_repos)
         c.repos_list = [('', _('--REMOVE FORK--'))]
-        c.repos_list += [(x.repo_id, x.repo_name) for x in
-                    Repository.query().order_by(Repository.repo_name).all()
-                    if x.repo_id != c.repo_info.repo_id]
+        c.repos_list += [(x.repo_id, x.repo_name)
+                         for x in read_access_repos
+                         if x.repo_id != c.repo_info.repo_id]
 
         defaults['id_fork_of'] = db_repo.fork.repo_id if db_repo.fork else ''
         return defaults
 
-    @HasPermissionAllDecorator('hg.admin')
     def index(self, format='html'):
         """GET /repos: All items in the collection"""
         # url('repos')
+        repo_list = Repository.query()\
+                                .order_by(func.lower(Repository.repo_name))\
+                                .all()
 
-        c.repos_list = Repository.query()\
-                        .order_by(func.lower(Repository.repo_name))\
-                        .all()
-
+        c.repos_list = RepoList(repo_list, perm_set=['repository.admin'])
         repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
                                                    admin=True,
                                                    super_user_actions=True)
@@ -216,7 +216,7 @@
             if not HasReposGroupPermissionAny('group.admin', 'group.write')(group_name=gr_name):
                 raise HTTPForbidden
 
-        acl_groups = GroupList(RepoGroup.query().all(),
+        acl_groups = RepoGroupList(RepoGroup.query().all(),
                                perm_set=['group.write', 'group.admin'])
         c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
@@ -266,7 +266,7 @@
         try:
             form_result = _form.to_python(dict(request.POST))
             repo = repo_model.update(repo_name, **form_result)
-            invalidate_cache('get_repo_cached_%s' % repo_name)
+            ScmModel().mark_for_invalidation(repo_name)
             h.flash(_('Repository %s updated successfully') % repo_name,
                     category='success')
             changed_name = repo.repo_name
@@ -319,7 +319,7 @@
             repo_model.delete(repo, forks=handle_forks)
             action_logger(self.rhodecode_user, 'admin_deleted_repo',
                   repo_name, self.ip_addr, self.sa)
-            invalidate_cache('get_repo_cached_%s' % repo_name)
+            ScmModel().mark_for_invalidation(repo_name)
             h.flash(_('Deleted repository %s') % repo_name, category='success')
             Session().commit()
         except AttachedForksError:
@@ -336,32 +336,8 @@
     @HasRepoPermissionAllDecorator('repository.admin')
     def set_repo_perm_member(self, repo_name):
         form = RepoPermsForm()().to_python(request.POST)
-
-        perms_new = form['perms_new']
-        perms_updates = form['perms_updates']
-        cur_repo = repo_name
-
-        # update permissions
-        for member, perm, member_type in perms_updates:
-            if member_type == 'user':
-                # this updates existing one
-                RepoModel().grant_user_permission(
-                    repo=cur_repo, user=member, perm=perm
-                )
-            else:
-                RepoModel().grant_users_group_permission(
-                    repo=cur_repo, group_name=member, perm=perm
-                )
-        # set new permissions
-        for member, perm, member_type in perms_new:
-            if member_type == 'user':
-                RepoModel().grant_user_permission(
-                    repo=cur_repo, user=member, perm=perm
-                )
-            else:
-                RepoModel().grant_users_group_permission(
-                    repo=cur_repo, group_name=member, perm=perm
-                )
+        RepoModel()._update_permissions(repo_name, form['perms_new'],
+                                        form['perms_updates'])
         #TODO: implement this
         #action_logger(self.rhodecode_user, 'admin_changed_repo_permissions',
         #              repo_name, self.ip_addr, self.sa)
@@ -370,42 +346,33 @@
         return redirect(url('edit_repo', repo_name=repo_name))
 
     @HasRepoPermissionAllDecorator('repository.admin')
-    def delete_perm_user(self, repo_name):
+    def delete_repo_perm_member(self, repo_name):
         """
         DELETE an existing repository permission user
 
         :param repo_name:
         """
         try:
-            RepoModel().revoke_user_permission(repo=repo_name,
-                                               user=request.POST['user_id'])
+            obj_type = request.POST.get('obj_type')
+            obj_id = None
+            if obj_type == 'user':
+                obj_id = safe_int(request.POST.get('user_id'))
+            elif obj_type == 'user_group':
+                obj_id = safe_int(request.POST.get('user_group_id'))
+
+            if obj_type == 'user':
+                RepoModel().revoke_user_permission(repo=repo_name, user=obj_id)
+            elif obj_type == 'user_group':
+                RepoModel().revoke_users_group_permission(
+                    repo=repo_name, group_name=obj_id
+                )
             #TODO: implement this
             #action_logger(self.rhodecode_user, 'admin_revoked_repo_permissions',
             #              repo_name, self.ip_addr, self.sa)
             Session().commit()
         except Exception:
             log.error(traceback.format_exc())
-            h.flash(_('An error occurred during deletion of repository user'),
-                    category='error')
-            raise HTTPInternalServerError()
-
-    @HasRepoPermissionAllDecorator('repository.admin')
-    def delete_perm_users_group(self, repo_name):
-        """
-        DELETE an existing repository permission user group
-
-        :param repo_name:
-        """
-
-        try:
-            RepoModel().revoke_users_group_permission(
-                repo=repo_name, group_name=request.POST['users_group_id']
-            )
-            Session().commit()
-        except Exception:
-            log.error(traceback.format_exc())
-            h.flash(_('An error occurred during deletion of repository'
-                      ' user groups'),
+            h.flash(_('An error occurred during revoking of permission'),
                     category='error')
             raise HTTPInternalServerError()
 
@@ -504,7 +471,7 @@
         if cur_token == token:
             try:
                 repo_id = Repository.get_by_repo_name(repo_name).repo_id
-                user_id = User.get_by_username('default').user_id
+                user_id = User.get_default_user().user_id
                 self.scm_model.toggle_following_repo(repo_id, user_id)
                 h.flash(_('Updated repository visibility in public journal'),
                         category='success')
@@ -530,6 +497,7 @@
             ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
             h.flash(_('Pulled from remote location'), category='success')
         except Exception, e:
+            log.error(traceback.format_exc())
             h.flash(_('An error occurred during pull from remote location'),
                     category='error')
 
--- a/rhodecode/controllers/admin/repos_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/repos_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -37,20 +37,21 @@
 
 import rhodecode
 from rhodecode.lib import helpers as h
-from rhodecode.lib.ext_json import json
+from rhodecode.lib.compat import json
 from rhodecode.lib.auth import LoginRequired, HasPermissionAnyDecorator,\
     HasReposGroupPermissionAnyDecorator, HasReposGroupPermissionAll,\
     HasPermissionAll
 from rhodecode.lib.base import BaseController, render
 from rhodecode.model.db import RepoGroup, Repository
+from rhodecode.model.scm import RepoGroupList
 from rhodecode.model.repos_group import ReposGroupModel
-from rhodecode.model.forms import ReposGroupForm
+from rhodecode.model.forms import ReposGroupForm, RepoGroupPermsForm
 from rhodecode.model.meta import Session
 from rhodecode.model.repo import RepoModel
 from webob.exc import HTTPInternalServerError, HTTPNotFound
 from rhodecode.lib.utils2 import str2bool, safe_int
 from sqlalchemy.sql.expression import func
-from rhodecode.model.scm import GroupList
+
 
 log = logging.getLogger(__name__)
 
@@ -72,7 +73,7 @@
 
         #override the choices for this form, we need to filter choices
         #and display only those we have ADMIN right
-        groups_with_admin_rights = GroupList(RepoGroup.query().all(),
+        groups_with_admin_rights = RepoGroupList(RepoGroup.query().all(),
                                              perm_set=['group.admin'])
         c.repo_groups = RepoGroup.groups_choices(groups=groups_with_admin_rights,
                                                  show_empty_group=allow_empty_group)
@@ -94,12 +95,12 @@
         data = repo_group.get_dict()
         data['group_name'] = repo_group.name
 
-        # fill repository users
+        # fill repository group users
         for p in repo_group.repo_group_to_perm:
             data.update({'u_perm_%s' % p.user.username:
                              p.permission.permission_name})
 
-        # fill repository groups
+        # fill repository group groups
         for p in repo_group.users_group_to_perm:
             data.update({'g_perm_%s' % p.users_group.users_group_name:
                              p.permission.permission_name})
@@ -118,7 +119,8 @@
     def index(self, format='html'):
         """GET /repos_groups: All items in the collection"""
         # url('repos_groups')
-        group_iter = GroupList(RepoGroup.query().all(), perm_set=['group.admin'])
+        group_iter = RepoGroupList(RepoGroup.query().all(),
+                                   perm_set=['group.admin'])
         sk = lambda g: g.parents[0].group_name if g.parents else g.group_name
         c.groups = sorted(group_iter, key=sk)
         return render('admin/repos_groups/repos_groups_show.html')
@@ -190,7 +192,7 @@
         #           method='put')
         # url('repos_group', group_name=GROUP_NAME)
 
-        c.repos_group = ReposGroupModel()._get_repos_group(group_name)
+        c.repos_group = ReposGroupModel()._get_repo_group(group_name)
         if HasPermissionAll('hg.admin')('group edit'):
             #we're global admin, we're ok and we can create TOP level groups
             allow_empty_group = True
@@ -209,11 +211,6 @@
         )()
         try:
             form_result = repos_group_form.to_python(dict(request.POST))
-            if not c.rhodecode_user.is_admin:
-                if self._revoke_perms_on_yourself(form_result):
-                    msg = _('Cannot revoke permission for yourself as admin')
-                    h.flash(msg, category='warning')
-                    raise Exception('revoke admin permission on self')
 
             new_gr = ReposGroupModel().update(group_name, form_result)
             Session().commit()
@@ -247,7 +244,7 @@
         #           method='delete')
         # url('repos_group', group_name=GROUP_NAME)
 
-        gr = c.repos_group = ReposGroupModel()._get_repos_group(group_name)
+        gr = c.repos_group = ReposGroupModel()._get_repo_group(group_name)
         repos = gr.repositories.all()
         if repos:
             h.flash(_('This group contains %s repositores and cannot be '
@@ -268,55 +265,71 @@
             #TODO: in future action_logger(, '', '', '', self.sa)
         except Exception:
             log.error(traceback.format_exc())
-            h.flash(_('Error occurred during deletion of repos '
-                      'group %s') % group_name, category='error')
+            h.flash(_('Error occurred during deletion of repository group %s')
+                    % group_name, category='error')
 
         return redirect(url('repos_groups'))
 
     @HasReposGroupPermissionAnyDecorator('group.admin')
-    def delete_repos_group_user_perm(self, group_name):
+    def set_repo_group_perm_member(self, group_name):
+        c.repos_group = ReposGroupModel()._get_repo_group(group_name)
+        form_result = RepoGroupPermsForm()().to_python(request.POST)
+        if not c.rhodecode_user.is_admin:
+            if self._revoke_perms_on_yourself(form_result):
+                msg = _('Cannot revoke permission for yourself as admin')
+                h.flash(msg, category='warning')
+                return redirect(url('edit_repos_group', group_name=group_name))
+        recursive = form_result['recursive']
+        # iterate over all members(if in recursive mode) of this groups and
+        # set the permissions !
+        # this can be potentially heavy operation
+        ReposGroupModel()._update_permissions(c.repos_group,
+                                              form_result['perms_new'],
+                                              form_result['perms_updates'],
+                                              recursive)
+        #TODO: implement this
+        #action_logger(self.rhodecode_user, 'admin_changed_repo_permissions',
+        #              repo_name, self.ip_addr, self.sa)
+        Session().commit()
+        h.flash(_('Repository Group permissions updated'), category='success')
+        return redirect(url('edit_repos_group', group_name=group_name))
+
+    @HasReposGroupPermissionAnyDecorator('group.admin')
+    def delete_repo_group_perm_member(self, group_name):
         """
         DELETE an existing repository group permission user
 
         :param group_name:
         """
         try:
+            obj_type = request.POST.get('obj_type')
+            obj_id = None
+            if obj_type == 'user':
+                obj_id = safe_int(request.POST.get('user_id'))
+            elif obj_type == 'user_group':
+                obj_id = safe_int(request.POST.get('user_group_id'))
+
             if not c.rhodecode_user.is_admin:
-                if c.rhodecode_user.user_id == safe_int(request.POST['user_id']):
+                if obj_type == 'user' and c.rhodecode_user.user_id == obj_id:
                     msg = _('Cannot revoke permission for yourself as admin')
                     h.flash(msg, category='warning')
                     raise Exception('revoke admin permission on self')
             recursive = str2bool(request.POST.get('recursive', False))
-            ReposGroupModel().delete_permission(
-                repos_group=group_name, obj=request.POST['user_id'],
-                obj_type='user', recursive=recursive
-            )
+            if obj_type == 'user':
+                ReposGroupModel().delete_permission(
+                    repos_group=group_name, obj=obj_id,
+                    obj_type='user', recursive=recursive
+                )
+            elif obj_type == 'user_group':
+                ReposGroupModel().delete_permission(
+                    repos_group=group_name, obj=obj_id,
+                    obj_type='users_group', recursive=recursive
+                )
+
             Session().commit()
         except Exception:
             log.error(traceback.format_exc())
-            h.flash(_('An error occurred during deletion of group user'),
-                    category='error')
-            raise HTTPInternalServerError()
-
-    @HasReposGroupPermissionAnyDecorator('group.admin')
-    def delete_repos_group_users_group_perm(self, group_name):
-        """
-        DELETE an existing repository group permission user group
-
-        :param group_name:
-        """
-
-        try:
-            recursive = str2bool(request.POST.get('recursive', False))
-            ReposGroupModel().delete_permission(
-                repos_group=group_name, obj=request.POST['users_group_id'],
-                obj_type='users_group', recursive=recursive
-            )
-            Session().commit()
-        except Exception:
-            log.error(traceback.format_exc())
-            h.flash(_('An error occurred during deletion of group'
-                      ' user groups'),
+            h.flash(_('An error occurred during revoking of permission'),
                     category='error')
             raise HTTPInternalServerError()
 
@@ -337,7 +350,7 @@
         """GET /repos_groups/group_name: Show a specific item"""
         # url('repos_group', group_name=GROUP_NAME)
 
-        c.group = c.repos_group = ReposGroupModel()._get_repos_group(group_name)
+        c.group = c.repos_group = ReposGroupModel()._get_repo_group(group_name)
         c.group_repos = c.group.repositories.all()
 
         #overwrite our cached list with current filter
@@ -348,19 +361,15 @@
             .filter(RepoGroup.group_parent_id == c.group.group_id).all()
         c.groups = self.scm_model.get_repos_groups(groups)
 
-        if not c.visual.lightweight_dashboard:
-            c.repos_list = self.scm_model.get_repos(all_repos=gr_filter)
-        ## lightweight version of dashboard
-        else:
-            c.repos_list = Repository.query()\
-                            .filter(Repository.group_id == c.group.group_id)\
-                            .order_by(func.lower(Repository.repo_name))\
-                            .all()
+        c.repos_list = Repository.query()\
+                        .filter(Repository.group_id == c.group.group_id)\
+                        .order_by(func.lower(Repository.repo_name))\
+                        .all()
 
-            repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
-                                                       admin=False)
-            #json used to render the grid
-            c.data = json.dumps(repos_data)
+        repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
+                                                   admin=False)
+        #json used to render the grid
+        c.data = json.dumps(repos_data)
 
         return render('admin/repos_groups/repos_groups.html')
 
@@ -369,7 +378,7 @@
         """GET /repos_groups/group_name/edit: Form to edit an existing item"""
         # url('edit_repos_group', group_name=GROUP_NAME)
 
-        c.repos_group = ReposGroupModel()._get_repos_group(group_name)
+        c.repos_group = ReposGroupModel()._get_repo_group(group_name)
         #we can only allow moving empty group if it's already a top-level
         #group, ie has no parents, or we're admin
         if HasPermissionAll('hg.admin')('group edit'):
--- a/rhodecode/controllers/admin/settings.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/settings.py	Fri Jun 07 00:31:11 2013 +0200
@@ -41,13 +41,13 @@
     HasReposGroupPermissionAll, HasReposGroupPermissionAny, AuthUser
 from rhodecode.lib.base import BaseController, render
 from rhodecode.lib.celerylib import tasks, run_task
-from rhodecode.lib.utils import repo2db_mapper, invalidate_cache, \
-    set_rhodecode_config, repo_name_slug, check_git_version
+from rhodecode.lib.utils import repo2db_mapper, set_rhodecode_config, \
+    check_git_version
 from rhodecode.model.db import RhodeCodeUi, Repository, RepoGroup, \
     RhodeCodeSetting, PullRequest, PullRequestReviewers
 from rhodecode.model.forms import UserForm, ApplicationSettingsForm, \
     ApplicationUiSettingsForm, ApplicationVisualisationForm
-from rhodecode.model.scm import ScmModel, GroupList
+from rhodecode.model.scm import ScmModel, RepoGroupList
 from rhodecode.model.user import UserModel
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.db import User
@@ -55,7 +55,6 @@
 from rhodecode.model.meta import Session
 from rhodecode.lib.utils2 import str2bool, safe_unicode
 from rhodecode.lib.compat import json
-from webob.exc import HTTPForbidden
 log = logging.getLogger(__name__)
 
 
@@ -68,15 +67,13 @@
 
     @LoginRequired()
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
+        super(SettingsController, self).__before__()
         c.modules = sorted([(p.project_name, p.version)
                             for p in pkg_resources.working_set]
                            + [('git', check_git_version())],
                            key=lambda k: k[0].lower())
         c.py_version = platform.python_version()
         c.platform = platform.platform()
-        super(SettingsController, self).__before__()
 
     @HasPermissionAllDecorator('hg.admin')
     def index(self, format='html'):
@@ -115,13 +112,17 @@
 
         if setting_id == 'mapping':
             rm_obsolete = request.POST.get('destroy', False)
-            log.debug('Rescanning directories with destroy=%s' % rm_obsolete)
-            initial = ScmModel().repo_scan()
-            log.debug('invalidating all repositories')
-            for repo_name in initial.keys():
-                invalidate_cache('get_repo_cached_%s' % repo_name)
+            invalidate_cache = request.POST.get('invalidate', False)
+            log.debug('rescanning repo location with destroy obsolete=%s'
+                      % (rm_obsolete,))
 
-            added, removed = repo2db_mapper(initial, rm_obsolete)
+            if invalidate_cache:
+                log.debug('invalidating all repositories cache')
+                for repo in Repository.get_all():
+                    ScmModel().mark_for_invalidation(repo.repo_name)
+
+            filesystem_repos = ScmModel().repo_scan()
+            added, removed = repo2db_mapper(filesystem_repos, rm_obsolete)
             _repr = lambda l: ', '.join(map(safe_unicode, l)) or '-'
             h.flash(_('Repositories successfully '
                       'rescanned added: %s ; removed: %s') %
@@ -186,6 +187,7 @@
                 )
 
             try:
+                #TODO: rewrite this to something less ugly
                 sett1 = RhodeCodeSetting.get_by_name_or_create('show_public_icon')
                 sett1.app_settings_value = \
                     form_result['rhodecode_show_public_icon']
@@ -201,16 +203,21 @@
                     form_result['rhodecode_stylify_metatags']
                 Session().add(sett3)
 
-                sett4 = RhodeCodeSetting.get_by_name_or_create('lightweight_dashboard')
-                sett4.app_settings_value = \
-                    form_result['rhodecode_lightweight_dashboard']
-                Session().add(sett4)
-
                 sett4 = RhodeCodeSetting.get_by_name_or_create('repository_fields')
                 sett4.app_settings_value = \
                     form_result['rhodecode_repository_fields']
                 Session().add(sett4)
 
+                sett5 = RhodeCodeSetting.get_by_name_or_create('dashboard_items')
+                sett5.app_settings_value = \
+                    form_result['rhodecode_dashboard_items']
+                Session().add(sett5)
+
+                sett6 = RhodeCodeSetting.get_by_name_or_create('show_version')
+                sett6.app_settings_value = \
+                    form_result['rhodecode_show_version']
+                Session().add(sett6)
+
                 Session().commit()
                 set_rhodecode_config(config)
                 h.flash(_('Updated visualisation settings'),
@@ -239,10 +246,10 @@
                 sett = RhodeCodeUi.get_by_key('push_ssl')
                 sett.ui_value = form_result['web_push_ssl']
                 Session().add(sett)
-
-                sett = RhodeCodeUi.get_by_key('/')
-                sett.ui_value = form_result['paths_root_path']
-                Session().add(sett)
+                if c.visual.allow_repo_location_change:
+                    sett = RhodeCodeUi.get_by_key('/')
+                    sett.ui_value = form_result['paths_root_path']
+                    Session().add(sett)
 
                 #HOOKS
                 sett = RhodeCodeUi.get_by_key(RhodeCodeUi.HOOK_UPDATE)
--- a/rhodecode/controllers/admin/users.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/users.py	Fri Jun 07 00:31:11 2013 +0200
@@ -41,8 +41,8 @@
     AuthUser
 from rhodecode.lib.base import BaseController, render
 
-from rhodecode.model.db import User, UserEmailMap, UserIpMap
-from rhodecode.model.forms import UserForm
+from rhodecode.model.db import User, UserEmailMap, UserIpMap, UserToPerm
+from rhodecode.model.forms import UserForm, CustomDefaultPermissionsForm
 from rhodecode.model.user import UserModel
 from rhodecode.model.meta import Session
 from rhodecode.lib.utils import action_logger
@@ -61,8 +61,6 @@
     @LoginRequired()
     @HasPermissionAllDecorator('hg.admin')
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
         super(UsersController, self).__before__()
         c.available_permissions = config['available_permissions']
 
@@ -70,7 +68,9 @@
         """GET /users: All items in the collection"""
         # url('users')
 
-        c.users_list = User.query().order_by(User.username).all()
+        c.users_list = User.query().order_by(User.username)\
+                        .filter(User.username != User.DEFAULT_USER)\
+                        .all()
 
         users_data = []
         total_records = len(c.users_list)
@@ -223,6 +223,7 @@
     def show(self, id, format='html'):
         """GET /users/id: Show a specific item"""
         # url('user', id=ID)
+        User.get_or_404(-1)
 
     def edit(self, id, format='html'):
         """GET /users/id/edit: Form to edit an existing item"""
@@ -241,12 +242,13 @@
                         .filter(UserEmailMap.user == c.user).all()
         c.user_ip_map = UserIpMap.query()\
                         .filter(UserIpMap.user == c.user).all()
-        user_model = UserModel()
+        umodel = UserModel()
         c.ldap_dn = c.user.ldap_dn
         defaults = c.user.get_dict()
         defaults.update({
-            'create_repo_perm': user_model.has_perm(id, 'hg.create.repository'),
-            'fork_repo_perm': user_model.has_perm(id, 'hg.fork.repository'),
+         'create_repo_perm': umodel.has_perm(c.user, 'hg.create.repository'),
+         'create_user_group_perm': umodel.has_perm(c.user, 'hg.usergroup.create.true'),
+         'fork_repo_perm': umodel.has_perm(c.user, 'hg.fork.repository'),
         })
 
         return htmlfill.render(
@@ -259,39 +261,36 @@
     def update_perm(self, id):
         """PUT /users_perm/id: Update an existing item"""
         # url('user_perm', id=ID, method='put')
-        usr = User.get_or_404(id)
-        grant_create_perm = str2bool(request.POST.get('create_repo_perm'))
-        grant_fork_perm = str2bool(request.POST.get('fork_repo_perm'))
-        inherit_perms = str2bool(request.POST.get('inherit_default_permissions'))
-
-        user_model = UserModel()
+        user = User.get_or_404(id)
 
         try:
-            usr.inherit_default_permissions = inherit_perms
-            Session().add(usr)
+            form = CustomDefaultPermissionsForm()()
+            form_result = form.to_python(request.POST)
+
+            inherit_perms = form_result['inherit_default_permissions']
+            user.inherit_default_permissions = inherit_perms
+            Session().add(user)
+            user_model = UserModel()
 
-            if grant_create_perm:
-                user_model.revoke_perm(usr, 'hg.create.none')
-                user_model.grant_perm(usr, 'hg.create.repository')
-                h.flash(_("Granted 'repository create' permission to user"),
-                        category='success')
+            defs = UserToPerm.query()\
+                .filter(UserToPerm.user == user)\
+                .all()
+            for ug in defs:
+                Session().delete(ug)
+
+            if form_result['create_repo_perm']:
+                user_model.grant_perm(id, 'hg.create.repository')
             else:
-                user_model.revoke_perm(usr, 'hg.create.repository')
-                user_model.grant_perm(usr, 'hg.create.none')
-                h.flash(_("Revoked 'repository create' permission to user"),
-                        category='success')
-
-            if grant_fork_perm:
-                user_model.revoke_perm(usr, 'hg.fork.none')
-                user_model.grant_perm(usr, 'hg.fork.repository')
-                h.flash(_("Granted 'repository fork' permission to user"),
-                        category='success')
+                user_model.grant_perm(id, 'hg.create.none')
+            if form_result['create_user_group_perm']:
+                user_model.grant_perm(id, 'hg.usergroup.create.true')
             else:
-                user_model.revoke_perm(usr, 'hg.fork.repository')
-                user_model.grant_perm(usr, 'hg.fork.none')
-                h.flash(_("Revoked 'repository fork' permission to user"),
-                        category='success')
-
+                user_model.grant_perm(id, 'hg.usergroup.create.false')
+            if form_result['fork_repo_perm']:
+                user_model.grant_perm(id, 'hg.fork.repository')
+            else:
+                user_model.grant_perm(id, 'hg.fork.none')
+            h.flash(_("Updated permissions"), category='success')
             Session().commit()
         except Exception:
             log.error(traceback.format_exc())
--- a/rhodecode/controllers/admin/users_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/admin/users_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -33,19 +33,23 @@
 from pylons.i18n.translation import _
 
 from rhodecode.lib import helpers as h
-from rhodecode.lib.exceptions import UserGroupsAssignedException
-from rhodecode.lib.utils2 import safe_unicode, str2bool
-from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
+from rhodecode.lib.exceptions import UserGroupsAssignedException,\
+    RepoGroupAssignmentError
+from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
+from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator,\
+    HasUserGroupPermissionAnyDecorator, HasPermissionAnyDecorator
 from rhodecode.lib.base import BaseController, render
-
+from rhodecode.model.scm import UserGroupList
 from rhodecode.model.users_group import UserGroupModel
-
+from rhodecode.model.repo import RepoModel
 from rhodecode.model.db import User, UserGroup, UserGroupToPerm,\
     UserGroupRepoToPerm, UserGroupRepoGroupToPerm
-from rhodecode.model.forms import UserGroupForm
+from rhodecode.model.forms import UserGroupForm, UserGroupPermsForm,\
+    CustomDefaultPermissionsForm
 from rhodecode.model.meta import Session
 from rhodecode.lib.utils import action_logger
 from sqlalchemy.orm import joinedload
+from webob.exc import HTTPInternalServerError
 
 log = logging.getLogger(__name__)
 
@@ -57,19 +61,89 @@
     #     map.resource('users_group', 'users_groups')
 
     @LoginRequired()
-    @HasPermissionAllDecorator('hg.admin')
     def __before__(self):
-        c.admin_user = session.get('admin_user')
-        c.admin_username = session.get('admin_username')
         super(UsersGroupsController, self).__before__()
         c.available_permissions = config['available_permissions']
 
+    def __load_data(self, user_group_id):
+        permissions = {
+            'repositories': {},
+            'repositories_groups': {}
+        }
+        ugroup_repo_perms = UserGroupRepoToPerm.query()\
+            .options(joinedload(UserGroupRepoToPerm.permission))\
+            .options(joinedload(UserGroupRepoToPerm.repository))\
+            .filter(UserGroupRepoToPerm.users_group_id == user_group_id)\
+            .all()
+
+        for gr in ugroup_repo_perms:
+            permissions['repositories'][gr.repository.repo_name]  \
+                = gr.permission.permission_name
+
+        ugroup_group_perms = UserGroupRepoGroupToPerm.query()\
+            .options(joinedload(UserGroupRepoGroupToPerm.permission))\
+            .options(joinedload(UserGroupRepoGroupToPerm.group))\
+            .filter(UserGroupRepoGroupToPerm.users_group_id == user_group_id)\
+            .all()
+
+        for gr in ugroup_group_perms:
+            permissions['repositories_groups'][gr.group.group_name] \
+                = gr.permission.permission_name
+        c.permissions = permissions
+        c.group_members_obj = sorted((x.user for x in c.users_group.members),
+                                     key=lambda u: u.username.lower())
+
+        c.group_members = [(x.user_id, x.username) for x in c.group_members_obj]
+        c.available_members = sorted(((x.user_id, x.username) for x in
+                                      User.query().all()),
+                                     key=lambda u: u[1].lower())
+        repo_model = RepoModel()
+        c.users_array = repo_model.get_users_js()
+        c.users_groups_array = repo_model.get_users_groups_js()
+        c.available_permissions = config['available_permissions']
+
+    def __load_defaults(self, user_group_id):
+        """
+        Load defaults settings for edit, and update
+
+        :param user_group_id:
+        """
+        user_group = UserGroup.get_or_404(user_group_id)
+        data = user_group.get_dict()
+
+        ug_model = UserGroupModel()
+
+        data.update({
+            'create_repo_perm': ug_model.has_perm(user_group,
+                                                  'hg.create.repository'),
+            'create_user_group_perm': ug_model.has_perm(user_group,
+                                                  'hg.usergroup.create.true'),
+            'fork_repo_perm': ug_model.has_perm(user_group,
+                                                'hg.fork.repository'),
+        })
+
+        # fill user group users
+        for p in user_group.user_user_group_to_perm:
+            data.update({'u_perm_%s' % p.user.username:
+                             p.permission.permission_name})
+
+        for p in user_group.user_group_user_group_to_perm:
+            data.update({'g_perm_%s' % p.user_group.users_group_name:
+                             p.permission.permission_name})
+
+        return data
+
     def index(self, format='html'):
         """GET /users_groups: All items in the collection"""
         # url('users_groups')
-        c.users_groups_list = UserGroup().query().all()
+
+        group_iter = UserGroupList(UserGroup().query().all(),
+                                   perm_set=['usergroup.admin'])
+        sk = lambda g: g.users_group_name
+        c.users_groups_list = sorted(group_iter, key=sk)
         return render('admin/users_groups/users_groups.html')
 
+    @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
     def create(self):
         """POST /users_groups: Create a new item"""
         # url('users_groups')
@@ -78,7 +152,9 @@
         try:
             form_result = users_group_form.to_python(dict(request.POST))
             UserGroupModel().create(name=form_result['users_group_name'],
-                                     active=form_result['users_group_active'])
+                                    owner=self.rhodecode_user.user_id,
+                                    active=form_result['users_group_active'])
+
             gr = form_result['users_group_name']
             action_logger(self.rhodecode_user,
                           'admin_created_users_group:%s' % gr,
@@ -99,45 +175,13 @@
 
         return redirect(url('users_groups'))
 
+    @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
     def new(self, format='html'):
         """GET /users_groups/new: Form to create a new item"""
         # url('new_users_group')
         return render('admin/users_groups/users_group_add.html')
 
-    def _load_data(self, id):
-        c.users_group.permissions = {
-            'repositories': {},
-            'repositories_groups': {}
-        }
-
-        ugroup_repo_perms = UserGroupRepoToPerm.query()\
-            .options(joinedload(UserGroupRepoToPerm.permission))\
-            .options(joinedload(UserGroupRepoToPerm.repository))\
-            .filter(UserGroupRepoToPerm.users_group_id == id)\
-            .all()
-
-        for gr in ugroup_repo_perms:
-            c.users_group.permissions['repositories'][gr.repository.repo_name]  \
-                = gr.permission.permission_name
-
-        ugroup_group_perms = UserGroupRepoGroupToPerm.query()\
-            .options(joinedload(UserGroupRepoGroupToPerm.permission))\
-            .options(joinedload(UserGroupRepoGroupToPerm.group))\
-            .filter(UserGroupRepoGroupToPerm.users_group_id == id)\
-            .all()
-
-        for gr in ugroup_group_perms:
-            c.users_group.permissions['repositories_groups'][gr.group.group_name] \
-                = gr.permission.permission_name
-
-        c.group_members_obj = sorted((x.user for x in c.users_group.members),
-                                     key=lambda u: u.username.lower())
-        c.group_members = [(x.user_id, x.username) for x in
-                           c.group_members_obj]
-        c.available_members = sorted(((x.user_id, x.username) for x in
-                                      User.query().all()),
-                                     key=lambda u: u[1].lower())
-
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
     def update(self, id):
         """PUT /users_groups/id: Update an existing item"""
         # Forms posted to this method should contain a hidden field:
@@ -148,7 +192,7 @@
         # url('users_group', id=ID)
 
         c.users_group = UserGroup.get_or_404(id)
-        self._load_data(id)
+        self.__load_data(id)
 
         available_members = [safe_unicode(x[0]) for x in c.available_members]
 
@@ -190,6 +234,7 @@
 
         return redirect(url('edit_users_group', id=id))
 
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
     def delete(self, id):
         """DELETE /users_groups/id: Delete an existing item"""
         # Forms posted to this method should contain a hidden field:
@@ -211,25 +256,76 @@
                     category='error')
         return redirect(url('users_groups'))
 
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
+    def set_user_group_perm_member(self, id):
+        """
+        grant permission for given usergroup
+
+        :param id:
+        """
+        user_group = UserGroup.get_or_404(id)
+        form = UserGroupPermsForm()().to_python(request.POST)
+
+        # set the permissions !
+        try:
+            UserGroupModel()._update_permissions(user_group, form['perms_new'],
+                                                 form['perms_updates'])
+        except RepoGroupAssignmentError:
+            h.flash(_('Target group cannot be the same'), category='error')
+            return redirect(url('edit_users_group', id=id))
+        #TODO: implement this
+        #action_logger(self.rhodecode_user, 'admin_changed_repo_permissions',
+        #              repo_name, self.ip_addr, self.sa)
+        Session().commit()
+        h.flash(_('User Group permissions updated'), category='success')
+        return redirect(url('edit_users_group', id=id))
+
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
+    def delete_user_group_perm_member(self, id):
+        """
+        DELETE an existing repository group permission user
+
+        :param group_name:
+        """
+        try:
+            obj_type = request.POST.get('obj_type')
+            obj_id = None
+            if obj_type == 'user':
+                obj_id = safe_int(request.POST.get('user_id'))
+            elif obj_type == 'user_group':
+                obj_id = safe_int(request.POST.get('user_group_id'))
+
+            if not c.rhodecode_user.is_admin:
+                if obj_type == 'user' and c.rhodecode_user.user_id == obj_id:
+                    msg = _('Cannot revoke permission for yourself as admin')
+                    h.flash(msg, category='warning')
+                    raise Exception('revoke admin permission on self')
+            if obj_type == 'user':
+                UserGroupModel().revoke_user_permission(user_group=id,
+                                                        user=obj_id)
+            elif obj_type == 'user_group':
+                UserGroupModel().revoke_users_group_permission(target_user_group=id,
+                                                               user_group=obj_id)
+            Session().commit()
+        except Exception:
+            log.error(traceback.format_exc())
+            h.flash(_('An error occurred during revoking of permission'),
+                    category='error')
+            raise HTTPInternalServerError()
+
     def show(self, id, format='html'):
         """GET /users_groups/id: Show a specific item"""
         # url('users_group', id=ID)
 
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
     def edit(self, id, format='html'):
         """GET /users_groups/id/edit: Form to edit an existing item"""
         # url('edit_users_group', id=ID)
 
         c.users_group = UserGroup.get_or_404(id)
-        self._load_data(id)
+        self.__load_data(id)
 
-        ug_model = UserGroupModel()
-        defaults = c.users_group.get_dict()
-        defaults.update({
-            'create_repo_perm': ug_model.has_perm(c.users_group,
-                                                  'hg.create.repository'),
-            'fork_repo_perm': ug_model.has_perm(c.users_group,
-                                                'hg.fork.repository'),
-        })
+        defaults = self.__load_defaults(id)
 
         return htmlfill.render(
             render('admin/users_groups/users_group_edit.html'),
@@ -238,43 +334,42 @@
             force_defaults=False
         )
 
+    @HasUserGroupPermissionAnyDecorator('usergroup.admin')
     def update_perm(self, id):
         """PUT /users_perm/id: Update an existing item"""
         # url('users_group_perm', id=ID, method='put')
 
         users_group = UserGroup.get_or_404(id)
-        grant_create_perm = str2bool(request.POST.get('create_repo_perm'))
-        grant_fork_perm = str2bool(request.POST.get('fork_repo_perm'))
-        inherit_perms = str2bool(request.POST.get('inherit_default_permissions'))
-
-        usergroup_model = UserGroupModel()
 
         try:
+            form = CustomDefaultPermissionsForm()()
+            form_result = form.to_python(request.POST)
+
+            inherit_perms = form_result['inherit_default_permissions']
             users_group.inherit_default_permissions = inherit_perms
             Session().add(users_group)
+            usergroup_model = UserGroupModel()
 
-            if grant_create_perm:
-                usergroup_model.revoke_perm(id, 'hg.create.none')
-                usergroup_model.grant_perm(id, 'hg.create.repository')
-                h.flash(_("Granted 'repository create' permission to user group"),
-                        category='success')
-            else:
-                usergroup_model.revoke_perm(id, 'hg.create.repository')
-                usergroup_model.grant_perm(id, 'hg.create.none')
-                h.flash(_("Revoked 'repository create' permission to user group"),
-                        category='success')
+            defs = UserGroupToPerm.query()\
+                .filter(UserGroupToPerm.users_group == users_group)\
+                .all()
+            for ug in defs:
+                Session().delete(ug)
 
-            if grant_fork_perm:
-                usergroup_model.revoke_perm(id, 'hg.fork.none')
-                usergroup_model.grant_perm(id, 'hg.fork.repository')
-                h.flash(_("Granted 'repository fork' permission to user group"),
-                        category='success')
+            if form_result['create_repo_perm']:
+                usergroup_model.grant_perm(id, 'hg.create.repository')
+            else:
+                usergroup_model.grant_perm(id, 'hg.create.none')
+            if form_result['create_user_group_perm']:
+                usergroup_model.grant_perm(id, 'hg.usergroup.create.true')
             else:
-                usergroup_model.revoke_perm(id, 'hg.fork.repository')
+                usergroup_model.grant_perm(id, 'hg.usergroup.create.false')
+            if form_result['fork_repo_perm']:
+                usergroup_model.grant_perm(id, 'hg.fork.repository')
+            else:
                 usergroup_model.grant_perm(id, 'hg.fork.none')
-                h.flash(_("Revoked 'repository fork' permission to user group"),
-                        category='success')
 
+            h.flash(_("Updated permissions"), category='success')
             Session().commit()
         except Exception:
             log.error(traceback.format_exc())
--- a/rhodecode/controllers/api/api.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/api/api.py	Fri Jun 07 00:31:11 2013 +0200
@@ -25,6 +25,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA  02110-1301, USA.
 
+import time
 import traceback
 import logging
 
@@ -34,19 +35,30 @@
     HasPermissionAnyApi, HasRepoPermissionAnyApi
 from rhodecode.lib.utils import map_groups, repo2db_mapper
 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_int
-from rhodecode.lib import helpers as h
 from rhodecode.model.meta import Session
 from rhodecode.model.scm import ScmModel
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.user import UserModel
 from rhodecode.model.users_group import UserGroupModel
+from rhodecode.model.repos_group import ReposGroupModel
 from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap,\
-    Permission
+    Permission, User, Gist
 from rhodecode.lib.compat import json
+from rhodecode.lib.exceptions import DefaultUserException
+from rhodecode.model.gist import GistModel
 
 log = logging.getLogger(__name__)
 
 
+def store_update(updates, attr, name):
+    """
+    Stores param in updates dict if it's not instance of Optional
+    allows easy updates of passed in params
+    """
+    if not isinstance(attr, Optional):
+        updates[name] = attr
+
+
 class OptionalAttr(object):
     """
     Special Optional Option that defines other attribute
@@ -113,7 +125,7 @@
     """
     Get repo by id or name or return JsonRPCError if not found
 
-    :param userid:
+    :param repoid:
     """
     repo = RepoModel().get_repo(repoid)
     if repo is None:
@@ -121,6 +133,19 @@
     return repo
 
 
+def get_repo_group_or_error(repogroupid):
+    """
+    Get repo group by id or name or return JsonRPCError if not found
+
+    :param repogroupid:
+    """
+    repo_group = ReposGroupModel()._get_repo_group(repogroupid)
+    if repo_group is None:
+        raise JSONRPCError(
+            'repository group `%s` does not exist' % (repogroupid,))
+    return repo_group
+
+
 def get_users_group_or_error(usersgroupid):
     """
     Get user group by id or name or return JsonRPCError if not found
@@ -212,7 +237,7 @@
         :param repoid:
         """
         repo = get_repo_or_error(repoid)
-        if HasPermissionAnyApi('hg.admin')(user=apiuser) is False:
+        if not HasPermissionAnyApi('hg.admin')(user=apiuser):
             # check if we have admin permission for this repo !
             if HasRepoPermissionAnyApi('repository.admin',
                                        'repository.write')(user=apiuser,
@@ -220,16 +245,15 @@
                 raise JSONRPCError('repository `%s` does not exist' % (repoid))
 
         try:
-            invalidated_keys = ScmModel().mark_for_invalidation(repo.repo_name)
-            Session().commit()
-            return ('Cache for repository `%s` was invalidated: '
-                    'invalidated cache keys: %s' % (repoid, invalidated_keys))
+            ScmModel().mark_for_invalidation(repo.repo_name)
+            return ('Caches of repository `%s` was invalidated' % repoid)
         except Exception:
             log.error(traceback.format_exc())
             raise JSONRPCError(
                 'Error occurred during cache invalidation action'
             )
 
+    # permission check inside
     def lock(self, apiuser, repoid, locked=Optional(None),
              userid=Optional(OAttr('apiuser'))):
         """
@@ -266,27 +290,47 @@
             lockobj = Repository.getlock(repo)
 
             if lockobj[0] is None:
-                return ('Repo `%s` not locked. Locked=`False`.'
-                        % (repo.repo_name))
+                _d = {
+                    'repo': repo.repo_name,
+                    'locked': False,
+                    'locked_since': None,
+                    'locked_by': None,
+                    'msg': 'Repo `%s` not locked.' % repo.repo_name
+                }
+                return _d
             else:
                 userid, time_ = lockobj
-                user = get_user_or_error(userid)
+                lock_user = get_user_or_error(userid)
+                _d = {
+                    'repo': repo.repo_name,
+                    'locked': True,
+                    'locked_since': time_,
+                    'locked_by': lock_user.username,
+                    'msg': ('Repo `%s` locked by `%s`. '
+                            % (repo.repo_name,
+                               json.dumps(time_to_datetime(time_))))
+                }
+                return _d
 
-                return ('Repo `%s` locked by `%s`. Locked=`True`. '
-                        'Locked since: `%s`'
-                    % (repo.repo_name, user.username,
-                       json.dumps(time_to_datetime(time_))))
-
+        # force locked state through a flag
         else:
             locked = str2bool(locked)
             try:
                 if locked:
-                    Repository.lock(repo, user.user_id)
+                    lock_time = time.time()
+                    Repository.lock(repo, user.user_id, lock_time)
                 else:
+                    lock_time = None
                     Repository.unlock(repo)
-
-                return ('User `%s` set lock state for repo `%s` to `%s`'
-                        % (user.username, repo.repo_name, locked))
+                _d = {
+                    'repo': repo.repo_name,
+                    'locked': locked,
+                    'locked_since': lock_time,
+                    'locked_by': user.username,
+                    'msg': ('User `%s` set lock state for repo `%s` to `%s`'
+                            % (user.username, repo.repo_name, locked))
+                }
+                return _d
             except Exception:
                 log.error(traceback.format_exc())
                 raise JSONRPCError(
@@ -302,9 +346,8 @@
         :param apiuser:
         :param userid:
         """
-        if HasPermissionAnyApi('hg.admin')(user=apiuser):
-            pass
-        else:
+
+        if not HasPermissionAnyApi('hg.admin')(user=apiuser):
             #make sure normal user does not pass someone else userid,
             #he is not allowed to do that
             if not isinstance(userid, Optional) and userid != apiuser.user_id:
@@ -354,7 +397,7 @@
         :param apiuser:
         :param userid:
         """
-        if HasPermissionAnyApi('hg.admin')(user=apiuser) is False:
+        if not HasPermissionAnyApi('hg.admin')(user=apiuser):
             #make sure normal user does not pass someone else userid,
             #he is not allowed to do that
             if not isinstance(userid, Optional) and userid != apiuser.user_id:
@@ -379,12 +422,15 @@
         """
 
         result = []
-        for user in UserModel().get_all():
+        users_list = User.query().order_by(User.username)\
+                        .filter(User.username != User.DEFAULT_USER)\
+                        .all()
+        for user in users_list:
             result.append(user.get_api_data())
         return result
 
     @HasPermissionAllDecorator('hg.admin')
-    def create_user(self, apiuser, username, email, password,
+    def create_user(self, apiuser, username, email, password=Optional(None),
                     firstname=Optional(None), lastname=Optional(None),
                     active=Optional(True), admin=Optional(False),
                     ldap_dn=Optional(None)):
@@ -479,6 +525,9 @@
                 msg='updated user ID:%s %s' % (user.user_id, user.username),
                 user=user.get_api_data()
             )
+        except DefaultUserException:
+            log.error(traceback.format_exc())
+            raise JSONRPCError('editing default user is forbidden')
         except Exception:
             log.error(traceback.format_exc())
             raise JSONRPCError('failed to update user `%s`' % userid)
@@ -538,12 +587,15 @@
         return result
 
     @HasPermissionAllDecorator('hg.admin')
-    def create_users_group(self, apiuser, group_name, active=Optional(True)):
+    def create_users_group(self, apiuser, group_name,
+                           owner=Optional(OAttr('apiuser')),
+                           active=Optional(True)):
         """
         Creates an new usergroup
 
         :param apiuser:
         :param group_name:
+        :param owner:
         :param active:
         """
 
@@ -551,8 +603,14 @@
             raise JSONRPCError("user group `%s` already exist" % group_name)
 
         try:
+            if isinstance(owner, Optional):
+                owner = apiuser.user_id
+
+            owner = get_user_or_error(owner)
             active = Optional.extract(active)
-            ug = UserGroupModel().create(name=group_name, active=active)
+            ug = UserGroupModel().create(name=group_name,
+                                         owner=owner,
+                                         active=active)
             Session().commit()
             return dict(
                 msg='created new user group `%s`' % group_name,
@@ -633,10 +691,10 @@
         """
         repo = get_repo_or_error(repoid)
 
-        if HasPermissionAnyApi('hg.admin')(user=apiuser) is False:
+        if not HasPermissionAnyApi('hg.admin')(user=apiuser):
             # check if we have admin permission for this repo !
-            if HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
-                                            repo_name=repo.repo_name) is False:
+            if not HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
+                                            repo_name=repo.repo_name):
                 raise JSONRPCError('repository `%s` does not exist' % (repoid))
 
         members = []
@@ -665,6 +723,7 @@
         data['followers'] = followers
         return data
 
+    # permission check inside
     def get_repos(self, apiuser):
         """"
         Get all repositories
@@ -792,6 +851,71 @@
             log.error(traceback.format_exc())
             raise JSONRPCError('failed to create repository `%s`' % repo_name)
 
+    # permission check inside
+    def update_repo(self, apiuser, repoid, name=Optional(None),
+                    owner=Optional(OAttr('apiuser')),
+                    group=Optional(None),
+                    description=Optional(''), private=Optional(False),
+                    clone_uri=Optional(None), landing_rev=Optional('tip'),
+                    enable_statistics=Optional(False),
+                    enable_locking=Optional(False),
+                    enable_downloads=Optional(False)):
+
+        """
+        Updates repo
+
+        :param apiuser: filled automatically from apikey
+        :type apiuser: AuthUser
+        :param repoid: repository name or repository id
+        :type repoid: str or int
+        :param name:
+        :param owner:
+        :param group:
+        :param description:
+        :param private:
+        :param clone_uri:
+        :param landing_rev:
+        :param enable_statistics:
+        :param enable_locking:
+        :param enable_downloads:
+        """
+        repo = get_repo_or_error(repoid)
+        if not HasPermissionAnyApi('hg.admin')(user=apiuser):
+            # check if we have admin permission for this repo !
+            if not HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
+                                                               repo_name=repo.repo_name):
+                raise JSONRPCError('repository `%s` does not exist' % (repoid,))
+
+        updates = {
+            # update function requires this.
+            'repo_name': repo.repo_name
+        }
+        repo_group = group
+        if not isinstance(repo_group, Optional):
+            repo_group = get_repo_group_or_error(repo_group)
+            repo_group = repo_group.group_id
+        try:
+            store_update(updates, name, 'repo_name')
+            store_update(updates, repo_group, 'repo_group')
+            store_update(updates, owner, 'user')
+            store_update(updates, description, 'repo_description')
+            store_update(updates, private, 'repo_private')
+            store_update(updates, clone_uri, 'clone_uri')
+            store_update(updates, landing_rev, 'repo_landing_rev')
+            store_update(updates, enable_statistics, 'repo_enable_statistics')
+            store_update(updates, enable_locking, 'repo_enable_locking')
+            store_update(updates, enable_downloads, 'repo_enable_downloads')
+
+            RepoModel().update(repo, **updates)
+            Session().commit()
+            return dict(
+                msg='updated repo ID:%s %s' % (repo.repo_id, repo.repo_name),
+                repository=repo.get_api_data()
+            )
+        except Exception:
+            log.error(traceback.format_exc())
+            raise JSONRPCError('failed to update repo `%s`' % repoid)
+
     @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
     def fork_repo(self, apiuser, repoid, fork_name, owner=Optional(OAttr('apiuser')),
                   description=Optional(''), copy_permissions=Optional(False),
@@ -853,6 +977,7 @@
                                                             fork_name)
             )
 
+    # perms handled inside
     def delete_repo(self, apiuser, repoid, forks=Optional(None)):
         """
         Deletes a given repository
@@ -874,9 +999,9 @@
             _forks_msg = ''
             _forks = [f for f in repo.forks]
             if handle_forks == 'detach':
-                _forks_msg = ' ' + _('Detached %s forks') % len(_forks)
+                _forks_msg = ' ' + 'Detached %s forks' % len(_forks)
             elif handle_forks == 'delete':
-                _forks_msg = ' ' + _('Deleted %s forks') % len(_forks)
+                _forks_msg = ' ' + 'Deleted %s forks' % len(_forks)
             elif _forks:
                 raise JSONRPCError(
                     'Cannot delete `%s` it still contains attached forks'
@@ -1029,3 +1154,34 @@
                     users_group.users_group_name, repo.repo_name
                 )
             )
+
+    def create_gist(self, apiuser, files, owner=Optional(OAttr('apiuser')),
+                    gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1),
+                    description=Optional('')):
+
+        try:
+            if isinstance(owner, Optional):
+                owner = apiuser.user_id
+
+            owner = get_user_or_error(owner)
+            description = Optional.extract(description)
+            gist_type = Optional.extract(gist_type)
+            lifetime = Optional.extract(lifetime)
+
+            # files: {
+            #    'filename': {'content':'...', 'lexer': null},
+            #    'filename2': {'content':'...', 'lexer': null}
+            #}
+            gist = GistModel().create(description=description,
+                                      owner=owner,
+                                      gist_mapping=files,
+                                      gist_type=gist_type,
+                                      lifetime=lifetime)
+            Session().commit()
+            return dict(
+                msg='created new gist',
+                gist=gist.get_api_data()
+            )
+        except Exception:
+            log.error(traceback.format_exc())
+            raise JSONRPCError('failed to create gist')
--- a/rhodecode/controllers/bookmarks.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/bookmarks.py	Fri Jun 07 00:31:11 2013 +0200
@@ -36,12 +36,12 @@
 
 class BookmarksController(BaseRepoController):
 
+    def __before__(self):
+        super(BookmarksController, self).__before__()
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
-    def __before__(self):
-        super(BookmarksController, self).__before__()
-
     def index(self):
         if c.rhodecode_repo.alias != 'hg':
             raise HTTPNotFound()
--- a/rhodecode/controllers/branches.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/branches.py	Fri Jun 07 00:31:11 2013 +0200
@@ -38,12 +38,12 @@
 
 class BranchesController(BaseRepoController):
 
+    def __before__(self):
+        super(BranchesController, self).__before__()
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
-    def __before__(self):
-        super(BranchesController, self).__before__()
-
     def index(self):
 
         def _branchtags(localrepo):
@@ -72,5 +72,4 @@
                                              key=lambda ctx: ctx[0],
                                              reverse=False))
 
-
         return render('branches/branches.html')
--- a/rhodecode/controllers/changelog.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/changelog.py	Fri Jun 07 00:31:11 2013 +0200
@@ -37,22 +37,65 @@
 from rhodecode.lib.compat import json
 from rhodecode.lib.graphmod import _colored, _dagwalker
 from rhodecode.lib.vcs.exceptions import RepositoryError, ChangesetDoesNotExistError,\
-    EmptyRepositoryError
+    ChangesetError, NodeDoesNotExistError, EmptyRepositoryError
 from rhodecode.lib.utils2 import safe_int
+from webob.exc import HTTPNotFound
 
 log = logging.getLogger(__name__)
 
 
+def _load_changelog_summary():
+    p = safe_int(request.GET.get('page'), 1)
+    size = safe_int(request.GET.get('size'), 10)
+
+    def url_generator(**kw):
+        return url('changelog_summary_home',
+                   repo_name=c.rhodecode_db_repo.repo_name, size=size, **kw)
+
+    collection = c.rhodecode_repo
+
+    c.repo_changesets = RepoPage(collection, page=p,
+                                 items_per_page=size,
+                                 url=url_generator)
+    page_revisions = [x.raw_id for x in list(c.repo_changesets)]
+    c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
+    c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
+
+
 class ChangelogController(BaseRepoController):
 
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
     def __before__(self):
         super(ChangelogController, self).__before__()
         c.affected_files_cut_off = 60
 
-    def index(self):
+    def _graph(self, repo, revs_int, repo_size, size, p):
+        """
+        Generates a DAG graph for repo
+
+        :param repo:
+        :param revs_int:
+        :param repo_size:
+        :param size:
+        :param p:
+        """
+        if not revs_int:
+            c.jsdata = json.dumps([])
+            return
+
+        data = []
+        revs = revs_int
+
+        dag = _dagwalker(repo, revs, repo.alias)
+        dag = _colored(dag)
+        for (id, type, ctx, vtx, edges) in dag:
+            data.append(['', vtx, edges])
+
+        c.jsdata = json.dumps(data)
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
+    def index(self, repo_name, revision=None, f_path=None):
         limit = 100
         default = 20
         if request.GET.get('size'):
@@ -65,20 +108,33 @@
         c.size = max(c.size, 1)
         p = safe_int(request.GET.get('page', 1), 1)
         branch_name = request.GET.get('branch', None)
+        c.changelog_for_path = f_path
         try:
-            if branch_name:
-                collection = [z for z in
-                              c.rhodecode_repo.get_changesets(start=0,
-                                                    branch_name=branch_name)]
-                c.total_cs = len(collection)
+
+            if f_path:
+                log.debug('generating changelog for path %s' % f_path)
+                # get the history for the file !
+                tip_cs = c.rhodecode_repo.get_changeset()
+                try:
+                    collection = tip_cs.get_file_history(f_path)
+                except (NodeDoesNotExistError, ChangesetError):
+                    #this node is not present at tip !
+                    try:
+                        cs = self.__get_cs_or_redirect(revision, repo_name)
+                        collection = cs.get_file_history(f_path)
+                    except RepositoryError, e:
+                        h.flash(str(e), category='warning')
+                        redirect(h.url('changelog_home', repo_name=repo_name))
+                collection = list(reversed(collection))
             else:
-                collection = c.rhodecode_repo
-                c.total_cs = len(c.rhodecode_repo)
+                collection = c.rhodecode_repo.get_changesets(start=0,
+                                                        branch_name=branch_name)
+            c.total_cs = len(collection)
 
             c.pagination = RepoPage(collection, page=p, item_count=c.total_cs,
-                                    items_per_page=c.size, branch=branch_name)
+                                    items_per_page=c.size, branch=branch_name,)
             collection = list(c.pagination)
-            page_revisions = [x.raw_id for x in collection]
+            page_revisions = [x.raw_id for x in c.pagination]
             c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
             c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
         except (EmptyRepositoryError), e:
@@ -89,37 +145,31 @@
             h.flash(str(e), category='error')
             return redirect(url('changelog_home', repo_name=c.repo_name))
 
-        self._graph(c.rhodecode_repo, collection, c.total_cs, c.size, p)
-
         c.branch_name = branch_name
         c.branch_filters = [('', _('All Branches'))] + \
             [(k, k) for k in c.rhodecode_repo.branches.keys()]
+        _revs = []
+        if not f_path:
+            _revs = [x.revision for x in c.pagination]
+        self._graph(c.rhodecode_repo, _revs, c.total_cs, c.size, p)
 
         return render('changelog/changelog.html')
 
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def changelog_details(self, cs):
         if request.environ.get('HTTP_X_PARTIAL_XHR'):
             c.cs = c.rhodecode_repo.get_changeset(cs)
             return render('changelog/changelog_details.html')
-
-    def _graph(self, repo, collection, repo_size, size, p):
-        """
-        Generates a DAG graph for mercurial
+        raise HTTPNotFound()
 
-        :param repo: repo instance
-        :param size: number of commits to show
-        :param p: page number
-        """
-        if not collection:
-            c.jsdata = json.dumps([])
-            return
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
+    def changelog_summary(self, repo_name):
+        if request.environ.get('HTTP_X_PARTIAL_XHR'):
+            _load_changelog_summary()
 
-        data = []
-        revs = [x.revision for x in collection]
-
-        dag = _dagwalker(repo, revs, repo.alias)
-        dag = _colored(dag)
-        for (id, type, ctx, vtx, edges) in dag:
-            data.append(['', vtx, edges])
-
-        c.jsdata = json.dumps(data)
+            return render('changelog/changelog_summary_data.html')
+        raise HTTPNotFound()
--- a/rhodecode/controllers/changeset.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/changeset.py	Fri Jun 07 00:31:11 2013 +0200
@@ -37,7 +37,8 @@
     ChangesetDoesNotExistError
 
 import rhodecode.lib.helpers as h
-from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
+from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
+    NotAnonymous
 from rhodecode.lib.base import BaseRepoController, render
 from rhodecode.lib.utils import action_logger
 from rhodecode.lib.compat import OrderedDict
@@ -169,9 +170,6 @@
 
 class ChangesetController(BaseRepoController):
 
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
     def __before__(self):
         super(ChangesetController, self).__before__()
         c.affected_files_cut_off = 60
@@ -179,7 +177,7 @@
         c.users_array = repo_model.get_users_js()
         c.users_groups_array = repo_model.get_users_groups_js()
 
-    def index(self, revision, method='show'):
+    def _index(self, revision, method):
         c.anchor_url = anchor_url
         c.ignorews_url = _ignorews_url
         c.context_url = _context_url
@@ -236,7 +234,7 @@
                 # show comments from them
 
                 prs = set([x.pull_request for x in
-                           filter(lambda x: x.pull_request != None, st)])
+                           filter(lambda x: x.pull_request is not None, st)])
 
                 for pr in prs:
                     c.comments.extend(pr.comments)
@@ -267,9 +265,8 @@
                     c.limited_diff = True
                 for f in _parsed:
                     st = f['stats']
-                    if st[0] != 'b':
-                        c.lines_added += st[0]
-                        c.lines_deleted += st[1]
+                    c.lines_added += st['added']
+                    c.lines_deleted += st['deleted']
                     fid = h.FID(changeset.raw_id, f['filename'])
                     diff = diff_processor.as_html(enable_comments=enable_comments,
                                                   parsed_lines=[f])
@@ -311,15 +308,34 @@
             else:
                 return render('changeset/changeset_range.html')
 
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
+    def index(self, revision, method='show'):
+        return self._index(revision, method=method)
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def changeset_raw(self, revision):
-        return self.index(revision, method='raw')
+        return self._index(revision, method='raw')
 
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def changeset_patch(self, revision):
-        return self.index(revision, method='patch')
+        return self._index(revision, method='patch')
 
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def changeset_download(self, revision):
-        return self.index(revision, method='download')
+        return self._index(revision, method='download')
 
+    @LoginRequired()
+    @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def comment(self, repo_name, revision):
         status = request.POST.get('changeset_status')
@@ -382,6 +398,22 @@
 
         return data
 
+    @LoginRequired()
+    @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
+    def preview_comment(self):
+        if not request.environ.get('HTTP_X_PARTIAL_XHR'):
+            raise HTTPBadRequest()
+        text = request.POST.get('text')
+        if text:
+            return h.rst_w_mentions(text)
+        return ''
+
+    @LoginRequired()
+    @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def delete_comment(self, repo_name, comment_id):
         co = ChangesetComment.get(comment_id)
@@ -393,6 +425,9 @@
         else:
             raise HTTPForbidden()
 
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def changeset_info(self, repo_name, revision):
         if request.is_xhr:
--- a/rhodecode/controllers/compare.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/compare.py	Fri Jun 07 00:31:11 2013 +0200
@@ -23,8 +23,10 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
 import logging
 import traceback
+import re
 
 from webob.exc import HTTPNotFound
 from pylons import request, response, session, tmpl_context as c, url
@@ -32,25 +34,23 @@
 from pylons.i18n.translation import _
 
 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError, RepositoryError
+from rhodecode.lib.vcs.utils import safe_str
+from rhodecode.lib.vcs.utils.hgcompat import scmutil
 from rhodecode.lib import helpers as h
 from rhodecode.lib.base import BaseRepoController, render
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
-from rhodecode.lib import diffs
+from rhodecode.lib import diffs, unionrepo
 
 from rhodecode.model.db import Repository
-from rhodecode.model.pull_request import PullRequestModel
 from webob.exc import HTTPBadRequest
 from rhodecode.lib.diffs import LimitedDiffContainer
-from rhodecode.lib.vcs.backends.base import EmptyChangeset
+
 
 log = logging.getLogger(__name__)
 
 
 class CompareController(BaseRepoController):
 
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
     def __before__(self):
         super(CompareController, self).__before__()
 
@@ -82,6 +82,81 @@
                 redirect(h.url('summary_home', repo_name=repo.repo_name))
             raise HTTPBadRequest()
 
+    def _get_changesets(self, alias, org_repo, org_ref, other_repo, other_ref, merge):
+        """
+        Returns a list of changesets that can be merged from org_repo@org_ref
+        to other_repo@other_ref ... and the ancestor that would be used for merge
+
+        :param org_repo:
+        :param org_ref:
+        :param other_repo:
+        :param other_ref:
+        :param tmp:
+        """
+
+        ancestor = None
+
+        if alias == 'hg':
+            # lookup up the exact node id
+            _revset_predicates = {
+                    'branch': 'branch',
+                    'book': 'bookmark',
+                    'tag': 'tag',
+                    'rev': 'id',
+                }
+
+            org_rev_spec = "max(%s(%%s))" % _revset_predicates[org_ref[0]]
+            org_revs = org_repo._repo.revs(org_rev_spec, safe_str(org_ref[1]))
+            org_rev = org_repo._repo[org_revs[-1] if org_revs else -1].hex()
+
+            other_revs_spec = "max(%s(%%s))" % _revset_predicates[other_ref[0]]
+            other_revs = other_repo._repo.revs(other_revs_spec, safe_str(other_ref[1]))
+            other_rev = other_repo._repo[other_revs[-1] if other_revs else -1].hex()
+
+            #case two independent repos
+            if org_repo != other_repo:
+                hgrepo = unionrepo.unionrepository(other_repo.baseui,
+                                                   other_repo.path,
+                                                   org_repo.path)
+                # all the changesets we are looking for will be in other_repo,
+                # so rev numbers from hgrepo can be used in other_repo
+
+            #no remote compare do it on the same repository
+            else:
+                hgrepo = other_repo._repo
+
+            if merge:
+                revs = hgrepo.revs("ancestors(id(%s)) and not ancestors(id(%s)) and not id(%s)",
+                                   other_rev, org_rev, org_rev)
+
+                ancestors = hgrepo.revs("ancestor(id(%s), id(%s))", org_rev, other_rev)
+                if ancestors:
+                    # pick arbitrary ancestor - but there is usually only one
+                    ancestor = hgrepo[ancestors[0]].hex()
+            else:
+                # TODO: have both + and - changesets
+                revs = hgrepo.revs("id(%s) :: id(%s) - id(%s)",
+                                   org_rev, other_rev, org_rev)
+
+            changesets = [other_repo.get_changeset(rev) for rev in revs]
+
+        elif alias == 'git':
+            if org_repo != other_repo:
+                raise Exception('Comparing of different GIT repositories is not'
+                                'allowed. Got %s != %s' % (org_repo, other_repo))
+
+            so, se = org_repo.run_git_command(
+                'log --reverse --pretty="format: %%H" -s -p %s..%s'
+                    % (org_ref[1], other_ref[1])
+            )
+            changesets = [org_repo.get_changeset(cs)
+                          for cs in re.findall(r'[0-9a-fA-F]{40}', so)]
+
+        return changesets, ancestor
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
         # org_ref will be evaluated in org_repo
         org_repo = c.rhodecode_db_repo.repo_name
@@ -140,13 +215,17 @@
         c.org_ref_type = org_ref[0]
         c.other_ref_type = other_ref[0]
 
-        c.cs_ranges, c.ancestor = PullRequestModel().get_compare_data(
-            org_repo, org_ref, other_repo, other_ref, merge)
+        c.cs_ranges, c.ancestor = self._get_changesets(org_repo.scm_instance.alias,
+                                                       org_repo.scm_instance, org_ref,
+                                                       other_repo.scm_instance, other_ref,
+                                                       merge)
 
         c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
                                                    c.cs_ranges])
+        if not c.ancestor:
+            log.warning('Unable to find ancestor revision')
+
         if partial:
-            assert c.ancestor
             return render('compare/compare_cs.html')
 
         if c.ancestor:
@@ -161,9 +240,11 @@
 
         diff_limit = self.cut_off_limit if not c.fulldiff else None
 
-        _diff = diffs.differ(org_repo, org_ref, other_repo, other_ref)
+        log.debug('running diff between %s and %s in %s'
+                  % (org_ref, other_ref, org_repo.scm_instance.path))
+        txtdiff = org_repo.scm_instance.get_diff(rev1=safe_str(org_ref[1]), rev2=safe_str(other_ref[1]))
 
-        diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
+        diff_processor = diffs.DiffProcessor(txtdiff or '', format='gitdiff',
                                              diff_limit=diff_limit)
         _parsed = diff_processor.prepare()
 
@@ -177,12 +258,12 @@
         c.lines_deleted = 0
         for f in _parsed:
             st = f['stats']
-            if st[0] != 'b':
-                c.lines_added += st[0]
-                c.lines_deleted += st[1]
+            if not st['binary']:
+                c.lines_added += st['added']
+                c.lines_deleted += st['deleted']
             fid = h.FID('', f['filename'])
             c.files.append([fid, f['operation'], f['filename'], f['stats']])
-            diff = diff_processor.as_html(enable_comments=False, parsed_lines=[f])
-            c.changes[fid] = [f['operation'], f['filename'], diff]
+            htmldiff = diff_processor.as_html(enable_comments=False, parsed_lines=[f])
+            c.changes[fid] = [f['operation'], f['filename'], htmldiff]
 
         return render('compare/compare_diff.html')
--- a/rhodecode/controllers/error.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/error.py	Fri Jun 07 00:31:11 2013 +0200
@@ -87,8 +87,8 @@
         return fapp(request.environ, self.start_response)
 
     def get_error_explanation(self, code):
-        ''' get the error explanations of int codes
-            [400, 401, 403, 404, 500]'''
+        """ get the error explanations of int codes
+            [400, 401, 403, 404, 500]"""
         try:
             code = int(code)
         except Exception:
--- a/rhodecode/controllers/feed.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/feed.py	Fri Jun 07 00:31:11 2013 +0200
@@ -76,8 +76,8 @@
             limited_diff = True
 
         for st in _parsed:
-            st.update({'added': st['stats'][0],
-                       'removed': st['stats'][1]})
+            st.update({'added': st['stats']['added'],
+                       'removed': st['stats']['deleted']})
             changes.append('\n %(operation)s %(filename)s '
                            '(%(added)s lines added, %(removed)s lines removed)'
                             % st)
@@ -87,9 +87,8 @@
         return diff_processor, changes
 
     def __get_desc(self, cs):
-        desc_msg = []
-        desc_msg.append((_('%s committed on %s')
-                         % (h.person(cs.author), h.fmt_date(cs.date))) + '<br/>')
+        desc_msg = [(_('%s committed on %s')
+                     % (h.person(cs.author), h.fmt_date(cs.date))) + '<br/>']
         #branches, tags, bookmarks
         if cs.branch:
             desc_msg.append('branch: %s<br/>' % cs.branch)
@@ -118,7 +117,7 @@
         """Produce an atom-1.0 feed via feedgenerator module"""
 
         @cache_region('long_term')
-        def _get_feed_from_cache(key):
+        def _get_feed_from_cache(key, kind):
             feed = Atom1Feed(
                  title=self.title % repo_name,
                  link=url('summary_home', repo_name=repo_name,
@@ -140,18 +139,17 @@
             response.content_type = feed.mime_type
             return feed.writeString('utf-8')
 
-        key = repo_name + '_ATOM'
-        inv = CacheInvalidation.invalidate(key)
-        if inv is not None:
-            region_invalidate(_get_feed_from_cache, None, key)
-            CacheInvalidation.set_valid(inv.cache_key)
-        return _get_feed_from_cache(key)
+        kind = 'ATOM'
+        valid = CacheInvalidation.test_and_set_valid(repo_name, kind)
+        if not valid:
+            region_invalidate(_get_feed_from_cache, None, repo_name, kind)
+        return _get_feed_from_cache(repo_name, kind)
 
     def rss(self, repo_name):
         """Produce an rss2 feed via feedgenerator module"""
 
         @cache_region('long_term')
-        def _get_feed_from_cache(key):
+        def _get_feed_from_cache(key, kind):
             feed = Rss201rev2Feed(
                 title=self.title % repo_name,
                 link=url('summary_home', repo_name=repo_name,
@@ -173,9 +171,8 @@
             response.content_type = feed.mime_type
             return feed.writeString('utf-8')
 
-        key = repo_name + '_RSS'
-        inv = CacheInvalidation.invalidate(key)
-        if inv is not None:
-            region_invalidate(_get_feed_from_cache, None, key)
-            CacheInvalidation.set_valid(inv.cache_key)
-        return _get_feed_from_cache(key)
+        kind = 'RSS'
+        valid = CacheInvalidation.test_and_set_valid(repo_name, kind)
+        if not valid:
+            region_invalidate(_get_feed_from_cache, None, repo_name, kind)
+        return _get_feed_from_cache(repo_name, kind)
--- a/rhodecode/controllers/files.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/files.py	Fri Jun 07 00:31:11 2013 +0200
@@ -32,7 +32,7 @@
 from pylons import request, response, tmpl_context as c, url
 from pylons.i18n.translation import _
 from pylons.controllers.util import redirect
-from rhodecode.lib.utils import jsonify
+from rhodecode.lib.utils import jsonify, action_logger
 
 from rhodecode.lib import diffs
 from rhodecode.lib import helpers as h
@@ -57,6 +57,7 @@
 from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\
     _context_url, get_line_ctx, get_ignore_ws
 from webob.exc import HTTPNotFound
+from rhodecode.lib.exceptions import NonRelativePathError
 
 
 log = logging.getLogger(__name__)
@@ -303,7 +304,7 @@
             first_line = sl[0] if sl else ''
             # modes:  0 - Unix, 1 - Mac, 2 - DOS
             mode = detect_mode(first_line, 0)
-            content = convert_line_endings(r_post.get('content'), mode)
+            content = convert_line_endings(r_post.get('content', ''), mode)
 
             message = r_post.get('message') or c.default_message
             author = self.rhodecode_user.full_contact
@@ -352,11 +353,11 @@
 
         if r_post:
             unix_mode = 0
-            content = convert_line_endings(r_post.get('content'), unix_mode)
+            content = convert_line_endings(r_post.get('content', ''), unix_mode)
 
             message = r_post.get('message') or c.default_message
             filename = r_post.get('filename')
-            location = r_post.get('location')
+            location = r_post.get('location', '')
             file_obj = r_post.get('upload_file', None)
 
             if file_obj is not None and hasattr(file_obj, 'filename'):
@@ -371,25 +372,32 @@
                 h.flash(_('No filename'), category='warning')
                 return redirect(url('changeset_home', repo_name=c.repo_name,
                                     revision='tip'))
-            if location.startswith('/') or location.startswith('.') or '../' in location:
-                h.flash(_('Location must be relative path and must not '
-                          'contain .. in path'), category='warning')
-                return redirect(url('changeset_home', repo_name=c.repo_name,
-                                    revision='tip'))
-            if location:
-                location = os.path.normpath(location)
+            #strip all crap out of file, just leave the basename
             filename = os.path.basename(filename)
             node_path = os.path.join(location, filename)
             author = self.rhodecode_user.full_contact
 
             try:
-                self.scm_model.create_node(repo=c.rhodecode_repo,
-                                           repo_name=repo_name, cs=c.cs,
-                                           user=self.rhodecode_user.user_id,
-                                           author=author, message=message,
-                                           content=content, f_path=node_path)
+                nodes = {
+                    node_path: {
+                        'content': content
+                    }
+                }
+                self.scm_model.create_nodes(
+                    user=c.rhodecode_user.user_id, repo=c.rhodecode_db_repo,
+                    message=message,
+                    nodes=nodes,
+                    parent_cs=c.cs,
+                    author=author,
+                )
+
                 h.flash(_('Successfully committed to %s') % node_path,
                         category='success')
+            except NonRelativePathError, e:
+                h.flash(_('Location must be relative path and must not '
+                          'contain .. in path'), category='warning')
+                return redirect(url('changeset_home', repo_name=c.repo_name,
+                                    revision='tip'))
             except (NodeError, NodeAlreadyExistsError), e:
                 h.flash(_(e), category='error')
             except Exception:
@@ -484,7 +492,10 @@
                         os.remove(archive)
                     break
                 yield data
-
+        # store download action
+        action_logger(user=c.rhodecode_user,
+                      action='user_downloaded_archive:%s' % (archive_name),
+                      repo=repo_name, ipaddr=self.ip_addr, commit=True)
         response.content_disposition = str('attachment; filename=%s' % (archive_name))
         response.content_type = str(content_type)
         return get_chunked_archive(archive)
--- a/rhodecode/controllers/followers.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/followers.py	Fri Jun 07 00:31:11 2013 +0200
@@ -37,12 +37,12 @@
 
 class FollowersController(BaseRepoController):
 
+    def __before__(self):
+        super(FollowersController, self).__before__()
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
-    def __before__(self):
-        super(FollowersController, self).__before__()
-
     def followers(self, repo_name):
         p = safe_int(request.GET.get('page', 1), 1)
         repo_id = c.rhodecode_db_repo.repo_id
--- a/rhodecode/controllers/forks.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/forks.py	Fri Jun 07 00:31:11 2013 +0200
@@ -42,7 +42,7 @@
     RhodeCodeUi
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.forms import RepoForkForm
-from rhodecode.model.scm import ScmModel, GroupList
+from rhodecode.model.scm import ScmModel, RepoGroupList
 from rhodecode.lib.utils2 import safe_int
 
 log = logging.getLogger(__name__)
@@ -50,12 +50,11 @@
 
 class ForksController(BaseRepoController):
 
-    @LoginRequired()
     def __before__(self):
         super(ForksController, self).__before__()
 
     def __load_defaults(self):
-        acl_groups = GroupList(RepoGroup.query().all(),
+        acl_groups = RepoGroupList(RepoGroup.query().all(),
                                perm_set=['group.write', 'group.admin'])
         c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
@@ -78,7 +77,7 @@
             h.not_mapped_error(repo_name)
             return redirect(url('repos'))
 
-        c.default_user_id = User.get_by_username('default').user_id
+        c.default_user_id = User.get_default_user().user_id
         c.in_public_journal = UserFollowing.query()\
             .filter(UserFollowing.user_id == c.default_user_id)\
             .filter(UserFollowing.follows_repository == c.repo_info).scalar()
@@ -107,6 +106,7 @@
 
         return defaults
 
+    @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
     def forks(self, repo_name):
@@ -128,6 +128,7 @@
 
         return render('/forks/forks.html')
 
+    @LoginRequired()
     @NotAnonymous()
     @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
@@ -147,6 +148,7 @@
             force_defaults=False
         )
 
+    @LoginRequired()
     @NotAnonymous()
     @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
--- a/rhodecode/controllers/home.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/home.py	Fri Jun 07 00:31:11 2013 +0200
@@ -32,7 +32,7 @@
 
 import rhodecode
 from rhodecode.lib import helpers as h
-from rhodecode.lib.ext_json import json
+from rhodecode.lib.compat import json
 from rhodecode.lib.auth import LoginRequired
 from rhodecode.lib.base import BaseController, render
 from rhodecode.model.db import Repository
@@ -44,30 +44,27 @@
 
 class HomeController(BaseController):
 
-    @LoginRequired()
     def __before__(self):
         super(HomeController, self).__before__()
 
+    @LoginRequired()
     def index(self):
         c.groups = self.scm_model.get_repos_groups()
         c.group = None
 
-        if not c.visual.lightweight_dashboard:
-            c.repos_list = self.scm_model.get_repos()
-        ## lightweight version of dashboard
-        else:
-            c.repos_list = Repository.query()\
-                            .filter(Repository.group_id == None)\
-                            .order_by(func.lower(Repository.repo_name))\
-                            .all()
+        c.repos_list = Repository.query()\
+                        .filter(Repository.group_id == None)\
+                        .order_by(func.lower(Repository.repo_name))\
+                        .all()
 
-            repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
-                                                       admin=False)
-            #json used to render the grid
-            c.data = json.dumps(repos_data)
+        repos_data = RepoModel().get_repos_as_dict(repos_list=c.repos_list,
+                                                   admin=False)
+        #json used to render the grid
+        c.data = json.dumps(repos_data)
 
         return render('/index.html')
 
+    @LoginRequired()
     def repo_switcher(self):
         if request.is_xhr:
             all_repos = Repository.query().order_by(Repository.repo_name).all()
@@ -78,6 +75,7 @@
         else:
             raise HTTPBadRequest()
 
+    @LoginRequired()
     def branch_tag_switcher(self, repo_name):
         if request.is_xhr:
             c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
--- a/rhodecode/controllers/journal.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/journal.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,21 +29,21 @@
 from sqlalchemy.orm import joinedload
 from sqlalchemy.sql.expression import func
 
-from webhelpers.paginate import Page
 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
 
 from webob.exc import HTTPBadRequest
 from pylons import request, tmpl_context as c, response, url
 from pylons.i18n.translation import _
 
+from rhodecode.controllers.admin.admin import _journal_filter
+from rhodecode.model.db import UserLog, UserFollowing, Repository, User
+from rhodecode.model.meta import Session
+from rhodecode.model.repo import RepoModel
 import rhodecode.lib.helpers as h
+from rhodecode.lib.helpers import Page
 from rhodecode.lib.auth import LoginRequired, NotAnonymous
 from rhodecode.lib.base import BaseController, render
-from rhodecode.model.db import UserLog, UserFollowing, Repository, User
-from rhodecode.model.meta import Session
 from rhodecode.lib.utils2 import safe_int, AttributeDict
-from rhodecode.controllers.admin.admin import _journal_filter
-from rhodecode.model.repo import RepoModel
 from rhodecode.lib.compat import json
 
 log = logging.getLogger(__name__)
@@ -58,6 +58,137 @@
         self.feed_nr = 20
         c.search_term = request.GET.get('filter')
 
+    def _get_daily_aggregate(self, journal):
+        groups = []
+        for k, g in groupby(journal, lambda x: x.action_as_day):
+            user_group = []
+            #groupby username if it's a present value, else fallback to journal username
+            for _, g2 in groupby(list(g), lambda x: x.user.username if x.user else x.username):
+                l = list(g2)
+                user_group.append((l[0].user, l))
+
+            groups.append((k, user_group,))
+
+        return groups
+
+    def _get_journal_data(self, following_repos):
+        repo_ids = [x.follows_repository.repo_id for x in following_repos
+                    if x.follows_repository is not None]
+        user_ids = [x.follows_user.user_id for x in following_repos
+                    if x.follows_user is not None]
+
+        filtering_criterion = None
+
+        if repo_ids and user_ids:
+            filtering_criterion = or_(UserLog.repository_id.in_(repo_ids),
+                        UserLog.user_id.in_(user_ids))
+        if repo_ids and not user_ids:
+            filtering_criterion = UserLog.repository_id.in_(repo_ids)
+        if not repo_ids and user_ids:
+            filtering_criterion = UserLog.user_id.in_(user_ids)
+        if filtering_criterion is not None:
+            journal = self.sa.query(UserLog)\
+                .options(joinedload(UserLog.user))\
+                .options(joinedload(UserLog.repository))
+            #filter
+            try:
+                journal = _journal_filter(journal, c.search_term)
+            except Exception:
+                # we want this to crash for now
+                raise
+            journal = journal.filter(filtering_criterion)\
+                        .order_by(UserLog.action_date.desc())
+        else:
+            journal = []
+
+        return journal
+
+    def _atom_feed(self, repos, public=True):
+        journal = self._get_journal_data(repos)
+        if public:
+            _link = url('public_journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
+                                  'atom feed')
+        else:
+            _link = url('journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'atom feed')
+
+        feed = Atom1Feed(title=_desc,
+                         link=_link,
+                         description=_desc,
+                         language=self.language,
+                         ttl=self.ttl)
+
+        for entry in journal[:self.feed_nr]:
+            user = entry.user
+            if user is None:
+                #fix deleted users
+                user = AttributeDict({'short_contact': entry.username,
+                                      'email': '',
+                                      'full_contact': ''})
+            action, action_extra, ico = h.action_parser(entry, feed=True)
+            title = "%s - %s %s" % (user.short_contact, action(),
+                                    entry.repository.repo_name)
+            desc = action_extra()
+            _url = None
+            if entry.repository is not None:
+                _url = url('changelog_home',
+                           repo_name=entry.repository.repo_name,
+                           qualified=True)
+
+            feed.add_item(title=title,
+                          pubdate=entry.action_date,
+                          link=_url or url('', qualified=True),
+                          author_email=user.email,
+                          author_name=user.full_contact,
+                          description=desc)
+
+        response.content_type = feed.mime_type
+        return feed.writeString('utf-8')
+
+    def _rss_feed(self, repos, public=True):
+        journal = self._get_journal_data(repos)
+        if public:
+            _link = url('public_journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
+                                  'rss feed')
+        else:
+            _link = url('journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'rss feed')
+
+        feed = Rss201rev2Feed(title=_desc,
+                         link=_link,
+                         description=_desc,
+                         language=self.language,
+                         ttl=self.ttl)
+
+        for entry in journal[:self.feed_nr]:
+            user = entry.user
+            if user is None:
+                #fix deleted users
+                user = AttributeDict({'short_contact': entry.username,
+                                      'email': '',
+                                      'full_contact': ''})
+            action, action_extra, ico = h.action_parser(entry, feed=True)
+            title = "%s - %s %s" % (user.short_contact, action(),
+                                    entry.repository.repo_name)
+            desc = action_extra()
+            _url = None
+            if entry.repository is not None:
+                _url = url('changelog_home',
+                           repo_name=entry.repository.repo_name,
+                           qualified=True)
+
+            feed.add_item(title=title,
+                          pubdate=entry.action_date,
+                          link=_url or url('', qualified=True),
+                          author_email=user.email,
+                          author_name=user.full_contact,
+                          description=desc)
+
+        response.content_type = feed.mime_type
+        return feed.writeString('utf-8')
+
     @LoginRequired()
     @NotAnonymous()
     def index(self):
@@ -172,51 +303,6 @@
             .all()
         return self._rss_feed(following, public=False)
 
-    def _get_daily_aggregate(self, journal):
-        groups = []
-        for k, g in groupby(journal, lambda x: x.action_as_day):
-            user_group = []
-            #groupby username if it's a present value, else fallback to journal username
-            for _, g2 in groupby(list(g), lambda x: x.user.username if x.user else x.username):
-                l = list(g2)
-                user_group.append((l[0].user, l))
-
-            groups.append((k, user_group,))
-
-        return groups
-
-    def _get_journal_data(self, following_repos):
-        repo_ids = [x.follows_repository.repo_id for x in following_repos
-                    if x.follows_repository is not None]
-        user_ids = [x.follows_user.user_id for x in following_repos
-                    if x.follows_user is not None]
-
-        filtering_criterion = None
-
-        if repo_ids and user_ids:
-            filtering_criterion = or_(UserLog.repository_id.in_(repo_ids),
-                        UserLog.user_id.in_(user_ids))
-        if repo_ids and not user_ids:
-            filtering_criterion = UserLog.repository_id.in_(repo_ids)
-        if not repo_ids and user_ids:
-            filtering_criterion = UserLog.user_id.in_(user_ids)
-        if filtering_criterion is not None:
-            journal = self.sa.query(UserLog)\
-                .options(joinedload(UserLog.user))\
-                .options(joinedload(UserLog.repository))
-            #filter
-            try:
-                journal = _journal_filter(journal, c.search_term)
-            except Exception:
-                # we want this to crash for now
-                raise
-            journal = journal.filter(filtering_criterion)\
-                        .order_by(UserLog.action_date.desc())
-        else:
-            journal = []
-
-        return journal
-
     @LoginRequired()
     @NotAnonymous()
     def toggle_following(self):
@@ -268,92 +354,6 @@
             return c.journal_data
         return render('journal/public_journal.html')
 
-    def _atom_feed(self, repos, public=True):
-        journal = self._get_journal_data(repos)
-        if public:
-            _link = url('public_journal_atom', qualified=True)
-            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
-                                  'atom feed')
-        else:
-            _link = url('journal_atom', qualified=True)
-            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'atom feed')
-
-        feed = Atom1Feed(title=_desc,
-                         link=_link,
-                         description=_desc,
-                         language=self.language,
-                         ttl=self.ttl)
-
-        for entry in journal[:self.feed_nr]:
-            user = entry.user
-            if user is None:
-                #fix deleted users
-                user = AttributeDict({'short_contact': entry.username,
-                                      'email': '',
-                                      'full_contact': ''})
-            action, action_extra, ico = h.action_parser(entry, feed=True)
-            title = "%s - %s %s" % (user.short_contact, action(),
-                                    entry.repository.repo_name)
-            desc = action_extra()
-            _url = None
-            if entry.repository is not None:
-                _url = url('changelog_home',
-                           repo_name=entry.repository.repo_name,
-                           qualified=True)
-
-            feed.add_item(title=title,
-                          pubdate=entry.action_date,
-                          link=_url or url('', qualified=True),
-                          author_email=user.email,
-                          author_name=user.full_contact,
-                          description=desc)
-
-        response.content_type = feed.mime_type
-        return feed.writeString('utf-8')
-
-    def _rss_feed(self, repos, public=True):
-        journal = self._get_journal_data(repos)
-        if public:
-            _link = url('public_journal_atom', qualified=True)
-            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
-                                  'rss feed')
-        else:
-            _link = url('journal_atom', qualified=True)
-            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'rss feed')
-
-        feed = Rss201rev2Feed(title=_desc,
-                         link=_link,
-                         description=_desc,
-                         language=self.language,
-                         ttl=self.ttl)
-
-        for entry in journal[:self.feed_nr]:
-            user = entry.user
-            if user is None:
-                #fix deleted users
-                user = AttributeDict({'short_contact': entry.username,
-                                      'email': '',
-                                      'full_contact': ''})
-            action, action_extra, ico = h.action_parser(entry, feed=True)
-            title = "%s - %s %s" % (user.short_contact, action(),
-                                    entry.repository.repo_name)
-            desc = action_extra()
-            _url = None
-            if entry.repository is not None:
-                _url = url('changelog_home',
-                           repo_name=entry.repository.repo_name,
-                           qualified=True)
-
-            feed.add_item(title=title,
-                          pubdate=entry.action_date,
-                          link=_url or url('', qualified=True),
-                          author_email=user.email,
-                          author_name=user.full_contact,
-                          description=desc)
-
-        response.content_type = feed.mime_type
-        return feed.writeString('utf-8')
-
     @LoginRequired(api_access=True)
     def public_journal_atom(self):
         """
--- a/rhodecode/controllers/login.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/login.py	Fri Jun 07 00:31:11 2013 +0200
@@ -126,7 +126,7 @@
     @HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
                                'hg.register.manual_activate')
     def register(self):
-        c.auto_active = 'hg.register.auto_activate' in User.get_by_username('default')\
+        c.auto_active = 'hg.register.auto_activate' in User.get_default_user()\
             .AuthUser.permissions['global']
 
         if request.POST:
--- a/rhodecode/controllers/pullrequests.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/pullrequests.py	Fri Jun 07 00:31:11 2013 +0200
@@ -30,8 +30,8 @@
 from collections import defaultdict
 from itertools import groupby
 
-from pylons import request, response, session, tmpl_context as c, url
-from pylons.controllers.util import abort, redirect
+from pylons import request, tmpl_context as c, url
+from pylons.controllers.util import redirect
 from pylons.i18n.translation import _
 
 from rhodecode.lib.compat import json
@@ -42,18 +42,16 @@
 from rhodecode.lib import helpers as h
 from rhodecode.lib import diffs
 from rhodecode.lib.utils import action_logger, jsonify
+from rhodecode.lib.vcs.utils import safe_str
 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError
-from rhodecode.lib.vcs.backends.base import EmptyChangeset
 from rhodecode.lib.diffs import LimitedDiffContainer
-from rhodecode.model.db import User, PullRequest, ChangesetStatus,\
-    ChangesetComment
+from rhodecode.model.db import  PullRequest, ChangesetStatus, ChangesetComment
 from rhodecode.model.pull_request import PullRequestModel
 from rhodecode.model.meta import Session
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.comment import ChangesetCommentsModel
 from rhodecode.model.changeset_status import ChangesetStatusModel
 from rhodecode.model.forms import PullRequestForm
-from mercurial import scmutil
 from rhodecode.lib.utils2 import safe_int
 
 log = logging.getLogger(__name__)
@@ -61,47 +59,67 @@
 
 class PullrequestsController(BaseRepoController):
 
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
     def __before__(self):
         super(PullrequestsController, self).__before__()
         repo_model = RepoModel()
         c.users_array = repo_model.get_users_js()
         c.users_groups_array = repo_model.get_users_groups_js()
 
-    def _get_repo_refs(self, repo, rev=None, branch_rev=None):
+    def _get_repo_refs(self, repo, rev=None, branch=None, branch_rev=None):
         """return a structure with repo's interesting changesets, suitable for
-        the selectors in pullrequest.html"""
+        the selectors in pullrequest.html
 
+        rev: a revision that must be in the list somehow and selected by default
+        branch: a branch that must be in the list and selected by default - even if closed
+        branch_rev: a revision of which peers should be preferred and available."""
         # list named branches that has been merged to this named branch - it should probably merge back
         peers = []
+
+        if rev:
+            rev = safe_str(rev)
+
+        if branch:
+            branch = safe_str(branch)
+
         if branch_rev:
+            branch_rev = safe_str(branch_rev)
             # not restricting to merge() would also get branch point and be better
             # (especially because it would get the branch point) ... but is currently too expensive
-            revs = ["sort(parents(branch(id('%s')) and merge()) - branch(id('%s')))" %
-                    (branch_rev, branch_rev)]
             otherbranches = {}
-            for i in scmutil.revrange(repo._repo, revs):
+            for i in repo._repo.revs(
+                "sort(parents(branch(id(%s)) and merge()) - branch(id(%s)))",
+                branch_rev, branch_rev):
                 cs = repo.get_changeset(i)
                 otherbranches[cs.branch] = cs.raw_id
-            for branch, node in otherbranches.iteritems():
-                selected = 'branch:%s:%s' % (branch, node)
-                peers.append((selected, branch))
+            for abranch, node in otherbranches.iteritems():
+                selected = 'branch:%s:%s' % (abranch, node)
+                peers.append((selected, abranch))
 
         selected = None
+
         branches = []
-        for branch, branchrev in repo.branches.iteritems():
-            n = 'branch:%s:%s' % (branch, branchrev)
-            branches.append((n, branch))
+        for abranch, branchrev in repo.branches.iteritems():
+            n = 'branch:%s:%s' % (abranch, branchrev)
+            branches.append((n, abranch))
             if rev == branchrev:
                 selected = n
+            if branch == abranch:
+                selected = n
+                branch = None
+        if branch: # branch not in list - it is probably closed
+            revs = repo._repo.revs('max(branch(%s))', branch)
+            if revs:
+                cs = repo.get_changeset(revs[0])
+                selected = 'branch:%s:%s' % (branch, cs.raw_id)
+                branches.append((selected, branch))
+
         bookmarks = []
         for bookmark, bookmarkrev in repo.bookmarks.iteritems():
             n = 'book:%s:%s' % (bookmark, bookmarkrev)
             bookmarks.append((n, bookmark))
             if rev == bookmarkrev:
                 selected = n
+
         tags = []
         for tag, tagrev in repo.tags.iteritems():
             n = 'tag:%s:%s' % (tag, tagrev)
@@ -139,6 +157,74 @@
                                                    pull_request.reviewers]
         return (self.rhodecode_user.admin or owner or reviewer)
 
+    def _load_compare_data(self, pull_request, enable_comments=True):
+        """
+        Load context data needed for generating compare diff
+
+        :param pull_request:
+        """
+        org_repo = pull_request.org_repo
+        (org_ref_type,
+         org_ref_name,
+         org_ref_rev) = pull_request.org_ref.split(':')
+
+        other_repo = org_repo
+        (other_ref_type,
+         other_ref_name,
+         other_ref_rev) = pull_request.other_ref.split(':')
+
+        # despite opening revisions for bookmarks/branches/tags, we always
+        # convert this to rev to prevent changes after bookmark or branch change
+        org_ref = ('rev', org_ref_rev)
+        other_ref = ('rev', other_ref_rev)
+
+        c.org_repo = org_repo
+        c.other_repo = other_repo
+
+        c.fulldiff = fulldiff = request.GET.get('fulldiff')
+
+        c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions]
+
+        c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
+
+        c.org_ref = org_ref[1]
+        c.org_ref_type = org_ref[0]
+        c.other_ref = other_ref[1]
+        c.other_ref_type = other_ref[0]
+
+        diff_limit = self.cut_off_limit if not fulldiff else None
+
+        # we swap org/other ref since we run a simple diff on one repo
+        log.debug('running diff between %s and %s in %s'
+                  % (other_ref, org_ref, org_repo.scm_instance.path))
+        txtdiff = org_repo.scm_instance.get_diff(rev1=safe_str(other_ref[1]), rev2=safe_str(org_ref[1]))
+
+        diff_processor = diffs.DiffProcessor(txtdiff or '', format='gitdiff',
+                                             diff_limit=diff_limit)
+        _parsed = diff_processor.prepare()
+
+        c.limited_diff = False
+        if isinstance(_parsed, LimitedDiffContainer):
+            c.limited_diff = True
+
+        c.files = []
+        c.changes = {}
+        c.lines_added = 0
+        c.lines_deleted = 0
+
+        for f in _parsed:
+            st = f['stats']
+            c.lines_added += st['added']
+            c.lines_deleted += st['deleted']
+            fid = h.FID('', f['filename'])
+            c.files.append([fid, f['operation'], f['filename'], f['stats']])
+            htmldiff = diff_processor.as_html(enable_comments=enable_comments,
+                                              parsed_lines=[f])
+            c.changes[fid] = [f['operation'], f['filename'], htmldiff]
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def show_all(self, repo_name):
         c.pull_requests = PullRequestModel().get_all(repo_name)
         c.repo_name = repo_name
@@ -153,7 +239,10 @@
 
         return render('/pullrequests/pullrequest_show_all.html')
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def index(self):
         org_repo = c.rhodecode_db_repo
 
@@ -172,11 +261,12 @@
         # rev_start is not directly useful - its parent could however be used
         # as default for other and thus give a simple compare view
         #other_rev = request.POST.get('rev_start')
+        branch = request.GET.get('branch')
 
         c.org_repos = []
         c.org_repos.append((org_repo.repo_name, org_repo.repo_name))
         c.default_org_repo = org_repo.repo_name
-        c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance, org_rev)
+        c.org_refs, c.default_org_ref = self._get_repo_refs(org_repo.scm_instance, rev=org_rev, branch=branch)
 
         c.other_repos = []
         other_repos_info = {}
@@ -215,7 +305,10 @@
 
         return render('/pullrequests/pullrequest.html')
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def create(self, repo_name):
         repo = RepoModel()._get_repo(repo_name)
         try:
@@ -236,12 +329,11 @@
         org_ref = 'rev:merge:%s' % _form['merge_rev']
         other_repo = _form['other_repo']
         other_ref = 'rev:ancestor:%s' % _form['ancestor_rev']
-        revisions = _form['revisions']
+        revisions = [x for x in reversed(_form['revisions'])]
         reviewers = _form['review_members']
 
         title = _form['pullrequest_title']
         description = _form['pullrequest_desc']
-
         try:
             pull_request = PullRequestModel().create(
                 self.rhodecode_user.user_id, org_repo, org_ref, other_repo,
@@ -259,7 +351,10 @@
         return redirect(url('pullrequest_show', repo_name=other_repo,
                             pull_request_id=pull_request.pull_request_id))
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def update(self, repo_name, pull_request_id):
         pull_request = PullRequest.get_or_404(pull_request_id)
@@ -276,7 +371,10 @@
             return True
         raise HTTPForbidden()
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def delete(self, repo_name, pull_request_id):
         pull_request = PullRequest.get_or_404(pull_request_id)
@@ -289,70 +387,9 @@
             return redirect(url('admin_settings_my_account', anchor='pullrequests'))
         raise HTTPForbidden()
 
-    def _load_compare_data(self, pull_request, enable_comments=True):
-        """
-        Load context data needed for generating compare diff
-
-        :param pull_request:
-        :type pull_request:
-        """
-        org_repo = pull_request.org_repo
-        (org_ref_type,
-         org_ref_name,
-         org_ref_rev) = pull_request.org_ref.split(':')
-
-        other_repo = org_repo
-        (other_ref_type,
-         other_ref_name,
-         other_ref_rev) = pull_request.other_ref.split(':')
-
-        # despite opening revisions for bookmarks/branches/tags, we always
-        # convert this to rev to prevent changes after bookmark or branch change
-        org_ref = ('rev', org_ref_rev)
-        other_ref = ('rev', other_ref_rev)
-
-        c.org_repo = org_repo
-        c.other_repo = other_repo
-
-        c.fulldiff = fulldiff = request.GET.get('fulldiff')
-
-        c.cs_ranges = [org_repo.get_changeset(x) for x in pull_request.revisions]
-
-        c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
-
-        c.org_ref = org_ref[1]
-        c.org_ref_type = org_ref[0]
-        c.other_ref = other_ref[1]
-        c.other_ref_type = other_ref[0]
-
-        diff_limit = self.cut_off_limit if not fulldiff else None
-
-        #we swap org/other ref since we run a simple diff on one repo
-        _diff = diffs.differ(org_repo, other_ref, other_repo, org_ref)
-
-        diff_processor = diffs.DiffProcessor(_diff or '', format='gitdiff',
-                                             diff_limit=diff_limit)
-        _parsed = diff_processor.prepare()
-
-        c.limited_diff = False
-        if isinstance(_parsed, LimitedDiffContainer):
-            c.limited_diff = True
-
-        c.files = []
-        c.changes = {}
-        c.lines_added = 0
-        c.lines_deleted = 0
-        for f in _parsed:
-            st = f['stats']
-            if st[0] != 'b':
-                c.lines_added += st[0]
-                c.lines_deleted += st[1]
-            fid = h.FID('', f['filename'])
-            c.files.append([fid, f['operation'], f['filename'], f['stats']])
-            diff = diff_processor.as_html(enable_comments=enable_comments,
-                                          parsed_lines=[f])
-            c.changes[fid] = [f['operation'], f['filename'], diff]
-
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def show(self, repo_name, pull_request_id):
         repo_model = RepoModel()
         c.users_array = repo_model.get_users_js()
@@ -421,7 +458,10 @@
         c.ancestor = None # there is one - but right here we don't know which
         return render('/pullrequests/pullrequest_show.html')
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def comment(self, repo_name, pull_request_id):
         pull_request = PullRequest.get_or_404(pull_request_id)
@@ -496,7 +536,10 @@
 
         return data
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def delete_comment(self, repo_name, comment_id):
         co = ChangesetComment.get(comment_id)
--- a/rhodecode/controllers/search.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/search.py	Fri Jun 07 00:31:11 2013 +0200
@@ -28,30 +28,28 @@
 from pylons.i18n.translation import _
 from pylons import request, config, tmpl_context as c
 
+from whoosh.index import open_dir, EmptyIndexError
+from whoosh.qparser import QueryParser, QueryParserError
+from whoosh.query import Phrase, Wildcard, Term, Prefix
+from webhelpers.util import update_params
+
 from rhodecode.lib.auth import LoginRequired
 from rhodecode.lib.base import BaseRepoController, render
 from rhodecode.lib.indexers import CHGSETS_SCHEMA, SCHEMA, CHGSET_IDX_NAME, \
     IDX_NAME, WhooshResultWrapper
-
-from webhelpers.paginate import Page
-from webhelpers.util import update_params
-
-from whoosh.index import open_dir, EmptyIndexError
-from whoosh.qparser import QueryParser, QueryParserError
-from whoosh.query import Phrase, Wildcard, Term, Prefix
 from rhodecode.model.repo import RepoModel
 from rhodecode.lib.utils2 import safe_str, safe_int
-
+from rhodecode.lib.helpers import Page
 
 log = logging.getLogger(__name__)
 
 
 class SearchController(BaseRepoController):
 
-    @LoginRequired()
     def __before__(self):
         super(SearchController, self).__before__()
 
+    @LoginRequired()
     def index(self, repo_name=None):
         c.repo_name = repo_name
         c.formated_results = []
--- a/rhodecode/controllers/shortlog.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    rhodecode.controllers.shortlog
-    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-    Shortlog controller for rhodecode
-
-    :created_on: Apr 18, 2010
-    :author: marcink
-    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
-    :license: GPLv3, see COPYING for more details.
-"""
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-import logging
-
-from pylons import tmpl_context as c, request, url
-from pylons.i18n.translation import _
-
-from rhodecode.lib import helpers as h
-from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
-from rhodecode.lib.base import BaseRepoController, render
-from rhodecode.lib.helpers import RepoPage
-from pylons.controllers.util import redirect
-from rhodecode.lib.utils2 import safe_int
-from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError, ChangesetError,\
-    RepositoryError
-
-log = logging.getLogger(__name__)
-
-
-class ShortlogController(BaseRepoController):
-
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
-    def __before__(self):
-        super(ShortlogController, self).__before__()
-
-    def __get_cs_or_redirect(self, rev, repo_name, redirect_after=True):
-        """
-        Safe way to get changeset if error occur it redirects to tip with
-        proper message
-
-        :param rev: revision to fetch
-        :param repo_name: repo name to redirect after
-        """
-
-        try:
-            return c.rhodecode_repo.get_changeset(rev)
-        except RepositoryError, e:
-            h.flash(str(e), category='warning')
-            redirect(h.url('shortlog_home', repo_name=repo_name))
-
-    def index(self, repo_name, revision=None, f_path=None):
-        p = safe_int(request.GET.get('page', 1), 1)
-        size = safe_int(request.GET.get('size', 20), 20)
-        collection = c.rhodecode_repo
-        c.file_history = f_path
-
-        def url_generator(**kw):
-            if f_path:
-                return url('shortlog_file_home', repo_name=repo_name,
-                           revision=revision, f_path=f_path, size=size, **kw)
-            return url('shortlog_home', repo_name=repo_name, size=size, **kw)
-
-        if f_path:
-            log.debug('generating shortlog for path %s' % f_path)
-            # get the history for the file !
-            tip_cs = c.rhodecode_repo.get_changeset()
-            try:
-                collection = tip_cs.get_file_history(f_path)
-            except (NodeDoesNotExistError, ChangesetError):
-                #this node is not present at tip !
-                try:
-                    cs = self.__get_cs_or_redirect(revision, repo_name)
-                    collection = cs.get_file_history(f_path)
-                except RepositoryError, e:
-                    h.flash(str(e), category='warning')
-                    redirect(h.url('shortlog_home', repo_name=repo_name))
-            collection = list(reversed(collection))
-
-        c.repo_changesets = RepoPage(collection, page=p,
-                                     items_per_page=size, url=url_generator)
-        page_revisions = [x.raw_id for x in list(c.repo_changesets)]
-        c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
-
-        if not c.repo_changesets:
-            h.flash(_('There are no changesets yet'), category='warning')
-            return redirect(url('summary_home', repo_name=repo_name))
-
-        c.shortlog_data = render('shortlog/shortlog_data.html')
-        if request.environ.get('HTTP_X_PARTIAL_XHR'):
-            return c.shortlog_data
-        r = render('shortlog/shortlog.html')
-        return r
--- a/rhodecode/controllers/summary.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/summary.py	Fri Jun 07 00:31:11 2013 +0200
@@ -55,6 +55,7 @@
 from rhodecode.lib.helpers import RepoPage
 from rhodecode.lib.compat import json, OrderedDict
 from rhodecode.lib.vcs.nodes import FileNode
+from rhodecode.controllers.changelog import _load_changelog_summary
 
 log = logging.getLogger(__name__)
 
@@ -65,23 +66,76 @@
 
 class SummaryController(BaseRepoController):
 
-    @LoginRequired()
-    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')
     def __before__(self):
         super(SummaryController, self).__before__()
 
+    def _get_download_links(self, repo):
+
+        download_l = []
+
+        branches_group = ([], _("Branches"))
+        tags_group = ([], _("Tags"))
+
+        for name, chs in c.rhodecode_repo.branches.items():
+            #chs = chs.split(':')[-1]
+            branches_group[0].append((chs, name),)
+        download_l.append(branches_group)
+
+        for name, chs in c.rhodecode_repo.tags.items():
+            #chs = chs.split(':')[-1]
+            tags_group[0].append((chs, name),)
+        download_l.append(tags_group)
+
+        return download_l
+
+    def __get_readme_data(self, db_repo):
+        repo_name = db_repo.repo_name
+
+        @cache_region('long_term')
+        def _get_readme_from_cache(key, kind):
+            readme_data = None
+            readme_file = None
+            log.debug('Looking for README file')
+            try:
+                # get's the landing revision! or tip if fails
+                cs = db_repo.get_landing_changeset()
+                if isinstance(cs, EmptyChangeset):
+                    raise EmptyRepositoryError()
+                renderer = MarkupRenderer()
+                for f in README_FILES:
+                    try:
+                        readme = cs.get_node(f)
+                        if not isinstance(readme, FileNode):
+                            continue
+                        readme_file = f
+                        log.debug('Found README file `%s` rendering...' %
+                                  readme_file)
+                        readme_data = renderer.render(readme.content, f)
+                        break
+                    except NodeDoesNotExistError:
+                        continue
+            except ChangesetError:
+                log.error(traceback.format_exc())
+                pass
+            except EmptyRepositoryError:
+                pass
+            except Exception:
+                log.error(traceback.format_exc())
+
+            return readme_data, readme_file
+
+        kind = 'README'
+        valid = CacheInvalidation.test_and_set_valid(repo_name, kind)
+        if not valid:
+            region_invalidate(_get_readme_from_cache, None, repo_name, kind)
+        return _get_readme_from_cache(repo_name, kind)
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     def index(self, repo_name):
         c.dbrepo = dbrepo = c.rhodecode_db_repo
-
-        def url_generator(**kw):
-            return url('shortlog_home', repo_name=repo_name, size=10, **kw)
-
-        c.repo_changesets = RepoPage(c.rhodecode_repo, page=1,
-                                     items_per_page=10, url=url_generator)
-        page_revisions = [x.raw_id for x in list(c.repo_changesets)]
-        c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
-
+        _load_changelog_summary()
         if self.rhodecode_user.username == 'default':
             # for default(anonymous) user we don't need to pass credentials
             username = ''
@@ -114,19 +168,6 @@
 
         c.clone_repo_url = uri
         c.clone_repo_url_id = uri_id
-        c.repo_tags = OrderedDict()
-        for name, hash_ in c.rhodecode_repo.tags.items()[:10]:
-            try:
-                c.repo_tags[name] = c.rhodecode_repo.get_changeset(hash_)
-            except ChangesetError:
-                c.repo_tags[name] = EmptyChangeset(hash_)
-
-        c.repo_branches = OrderedDict()
-        for name, hash_ in c.rhodecode_repo.branches.items()[:10]:
-            try:
-                c.repo_branches[name] = c.rhodecode_repo.get_changeset(hash_)
-            except ChangesetError:
-                c.repo_branches[name] = EmptyChangeset(hash_)
 
         td = date.today() + timedelta(days=1)
         td_1m = td - timedelta(days=calendar.mdays[td.month])
@@ -189,72 +230,13 @@
             self.__get_readme_data(c.rhodecode_db_repo)
         return render('summary/summary.html')
 
+    @LoginRequired()
     @NotAnonymous()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
     @jsonify
     def repo_size(self, repo_name):
         if request.is_xhr:
             return c.rhodecode_db_repo._repo_size()
         else:
             raise HTTPBadRequest()
-
-    def __get_readme_data(self, db_repo):
-        repo_name = db_repo.repo_name
-
-        @cache_region('long_term')
-        def _get_readme_from_cache(key):
-            readme_data = None
-            readme_file = None
-            log.debug('Looking for README file')
-            try:
-                # get's the landing revision! or tip if fails
-                cs = db_repo.get_landing_changeset()
-                if isinstance(cs, EmptyChangeset):
-                    raise EmptyRepositoryError()
-                renderer = MarkupRenderer()
-                for f in README_FILES:
-                    try:
-                        readme = cs.get_node(f)
-                        if not isinstance(readme, FileNode):
-                            continue
-                        readme_file = f
-                        log.debug('Found README file `%s` rendering...' %
-                                  readme_file)
-                        readme_data = renderer.render(readme.content, f)
-                        break
-                    except NodeDoesNotExistError:
-                        continue
-            except ChangesetError:
-                log.error(traceback.format_exc())
-                pass
-            except EmptyRepositoryError:
-                pass
-            except Exception:
-                log.error(traceback.format_exc())
-
-            return readme_data, readme_file
-
-        key = repo_name + '_README'
-        inv = CacheInvalidation.invalidate(key)
-        if inv is not None:
-            region_invalidate(_get_readme_from_cache, None, key)
-            CacheInvalidation.set_valid(inv.cache_key)
-        return _get_readme_from_cache(key)
-
-    def _get_download_links(self, repo):
-
-        download_l = []
-
-        branches_group = ([], _("Branches"))
-        tags_group = ([], _("Tags"))
-
-        for name, chs in c.rhodecode_repo.branches.items():
-            #chs = chs.split(':')[-1]
-            branches_group[0].append((chs, name),)
-        download_l.append(branches_group)
-
-        for name, chs in c.rhodecode_repo.tags.items():
-            #chs = chs.split(':')[-1]
-            tags_group[0].append((chs, name),)
-        download_l.append(tags_group)
-
-        return download_l
--- a/rhodecode/controllers/tags.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/controllers/tags.py	Fri Jun 07 00:31:11 2013 +0200
@@ -35,12 +35,12 @@
 
 class TagsController(BaseRepoController):
 
+    def __before__(self):
+        super(TagsController, self).__before__()
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
                                    'repository.admin')
-    def __before__(self):
-        super(TagsController, self).__before__()
-
     def index(self):
         c.repo_tags = OrderedDict()
 
Binary file rhodecode/i18n/en/LC_MESSAGES/rhodecode.mo has changed
--- a/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: rhodecode 0.1\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
 "PO-Revision-Date: 2011-02-25 19:13+0100\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: en <LL@li.org>\n"
@@ -17,38 +17,37 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:83
+#: rhodecode/controllers/changeset.py:84
 msgid "Show white space"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 msgid "Ignore white space"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:163
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:329
-#: rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
 #, python-format
 msgid "Status change -> %s"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:360
+#: rhodecode/controllers/changeset.py:376
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
 #: rhodecode/controllers/compare.py:74
-#: rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/pullrequests.py:259
 msgid "There are no changesets yet"
 msgstr ""
 
@@ -89,8 +88,8 @@
 msgstr ""
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -98,115 +97,116 @@
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: rhodecode/controllers/feed.py:91
+#: rhodecode/controllers/feed.py:90
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:88
-msgid "Click here to add new file"
-msgstr ""
-
 #: rhodecode/controllers/files.py:89
+msgid "Click here to add new file"
+msgstr ""
+
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
 
-#: rhodecode/controllers/files.py:293
+#: rhodecode/controllers/files.py:297
 #, python-format
 msgid "Edited file %s via RhodeCode"
 msgstr ""
 
-#: rhodecode/controllers/files.py:309
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr ""
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr ""
 
-#: rhodecode/controllers/files.py:347
+#: rhodecode/controllers/files.py:351
 msgid "Added file via RhodeCode"
 msgstr ""
 
-#: rhodecode/controllers/files.py:364
-msgid "No content"
-msgstr ""
-
 #: rhodecode/controllers/files.py:368
-msgid "No filename"
+msgid "No content"
 msgstr ""
 
 #: rhodecode/controllers/files.py:372
+msgid "No filename"
+msgstr ""
+
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: rhodecode/controllers/files.py:420
-msgid "Downloads disabled"
-msgstr ""
-
 #: rhodecode/controllers/files.py:431
+msgid "Downloads disabled"
+msgstr ""
+
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr ""
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr ""
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr ""
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632 rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr ""
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633 rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr ""
 
-#: rhodecode/controllers/forks.py:175
+#: rhodecode/controllers/forks.py:176
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: rhodecode/controllers/forks.py:189
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 msgid "public journal"
 msgstr ""
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr ""
@@ -225,71 +225,71 @@
 "email"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:139
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:149
 msgid "Special"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:129
+#: rhodecode/controllers/pullrequests.py:150
 msgid "Peer branches"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:324
 msgid "Pull request requires a title with min. 3 chars"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:230
+#: rhodecode/controllers/pullrequests.py:326
 msgid "Error creating pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:251
+#: rhodecode/controllers/pullrequests.py:346
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:349
 msgid "Error occurred during sending pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:388
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:484
 msgid "Closing with"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:478
+#: rhodecode/controllers/pullrequests.py:521
 msgid "Closing pull request on other statuses than rejected or approved forbidden"
 msgstr ""
 
-#: rhodecode/controllers/search.py:134
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr ""
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr ""
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr ""
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr ""
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr ""
@@ -302,6 +302,43 @@
 msgid "Error occurred during update of defaults"
 msgstr ""
 
+#: rhodecode/controllers/admin/gists.py:56
+msgid "forever"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:57
+#, fuzzy
+msgid "5 minutes"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:58
+#, fuzzy
+msgid "1 hour"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:59
+#, fuzzy
+msgid "1 day"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:60
+#, fuzzy
+msgid "1 month"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+msgid "Error occurred during gist creation"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:165
+#, python-format
+msgid "Deleted gist %s"
+msgstr ""
+
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
 msgstr ""
@@ -346,35 +383,39 @@
 msgid "START_TLS on LDAP connection"
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
+#: rhodecode/controllers/admin/ldap_settings.py:145
 msgid "Error occurred during update of ldap settings"
 msgstr ""
 
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
 msgstr ""
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr ""
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr ""
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -395,41 +436,55 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292
-#: rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299
-#: rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
-msgid "Disabled"
-msgstr ""
-
 #: rhodecode/controllers/admin/permissions.py:72
-msgid "Allowed with manual account activation"
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
+msgid "Disabled"
 msgstr ""
 
 #: rhodecode/controllers/admin/permissions.py:74
+msgid "Allowed with manual account activation"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:76
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:77
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:142
+#: rhodecode/controllers/admin/permissions.py:152
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:127
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr ""
 
@@ -448,230 +503,223 @@
 msgid "Error creating repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:266
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:284
+#: rhodecode/controllers/admin/repos.py:288
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:311
-#: rhodecode/controllers/api/api.py:877
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:314
-#: rhodecode/controllers/api/api.py:879
+#: rhodecode/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:319
+#: rhodecode/controllers/admin/repos.py:323
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:322
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:365
+#: rhodecode/controllers/admin/repos.py:345
 msgid "Repository permissions updated"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:403
-msgid "An error occurred during deletion of repository user groups"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:421
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+msgid "An error occurred during revoking of permission"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 msgid "An error occurred during unlocking"
 msgstr ""
 
+#: rhodecode/controllers/admin/repos.py:447
+msgid "Unlocked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:450
+msgid "Locked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:452
+#, python-format
+msgid "Repository has been %s"
+msgstr ""
+
 #: rhodecode/controllers/admin/repos.py:476
-msgid "Unlocked"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:479
-msgid "Locked"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:481
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:505
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:590
+#: rhodecode/controllers/admin/repos.py:562
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:604
+#: rhodecode/controllers/admin/repos.py:576
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:145
+#: rhodecode/controllers/admin/repos_groups.py:147
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:157
+#: rhodecode/controllers/admin/repos_groups.py:159
 #, python-format
 msgid "Error occurred during creation of repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
+#: rhodecode/controllers/admin/repos_groups.py:217
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:235
+#: rhodecode/controllers/admin/repos_groups.py:232
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:253
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:260
+#: rhodecode/controllers/admin/repos_groups.py:257
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:266
+#: rhodecode/controllers/admin/repos_groups.py:263
 #, python-format
 msgid "Removed repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:271
+#: rhodecode/controllers/admin/repos_groups.py:268
 #, python-format
 msgid "Error occurred during deletion of repos group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-msgid "An error occurred during deletion of group user groups"
-msgstr ""
-
-#: rhodecode/controllers/admin/settings.py:126
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+msgid "Repository Group permissions updated"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:123
 #, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:135
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 msgid "Error occurred during updating application settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:216
+#: rhodecode/controllers/admin/settings.py:219
 msgid "Updated visualisation settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:221
+#: rhodecode/controllers/admin/settings.py:224
 msgid "Error occurred during updating visualisation settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:297
+#: rhodecode/controllers/admin/settings.py:300
 msgid "Updated VCS settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:327
+#: rhodecode/controllers/admin/settings.py:330
 msgid "Error occurred during hook creation"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:346
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:452
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
 #, python-format
 msgid "Error occurred during update of user %s"
@@ -699,111 +747,92 @@
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:287
-msgid "Granted 'repository fork' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:292
-msgid "Revoked 'repository fork' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+msgid "Updated permissions"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 msgid "Removed email from user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:341
+#: rhodecode/controllers/admin/users.py:340
 #, python-format
 msgid "Added ip %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:347
+#: rhodecode/controllers/admin/users.py:346
 msgid "An error occurred during ip saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:359
+#: rhodecode/controllers/admin/users.py:358
 msgid "Removed ip from user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:86
+#: rhodecode/controllers/admin/users_groups.py:162
 #, python-format
 msgid "Created user group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:97
+#: rhodecode/controllers/admin/users_groups.py:173
 #, python-format
 msgid "Error occurred during creation of user group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:166
-#, python-format
-msgid "Updated user group %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:188
-#, python-format
-msgid "Error occurred during update of user group %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:205
-msgid "Successfully deleted user group"
-msgstr ""
-
 #: rhodecode/controllers/admin/users_groups.py:210
+#, python-format
+msgid "Updated user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:232
+#, python-format
+msgid "Error occurred during update of user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:250
+msgid "Successfully deleted user group"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:255
 msgid "An error occurred during deletion of user group"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:259
-msgid "Granted 'repository create' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:264
-msgid "Revoked 'repository create' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:270
-msgid "Granted 'repository fork' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:275
-msgid "Revoked 'repository fork' permission to user group"
-msgstr ""
-
-#: rhodecode/lib/auth.py:530
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+msgid "User Group permissions updated"
+msgstr ""
+
+#: rhodecode/lib/auth.py:544
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: rhodecode/lib/auth.py:579
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr ""
 
@@ -819,152 +848,176 @@
 msgid "No changes detected"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:394
+#: rhodecode/lib/helpers.py:428
 #, python-format
 msgid "%a, %d %b %Y %H:%M:%S"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674 rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, python-format
 msgid "fork name %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+msgid "[downloaded] archive from repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 msgid "[created] user"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 msgid "[updated] user"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:712
+#: rhodecode/lib/helpers.py:749
 msgid "[created] user group"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:714
+#: rhodecode/lib/helpers.py:751
 msgid "[updated] user group"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:716
+#: rhodecode/lib/helpers.py:753
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 msgid "[closed] pull request for"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 msgid "[committed via RhodeCode] into repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+msgid "new file"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1161
+msgid "mod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1164
+msgid "del"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1167
+msgid "rename"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -976,221 +1029,299 @@
 msgid "cannot create new union repository"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:411
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 msgstr[1] ""
 
+#: rhodecode/lib/utils2.py:412
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
 #: rhodecode/lib/utils2.py:413
 #, python-format
-msgid "%d day"
-msgid_plural "%d days"
+msgid "%d hour"
+msgid_plural "%d hours"
 msgstr[0] ""
 msgstr[1] ""
 
 #: rhodecode/lib/utils2.py:414
 #, python-format
-msgid "%d hour"
-msgid_plural "%d hours"
+msgid "%d minute"
+msgid_plural "%d minutes"
 msgstr[0] ""
 msgstr[1] ""
 
 #: rhodecode/lib/utils2.py:415
 #, python-format
-msgid "%d minute"
-msgid_plural "%d minutes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rhodecode/lib/utils2.py:416
-#, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 msgid "Repository no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 msgid "Repository read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 msgid "Repository write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 msgid "Repository admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 msgid "Repositories Group no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 msgid "Repositories Group read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 msgid "Repositories Group write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 msgid "Repositories Group admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 msgid "RhodeCode Administrator"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 msgid "Repository creation disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 msgid "Repository creation enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 msgid "Repository forking disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 msgid "Repository forking enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 msgid "Register disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 msgid "Approved"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr ""
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+msgid "Repository group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+msgid "Repository group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+msgid "Repository group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+msgid "Repository group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+msgid "User group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+msgid "User group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+msgid "User group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+msgid "User group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+msgid "Repository Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+msgid "Repository Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+msgid "User Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+msgid "User Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+msgid "Registration disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+msgid "User Registration with manual account activation"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+msgid "User Registration with automatic account activation"
+msgstr ""
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr ""
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-msgid "Repository group no access"
-msgstr ""
-
-#: rhodecode/model/db.py:1394
-msgid "Repository group read access"
-msgstr ""
-
-#: rhodecode/model/db.py:1395
-msgid "Repository group write access"
-msgstr ""
-
-#: rhodecode/model/db.py:1396
-msgid "Repository group admin access"
-msgstr ""
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr ""
@@ -1209,42 +1340,42 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: rhodecode/model/notification.py:224
+#: rhodecode/model/notification.py:228
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr ""
 
-#: rhodecode/model/notification.py:225
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:226
-#, python-format
-msgid "%(user)s mentioned you at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:227
-#, python-format
-msgid "%(user)s registered in RhodeCode at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:228
-#, python-format
-msgid "%(user)s opened new pull request at %(when)s"
-msgstr ""
-
 #: rhodecode/model/notification.py:229
 #, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:230
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:231
+#, python-format
+msgid "%(user)s registered in RhodeCode at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:232
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:233
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: rhodecode/model/pull_request.py:104
+#: rhodecode/model/pull_request.py:98
 #, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
 msgstr ""
 
-#: rhodecode/model/scm.py:598
+#: rhodecode/model/scm.py:674
 msgid "latest tip"
 msgstr ""
 
@@ -1297,7 +1428,7 @@
 #: rhodecode/model/validators.py:89
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character"
+" dashes and must begin with alphanumeric character or underscore"
 msgstr ""
 
 #: rhodecode/model/validators.py:117
@@ -1398,47 +1529,51 @@
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: rhodecode/model/validators.py:557
+#: rhodecode/model/validators.py:559
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: rhodecode/model/validators.py:650
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr ""
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr ""
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr ""
 
-#: rhodecode/model/validators.py:722
+#: rhodecode/model/validators.py:724
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr ""
 
-#: rhodecode/model/validators.py:735
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
 msgstr ""
 
-#: rhodecode/model/validators.py:767
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
 msgstr ""
 
-#: rhodecode/model/validators.py:768
+#: rhodecode/model/validators.py:770
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: rhodecode/model/validators.py:800
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
 #: rhodecode/templates/index.html:5
 msgid "Dashboard"
 msgstr ""
@@ -1484,29 +1619,28 @@
 msgstr ""
 
 #: rhodecode/templates/index_base.html:40
-#: rhodecode/templates/index_base.html:140
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr ""
 
 #: rhodecode/templates/index_base.html:41
-#: rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142
-#: rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:68
 #: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr ""
@@ -1514,27 +1648,25 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:82
-#: rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
 #: rhodecode/templates/admin/repos/repos.html:71
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
 #: rhodecode/templates/tags/tags.html:48
@@ -1542,109 +1674,78 @@
 msgid "Name"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:85
-#: rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr ""
+
+#: rhodecode/templates/index_base.html:126
 #: rhodecode/templates/admin/repos/repos.html:74
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:86
-#: rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
 #: rhodecode/templates/admin/repos/repos.html:76
 msgid "Owner"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:171
-#: rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:172
-#: rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:181
-#: rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr ""
-
-#: rhodecode/templates/index_base.html:212
-#: rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+msgid "No repositories found."
+msgstr ""
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr ""
 
-#: rhodecode/templates/index_base.html:213
-#: rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr ""
 
-#: rhodecode/templates/index_base.html:298
-msgid "No repositories found."
-msgstr ""
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr ""
 
@@ -1659,7 +1760,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr ""
@@ -1667,7 +1768,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr ""
 
@@ -1683,7 +1784,7 @@
 msgid "Forgot your password ?"
 msgstr ""
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr ""
 
@@ -1752,7 +1853,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1775,13 +1876,13 @@
 msgstr ""
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr ""
 
 #: rhodecode/templates/admin/admin.html:5
 #: rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr ""
 
@@ -1807,9 +1908,9 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr ""
 
@@ -1819,7 +1920,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
@@ -1842,19 +1943,18 @@
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 msgid "Defaults"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -1862,60 +1962,185 @@
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 msgid "Enable locking"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr ""
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, python-format
+msgid "Private Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+msgid "Create new gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:48
+msgid "Created"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+msgid "Expires"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+msgid "never"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:68
+msgid "There are no gists yet"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+msgid "Gist description ..."
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+msgid "Private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+#, fuzzy
+msgid "Confirm to delete this gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+msgid "Show as raw"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:71
+msgid "created"
+msgstr ""
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr ""
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
+#: rhodecode/templates/base/base.html:79
 msgid "LDAP"
 msgstr ""
 
@@ -2016,7 +2241,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr ""
 
@@ -2025,12 +2250,14 @@
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr ""
 
@@ -2051,6 +2278,7 @@
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
 msgid "Overwrite existing settings"
 msgstr ""
 
@@ -2062,86 +2290,85 @@
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr ""
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+msgid "User group"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+msgid "User group creation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 msgid "Repository forking"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr ""
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+msgid "External auth account activation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 msgid "Default User Permissions"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 msgid "Allowed IP addresses"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
 #, fuzzy, python-format
 msgid "Confirm to delete this ip: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 msgid "New ip address"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:153
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 msgid "Add"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr ""
 
@@ -2156,7 +2383,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr ""
 
@@ -2170,19 +2397,19 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 msgid "Landing revision"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
@@ -2194,245 +2421,249 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+msgid "Non-changeable id"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:177
+msgid "Advanced settings"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:180
+msgid "Statistics"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:184
-msgid "Advanced settings"
+msgid "Reset current statistics"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:184
+msgid "Confirm to remove current statistics"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit.html:187
-msgid "Statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Reset current statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Confirm to remove current statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:194
 msgid "Fetched to rev"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:211
+msgid "Cache"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Invalidate repository cache"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Confirm to invalidate repository cache"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:218
-msgid "Cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:222
-msgid "Invalidate repository cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:222
-msgid "Confirm to invalidate repository cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:225
 msgid ""
 "Manually invalidate cache for this repository. On first access repository"
 " will be cached again"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 msgid "Key"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280
-#: rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:249
+msgid "Remove from public journal"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:251
+msgid "Add to public journal"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:256
-msgid "Remove from public journal"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:258
-msgid "Add to public journal"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:263
 msgid ""
 "All actions made on this repository will be accessible to everyone in "
 "public journal"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:270
+#: rhodecode/templates/admin/repos/repo_edit.html:263
 msgid "Locking"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Confirm to unlock repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Lock repo"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 msgid "Confirm to lock repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 msgid "Repository is not locked"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:277
+msgid "Force locking on repository. Works only when anonymous access is disabled"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:284
-msgid "Force locking on repository. Works only when anonymous access is disabled"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:291
 msgid "Set as fork of"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+msgid "Set"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 msgid "Manually set this repository as a fork of another from the list"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
+#: rhodecode/templates/admin/repos/repo_edit.html:310
 #, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:318
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 msgid "Detach forks"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:319
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 msgid "Delete forks"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:322
+#: rhodecode/templates/admin/repos/repo_edit.html:315
 msgid ""
 "This repository will be renamed in a special way in order to be "
 "unaccesible for RhodeCode and VCS systems. If you need to fully delete it"
 " from file system please do it manually"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:348
+#: rhodecode/templates/admin/repos/repo_edit.html:341
 #, fuzzy, python-format
 msgid "Confirm to delete this field: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:362
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 msgid "New field key"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:379
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 msgid "New field description"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr ""
 
@@ -2444,6 +2675,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 msgid "default"
 msgstr ""
 
@@ -2451,33 +2684,37 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-msgid "Failed to remove user group"
-msgstr ""
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr ""
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
-msgid "apply to children"
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
+msgid "apply to children"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
 msgid ""
 "Set or revoke permission to all children of that group, including non-"
 "private repositories and other groups"
@@ -2503,7 +2740,7 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 msgid "Repository groups"
 msgstr ""
 
@@ -2533,7 +2770,7 @@
 msgid "Add child group"
 msgstr ""
 
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
 msgid ""
 "Enable lock-by-pulling on group. This option will be applied to all other"
 " groups and repositories inside"
@@ -2548,15 +2785,21 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 msgid "Edit"
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr ""
 
@@ -2654,8 +2897,8 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr ""
 
@@ -2668,133 +2911,154 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:140
 msgid "Use repository extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:147
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+msgid "Dashboard items"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 msgid "Icons"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 msgid "Show private repo icon on repositories"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+msgid "Show public/private icons next to repositories names"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:172
 msgid "Meta-Tagging"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:195
-msgid "VCS settings"
-msgstr ""
-
 #: rhodecode/templates/admin/settings/settings.html:204
+msgid "VCS settings"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:209
+#: rhodecode/templates/admin/settings/settings.html:218
 msgid "Require SSL for vcs operations"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:211
+#: rhodecode/templates/admin/settings/settings.html:220
 msgid ""
 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
 "will return HTTP Error 406: Not Acceptable"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:217
-msgid "Hooks"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:222
-msgid "Update repository after push (hg update)"
-msgstr ""
-
 #: rhodecode/templates/admin/settings/settings.html:226
+msgid "Hooks"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:231
+msgid "Update repository after push (hg update)"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:234
-msgid "Log user pull commands"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:238
-msgid "Advanced setup"
-msgstr ""
-
 #: rhodecode/templates/admin/settings/settings.html:243
-msgid "Mercurial Extensions"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:248
-msgid "Enable largefiles extension"
+msgid "Log user pull commands"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:247
+msgid "Advanced setup"
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:252
+msgid "Mercurial Extensions"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:257
+msgid "Enable largefiles extension"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:261
 msgid "Enable hgsubversion extension"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:254
+#: rhodecode/templates/admin/settings/settings.html:263
 msgid ""
 "Requires hgsubversion library installed. Allows cloning from svn remote "
 "locations"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:264
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:269
+#: rhodecode/templates/admin/settings/settings.html:279
 msgid ""
-"This a crucial application setting. If you are really sure you need to "
-"change this, you must restart application in order to make this setting "
-"take effect. Click this label to unlock."
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
+"Click to unlock. You must restart RhodeCode in order to make this setting"
+" take effect."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 msgid "Unlock"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:272
+#: rhodecode/templates/admin/settings/settings.html:282
 msgid ""
 "Location where repositories are stored. After changing this value a "
 "restart, and rescan is required"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:292
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr ""
 
@@ -2804,7 +3068,7 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr ""
 
@@ -2861,44 +3125,21 @@
 msgid "New password confirmation"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-msgid "Inherit default permissions"
-msgstr ""
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-msgid "Fork repositories"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 msgid "Email addresses"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, python-format
 msgid "Confirm to delete this email: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 msgid "New email address"
 msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr ""
 
@@ -2935,7 +3176,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -2955,7 +3196,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr ""
@@ -2986,12 +3227,12 @@
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 msgid "User groups"
 msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 msgid "Add new user group"
 msgstr ""
 
@@ -3004,7 +3245,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr ""
 
@@ -3024,45 +3265,53 @@
 msgid "Add all elements"
 msgstr ""
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr ""
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 msgid "No members yet"
 msgstr ""
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+msgid "Global Permissions"
+msgstr ""
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
 msgid "User groups administration"
 msgstr ""
 
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
 #, fuzzy, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
 
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+msgid "There are no user groups yet"
+msgstr ""
+
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3070,48 +3319,44 @@
 msgid "Files"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:112
+#: rhodecode/templates/base/base.html:125
 msgid "Switch To"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:114
-#: rhodecode/templates/base/base.html:267
-msgid "loading..."
-msgstr ""
-
-#: rhodecode/templates/base/base.html:118
-msgid "Options"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:124
-#: rhodecode/templates/forks/forks_data.html:21
-msgid "Compare fork"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:126
-msgid "Lightweight changelog"
-msgstr ""
-
 #: rhodecode/templates/base/base.html:127
-#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:279
+msgid "loading..."
+msgstr ""
+
+#: rhodecode/templates/base/base.html:131
+msgid "Options"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:137
+#: rhodecode/templates/forks/forks_data.html:21
+msgid "Compare fork"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:133
+#: rhodecode/templates/base/base.html:145
 msgid "Lock"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:141
+#: rhodecode/templates/base/base.html:153
 msgid "Follow"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:142
+#: rhodecode/templates/base/base.html:154
 msgid "Unfollow"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:145
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3120,60 +3365,113 @@
 msgid "Fork"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:147
+#: rhodecode/templates/base/base.html:159
 msgid "Create Pull Request"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Show Pull Requests"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Pull Requests"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:190
+#: rhodecode/templates/base/base.html:202
 msgid "Not logged in"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:197
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:262
-msgid "Switch repository"
-msgstr ""
-
 #: rhodecode/templates/base/base.html:274
-msgid "Show recent activity"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:275
-#: rhodecode/templates/journal/journal.html:4
-msgid "Journal"
+msgid "Switch repository"
 msgstr ""
 
 #: rhodecode/templates/base/base.html:286
+msgid "Show recent activity"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/journal/journal.html:4
+msgid "Journal"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 msgid "Search in repositories"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:8
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+msgid "Create user groups"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 msgid "No permissions defined yet"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:15
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 msgid "Edit Permission"
 msgstr ""
 
@@ -3183,7 +3481,7 @@
 msgstr ""
 
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
+#: rhodecode/templates/data_table/_dt_elements.html:147
 msgid "Stop following this repository"
 msgstr ""
 
@@ -3200,7 +3498,7 @@
 msgstr ""
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
+#: rhodecode/templates/pullrequests/pullrequest.html:203
 msgid "Loading ..."
 msgstr ""
 
@@ -3213,7 +3511,7 @@
 msgstr ""
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
+#: rhodecode/templates/changelog/changelog.html:45
 msgid "Open new pull request"
 msgstr ""
 
@@ -3242,31 +3540,48 @@
 msgid "Expand diff"
 msgstr ""
 
+#: rhodecode/templates/base/root.html:58
+msgid "Failed to remoke permission"
+msgstr ""
+
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, python-format
 msgid "%s Bookmarks"
 msgstr ""
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+msgid "Compare bookmarks"
+msgstr ""
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
 #: rhodecode/templates/tags/tags.html:51
 #: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr ""
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
 #: rhodecode/templates/tags/tags.html:52
 #: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr ""
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr ""
+
 #: rhodecode/templates/branches/branches.html:5
 #, python-format
 msgid "%s Branches"
@@ -3276,65 +3591,68 @@
 msgid "Compare branches"
 msgstr ""
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54
-#: rhodecode/templates/tags/tags_data.html:10
-msgid "Compare"
-msgstr ""
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, python-format
 msgid "%s Changelog"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 msgid "showing %d out of %d revision"
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 msgid "Clear selection"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
 #, python-format
 msgid "Compare fork with %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 msgid "Compare fork with parent"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 msgid "Show more"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:89
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
 #, python-format
 msgid "Bookmark %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
 #, python-format
 msgid "Tag %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
 #, python-format
 msgid "Branch %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:258
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr ""
 
@@ -3364,6 +3682,38 @@
 msgid "Affected %s files"
 msgstr ""
 
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+msgid "Commit message"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+msgid "Age"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset.html:6
 #, python-format
 msgid "%s Changeset"
@@ -3384,7 +3734,7 @@
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
+#: rhodecode/templates/changeset/diff_block.html:22
 msgid "Raw diff"
 msgstr ""
 
@@ -3393,12 +3743,12 @@
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
+#: rhodecode/templates/changeset/diff_block.html:23
 msgid "Download diff"
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -3406,7 +3756,7 @@
 msgstr[1] ""
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
@@ -3414,11 +3764,11 @@
 msgstr[1] ""
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, python-format
@@ -3427,7 +3777,7 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, python-format
@@ -3436,15 +3786,15 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -3462,51 +3812,64 @@
 msgid "Comment on pull request #%s"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr ""
 
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
+#, python-format
+msgid "Comments parsed using %s syntax with %s support."
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
-#, python-format
-msgid "Comments parsed using %s syntax with %s support."
-msgstr ""
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
 msgid "Use @username inside this text to send notification to this RhodeCode user"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+#, fuzzy
+msgid "Preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+msgid "Comment preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 msgid "Change status"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr ""
 
@@ -3519,19 +3882,19 @@
 msgid "Files affected"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:22
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:30
+#: rhodecode/templates/changeset/diff_block.html:29
 msgid "Show inline comments"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:55
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:56
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
 msgstr ""
 
@@ -3606,27 +3969,24 @@
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-msgid "New status"
-msgstr ""
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+msgid "URL"
+msgstr ""
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, python-format
+msgid "%s commented on a %s changeset."
 msgstr ""
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-msgid "Repo"
-msgstr ""
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
+msgid "The changeset status was changed to"
 msgstr ""
 
 #: rhodecode/templates/email_templates/main.html:8
@@ -3646,47 +4006,38 @@
 msgid "You can generate it by clicking following URL"
 msgstr ""
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-msgid "If you did not request new password please ignore this email."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid ""
-"User %s opened pull request for repository %s and wants you to review "
-"changes."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-msgid "View this pull request here"
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
 msgstr ""
 
 #: rhodecode/templates/email_templates/pull_request.html:6
-msgid "title"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:7
-msgid "description"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
 #, python-format
-msgid "Pull request #%s for repository %s"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-msgid "Closing pull request with status"
-msgstr ""
-
-#: rhodecode/templates/email_templates/registration.html:4
-msgid "A new user have registered in RhodeCode"
-msgstr ""
-
-#: rhodecode/templates/email_templates/registration.html:9
+msgid ""
+"%s opened a pull request for repository %s and wants you to review "
+"changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
+#, python-format
+msgid "%s commented on pull request \"%s\""
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+msgid "Pull request was closed with status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+msgid "Pull request changed status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr ""
 
@@ -3713,7 +4064,6 @@
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
 msgid "Branch"
 msgstr ""
 
@@ -3726,12 +4076,6 @@
 msgid "Add file"
 msgstr ""
 
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr ""
-
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
 msgstr ""
@@ -3760,12 +4104,6 @@
 msgid "use / to separate directories"
 msgstr ""
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-msgid "Commit message"
-msgstr ""
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
@@ -3829,12 +4167,6 @@
 msgid "Show annotation"
 msgstr ""
 
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-msgid "Show as raw"
-msgstr ""
-
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
 msgid "Download as raw"
@@ -4024,36 +4356,47 @@
 msgid "New pull request"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-msgid "Detailed compare view"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+msgid "Write a short description on this pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+msgid "Changeset flow"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+msgid "Origin repository"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 msgid "owner"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-msgid "Create new pull request"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-msgid "Title"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+msgid "Destination repository"
 msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
@@ -4084,10 +4427,6 @@
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-msgid "Origin repository"
-msgstr ""
-
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 msgid "Created on"
 msgstr ""
@@ -4150,37 +4489,6 @@
 msgid "Permission denied"
 msgstr ""
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, fuzzy, python-format
-msgid "%s Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-msgid "Age"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, python-format
-msgid "Click to open associated pull request #%s"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr ""
-
 #: rhodecode/templates/summary/summary.html:4
 #, python-format
 msgid "%s Summary"
@@ -4219,7 +4527,7 @@
 msgid "Fork of"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
 msgid "Remote clone"
 msgstr ""
 
@@ -4245,8 +4553,7 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
+msgid "Enable"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:159
@@ -4261,7 +4568,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 msgid "Download as zip"
 msgstr ""
 
@@ -4286,6 +4593,10 @@
 msgid "Commit activity by day / author"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr ""
@@ -4300,51 +4611,47 @@
 
 #: rhodecode/templates/summary/summary.html:272
 #, python-format
-msgid "Readme file at revision '%s'"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:333
+msgid "Readme file from revision %s"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:689
+msgid "commits"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:690
-msgid "commits"
+msgid "files added"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:691
-msgid "files added"
+msgid "files changed"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:692
-msgid "files changed"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:693
 msgid "files removed"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:694
+msgid "commit"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:695
-msgid "commit"
+msgid "file added"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
+msgid "file changed"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr ""
 
Binary file rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo has changed
--- a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: RhodeCode 1.1.5\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
 "PO-Revision-Date: 2012-10-02 11:32+0100\n"
 "Last-Translator: Vincent Duvert <vincent@duvert.net>\n"
 "Language-Team: fr <LL@li.org>\n"
@@ -17,32 +17,30 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr "Toutes les branches"
 
-#: rhodecode/controllers/changeset.py:83
-#, fuzzy
+#: rhodecode/controllers/changeset.py:84
 msgid "Show white space"
 msgstr "Afficher les espaces et tabulations"
 
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
-#, fuzzy
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 msgid "Ignore white space"
 msgstr "Ignorer les espaces et tabulations"
 
-#: rhodecode/controllers/changeset.py:163
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr "Afficher %s lignes de contexte"
 
-#: rhodecode/controllers/changeset.py:329
-#: rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
 #, python-format
 msgid "Status change -> %s"
 msgstr "Changement de statut -> %s"
 
-#: rhodecode/controllers/changeset.py:360
+#: rhodecode/controllers/changeset.py:376
 #, fuzzy
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
@@ -52,8 +50,7 @@
 "n’est pas autorisé."
 
 #: rhodecode/controllers/compare.py:74
-#: rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/pullrequests.py:259
 msgid "There are no changesets yet"
 msgstr "Il n’y a aucun changement pour le moment"
 
@@ -98,8 +95,8 @@
 msgstr "Flux %s de %s"
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -107,124 +104,125 @@
 msgid "Changeset was too big and was cut off..."
 msgstr "Cet ensemble de changements était trop important et a été découpé…"
 
-#: rhodecode/controllers/feed.py:91
-#, fuzzy, python-format
+#: rhodecode/controllers/feed.py:90
+#, python-format
 msgid "%s committed on %s"
 msgstr "%s a commité, le %s"
 
-#: rhodecode/controllers/files.py:88
-#, fuzzy
+#: rhodecode/controllers/files.py:89
+#
 msgid "Click here to add new file"
 msgstr "Ajouter un nouveau fichier"
 
-#: rhodecode/controllers/files.py:89
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr "Il n’y a pas encore de fichiers %s"
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr "Ce dépôt a été verrouillé par %s sur %s."
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
 
-#: rhodecode/controllers/files.py:293
-#, fuzzy, python-format
+#: rhodecode/controllers/files.py:297
+#, python-format
 msgid "Edited file %s via RhodeCode"
 msgstr "%s édité via RhodeCode"
 
-#: rhodecode/controllers/files.py:309
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr "Aucun changement"
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr "Commit réalisé avec succès sur %s"
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr "Une erreur est survenue durant le commit"
 
-#: rhodecode/controllers/files.py:347
-#, fuzzy
+#: rhodecode/controllers/files.py:351
+#
 msgid "Added file via RhodeCode"
 msgstr "%s ajouté par RhodeCode"
 
-#: rhodecode/controllers/files.py:364
-msgid "No content"
-msgstr "Aucun contenu"
-
 #: rhodecode/controllers/files.py:368
+msgid "No content"
+msgstr "Aucun contenu"
+
+#: rhodecode/controllers/files.py:372
 msgid "No filename"
 msgstr "Aucun nom de fichier"
 
-#: rhodecode/controllers/files.py:372
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: rhodecode/controllers/files.py:420
-#, fuzzy
+#: rhodecode/controllers/files.py:431
+#
 msgid "Downloads disabled"
 msgstr "Les téléchargements sont désactivés"
 
-#: rhodecode/controllers/files.py:431
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Révision %s inconnue."
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr "Dépôt vide."
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr "Type d’archive inconnu"
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr "Changesets"
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632 rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Branches"
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633 rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Tags"
 
-#: rhodecode/controllers/forks.py:175
-#, fuzzy, python-format
+#: rhodecode/controllers/forks.py:176
+#, python-format
 msgid "Forked repository %s as %s"
 msgstr "dépôt %s forké en tant que %s"
 
-#: rhodecode/controllers/forks.py:189
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Une erreur est survenue durant le fork du dépôt %s."
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 msgid "public journal"
 msgstr "Journal public"
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr "Journal"
 
 #: rhodecode/controllers/login.py:138
-#, fuzzy
+#
 msgid "You have successfully registered into RhodeCode"
 msgstr "Vous vous êtes inscrits avec succès à RhodeCode"
 
@@ -240,75 +238,75 @@
 "Votre mot de passe a été réinitialisé. Votre nouveau mot de passe vous a "
 "été envoyé par e-mail."
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:139
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr "Changements"
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:149
 msgid "Special"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:129
-#, fuzzy
+#: rhodecode/controllers/pullrequests.py:150
+#
 msgid "Peer branches"
-msgstr "Branches"
-
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Signets"
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:324
 msgid "Pull request requires a title with min. 3 chars"
 msgstr "Les requêtes de pull nécessitent un titre d’au moins 3 caractères."
 
-#: rhodecode/controllers/pullrequests.py:230
-#, fuzzy
+#: rhodecode/controllers/pullrequests.py:326
+#
 msgid "Error creating pull request"
 msgstr "Une erreur est survenue lors de la création de la requête de pull."
 
-#: rhodecode/controllers/pullrequests.py:251
+#: rhodecode/controllers/pullrequests.py:346
 msgid "Successfully opened new pull request"
 msgstr "La requête de pull a été ouverte avec succès."
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:349
 msgid "Error occurred during sending pull request"
 msgstr "Une erreur est survenue durant l’envoi de la requête de pull."
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:388
 msgid "Successfully deleted pull request"
 msgstr "La requête de pull a été supprimée avec succès."
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:484
 msgid "Closing with"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:478
+#: rhodecode/controllers/pullrequests.py:521
 msgid "Closing pull request on other statuses than rejected or approved forbidden"
 msgstr ""
 
-#: rhodecode/controllers/search.py:134
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr "Requête invalide. Essayer de la mettre entre guillemets."
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr ""
 "L’index de recherche n’est pas présent. Veuillez exécuter l’indexeur de "
 "code Whoosh."
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr "Une erreur est survenue durant l’opération de recherche."
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr "Aucune donnée actuellement disponible."
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr "La mise à jour des statistiques est désactivée pour ce dépôt."
@@ -323,6 +321,45 @@
 msgid "Error occurred during update of defaults"
 msgstr "Une erreur est survenue durant la mise à jour de l’utilisateur %s."
 
+#: rhodecode/controllers/admin/gists.py:56
+#
+msgid "forever"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:57
+#
+msgid "5 minutes"
+msgstr "5 minute"
+
+#: rhodecode/controllers/admin/gists.py:58
+#
+msgid "1 hour"
+msgstr "1 heure"
+
+#: rhodecode/controllers/admin/gists.py:59
+#
+msgid "1 day"
+msgstr "1 jour"
+
+#: rhodecode/controllers/admin/gists.py:60
+#
+msgid "1 month"
+msgstr "1 mois"
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+#, fuzzy
+msgid "Error occurred during gist creation"
+msgstr "Une erreur est survenue durant la création du hook."
+
+#: rhodecode/controllers/admin/gists.py:165
+#, fuzzy, python-format
+msgid "Deleted gist %s"
+msgstr "Dépôt %s supprimé"
+
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
 msgstr "Base"
@@ -367,36 +404,40 @@
 msgid "START_TLS on LDAP connection"
 msgstr "START_TLS à la connexion"
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr "Mise à jour réussie des réglages LDAP"
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr "Impossible d’activer LDAP. La bibliothèque « python-ldap » est manquante."
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
+#: rhodecode/controllers/admin/ldap_settings.py:145
 #, fuzzy
 msgid "Error occurred during update of ldap settings"
 msgstr "Une erreur est survenue durant la mise à jour des réglages du LDAP."
 
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr "Aucun"
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr "Lire"
+
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
-msgstr "Aucun"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
+msgstr "Écrire"
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr "Lire"
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr "Écrire"
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -417,44 +458,58 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292
-#: rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299
-#: rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr "Administration"
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
 msgid "Disabled"
 msgstr "Interdite"
 
-#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:74
 #, fuzzy
 msgid "Allowed with manual account activation"
 msgstr "Autorisé avec activation manuelle du compte"
 
-#: rhodecode/controllers/admin/permissions.py:74
+#: rhodecode/controllers/admin/permissions.py:76
 #, fuzzy
 msgid "Allowed with automatic account activation"
 msgstr "Autorisé avec activation automatique du compte"
 
-#: rhodecode/controllers/admin/permissions.py:77
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr "Autorisée"
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr "Permissions par défaut mises à jour avec succès"
 
-#: rhodecode/controllers/admin/permissions.py:142
+#: rhodecode/controllers/admin/permissions.py:152
 #, fuzzy
 msgid "Error occurred during update of permissions"
 msgstr "erreur pendant la mise à jour des permissions"
 
-#: rhodecode/controllers/admin/repos.py:127
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr "[Pas un fork]"
 
@@ -473,250 +528,237 @@
 msgid "Error creating repository %s"
 msgstr "Le dépôt %s a été créé."
 
-#: rhodecode/controllers/admin/repos.py:266
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Dépôt %s mis à jour avec succès."
 
-#: rhodecode/controllers/admin/repos.py:284
+#: rhodecode/controllers/admin/repos.py:288
 #, fuzzy, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "Une erreur est survenue lors de la mise à jour du dépôt %s."
 
-#: rhodecode/controllers/admin/repos.py:311
-#: rhodecode/controllers/api/api.py:877
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:314
-#: rhodecode/controllers/api/api.py:879
+#: rhodecode/controllers/admin/repos.py:318
 #, fuzzy, python-format
 msgid "Deleted %s forks"
 msgstr "Dépôt %s supprimé"
 
-#: rhodecode/controllers/admin/repos.py:319
+#: rhodecode/controllers/admin/repos.py:323
 #, fuzzy, python-format
 msgid "Deleted repository %s"
 msgstr "Dépôt %s supprimé"
 
-#: rhodecode/controllers/admin/repos.py:322
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr "Impossible de supprimer le dépôt %s : Des forks y sont attachés."
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Erreur pendant la suppression de %s"
 
-#: rhodecode/controllers/admin/repos.py:365
+#: rhodecode/controllers/admin/repos.py:345
 #, fuzzy
 msgid "Repository permissions updated"
 msgstr "Création de dépôt désactivée"
 
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr "Une erreur est survenue durant la suppression de l’utilisateur du dépôt."
-
-#: rhodecode/controllers/admin/repos.py:403
-#, fuzzy
-msgid "An error occurred during deletion of repository user groups"
-msgstr ""
-"Une erreur est survenue durant la suppression du groupe d’utilisateurs de"
-" ce dépôt."
-
-#: rhodecode/controllers/admin/repos.py:421
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+#, fuzzy
+msgid "An error occurred during revoking of permission"
+msgstr "erreur pendant la mise à jour des permissions"
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr "Une erreur est survenue durant la suppression des statistiques du dépôt."
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr "Une erreur est survenue durant l’invalidation du cache."
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 msgid "An error occurred during unlocking"
 msgstr "Une erreur est survenue durant le déverrouillage."
 
-#: rhodecode/controllers/admin/repos.py:476
+#: rhodecode/controllers/admin/repos.py:447
 #, fuzzy
 msgid "Unlocked"
 msgstr "déverrouillé"
 
-#: rhodecode/controllers/admin/repos.py:479
+#: rhodecode/controllers/admin/repos.py:450
 #, fuzzy
 msgid "Locked"
 msgstr "verrouillé"
 
-#: rhodecode/controllers/admin/repos.py:481
+#: rhodecode/controllers/admin/repos.py:452
 #, python-format
 msgid "Repository has been %s"
 msgstr "Le dépôt a été %s."
 
-#: rhodecode/controllers/admin/repos.py:505
+#: rhodecode/controllers/admin/repos.py:476
 msgid "Updated repository visibility in public journal"
 msgstr "La visibilité du dépôt dans le journal public a été mise à jour."
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 "Une erreur est survenue durant la configuration du journal public pour ce"
 " dépôt."
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr "Jeton d’authentification incorrect."
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr "Les changements distants ont été récupérés."
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr "Une erreur est survenue durant le pull depuis la source distante."
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr "[Aucun dépôt]"
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr "Le dépôt %s a été marké comme fork de %s"
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr "Une erreur est survenue durant cette opération."
 
-#: rhodecode/controllers/admin/repos.py:590
+#: rhodecode/controllers/admin/repos.py:562
 #, fuzzy
 msgid "An error occurred during creation of field"
 msgstr "Une erreur est survenue durant la création de l’utilisateur %s."
 
-#: rhodecode/controllers/admin/repos.py:604
+#: rhodecode/controllers/admin/repos.py:576
 #, fuzzy
 msgid "An error occurred during removal of field"
 msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail."
 
-#: rhodecode/controllers/admin/repos_groups.py:145
+#: rhodecode/controllers/admin/repos_groups.py:147
 #, fuzzy, python-format
 msgid "Created repository group %s"
 msgstr "Le groupe de dépôts %s a été créé."
 
-#: rhodecode/controllers/admin/repos_groups.py:157
+#: rhodecode/controllers/admin/repos_groups.py:159
 #, fuzzy, python-format
 msgid "Error occurred during creation of repository group %s"
 msgstr "Une erreur est survenue durant la création du groupe de dépôts %s."
 
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
+#: rhodecode/controllers/admin/repos_groups.py:217
 #, fuzzy, python-format
 msgid "Updated repository group %s"
 msgstr "Le groupe de dépôts %s a été mis à jour."
 
-#: rhodecode/controllers/admin/repos_groups.py:235
+#: rhodecode/controllers/admin/repos_groups.py:232
 #, fuzzy, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "Une erreur est survenue durant la mise à jour du groupe de dépôts %s."
 
-#: rhodecode/controllers/admin/repos_groups.py:253
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr "Ce groupe contient %s dépôts et ne peut être supprimé."
 
-#: rhodecode/controllers/admin/repos_groups.py:260
+#: rhodecode/controllers/admin/repos_groups.py:257
 #, fuzzy, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Ce groupe contient %s dépôts et ne peut être supprimé."
 
-#: rhodecode/controllers/admin/repos_groups.py:266
+#: rhodecode/controllers/admin/repos_groups.py:263
 #, fuzzy, python-format
 msgid "Removed repository group %s"
 msgstr "Le groupe de dépôts %s a été supprimé."
 
-#: rhodecode/controllers/admin/repos_groups.py:271
+#: rhodecode/controllers/admin/repos_groups.py:268
 #, fuzzy, python-format
 msgid "Error occurred during deletion of repos group %s"
 msgstr "Une erreur est survenue durant la suppression du groupe de dépôts %s."
 
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
 msgstr ""
-"Une erreur est survenue durant la suppression de l’utilisateur du groupe "
-"de dépôts."
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-#, fuzzy
-msgid "An error occurred during deletion of group user groups"
-msgstr ""
-"Une erreur est survenue durant la suppression du groupe d’utilisateurs du"
-" groupe de dépôts."
-
-#: rhodecode/controllers/admin/settings.py:126
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+#, fuzzy
+msgid "Repository Group permissions updated"
+msgstr "Création de dépôt désactivée"
+
+#: rhodecode/controllers/admin/settings.py:123
 #, fuzzy, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr "Après re-scan : %s ajouté(s), %s enlevé(s)"
 
-#: rhodecode/controllers/admin/settings.py:135
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr "La tâche de réindexation Whoosh a été planifiée."
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr "Réglages mis à jour"
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 #, fuzzy
 msgid "Error occurred during updating application settings"
 msgstr "Une erreur est survenue durant la mise à jour des options."
 
-#: rhodecode/controllers/admin/settings.py:216
+#: rhodecode/controllers/admin/settings.py:219
 msgid "Updated visualisation settings"
 msgstr "Réglages d’affichage mis à jour."
 
-#: rhodecode/controllers/admin/settings.py:221
+#: rhodecode/controllers/admin/settings.py:224
 #, fuzzy
 msgid "Error occurred during updating visualisation settings"
 msgstr "Une erreur est survenue durant la mise à jour des réglages d’affichages."
 
-#: rhodecode/controllers/admin/settings.py:297
+#: rhodecode/controllers/admin/settings.py:300
 msgid "Updated VCS settings"
 msgstr "Réglages des gestionnaires de versions mis à jour."
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr "Le nouveau hook a été ajouté."
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr "Hooks mis à jour"
 
-#: rhodecode/controllers/admin/settings.py:327
+#: rhodecode/controllers/admin/settings.py:330
 #, fuzzy
 msgid "Error occurred during hook creation"
 msgstr "Une erreur est survenue durant la création du hook."
 
-#: rhodecode/controllers/admin/settings.py:346
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr "La tâche d’e-mail a été créée."
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 "Vous ne pouvez pas éditer cet utilisateur ; il est nécessaire pour le bon"
 " fonctionnement de l’application."
 
-#: rhodecode/controllers/admin/settings.py:452
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr "Votre compte a été mis à jour avec succès"
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
 #, fuzzy, python-format
 msgid "Error occurred during update of user %s"
@@ -745,123 +787,98 @@
 msgid "An error occurred during deletion of user"
 msgstr "Une erreur est survenue durant la suppression de l’utilisateur."
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr "Vous ne pouvez pas éditer cet utilisateur"
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr "La permission de création de dépôts a été accordée à l’utilisateur."
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr "La permission de création de dépôts a été révoquée à l’utilisateur."
-
-#: rhodecode/controllers/admin/users.py:287
-msgid "Granted 'repository fork' permission to user"
-msgstr "La permission de fork de dépôts a été accordée à l’utilisateur."
-
-#: rhodecode/controllers/admin/users.py:292
-msgid "Revoked 'repository fork' permission to user"
-msgstr "La permission de fork de dépôts a été révoquée à l’utilisateur."
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+#, fuzzy
+msgid "Updated permissions"
+msgstr "Copier les permissions"
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 msgid "An error occurred during permissions saving"
 msgstr "Une erreur est survenue durant l’enregistrement des permissions."
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr "L’e-mail « %s » a été ajouté à l’utilisateur."
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 msgid "An error occurred during email saving"
 msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail."
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 msgid "Removed email from user"
 msgstr "L’e-mail a été enlevé de l’utilisateur."
 
-#: rhodecode/controllers/admin/users.py:341
+#: rhodecode/controllers/admin/users.py:340
 #, fuzzy, python-format
 msgid "Added ip %s to user"
 msgstr "L’e-mail « %s » a été ajouté à l’utilisateur."
 
-#: rhodecode/controllers/admin/users.py:347
+#: rhodecode/controllers/admin/users.py:346
 #, fuzzy
 msgid "An error occurred during ip saving"
 msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail."
 
-#: rhodecode/controllers/admin/users.py:359
+#: rhodecode/controllers/admin/users.py:358
 #, fuzzy
 msgid "Removed ip from user"
 msgstr "L’e-mail a été enlevé de l’utilisateur."
 
-#: rhodecode/controllers/admin/users_groups.py:86
+#: rhodecode/controllers/admin/users_groups.py:162
 #, fuzzy, python-format
 msgid "Created user group %s"
 msgstr "Le groupe d’utilisateurs %s a été créé."
 
-#: rhodecode/controllers/admin/users_groups.py:97
+#: rhodecode/controllers/admin/users_groups.py:173
 #, fuzzy, python-format
 msgid "Error occurred during creation of user group %s"
 msgstr "Une erreur est survenue durant la création du groupe d’utilisateurs %s."
 
-#: rhodecode/controllers/admin/users_groups.py:166
+#: rhodecode/controllers/admin/users_groups.py:210
 #, fuzzy, python-format
 msgid "Updated user group %s"
 msgstr "Le groupe d’utilisateurs %s a été mis à jour."
 
-#: rhodecode/controllers/admin/users_groups.py:188
+#: rhodecode/controllers/admin/users_groups.py:232
 #, fuzzy, python-format
 msgid "Error occurred during update of user group %s"
 msgstr "Une erreur est survenue durant la mise à jour du groupe d’utilisateurs %s."
 
-#: rhodecode/controllers/admin/users_groups.py:205
+#: rhodecode/controllers/admin/users_groups.py:250
 #, fuzzy
 msgid "Successfully deleted user group"
 msgstr "Le groupe d’utilisateurs a été supprimé avec succès."
 
-#: rhodecode/controllers/admin/users_groups.py:210
+#: rhodecode/controllers/admin/users_groups.py:255
 #, fuzzy
 msgid "An error occurred during deletion of user group"
 msgstr "Une erreur est survenue lors de la suppression du groupe d’utilisateurs."
 
-#: rhodecode/controllers/admin/users_groups.py:259
-#, fuzzy
-msgid "Granted 'repository create' permission to user group"
-msgstr ""
-"La permission de création de dépôts a été accordée au groupe "
-"d’utilisateurs."
-
-#: rhodecode/controllers/admin/users_groups.py:264
-#, fuzzy
-msgid "Revoked 'repository create' permission to user group"
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
 msgstr ""
-"La permission de création de dépôts a été révoquée au groupe "
-"d’utilisateurs."
-
-#: rhodecode/controllers/admin/users_groups.py:270
-#, fuzzy
-msgid "Granted 'repository fork' permission to user group"
-msgstr "La permission de fork de dépôts a été accordée au groupe d’utilisateur."
-
-#: rhodecode/controllers/admin/users_groups.py:275
-#, fuzzy
-msgid "Revoked 'repository fork' permission to user group"
-msgstr "La permission de fork de dépôts a été révoquée au groupe d’utilisateurs."
-
-#: rhodecode/lib/auth.py:530
+
+#: rhodecode/controllers/admin/users_groups.py:280
+#, fuzzy
+msgid "User Group permissions updated"
+msgstr "Création de dépôt désactivée"
+
+#: rhodecode/lib/auth.py:544
 #, fuzzy, python-format
 msgid "IP %s not allowed"
 msgstr "Followers de %s"
 
-#: rhodecode/lib/auth.py:579
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr "Vous devez être un utilisateur enregistré pour effectuer cette action."
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr "Vous devez être connecté pour visualiser cette page."
 
@@ -880,154 +897,183 @@
 msgid "No changes detected"
 msgstr "Aucun changement détecté."
 
-#: rhodecode/lib/helpers.py:394
+#: rhodecode/lib/helpers.py:428
 #, python-format
 msgid "%a, %d %b %Y %H:%M:%S"
 msgstr "%d/%m/%Y à %H:%M:%S"
 
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr "Vrai"
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr "Faux"
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, fuzzy, python-format
 msgid "Deleted branch: %s"
 msgstr "Dépôt %s supprimé"
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, fuzzy, python-format
 msgid "Created tag: %s"
 msgstr "utilisateur %s créé"
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr "Ensemble de changements non trouvé"
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Afficher les changements combinés %s->%s"
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr "vue de comparaison"
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr "et"
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr "%s de plus"
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674 rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr "révisions"
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, fuzzy, python-format
 msgid "fork name %s"
 msgstr "Nom du fork %s"
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr "Requête de pull #%s"
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr "[a supprimé] le dépôt"
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr "[a créé] le dépôt"
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr "[a créé] le dépôt en tant que fork"
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr "[a forké] le dépôt"
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr "[a mis à jour] le dépôt"
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+#, fuzzy
+msgid "[downloaded] archive from repository"
+msgstr "Les téléchargements sont désactivés pour ce dépôt."
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr "[a supprimé] le dépôt"
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 msgid "[created] user"
 msgstr "[a créé] l’utilisateur"
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 msgid "[updated] user"
 msgstr "[a mis à jour] l’utilisateur"
 
-#: rhodecode/lib/helpers.py:712
+#: rhodecode/lib/helpers.py:749
 #, fuzzy
 msgid "[created] user group"
 msgstr "[a créé] le groupe d’utilisateurs"
 
-#: rhodecode/lib/helpers.py:714
+#: rhodecode/lib/helpers.py:751
 #, fuzzy
 msgid "[updated] user group"
 msgstr "[a mis à jour] le groupe d’utilisateurs"
 
-#: rhodecode/lib/helpers.py:716
+#: rhodecode/lib/helpers.py:753
 msgid "[commented] on revision in repository"
 msgstr "[a commenté] une révision du dépôt"
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 msgid "[commented] on pull request for"
 msgstr "[a commenté] la requête de pull pour"
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 msgid "[closed] pull request for"
 msgstr "[a fermé] la requête de pull de"
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr "[a pushé] dans"
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 msgid "[committed via RhodeCode] into repository"
 msgstr "[a commité via RhodeCode] dans le dépôt"
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 msgid "[pulled from remote] into repository"
 msgstr "[a pullé depuis un site distant] dans le dépôt"
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr "[a pullé] depuis"
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr "[suit maintenant] le dépôt"
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr "[ne suit plus] le dépôt"
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr "et %s de plus"
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr "Aucun fichier"
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+#, fuzzy
+msgid "new file"
+msgstr "Ajouter un nouveau fichier"
+
+#: rhodecode/lib/helpers.py:1161
+#, fuzzy
+msgid "mod"
+msgstr "Supprimés"
+
+#: rhodecode/lib/helpers.py:1164
+#, fuzzy
+msgid "del"
+msgstr "Supprimer"
+
+#: rhodecode/lib/helpers.py:1167
+#, fuzzy
+msgid "rename"
+msgstr "Nom d’utilisateur"
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1043,225 +1089,314 @@
 msgid "cannot create new union repository"
 msgstr "[a créé] le dépôt"
 
-#: rhodecode/lib/utils2.py:411
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d an"
 msgstr[1] "%d ans"
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d mois"
 msgstr[1] "%d mois"
 
-#: rhodecode/lib/utils2.py:413
+#: rhodecode/lib/utils2.py:412
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d jour"
 msgstr[1] "%d jours"
 
-#: rhodecode/lib/utils2.py:414
+#: rhodecode/lib/utils2.py:413
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d heure"
 msgstr[1] "%d heures"
 
-#: rhodecode/lib/utils2.py:415
+#: rhodecode/lib/utils2.py:414
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minute"
 msgstr[1] "%d minutes"
 
-#: rhodecode/lib/utils2.py:416
+#: rhodecode/lib/utils2.py:415
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d seconde"
 msgstr[1] "%d secondes"
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, fuzzy, python-format
 msgid "in %s"
 msgstr "à la ligne %s"
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr "Il y a %s"
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, fuzzy, python-format
 msgid "in %s and %s"
 msgstr "Il y a %s et %s"
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr "Il y a %s et %s"
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr "à l’instant"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 msgid "Repository no access"
 msgstr "Aucun accès au dépôt"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 msgid "Repository read access"
 msgstr "Accès en lecture au dépôt"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 msgid "Repository write access"
 msgstr "Accès en écriture au dépôt"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 msgid "Repository admin access"
 msgstr "Accès administrateur au dépôt"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 msgid "Repositories Group no access"
 msgstr "Aucun accès au groupe de dépôts"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 msgid "Repositories Group read access"
 msgstr "Accès en lecture au groupe de dépôts"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 msgid "Repositories Group write access"
 msgstr "Accès en écriture au groupe de dépôts"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 msgid "Repositories Group admin access"
 msgstr "Accès administrateur au groupe de dépôts"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 msgid "RhodeCode Administrator"
 msgstr "Administrateur RhodeCode"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 msgid "Repository creation disabled"
 msgstr "Création de dépôt désactivée"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 msgid "Repository creation enabled"
 msgstr "Création de dépôt activée"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 msgid "Repository forking disabled"
 msgstr "Fork de dépôt désactivé"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 msgid "Repository forking enabled"
 msgstr "Fork de dépôt activé"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 msgid "Register disabled"
 msgstr "Enregistrement désactivé"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr "Enregistrer un nouvel utilisateur Rhodecode manuellement activé"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr "Enregistrer un nouvel utilisateur Rhodecode auto-activé"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr "Pas encore relue"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 msgid "Approved"
 msgstr "Approuvée "
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr "Rejetée"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr "En cours de relecture"
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+#, fuzzy
+msgid "Repository group no access"
+msgstr "Aucun accès au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+#, fuzzy
+msgid "Repository group read access"
+msgstr "Accès en lecture au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+#, fuzzy
+msgid "Repository group write access"
+msgstr "Accès en écriture au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+#, fuzzy
+msgid "Repository group admin access"
+msgstr "Accès administrateur au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+#, fuzzy
+msgid "User group no access"
+msgstr "Aucun accès au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+#, fuzzy
+msgid "User group read access"
+msgstr "Accès en lecture au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+#, fuzzy
+msgid "User group write access"
+msgstr "Accès en écriture au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+#, fuzzy
+msgid "User group admin access"
+msgstr "Accès administrateur au groupe de dépôts"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+#, fuzzy
+msgid "Repository Group creation disabled"
+msgstr "Création de dépôt désactivée"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+#, fuzzy
+msgid "Repository Group creation enabled"
+msgstr "Création de dépôt activée"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+#, fuzzy
+msgid "User Group creation disabled"
+msgstr "Création de dépôt désactivée"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+#, fuzzy
+msgid "User Group creation enabled"
+msgstr "Création de dépôt activée"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+#, fuzzy
+msgid "Registration disabled"
+msgstr "Enregistrement désactivé"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+#, fuzzy
+msgid "User Registration with manual account activation"
+msgstr "Autorisé avec activation manuelle du compte"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+#, fuzzy
+msgid "User Registration with automatic account activation"
+msgstr "Autorisé avec activation automatique du compte"
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr "à la ligne %s"
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr "[Mention]"
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-#, fuzzy
-msgid "Repository group no access"
-msgstr "Aucun accès au groupe de dépôts"
-
-#: rhodecode/model/db.py:1394
-#, fuzzy
-msgid "Repository group read access"
-msgstr "Accès en lecture au groupe de dépôts"
-
-#: rhodecode/model/db.py:1395
-#, fuzzy
-msgid "Repository group write access"
-msgstr "Accès en écriture au groupe de dépôts"
-
-#: rhodecode/model/db.py:1396
-#, fuzzy
-msgid "Repository group admin access"
-msgstr "Accès administrateur au groupe de dépôts"
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr "Veuillez entrer un identifiant"
@@ -1280,44 +1415,44 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Entrez au moins %(min)i caractères"
 
-#: rhodecode/model/notification.py:224
+#: rhodecode/model/notification.py:228
 #, fuzzy, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s a posté un commentaire sur le commit %(when)s"
 
-#: rhodecode/model/notification.py:225
+#: rhodecode/model/notification.py:229
 #, fuzzy, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s a envoyé un message  %(when)s"
 
-#: rhodecode/model/notification.py:226
+#: rhodecode/model/notification.py:230
 #, fuzzy, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s vous a mentioné %(when)s"
 
-#: rhodecode/model/notification.py:227
+#: rhodecode/model/notification.py:231
 #, fuzzy, python-format
 msgid "%(user)s registered in RhodeCode at %(when)s"
 msgstr "%(user)s s’est enregistré sur RhodeCode %(when)s"
 
-#: rhodecode/model/notification.py:228
+#: rhodecode/model/notification.py:232
 #, fuzzy, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s a ouvert une nouvelle requête de pull %(when)s"
 
-#: rhodecode/model/notification.py:229
+#: rhodecode/model/notification.py:233
 #, fuzzy, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s a commenté sur la requête de pull %(when)s"
 
-#: rhodecode/model/pull_request.py:104
+#: rhodecode/model/pull_request.py:98
 #, fuzzy, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
 msgstr ""
 "%(user)s voudrait que vous examiniez sa requête de pull nº%(pr_id)s: "
 "%(pr_title)s"
 
-#: rhodecode/model/scm.py:598
+#: rhodecode/model/scm.py:674
 msgid "latest tip"
 msgstr "Dernier sommet"
 
@@ -1377,9 +1512,10 @@
 msgstr "Le nom d’utilisateur « %(username)s » n’est pas autorisé"
 
 #: rhodecode/model/validators.py:89
+#, fuzzy
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character"
+" dashes and must begin with alphanumeric character or underscore"
 msgstr ""
 "Le nom d’utilisateur peut contenir uniquement des caractères alpha-"
 "numériques ainsi que les caractères suivants : « _ . - ». Il doit "
@@ -1492,25 +1628,25 @@
 msgid "You don't have permissions to create a group in this location"
 msgstr "Vous n’avez pas la permission de créer un dépôt dans ce groupe."
 
-#: rhodecode/model/validators.py:557
+#: rhodecode/model/validators.py:559
 #, fuzzy
 msgid "This username or user group name is not valid"
 msgstr "Ce nom d’utilisateur ou de groupe n’est pas valide."
 
-#: rhodecode/model/validators.py:650
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr "Ceci n’est pas un chemin valide"
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr "Cette adresse e-mail est déjà enregistrée"
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr "L’adresse e-mail « %(email)s » n’existe pas"
 
-#: rhodecode/model/validators.py:722
+#: rhodecode/model/validators.py:724
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -1518,26 +1654,30 @@
 "L’attribut Login du CN doit être spécifié. Cet attribut correspond au nom"
 " d’utilisateur."
 
-#: rhodecode/model/validators.py:735
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
 msgstr ""
 "Les révisions %(revs)s font déjà partie de la requête de pull ou on des "
 "statuts définis."
 
-#: rhodecode/model/validators.py:767
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
 msgstr ""
 
-#: rhodecode/model/validators.py:768
+#: rhodecode/model/validators.py:770
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: rhodecode/model/validators.py:800
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
 #: rhodecode/templates/index.html:5
 msgid "Dashboard"
 msgstr "Tableau de bord"
@@ -1585,29 +1725,28 @@
 msgstr ""
 
 #: rhodecode/templates/index_base.html:40
-#: rhodecode/templates/index_base.html:140
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr "Nom de groupe"
 
 #: rhodecode/templates/index_base.html:41
-#: rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142
-#: rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:68
 #: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr "Description"
@@ -1615,27 +1754,25 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr "Groupe de dépôt"
 
-#: rhodecode/templates/index_base.html:82
-#: rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
 #: rhodecode/templates/admin/repos/repos.html:71
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
 #: rhodecode/templates/tags/tags.html:48
@@ -1643,110 +1780,79 @@
 msgid "Name"
 msgstr "Nom"
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
 msgstr "Dernière modification"
 
-#: rhodecode/templates/index_base.html:85
-#: rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
+#: rhodecode/templates/index_base.html:126
 #: rhodecode/templates/admin/repos/repos.html:74
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr "Sommet"
 
-#: rhodecode/templates/index_base.html:86
-#: rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
 #: rhodecode/templates/admin/repos/repos.html:76
 msgid "Owner"
 msgstr "Propriétaire"
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr "Atom"
-
-#: rhodecode/templates/index_base.html:171
-#: rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr "Tri ascendant"
 
-#: rhodecode/templates/index_base.html:172
-#: rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr "Tri descendant"
 
-#: rhodecode/templates/index_base.html:181
-#: rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr "Dernière modification"
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr "Aucun élément n’a été trouvé."
-
-#: rhodecode/templates/index_base.html:212
-#: rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+#, fuzzy
+msgid "No repositories found."
+msgstr "Groupes de dépôts"
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr "Erreur d’intégrité des données."
 
-#: rhodecode/templates/index_base.html:213
-#: rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr "Chargement…"
 
-#: rhodecode/templates/index_base.html:298
-#, fuzzy
-msgid "No repositories found."
-msgstr "Groupes de dépôts"
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr "Connexion"
 
@@ -1761,7 +1867,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr "Nom d’utilisateur"
@@ -1769,7 +1875,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -1785,7 +1891,7 @@
 msgid "Forgot your password ?"
 msgstr "Mot de passe oublié ?"
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr "Vous n’avez pas de compte ?"
 
@@ -1855,7 +1961,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1878,13 +1984,13 @@
 msgstr "Aucun tag n’a été créé pour le moment."
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr "Aucun signet n’a été créé."
 
 #: rhodecode/templates/admin/admin.html:5
 #: rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr "Historique d’administration"
 
@@ -1912,9 +2018,9 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr "Action"
 
@@ -1924,7 +2030,7 @@
 msgstr "Dépôt"
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
@@ -1948,20 +2054,19 @@
 msgstr "Groupes de dépôts"
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 #, fuzzy
 msgid "Defaults"
 msgstr "[Par défaut]"
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr "Type"
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -1971,60 +2076,194 @@
 "comme collaborateurs."
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr "Activer les statistiques"
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr "Afficher les statistiques sur la page du dépôt."
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr "Activer les téléchargements"
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr "Afficher le menu de téléchargements sur la page du dépôt."
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 msgid "Enable locking"
 msgstr "Activer le verrouillage"
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr "Activer le verrouillage lors d’un pull sur le dépôt."
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr "Enregistrer"
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, fuzzy, python-format
+msgid "Private Gists for user %s"
+msgstr "utilisateur %s créé"
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+#, fuzzy
+msgid "Create new gist"
+msgstr "Créer un nouveau fichier"
+
+#: rhodecode/templates/admin/gists/index.html:48
+#, fuzzy
+msgid "Created"
+msgstr "Lecture"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+#, fuzzy
+msgid "Expires"
+msgstr "Dépôts"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+#, fuzzy
+msgid "never"
+msgstr "%d relecteur"
+
+#: rhodecode/templates/admin/gists/index.html:68
+#, fuzzy
+msgid "There are no gists yet"
+msgstr "Aucun tag n’a été créé pour le moment."
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+#, fuzzy
+msgid "Gist description ..."
+msgstr "Description"
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr "Réinitialiser"
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+#, fuzzy
+msgid "Private gist"
+msgstr "Dépôt privé"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr "Supprimer"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#, fuzzy
+msgid "Confirm to delete this gist"
+msgstr "Veuillez confirmer la suppression de l’e-mail : %s"
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+#, fuzzy
+msgid "Show as raw"
+msgstr "montrer le fichier brut"
+
+#: rhodecode/templates/admin/gists/show.html:71
+#, fuzzy
+msgid "created"
+msgstr "Lecture"
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr "Administration LDAP"
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
+#: rhodecode/templates/base/base.html:79
 #, fuzzy
 msgid "LDAP"
 msgstr "LDAP"
@@ -2125,7 +2364,7 @@
 msgstr "Notification"
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr "Notifications"
 
@@ -2134,12 +2373,14 @@
 msgstr "Gestion des permissions"
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr "Permissions"
 
@@ -2164,6 +2405,7 @@
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
 #, fuzzy
 msgid "Overwrite existing settings"
 msgstr "Écraser les permissions existantes"
@@ -2180,89 +2422,95 @@
 "perdues."
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr "Enregistrement"
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+#, fuzzy
+msgid "User group"
+msgstr "Groupes d’utilisateurs"
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+#, fuzzy
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+"Les permissions par défaut de chaque dépôt vont être remplacées par la "
+"permission choisie. Toutes les permissions par défaut des dépôts seront "
+"perdues."
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr "Création de dépôt"
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+#, fuzzy
+msgid "User group creation"
+msgstr "Gestion des groupes d’utilisateurs"
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 msgid "Repository forking"
 msgstr "Fork de dépôt"
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr "Réinitialiser"
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr "Enregistrement"
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+#, fuzzy
+msgid "External auth account activation"
+msgstr "Autorisé avec activation automatique du compte"
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 #, fuzzy
 msgid "Default User Permissions"
 msgstr "Permissions par défaut"
 
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 #, fuzzy
 msgid "Allowed IP addresses"
 msgstr "Adresses e-mail"
 
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr "Supprimer"
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
 #, fuzzy, python-format
 msgid "Confirm to delete this ip: %s"
 msgstr "Veuillez confirmer la suppression de l’e-mail : %s"
 
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 #, fuzzy
 msgid "New ip address"
 msgstr "Nouvelle adrese"
 
-#: rhodecode/templates/admin/permissions/permissions.html:153
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 msgid "Add"
 msgstr "Ajouter"
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr "Dépôts"
 
@@ -2278,7 +2526,7 @@
 msgstr "Cloner depuis"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr "URL http(s) depuis laquelle le dépôt doit être cloné."
 
@@ -2292,13 +2540,13 @@
 msgstr "Type de dépôt à créer."
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 msgid "Landing revision"
 msgstr "Révision d’arrivée"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
@@ -2306,7 +2554,7 @@
 "recherche et de documentation."
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
@@ -2320,73 +2568,78 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr "Options"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+#, fuzzy
+msgid "Non-changeable id"
+msgstr "Identifiant permanent : %s"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr "URL de clone"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr "Sélectionnez un groupe (optionel) dans lequel sera placé le dépôt."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr "Changer le propriétaire de ce dépôt."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:184
+#: rhodecode/templates/admin/repos/repo_edit.html:177
 #, fuzzy
 msgid "Advanced settings"
 msgstr "Enregister les options"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:187
+#: rhodecode/templates/admin/repos/repo_edit.html:180
 msgid "Statistics"
 msgstr "Statistiques"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Reset current statistics"
 msgstr "Réinitialiser les statistiques"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Confirm to remove current statistics"
 msgstr "Souhaitez-vous vraiment réinitialiser les statistiques de ce dépôt ?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:194
+#: rhodecode/templates/admin/repos/repo_edit.html:187
 msgid "Fetched to rev"
 msgstr "Parcouru jusqu’à la révision"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr "Statistiques obtenues"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr "Dépôt distant"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr "Récupérer les changements depuis le site distant"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr "Voulez-vous vraiment récupérer les changements depuis le site distant ?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:218
+#: rhodecode/templates/admin/repos/repo_edit.html:211
 msgid "Cache"
 msgstr "Cache"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Invalidate repository cache"
 msgstr "Invalider le cache du dépôt"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Confirm to invalidate repository cache"
 msgstr "Voulez-vous vraiment invalider le cache du dépôt ?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:225
+#: rhodecode/templates/admin/repos/repo_edit.html:218
 msgid ""
 "Manually invalidate cache for this repository. On first access repository"
 " will be cached again"
@@ -2394,44 +2647,44 @@
 "Invalide manuellement le cache de ce dépôt. Au prochain accès sur ce "
 "dépôt, il sera à nouveau mis en cache."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr "Liste des valeurs en cache"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 #, fuzzy
 msgid "Key"
 msgstr "Clé d’API"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr "Actif"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280
-#: rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr "Journal public"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:256
+#: rhodecode/templates/admin/repos/repo_edit.html:249
 msgid "Remove from public journal"
 msgstr "Supprimer du journal public"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:258
+#: rhodecode/templates/admin/repos/repo_edit.html:251
 msgid "Add to public journal"
 msgstr "Ajouter le dépôt au journal public"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:263
+#: rhodecode/templates/admin/repos/repo_edit.html:256
 msgid ""
 "All actions made on this repository will be accessible to everyone in "
 "public journal"
@@ -2439,79 +2692,76 @@
 "Le descriptif des actions réalisées sur ce dépôt sera visible à tous "
 "depuis le journal public."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:270
+#: rhodecode/templates/admin/repos/repo_edit.html:263
 msgid "Locking"
 msgstr "Verrouillage"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr "Déverrouiller le dépôt"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Confirm to unlock repository"
 msgstr "Veuillez confirmer le déverrouillage de ce dépôt."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+#, fuzzy
+msgid "Lock repo"
 msgstr "Verrouiller le dépôt"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 msgid "Confirm to lock repository"
 msgstr "Veuillez confirmer le verrouillage de ce dépôt."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 msgid "Repository is not locked"
 msgstr "Ce dépôt n’est pas verrouillé."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:284
+#: rhodecode/templates/admin/repos/repo_edit.html:277
 msgid "Force locking on repository. Works only when anonymous access is disabled"
 msgstr ""
 "Forcer le verrouillage du dépôt. Ce réglage fonctionne uniquement quand "
 "l‘accès anonyme est désactivé."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:291
+#: rhodecode/templates/admin/repos/repo_edit.html:284
 msgid "Set as fork of"
 msgstr "Indiquer comme fork"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+#, fuzzy
+msgid "Set"
 msgstr "Définir"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 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."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr "Supprimer"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr "Supprimer ce dépôt"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr "Voulez-vous vraiment supprimer ce dépôt ?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
+#: rhodecode/templates/admin/repos/repo_edit.html:310
 #, fuzzy, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
 msgstr[0] "[a créé] le dépôt en tant que %s fork"
 msgstr[1] "[a créé] le dépôt en tant que %s fork"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:318
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 #, fuzzy
 msgid "Detach forks"
 msgstr "Indiquer comme fork"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:319
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 #, fuzzy
 msgid "Delete forks"
 msgstr "Supprimer"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:322
+#: rhodecode/templates/admin/repos/repo_edit.html:315
 #, fuzzy
 msgid ""
 "This repository will be renamed in a special way in order to be "
@@ -2526,59 +2776,64 @@
 "Si vous voulez le supprimer complètement, effectuez la suppression "
 "manuellement."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:348
+#: rhodecode/templates/admin/repos/repo_edit.html:341
 #, fuzzy, python-format
 msgid "Confirm to delete this field: %s"
 msgstr "Veuillez confirmer la suppression de l’e-mail : %s"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:362
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 #, fuzzy
 msgid "New field key"
 msgstr "Ajouter un fichier"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:379
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 #, fuzzy
 msgid "New field description"
 msgstr "Description"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr "Aucune"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr "Lecture"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr "Écriture"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr "Administration"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr "Membre"
 
@@ -2590,6 +2845,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 msgid "default"
 msgstr "[Par défaut]"
 
@@ -2597,34 +2854,37 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr "Révoquer"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr "Ajouter un utilisateur"
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr "Échec de suppression de l’utilisateur"
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-#, fuzzy
-msgid "Failed to remove user group"
-msgstr "Erreur lors de la suppression du groupe d’utilisateurs."
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr "Administration des dépôts"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
+msgstr "Aucun élément n’a été trouvé."
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
 msgid "apply to children"
 msgstr "Appliquer aux enfants"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
 #, fuzzy
 msgid ""
 "Set or revoke permission to all children of that group, including non-"
@@ -2654,7 +2914,7 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 #, fuzzy
 msgid "Repository groups"
 msgstr "Groupe de dépôt"
@@ -2688,7 +2948,7 @@
 msgid "Add child group"
 msgstr "Ajouter un nouveau groupe"
 
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
 msgid ""
 "Enable lock-by-pulling on group. This option will be applied to all other"
 " groups and repositories inside"
@@ -2706,16 +2966,22 @@
 msgstr "Nombre de sous-dépôts"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 #, fuzzy
 msgid "Edit"
 msgstr "éditer"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr "éditer"
 
@@ -2823,8 +3089,8 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr "Enregister les options"
 
@@ -2838,48 +3104,72 @@
 msgstr "Activer"
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:140
 #, fuzzy
 msgid "Use repository extra fields"
 msgstr "Dépôts"
 
-#: rhodecode/templates/admin/settings/settings.html:147
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+#, fuzzy
+msgid "Dashboard items"
+msgstr "Tableau de bord"
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 msgid "Icons"
 msgstr "Icônes"
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr "Afficher l’icône de dépôt public sur les dépôts"
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 msgid "Show private repo icon on repositories"
 msgstr "Afficher l’icône de dépôt privé sur les dépôts"
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+#, fuzzy
+msgid "Show public/private icons next to repositories names"
+msgstr "Afficher l’icône de dépôt public sur les dépôts"
+
+#: rhodecode/templates/admin/settings/settings.html:172
 msgid "Meta-Tagging"
 msgstr "Meta-Tagging"
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr "Styliser les méta-tags reconnus :"
 
-#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:204
 msgid "VCS settings"
 msgstr "Réglages de gestionnaire de version"
 
-#: rhodecode/templates/admin/settings/settings.html:204
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr "Web"
 
-#: rhodecode/templates/admin/settings/settings.html:209
+#: rhodecode/templates/admin/settings/settings.html:218
 #, fuzzy
 msgid "Require SSL for vcs operations"
 msgstr "SSL requis pour les opérations de push/pull"
 
-#: rhodecode/templates/admin/settings/settings.html:211
+#: rhodecode/templates/admin/settings/settings.html:220
 msgid ""
 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
 "will return HTTP Error 406: Not Acceptable"
@@ -2887,46 +3177,46 @@
 "RhodeCode requièrera SSL pour les pushs et pulls. Si le SSL n’est pas "
 "utilisé l’erreur HTTP 406 (Non Acceptable) sera renvoyée."
 
-#: rhodecode/templates/admin/settings/settings.html:217
+#: rhodecode/templates/admin/settings/settings.html:226
 msgid "Hooks"
 msgstr "Hooks"
 
-#: rhodecode/templates/admin/settings/settings.html:222
+#: rhodecode/templates/admin/settings/settings.html:231
 msgid "Update repository after push (hg update)"
 msgstr "Mettre à jour les dépôts après un push (hg update)"
 
-#: rhodecode/templates/admin/settings/settings.html:226
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr "Afficher la taille du dépôt après un push"
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr "Journaliser les commandes de push"
 
-#: rhodecode/templates/admin/settings/settings.html:234
+#: rhodecode/templates/admin/settings/settings.html:243
 msgid "Log user pull commands"
 msgstr "Journaliser les commandes de pull"
 
-#: rhodecode/templates/admin/settings/settings.html:238
+#: rhodecode/templates/admin/settings/settings.html:247
 #, fuzzy
 msgid "Advanced setup"
 msgstr "Avancé"
 
-#: rhodecode/templates/admin/settings/settings.html:243
+#: rhodecode/templates/admin/settings/settings.html:252
 msgid "Mercurial Extensions"
 msgstr "Extensions Mercurial"
 
-#: rhodecode/templates/admin/settings/settings.html:248
+#: rhodecode/templates/admin/settings/settings.html:257
 #, fuzzy
 msgid "Enable largefiles extension"
 msgstr "Extensions largefiles"
 
-#: rhodecode/templates/admin/settings/settings.html:252
+#: rhodecode/templates/admin/settings/settings.html:261
 #, fuzzy
 msgid "Enable hgsubversion extension"
 msgstr "Extensions hgsubversion"
 
-#: rhodecode/templates/admin/settings/settings.html:254
+#: rhodecode/templates/admin/settings/settings.html:263
 #, fuzzy
 msgid ""
 "Requires hgsubversion library installed. Allows cloning from svn remote "
@@ -2935,27 +3225,23 @@
 "Ceci nécessite l’installation de la bibliothèque hgsubversion. Permet de "
 "clôner à partir de dépôts Suversion."
 
-#: rhodecode/templates/admin/settings/settings.html:264
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr "Emplacement des dépôts"
 
-#: rhodecode/templates/admin/settings/settings.html:269
+#: rhodecode/templates/admin/settings/settings.html:279
 msgid ""
-"This a crucial application setting. If you are really sure you need to "
-"change this, you must restart application in order to make this setting "
-"take effect. Click this label to unlock."
+"Click to unlock. You must restart RhodeCode in order to make this setting"
+" take effect."
 msgstr ""
-"Ce réglage ne devrait pas être modifié en temps normal. Si vous devez "
-"vraiment le faire, redémarrer l’application une fois le changement "
-"effectué. Cliquez sur ce texte pour déverrouiller."
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 #, fuzzy
 msgid "Unlock"
 msgstr "Déverrouiller"
 
-#: rhodecode/templates/admin/settings/settings.html:272
+#: rhodecode/templates/admin/settings/settings.html:282
 msgid ""
 "Location where repositories are stored. After changing this value a "
 "restart, and rescan is required"
@@ -2963,24 +3249,24 @@
 "Emplacement de stockage des dépôts. Si cette valeur est changée, "
 "Rhodecode devra être redémarré les les dépôts rescannés."
 
-#: rhodecode/templates/admin/settings/settings.html:292
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr "E-mail de test"
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr "Envoyer l’e-mail à"
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr "Envoyer"
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr "Information système et paquets"
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr "Afficher"
 
@@ -2990,7 +3276,7 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr "Utilisateurs"
 
@@ -3048,46 +3334,21 @@
 msgid "New password confirmation"
 msgstr "Confirmation du nouveau mot de passe"
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-msgid "Inherit default permissions"
-msgstr "Utiliser les permissions par défaut"
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-"Cochez pour utiliser les permissions des les réglages %s. Si cette option"
-" est activée, les réglages ci-dessous n’auront pas d’effet."
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr "Création de dépôts"
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-msgid "Fork repositories"
-msgstr "Forker les dépôts"
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 msgid "Email addresses"
 msgstr "Adresses e-mail"
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, python-format
 msgid "Confirm to delete this email: %s"
 msgstr "Veuillez confirmer la suppression de l’e-mail : %s"
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 msgid "New email address"
 msgstr "Nouvelle adrese"
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr "Mon compte"
 
@@ -3125,7 +3386,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -3145,7 +3406,7 @@
 msgstr "Je participe à"
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr "Requête de pull nº%s ouverte par %s le %s"
@@ -3180,13 +3441,13 @@
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 #, fuzzy
 msgid "User groups"
 msgstr "Groupes d’utilisateurs"
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 #, fuzzy
 msgid "Add new user group"
 msgstr "Ajouter un nouveau groupe"
@@ -3202,7 +3463,7 @@
 msgstr "Groupes d’utilisateurs"
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr "Membres"
 
@@ -3223,47 +3484,57 @@
 msgid "Add all elements"
 msgstr "Tout ajouter"
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr "Membres du groupe"
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 #, fuzzy
 msgid "No members yet"
 msgstr "Membres"
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+#, fuzzy
+msgid "Global Permissions"
+msgstr "Copier les permissions"
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
 #, fuzzy
 msgid "User groups administration"
 msgstr "Gestion des groupes d’utilisateurs"
 
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
 #, fuzzy, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Voulez-vous vraiment supprimer le groupe d‘utilisateurs « %s » ?"
 
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+#, fuzzy
+msgid "There are no user groups yet"
+msgstr "Aucun groupe de dépôts n’a été créé pour le moment."
+
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr "Signaler un bogue"
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Résumé"
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr "Historique"
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3271,52 +3542,48 @@
 msgid "Files"
 msgstr "Fichiers"
 
-#: rhodecode/templates/base/base.html:112
+#: rhodecode/templates/base/base.html:125
 #, fuzzy
 msgid "Switch To"
 msgstr "Aller"
 
-#: rhodecode/templates/base/base.html:114
-#: rhodecode/templates/base/base.html:267
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
 msgid "loading..."
 msgstr "Chargement…"
 
-#: rhodecode/templates/base/base.html:118
+#: rhodecode/templates/base/base.html:131
 msgid "Options"
 msgstr "Options"
 
-#: rhodecode/templates/base/base.html:124
+#: rhodecode/templates/base/base.html:137
 #: rhodecode/templates/forks/forks_data.html:21
 msgid "Compare fork"
 msgstr "Comparer le fork"
 
-#: rhodecode/templates/base/base.html:126
-msgid "Lightweight changelog"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:127
-#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr "Rechercher"
 
-#: rhodecode/templates/base/base.html:133
+#: rhodecode/templates/base/base.html:145
 #, fuzzy
 msgid "Lock"
 msgstr "Verrouiller"
 
-#: rhodecode/templates/base/base.html:141
+#: rhodecode/templates/base/base.html:153
 #, fuzzy
 msgid "Follow"
 msgstr "followers"
 
-#: rhodecode/templates/base/base.html:142
+#: rhodecode/templates/base/base.html:154
 #, fuzzy
 msgid "Unfollow"
 msgstr "followers"
 
-#: rhodecode/templates/base/base.html:145
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3325,66 +3592,122 @@
 msgid "Fork"
 msgstr "Fork"
 
-#: rhodecode/templates/base/base.html:147
+#: rhodecode/templates/base/base.html:159
 #, fuzzy
 msgid "Create Pull Request"
 msgstr "Nouvelle requête de pull"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 #, fuzzy
 msgid "Show Pull Requests"
 msgstr "Nouvelle requête de pull"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 #, fuzzy
 msgid "Pull Requests"
 msgstr "Requêtes de pull"
 
-#: rhodecode/templates/base/base.html:190
+#: rhodecode/templates/base/base.html:202
 #, fuzzy
 msgid "Not logged in"
 msgstr "Dernière connexion"
 
-#: rhodecode/templates/base/base.html:197
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr "Connexion à votre compte"
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr "Mot de passe oublié ?"
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr "Se déconnecter"
 
-#: rhodecode/templates/base/base.html:262
+#: rhodecode/templates/base/base.html:274
 msgid "Switch repository"
 msgstr "Aller au dépôt"
 
-#: rhodecode/templates/base/base.html:274
+#: rhodecode/templates/base/base.html:286
 msgid "Show recent activity"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:275
+#: rhodecode/templates/base/base.html:287
 #: rhodecode/templates/journal/journal.html:4
 msgid "Journal"
 msgstr "Historique"
 
-#: rhodecode/templates/base/base.html:286
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 #, fuzzy
 msgid "Search in repositories"
 msgstr "Rechercher dans tous les dépôts"
 
-#: rhodecode/templates/base/perms_summary.html:8
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr "Utiliser les permissions par défaut"
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, fuzzy, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr ""
+"Cochez pour utiliser les permissions des les réglages %s. Si cette option"
+" est activée, les réglages ci-dessous n’auront pas d’effet."
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr "Création de dépôts"
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+#, fuzzy
+msgid "Create user groups"
+msgstr "[a créé] le groupe d’utilisateurs"
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr "Forker les dépôts"
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 #, fuzzy
 msgid "No permissions defined yet"
 msgstr "Copier les permissions"
 
-#: rhodecode/templates/base/perms_summary.html:15
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr "Permission"
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 msgid "Edit Permission"
 msgstr "Éditer"
 
@@ -3394,7 +3717,7 @@
 msgstr "Nouveau commentaire"
 
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
+#: rhodecode/templates/data_table/_dt_elements.html:147
 msgid "Stop following this repository"
 msgstr "Arrêter de suivre ce dépôt"
 
@@ -3411,7 +3734,7 @@
 msgstr "Membres"
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
+#: rhodecode/templates/pullrequests/pullrequest.html:203
 #, fuzzy
 msgid "Loading ..."
 msgstr "Chargement…"
@@ -3427,7 +3750,7 @@
 msgstr "Aucun fichier ne correspond"
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
+#: rhodecode/templates/changelog/changelog.html:45
 msgid "Open new pull request"
 msgstr "Nouvelle requête de pull"
 
@@ -3461,31 +3784,50 @@
 msgid "Expand diff"
 msgstr "Diff brut"
 
+#: rhodecode/templates/base/root.html:58
+#, fuzzy
+msgid "Failed to remoke permission"
+msgstr "Échec de suppression de l’utilisateur"
+
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, python-format
 msgid "%s Bookmarks"
 msgstr "Signets de %s"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+#, fuzzy
+msgid "Compare bookmarks"
+msgstr "Comparer le fork"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
 #: rhodecode/templates/tags/tags.html:51
 #: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr "Auteur"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
 #: rhodecode/templates/tags/tags.html:52
 #: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr "Révision"
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr "Comparer"
+
 #: rhodecode/templates/branches/branches.html:5
 #, python-format
 msgid "%s Branches"
@@ -3495,68 +3837,71 @@
 msgid "Compare branches"
 msgstr "Comparer les branches"
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54
-#: rhodecode/templates/tags/tags_data.html:10
-msgid "Compare"
-msgstr "Comparer"
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, python-format
 msgid "%s Changelog"
 msgstr "Historique de %s"
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 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"
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 #, fuzzy
 msgid "Clear selection"
 msgstr "Réglages de recherche"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
 #, fuzzy, python-format
 msgid "Compare fork with %s"
 msgstr "Comparer le fork avec %s"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #, fuzzy
 msgid "Compare fork with parent"
 msgstr "Comparer le fork avec %s"
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr "Cliquez ici pour ouvrir la requête de pull associée #%s."
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 #, fuzzy
 msgid "Show more"
 msgstr "montrer plus"
 
-#: rhodecode/templates/changelog/changelog.html:89
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
 #, fuzzy, python-format
 msgid "Bookmark %s"
 msgstr "Signets %s"
 
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
 #, fuzzy, python-format
 msgid "Tag %s"
 msgstr "Tags %s"
 
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
 #, fuzzy, python-format
 msgid "Branch %s"
 msgstr "Branches %s"
 
-#: rhodecode/templates/changelog/changelog.html:258
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr "Il n’y a aucun changement pour le moment"
 
@@ -3588,6 +3933,40 @@
 msgid "Affected %s files"
 msgstr "%s fichiers affectés"
 
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+#, fuzzy
+msgid "Commit message"
+msgstr "Message de commit"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+#, fuzzy
+msgid "Age"
+msgstr "Âge"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr "Ajouter ou téléverser des fichiers directement via RhodeCode…"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr "Ajouter un nouveau fichier"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr "Pusher le nouveau dépôt"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr "Le dépôt existe déjà ?"
+
 #: rhodecode/templates/changeset/changeset.html:6
 #, python-format
 msgid "%s Changeset"
@@ -3609,7 +3988,7 @@
 msgstr "Statut du changeset"
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
+#: rhodecode/templates/changeset/diff_block.html:22
 #, fuzzy
 msgid "Raw diff"
 msgstr "Diff brut"
@@ -3620,13 +3999,13 @@
 msgstr "Diff brut"
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
+#: rhodecode/templates/changeset/diff_block.html:23
 #, fuzzy
 msgid "Download diff"
 msgstr "Télécharger le diff"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -3634,7 +4013,7 @@
 msgstr[1] "%d commentaires"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
@@ -3642,11 +4021,11 @@
 msgstr[1] "(et %d en ligne)"
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr "Fusion"
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy, python-format
@@ -3655,7 +4034,7 @@
 msgstr[0] "%s fichié modifié"
 msgstr[1] "%s fichié modifié"
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, fuzzy, python-format
@@ -3664,15 +4043,15 @@
 msgstr[0] "%s fichiers affectés avec %s insertions et %s suppressions"
 msgstr[1] "%s fichiers affectés avec %s insertions et %s suppressions"
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -3691,57 +4070,71 @@
 msgid "Comment on pull request #%s"
 msgstr "[a commenté] la requête de pull pour %s"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr "Envoi…"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr "Commentaire sur la ligne {1}."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
 #, python-format
 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."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
+#: rhodecode/templates/changeset/changeset_file_comment.html:61
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
 msgid "Use @username inside this text to send notification to this RhodeCode user"
 msgstr ""
 "Utilisez @nomutilisateur dans ce texte pour envoyer une notification à "
 "l’utilisateur RhodeCode en question."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+#, fuzzy
+msgid "Preview"
+msgstr "%d relecteur"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+#, fuzzy
+msgid "Comment preview"
+msgstr "vue de comparaison"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr "Commentaire"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 #, fuzzy
 msgid "Cancel"
 msgstr "Modifiés"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr "Vous devez être connecté pour poster des commentaires."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr "Se connecter maintenant"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr "Masquer"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 #, fuzzy
 msgid "Change status"
 msgstr "Modifier le statut"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr "Commenter et fermer"
 
@@ -3754,20 +4147,20 @@
 msgid "Files affected"
 msgstr "Fichiers affectés"
 
-#: rhodecode/templates/changeset/diff_block.html:22
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:30
+#: rhodecode/templates/changeset/diff_block.html:29
 #, fuzzy
 msgid "Show inline comments"
 msgstr "Afficher les commentaires"
 
-#: rhodecode/templates/changeset/diff_block.html:55
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:56
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
 msgstr ""
 
@@ -3845,29 +4238,25 @@
 msgid "Confirm to delete this repository: %s"
 msgstr "Voulez-vous vraiment supprimer le dépôt %s ?"
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Voulez-vous vraiment supprimer l’utilisateur « %s » ?"
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-#, fuzzy
-msgid "New status"
-msgstr "Modifier le statut"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
-msgstr ""
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+#, fuzzy
+msgid "URL"
+msgstr "Journal"
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, fuzzy, python-format
+msgid "%s commented on a %s changeset."
+msgstr "%s a posté un commentaire sur le commit %s"
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-#, fuzzy
-msgid "Repo"
-msgstr "Mes dépôts"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
+msgid "The changeset status was changed to"
 msgstr ""
 
 #: rhodecode/templates/email_templates/main.html:8
@@ -3888,51 +4277,40 @@
 msgid "You can generate it by clicking following URL"
 msgstr ""
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-msgid "If you did not request new password please ignore this email."
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
 msgstr ""
 
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid ""
-"User %s opened pull request for repository %s and wants you to review "
-"changes."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-#, fuzzy
-msgid "View this pull request here"
-msgstr "Ajouter un relecteur à cette requête de pull."
-
 #: rhodecode/templates/email_templates/pull_request.html:6
-#, fuzzy
-msgid "title"
+#, python-format
+msgid ""
+"%s opened a pull request for repository %s and wants you to review "
+"changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
 msgstr "Titre"
 
-#: rhodecode/templates/email_templates/pull_request.html:7
-msgid "description"
-msgstr "Description"
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
 #, fuzzy, python-format
-msgid "Pull request #%s for repository %s"
-msgstr "Requête de pull nº%s ouverte le %s"
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-#, fuzzy
-msgid "Closing pull request with status"
+msgid "%s commented on pull request \"%s\""
+msgstr "%s [a commenté] la requête de pull pour %s"
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+#, fuzzy
+msgid "Pull request was closed with status"
 msgstr "Statut de la requête de pull"
 
-#: rhodecode/templates/email_templates/registration.html:4
-#, fuzzy
-msgid "A new user have registered in RhodeCode"
-msgstr "Vous vous êtes inscrits avec succès à RhodeCode"
-
-#: rhodecode/templates/email_templates/registration.html:9
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+#, fuzzy
+msgid "Pull request changed status"
+msgstr "Statut de la requête de pull"
+
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr ""
 
@@ -3959,7 +4337,6 @@
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
 #, fuzzy
 msgid "Branch"
 msgstr "Branche"
@@ -3974,12 +4351,6 @@
 msgid "Add file"
 msgstr "Ajouter un fichier"
 
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr "Ajouter un nouveau fichier"
-
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
 msgstr "Nom de fichier"
@@ -4008,13 +4379,6 @@
 msgid "use / to separate directories"
 msgstr "Utilisez / pour séparer les répertoires"
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-#, fuzzy
-msgid "Commit message"
-msgstr "Message de commit"
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
@@ -4085,13 +4449,6 @@
 msgid "Show annotation"
 msgstr "Afficher les annotations"
 
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-#, fuzzy
-msgid "Show as raw"
-msgstr "montrer le fichier brut"
-
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
 #, fuzzy
@@ -4290,37 +4647,52 @@
 msgid "New pull request"
 msgstr "Nouvelle requête de pull"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-msgid "Detailed compare view"
-msgstr "Comparaison détaillée"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr "Nouvelle requête de pull"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+#, fuzzy
+msgid "Write a short description on this pull request"
+msgstr "Veuillez confirmer la suppression de cette requête de pull."
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+#, fuzzy
+msgid "Changeset flow"
+msgstr "Changements"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+#, fuzzy
+msgid "Origin repository"
+msgstr "Dépôt Git"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr "Envoyer la requête de pull"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr "Relecteurs de la requête de pull"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 msgid "owner"
 msgstr "Propriétaire"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr "Ajouter un relecteur à cette requête de pull."
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-msgid "Create new pull request"
-msgstr "Nouvelle requête de pull"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-msgid "Title"
-msgstr "Titre"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
-msgstr "Envoyer la requête de pull"
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr "Comparaison détaillée"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+#, fuzzy
+msgid "Destination repository"
+msgstr "Éditer le dépôt"
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
 #, fuzzy, python-format
@@ -4352,11 +4724,6 @@
 msgid "Pull request was reviewed by all reviewers"
 msgstr "La requête de pull a été relue par tous les relecteurs."
 
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-#, fuzzy
-msgid "Origin repository"
-msgstr "Dépôt Git"
-
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 msgid "Created on"
 msgstr "Créé le"
@@ -4421,38 +4788,6 @@
 msgid "Permission denied"
 msgstr "Permission refusée"
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, fuzzy, python-format
-msgid "%s Lightweight Changelog"
-msgstr "%s fichié modifié"
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-#, fuzzy
-msgid "Age"
-msgstr "Âge"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, python-format
-msgid "Click to open associated pull request #%s"
-msgstr "Cliquez ici pour ouvrir la requête de pull associée #%s."
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr "Ajouter ou téléverser des fichiers directement via RhodeCode…"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr "Pusher le nouveau dépôt"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr "Le dépôt existe déjà ?"
-
 #: rhodecode/templates/summary/summary.html:4
 #, python-format
 msgid "%s Summary"
@@ -4493,7 +4828,7 @@
 msgid "Fork of"
 msgstr "Fork de"
 
-#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
 #, fuzzy
 msgid "Remote clone"
 msgstr "Clone distant"
@@ -4520,8 +4855,8 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
+#, fuzzy
+msgid "Enable"
 msgstr "Activer"
 
 #: rhodecode/templates/summary/summary.html:159
@@ -4536,7 +4871,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr "Les téléchargements sont désactivés pour ce dépôt."
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 msgid "Download as zip"
 msgstr "Télécharger en ZIP"
 
@@ -4563,6 +4898,10 @@
 msgid "Commit activity by day / author"
 msgstr "Activité de commit par jour et par auteur"
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr "Activer"
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr "Statistiques obtenues :"
@@ -4577,52 +4916,48 @@
 msgstr "Démarrage rapide"
 
 #: rhodecode/templates/summary/summary.html:272
-#, python-format
-msgid "Readme file at revision '%s'"
+#, fuzzy, python-format
+msgid "Readme file from revision %s"
 msgstr "Fichier « Lisez-moi » à la révision « %s »"
 
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr "Lien permanent vers ce fichier « Lisez-moi »"
-
-#: rhodecode/templates/summary/summary.html:333
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr "Télécharger %s comme archive %s"
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr "Fichiers"
 
-#: rhodecode/templates/summary/summary.html:690
+#: rhodecode/templates/summary/summary.html:689
 msgid "commits"
 msgstr "commits"
 
-#: rhodecode/templates/summary/summary.html:691
+#: rhodecode/templates/summary/summary.html:690
 msgid "files added"
 msgstr "fichiers ajoutés"
 
-#: rhodecode/templates/summary/summary.html:692
+#: rhodecode/templates/summary/summary.html:691
 msgid "files changed"
 msgstr "fichiers modifiés"
 
-#: rhodecode/templates/summary/summary.html:693
+#: rhodecode/templates/summary/summary.html:692
 msgid "files removed"
 msgstr "fichiers supprimés"
 
-#: rhodecode/templates/summary/summary.html:695
+#: rhodecode/templates/summary/summary.html:694
 msgid "commit"
 msgstr "commit"
 
+#: rhodecode/templates/summary/summary.html:695
+msgid "file added"
+msgstr "fichier ajouté"
+
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
-msgstr "fichier ajouté"
+msgid "file changed"
+msgstr "fichié modifié"
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr "fichié modifié"
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr "fichier supprimé"
 
--- a/rhodecode/i18n/how_to	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/how_to	Fri Jun 07 00:31:11 2013 +0200
@@ -2,29 +2,66 @@
 # to create new language #
 ##########################
 
-#this needs to be done on source codes, preferable default/stable branches
- 
-python setup.py extract_messages <- get messages from project
-python setup.py init_catalog -l pl <- create a language directory for <pl> lang
-#edit the new po file with poedit or any other editor
-msgfmt -f -c <updated_file.po> <- check format and errors
-python setup.py compile_catalog -l pl <- create translation files
+Translations are available on transifex under::
+
+    https://www.transifex.com/projects/p/RhodeCode/
+
+Preferred method is to register on transifex and request new language translation.
 
-############# 
-# to update #
-#############
+manual creation of new language
++++++++++++++++++++++++++++++++
+ 
+Dowload sources of RhodeCode. Run::
 
-python setup.py extract_messages <- get messages from project
-python setup.py update_catalog -l pl<- to update the translations
-#edit the new updated po file with poedit
-msgfmt -f -c <updated_file.po> <- check format and errors
-python setup.py compile_catalog -l pl <- create translation files
+    python setup.py develop
+
+To prepare the enviroment
 
 
-###################
-# change language #
-###################
+Make sure all translation strings are extracted by running::
+
+    python setup.py extract_messages
+
+Create new language by executing following command::
+    python setup.py init_catalog -l <new_language_code>
+
+This creates a new language under directory rhodecode/i18n/<new_language_code>
+Be sure to update transifex mapping under .tx/config for new language
+
+Edit the new PO file located in LC_MESSAGES directory with poedit or your
+favorite PO files editor. Do translations and at the end verify the translation
+file for any errors. This can be done by executing::
+
+    msgfmt -f -c rhodecode/i18n/<new_language_code>/LC_MESSAGES/<updated_file.po>
+
+finally compile the translations::
+
+    python setup.py compile_catalog -l <new_language_code>
+
+##########################
+# to update translations #
+##########################
 
-`lang=pl`
+Fetch latest version of strings for translation by running::
+
+    python setup.py extract_messages
+
+Update PO file by doing::
+
+    python setup.py update_catalog -l <new_language_code><- to update the translations
+
+Edit the new updated po file. Repeat all steps after `init_catalog` step from
+new translation instructions
+
 
-in the .ini file
\ No newline at end of file
+########################
+# testing translations #
+########################
+
+Edit test.ini file and set lang attribute to::
+
+    lang=<new_language_code>
+
+Run RhodeCode tests by executing::
+
+    nosetests
Binary file rhodecode/i18n/ja/LC_MESSAGES/rhodecode.mo has changed
--- a/rhodecode/i18n/ja/LC_MESSAGES/rhodecode.po	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/ja/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: RhodeCode 1.2.0\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
 "PO-Revision-Date: 2013-04-06 21:38+0900\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: ja <LL@li.org>\n"
@@ -22,38 +22,37 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr "すべてのブランチ"
 
-#: rhodecode/controllers/changeset.py:83
+#: rhodecode/controllers/changeset.py:84
 msgid "Show white space"
 msgstr "空白を表示"
 
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 msgid "Ignore white space"
 msgstr "空白を無視"
 
-#: rhodecode/controllers/changeset.py:163
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:329
-#: rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
 #, python-format
 msgid "Status change -> %s"
 msgstr "ステータス変更 -> %s"
 
-#: rhodecode/controllers/changeset.py:360
+#: rhodecode/controllers/changeset.py:376
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr "クローズしたプルリクエストに関連するチェンジセットのステータスを変更することは許可されていません"
 
 #: rhodecode/controllers/compare.py:74
-#: rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/pullrequests.py:259
 msgid "There are no changesets yet"
 msgstr "まだ変更がありません"
 
@@ -94,8 +93,8 @@
 msgstr "%s %s フィード"
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -103,115 +102,116 @@
 msgid "Changeset was too big and was cut off..."
 msgstr "チェンジセットが大きすぎるため、省略しました"
 
-#: rhodecode/controllers/feed.py:91
+#: rhodecode/controllers/feed.py:90
 #, python-format
 msgid "%s committed on %s"
 msgstr "%s コミット %s"
 
-#: rhodecode/controllers/files.py:88
+#: rhodecode/controllers/files.py:89
 msgid "Click here to add new file"
 msgstr "新しいファイルを追加"
 
-#: rhodecode/controllers/files.py:89
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr "まだファイルがありません %s"
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr "このリポジトリは %s によって %s にロックされました"
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
 
-#: rhodecode/controllers/files.py:293
+#: rhodecode/controllers/files.py:297
 #, python-format
 msgid "Edited file %s via RhodeCode"
 msgstr "RhodeCode経由で %s を変更"
 
-#: rhodecode/controllers/files.py:309
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr "変更点なし"
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr "%s へのコミットが成功しました"
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr "コミット中にエラーが発生しました"
 
-#: rhodecode/controllers/files.py:347
+#: rhodecode/controllers/files.py:351
 msgid "Added file via RhodeCode"
 msgstr "RhodeCode経由でファイルを追加"
 
-#: rhodecode/controllers/files.py:364
-msgid "No content"
-msgstr "内容がありません"
-
 #: rhodecode/controllers/files.py:368
+msgid "No content"
+msgstr "内容がありません"
+
+#: rhodecode/controllers/files.py:372
 msgid "No filename"
 msgstr "ファイル名がありません"
 
-#: rhodecode/controllers/files.py:372
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
 msgstr "場所には相対パスかつ .. を含まないパスを入力してください"
 
-#: rhodecode/controllers/files.py:420
+#: rhodecode/controllers/files.py:431
 msgid "Downloads disabled"
 msgstr "ダウンロードは無効化されています"
 
-#: rhodecode/controllers/files.py:431
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr "%s は未知のリビジョンです"
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr "空のリポジトリ"
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr "未知のアーカイブ種別です"
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr "チェンジセット"
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632 rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "ブランチ"
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633 rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "タグ"
 
-#: rhodecode/controllers/forks.py:175
+#: rhodecode/controllers/forks.py:176
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr "リポジトリ %s を %s としてフォークしました"
 
-#: rhodecode/controllers/forks.py:189
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "リポジトリ %s のフォーク中にエラーが発生しました"
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 msgid "public journal"
 msgstr "公開ジャーナル"
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr "ジャーナル"
@@ -230,71 +230,71 @@
 "email"
 msgstr "パスワードをリセットしました。新しいパスワードをあなたのメールアドレスに送りました"
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:139
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr "チェンジセット"
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:149
 msgid "Special"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:129
+#: rhodecode/controllers/pullrequests.py:150
 msgid "Peer branches"
 msgstr "相手のブランチ"
 
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "ブックマーク"
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:324
 msgid "Pull request requires a title with min. 3 chars"
 msgstr "プルリクエストには3文字以上のタイトルが必要です"
 
-#: rhodecode/controllers/pullrequests.py:230
+#: rhodecode/controllers/pullrequests.py:326
 msgid "Error creating pull request"
 msgstr "プルリクエストの作成中にエラーが発生しました"
 
-#: rhodecode/controllers/pullrequests.py:251
+#: rhodecode/controllers/pullrequests.py:346
 msgid "Successfully opened new pull request"
 msgstr "新しいプルリクエストを作成しました"
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:349
 msgid "Error occurred during sending pull request"
 msgstr "プルリクエストの作成中にエラーが発生しました"
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:388
 msgid "Successfully deleted pull request"
 msgstr "プルリクエストを削除しました"
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:484
 msgid "Closing with"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:478
+#: rhodecode/controllers/pullrequests.py:521
 msgid "Closing pull request on other statuses than rejected or approved forbidden"
 msgstr ""
 
-#: rhodecode/controllers/search.py:134
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr "無効な検索クエリーです。\\\"で囲んで下さい"
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr "検索するためのインデックスがありません。whooshでインデックスを作成して下さい"
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr "検索を実行する際にエラーがおきました"
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr "まだデータが読み込まれていません"
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr "このリポジトリの統計は無効化されています"
@@ -307,6 +307,45 @@
 msgid "Error occurred during update of defaults"
 msgstr "デフォルト設定の更新中にエラーが発生しました"
 
+#: rhodecode/controllers/admin/gists.py:56
+#, fuzzy
+msgid "forever"
+msgstr "レビュアー"
+
+#: rhodecode/controllers/admin/gists.py:57
+#, fuzzy
+msgid "5 minutes"
+msgstr "%d 分"
+
+#: rhodecode/controllers/admin/gists.py:58
+#, fuzzy
+msgid "1 hour"
+msgstr "%d 時間"
+
+#: rhodecode/controllers/admin/gists.py:59
+#, fuzzy
+msgid "1 day"
+msgstr "%d 日"
+
+#: rhodecode/controllers/admin/gists.py:60
+#, fuzzy
+msgid "1 month"
+msgstr "%d ヶ月"
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+#, fuzzy
+msgid "Error occurred during gist creation"
+msgstr "フックの作成中にエラーが発生しました"
+
+#: rhodecode/controllers/admin/gists.py:165
+#, fuzzy, python-format
+msgid "Deleted gist %s"
+msgstr "リポジトリ %s を削除しました"
+
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
 msgstr "BASE"
@@ -351,35 +390,39 @@
 msgid "START_TLS on LDAP connection"
 msgstr "LDAP接続でSTART_TLSを使用"
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr "LDAP設定を更新しました"
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr "LDAPを有効にできませんでした。\"python-ldap\"ライブラリがありません。"
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
+#: rhodecode/controllers/admin/ldap_settings.py:145
 msgid "Error occurred during update of ldap settings"
 msgstr "LDAP設定の更新中にエラーが発生しました"
 
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr "なし"
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr "読込"
+
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
-msgstr "なし"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
+msgstr "書込"
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr "読込"
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr "書込"
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -400,41 +443,55 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292
-#: rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299
-#: rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr "管理"
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
 msgid "Disabled"
 msgstr "無効"
 
-#: rhodecode/controllers/admin/permissions.py:72
-msgid "Allowed with manual account activation"
-msgstr "手動でアカウントを有効にする"
-
 #: rhodecode/controllers/admin/permissions.py:74
+msgid "Allowed with manual account activation"
+msgstr "手動でアカウントを有効にする"
+
+#: rhodecode/controllers/admin/permissions.py:76
 msgid "Allowed with automatic account activation"
 msgstr "自動でアカウントを有効にする"
 
-#: rhodecode/controllers/admin/permissions.py:77
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr "有効"
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr "デフォルトの権限を更新しました"
 
-#: rhodecode/controllers/admin/permissions.py:142
+#: rhodecode/controllers/admin/permissions.py:152
 msgid "Error occurred during update of permissions"
 msgstr "権限の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:127
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr "--フォーク元を削除--"
 
@@ -453,230 +510,225 @@
 msgid "Error creating repository %s"
 msgstr "リポジトリ %s の作成中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:266
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "リポジトリ %s の更新に成功しました"
 
-#: rhodecode/controllers/admin/repos.py:284
+#: rhodecode/controllers/admin/repos.py:288
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "リポジトリ %s の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:311
-#: rhodecode/controllers/api/api.py:877
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
 msgstr "%s 個のフォークを切り離しました"
 
-#: rhodecode/controllers/admin/repos.py:314
-#: rhodecode/controllers/api/api.py:879
+#: rhodecode/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted %s forks"
 msgstr "%s 個のフォークを削除しました"
 
-#: rhodecode/controllers/admin/repos.py:319
+#: rhodecode/controllers/admin/repos.py:323
 #, python-format
 msgid "Deleted repository %s"
 msgstr "リポジトリ %s を削除しました"
 
-#: rhodecode/controllers/admin/repos.py:322
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr "フォークしたリポジトリが存在するため、 %s は削除できません"
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "リポジトリ %s の削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:365
+#: rhodecode/controllers/admin/repos.py:345
 msgid "Repository permissions updated"
 msgstr "リポジトリ権限を更新しました"
 
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr "リポジトリユーザーの削除中にエラーが発生しました"
-
-#: rhodecode/controllers/admin/repos.py:403
-msgid "An error occurred during deletion of repository user groups"
-msgstr "リポジトリユーザーグループの削除中にエラーが発生しました"
-
-#: rhodecode/controllers/admin/repos.py:421
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+#, fuzzy
+msgid "An error occurred during revoking of permission"
+msgstr "権限の更新中にエラーが発生しました"
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr "リポジトリステートの削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr "キャッシュの無効化中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 msgid "An error occurred during unlocking"
 msgstr "アンロック中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:476
+#: rhodecode/controllers/admin/repos.py:447
 msgid "Unlocked"
 msgstr "アンロック"
 
-#: rhodecode/controllers/admin/repos.py:479
+#: rhodecode/controllers/admin/repos.py:450
 msgid "Locked"
 msgstr "ロック"
 
-#: rhodecode/controllers/admin/repos.py:481
+#: rhodecode/controllers/admin/repos.py:452
 #, python-format
 msgid "Repository has been %s"
 msgstr "リポジトリは %s されています"
 
-#: rhodecode/controllers/admin/repos.py:505
+#: rhodecode/controllers/admin/repos.py:476
 msgid "Updated repository visibility in public journal"
 msgstr "公開ジャーナルでのリポジトリの可視性を更新しました"
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr "このリポジトリの公開ジャーナルの設定中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr "トークンが合いません"
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr "リモートから取得"
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr "リモートから取得中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr "ありません"
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr "%s リポジトリを %s のフォークとして印をつける"
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr "操作中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:590
+#: rhodecode/controllers/admin/repos.py:562
 msgid "An error occurred during creation of field"
 msgstr "フィールドの作成中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos.py:604
+#: rhodecode/controllers/admin/repos.py:576
 msgid "An error occurred during removal of field"
 msgstr "フィールドの削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:145
+#: rhodecode/controllers/admin/repos_groups.py:147
 #, python-format
 msgid "Created repository group %s"
 msgstr "リポジトリグループ %s を作成しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:157
+#: rhodecode/controllers/admin/repos_groups.py:159
 #, python-format
 msgid "Error occurred during creation of repository group %s"
 msgstr "リポジトリグループ %s の作成中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
+#: rhodecode/controllers/admin/repos_groups.py:217
 #, python-format
 msgid "Updated repository group %s"
 msgstr "リポジトリグループ %s を更新しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:235
+#: rhodecode/controllers/admin/repos_groups.py:232
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "リポジトリグループ %s の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:253
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr "このグループは %s リポジトリを含んでいるため削除出来ません"
 
-#: rhodecode/controllers/admin/repos_groups.py:260
+#: rhodecode/controllers/admin/repos_groups.py:257
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "このグループは %s サブグループを含んでいるため削除出来ません"
 
-#: rhodecode/controllers/admin/repos_groups.py:266
+#: rhodecode/controllers/admin/repos_groups.py:263
 #, python-format
 msgid "Removed repository group %s"
 msgstr "リポジトリグループ %s を削除しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:271
+#: rhodecode/controllers/admin/repos_groups.py:268
 #, python-format
 msgid "Error occurred during deletion of repos group %s"
 msgstr "リポジトリグループ %s の削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
-msgstr "グループユーザーを削除中にエラーが発生しました"
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-msgid "An error occurred during deletion of group user groups"
-msgstr "グループユーザーのグループの削除中にエラーが発生しました"
-
-#: rhodecode/controllers/admin/settings.py:126
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+#, fuzzy
+msgid "Repository Group permissions updated"
+msgstr "リポジトリ権限を更新しました"
+
+#: rhodecode/controllers/admin/settings.py:123
 #, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr "リポジトリの再スキャンに成功しました。 追加: %s 削除: %s"
 
-#: rhodecode/controllers/admin/settings.py:135
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr "Whooshの再インデックスタスクを予定に入れました"
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr "アプリケーション設定を更新しました"
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 msgid "Error occurred during updating application settings"
 msgstr "アプリケーション設定の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/settings.py:216
+#: rhodecode/controllers/admin/settings.py:219
 msgid "Updated visualisation settings"
 msgstr "表示設定を更新しました"
 
-#: rhodecode/controllers/admin/settings.py:221
+#: rhodecode/controllers/admin/settings.py:224
 msgid "Error occurred during updating visualisation settings"
 msgstr "表示設定の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/settings.py:297
+#: rhodecode/controllers/admin/settings.py:300
 msgid "Updated VCS settings"
 msgstr "VCS設定を更新しました"
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr "新しいフックを追加しました"
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr "フックを更新しました"
 
-#: rhodecode/controllers/admin/settings.py:327
+#: rhodecode/controllers/admin/settings.py:330
 msgid "Error occurred during hook creation"
 msgstr "フックの作成中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/settings.py:346
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr "メールのタスクを作成しました"
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr "このユーザーを編集出来ません。このユーザーはアプリケーションにとって必要不可欠です。"
 
-#: rhodecode/controllers/admin/settings.py:452
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr "アカウントを更新しました"
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
 #, python-format
 msgid "Error occurred during update of user %s"
@@ -704,111 +756,94 @@
 msgid "An error occurred during deletion of user"
 msgstr "ユーザーの削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr "このユーザーは編集できません"
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr "ユーザーに 'リポジトリ作成' 権限を与えました"
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr "ユーザーの 'リポジトリ作成' 権限を取り消しました"
-
-#: rhodecode/controllers/admin/users.py:287
-msgid "Granted 'repository fork' permission to user"
-msgstr "ユーザーに 'リポジトリフォーク' 権限を与えました"
-
-#: rhodecode/controllers/admin/users.py:292
-msgid "Revoked 'repository fork' permission to user"
-msgstr "ユーザーの 'リポジトリフォーク' 権限を取り消しました"
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+#, fuzzy
+msgid "Updated permissions"
+msgstr "権限のコピー"
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 msgid "An error occurred during permissions saving"
 msgstr "権限の保存時にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr "ユーザーにメール %s を追加しました"
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 msgid "An error occurred during email saving"
 msgstr "メールの保存時にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 msgid "Removed email from user"
 msgstr "ユーザーからメールを削除しました"
 
-#: rhodecode/controllers/admin/users.py:341
+#: rhodecode/controllers/admin/users.py:340
 #, python-format
 msgid "Added ip %s to user"
 msgstr "ユーザーにIPアドレス %s を追加しました"
 
-#: rhodecode/controllers/admin/users.py:347
+#: rhodecode/controllers/admin/users.py:346
 msgid "An error occurred during ip saving"
 msgstr "IPアドレスの保存中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users.py:359
+#: rhodecode/controllers/admin/users.py:358
 msgid "Removed ip from user"
 msgstr "ユーザーからIPアドレスを削除しました"
 
-#: rhodecode/controllers/admin/users_groups.py:86
+#: rhodecode/controllers/admin/users_groups.py:162
 #, python-format
 msgid "Created user group %s"
 msgstr "ユーザーグループ %s を作成しました"
 
-#: rhodecode/controllers/admin/users_groups.py:97
+#: rhodecode/controllers/admin/users_groups.py:173
 #, python-format
 msgid "Error occurred during creation of user group %s"
 msgstr "ユーザーグループ %s の作成中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users_groups.py:166
+#: rhodecode/controllers/admin/users_groups.py:210
 #, python-format
 msgid "Updated user group %s"
 msgstr "ユーザーグループ %s を更新しました"
 
-#: rhodecode/controllers/admin/users_groups.py:188
+#: rhodecode/controllers/admin/users_groups.py:232
 #, python-format
 msgid "Error occurred during update of user group %s"
 msgstr "ユーザーグループ %s の更新中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users_groups.py:205
+#: rhodecode/controllers/admin/users_groups.py:250
 msgid "Successfully deleted user group"
 msgstr "ユーザーグループの削除に成功しました"
 
-#: rhodecode/controllers/admin/users_groups.py:210
+#: rhodecode/controllers/admin/users_groups.py:255
 msgid "An error occurred during deletion of user group"
 msgstr "ユーザーグループの削除中にエラーが発生しました"
 
-#: rhodecode/controllers/admin/users_groups.py:259
-msgid "Granted 'repository create' permission to user group"
-msgstr "ユーザーグループに 'リポジトリ作成' 権限を与えました"
-
-#: rhodecode/controllers/admin/users_groups.py:264
-msgid "Revoked 'repository create' permission to user group"
-msgstr "ユーザーグループの 'リポジトリ作成' 権限を取り消しました"
-
-#: rhodecode/controllers/admin/users_groups.py:270
-msgid "Granted 'repository fork' permission to user group"
-msgstr "ユーザーグループに 'リポジトリフォーク' 権限を与えました"
-
-#: rhodecode/controllers/admin/users_groups.py:275
-msgid "Revoked 'repository fork' permission to user group"
-msgstr "ユーザーグループの 'リポジトリフォーク' 権限を取り消しました"
-
-#: rhodecode/lib/auth.py:530
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+#, fuzzy
+msgid "User Group permissions updated"
+msgstr "リポジトリ権限を更新しました"
+
+#: rhodecode/lib/auth.py:544
 #, python-format
 msgid "IP %s not allowed"
 msgstr "IPアドレス %s は許可されません"
 
-#: rhodecode/lib/auth.py:579
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr "このアクションを実行するためには登録ユーザーである必要があります"
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr "このページを閲覧するためにはサインインが必要です"
 
@@ -824,152 +859,181 @@
 msgid "No changes detected"
 msgstr "検出された変更はありません"
 
-#: rhodecode/lib/helpers.py:394
+#: rhodecode/lib/helpers.py:428
 #, python-format
 msgid "%a, %d %b %Y %H:%M:%S"
 msgstr "%a, %d %b %Y %H:%M:%S"
 
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr "True"
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr "False"
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "削除されたブランチ: %s"
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, python-format
 msgid "Created tag: %s"
 msgstr "作成したタグ: %s"
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr "リビジョンが見つかりません"
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "%s から %s までのすべてのチェンジセットを表示"
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr "比較の表示"
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr "と"
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr "%s 以上"
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674 rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr "リビジョン"
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, python-format
 msgid "fork name %s"
 msgstr "フォーク名 %s"
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr "プルリクエスト #%s"
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr "リポジトリを[削除]"
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr "リポジトリを[作成]"
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr "フォークしてリポジトリを[作成]"
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr "リポジトリを[フォーク]"
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr "リポジトリを[更新]"
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+#, fuzzy
+msgid "[downloaded] archive from repository"
+msgstr "このリポジトリのダウンロードは無効化されています"
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr "リポジトリを[削除]"
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 msgid "[created] user"
 msgstr "ユーザーを[作成]"
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 msgid "[updated] user"
 msgstr "ユーザーを[更新]"
 
-#: rhodecode/lib/helpers.py:712
+#: rhodecode/lib/helpers.py:749
 msgid "[created] user group"
 msgstr "ユーザーグループを[作成]"
 
-#: rhodecode/lib/helpers.py:714
+#: rhodecode/lib/helpers.py:751
 msgid "[updated] user group"
 msgstr "ユーザーグループを[更新]"
 
-#: rhodecode/lib/helpers.py:716
+#: rhodecode/lib/helpers.py:753
 msgid "[commented] on revision in repository"
 msgstr "リポジトリのリビジョンに[コメント]"
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 msgid "[commented] on pull request for"
 msgstr "プルリクエストに[コメント]"
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 msgid "[closed] pull request for"
 msgstr "プルリクエストを[クローズ]"
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr "[プッシュ]"
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 msgid "[committed via RhodeCode] into repository"
 msgstr "リポジトリに[RhodeCode経由でコミット]"
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 msgid "[pulled from remote] into repository"
 msgstr "リポジトリに[リモートからプル]"
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr "[プル]"
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr "リポジトリの[フォローを開始]"
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr "リポジトリの[フォローを停止]"
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr " と %s 以上"
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr "ファイルなし"
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+#, fuzzy
+msgid "new file"
+msgstr "新しいファイルを追加"
+
+#: rhodecode/lib/helpers.py:1161
+#, fuzzy
+msgid "mod"
+msgstr "削除"
+
+#: rhodecode/lib/helpers.py:1164
+#, fuzzy
+msgid "del"
+msgstr "削除"
+
+#: rhodecode/lib/helpers.py:1167
+#, fuzzy
+msgid "rename"
+msgstr "ユーザー名"
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -983,215 +1047,302 @@
 msgid "cannot create new union repository"
 msgstr "新しいユニオンリポジトリは作成できません"
 
-#: rhodecode/lib/utils2.py:411
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d 年"
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d ヶ月"
 
-#: rhodecode/lib/utils2.py:413
+#: rhodecode/lib/utils2.py:412
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d 日"
 
-#: rhodecode/lib/utils2.py:414
+#: rhodecode/lib/utils2.py:413
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d 時間"
 
-#: rhodecode/lib/utils2.py:415
+#: rhodecode/lib/utils2.py:414
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d 分"
 
-#: rhodecode/lib/utils2.py:416
+#: rhodecode/lib/utils2.py:415
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d 秒"
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr "%s 前"
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s と %s 前"
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr "ちょうどいま"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 msgid "Repository no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 msgid "Repository read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 msgid "Repository write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 msgid "Repository admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 msgid "Repositories Group no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 msgid "Repositories Group read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 msgid "Repositories Group write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 msgid "Repositories Group admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 msgid "RhodeCode Administrator"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 msgid "Repository creation disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 msgid "Repository creation enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 msgid "Repository forking disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 msgid "Repository forking enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 msgid "Register disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr "未レビュー"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 msgid "Approved"
 msgstr "承認"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr "却下"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr "レビュー中"
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+msgid "Repository group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+msgid "Repository group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+msgid "Repository group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+msgid "Repository group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+#, fuzzy
+msgid "User group no access"
+msgstr "不正なユーザーグループ名です"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+#, fuzzy
+msgid "User group read access"
+msgstr "ユーザーグループ"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+msgid "User group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+#, fuzzy
+msgid "User group admin access"
+msgstr "ユーザーグループ管理"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+#, fuzzy
+msgid "Repository Group creation disabled"
+msgstr "リポジトリ作成"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+#, fuzzy
+msgid "Repository Group creation enabled"
+msgstr "リポジトリ作成"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+msgid "User Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+#, fuzzy
+msgid "User Group creation enabled"
+msgstr "ユーザーグループ管理"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+#, fuzzy
+msgid "Registration disabled"
+msgstr "登録"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+#, fuzzy
+msgid "User Registration with manual account activation"
+msgstr "手動でアカウントを有効にする"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+#, fuzzy
+msgid "User Registration with automatic account activation"
+msgstr "自動でアカウントを有効にする"
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr "[Mention]"
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-msgid "Repository group no access"
-msgstr ""
-
-#: rhodecode/model/db.py:1394
-msgid "Repository group read access"
-msgstr ""
-
-#: rhodecode/model/db.py:1395
-msgid "Repository group write access"
-msgstr ""
-
-#: rhodecode/model/db.py:1396
-msgid "Repository group admin access"
-msgstr ""
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr "ログイン名を入力してください"
@@ -1210,42 +1361,42 @@
 msgid "Enter %(min)i characters or more"
 msgstr "%(min)i 文字以上必要です"
 
-#: rhodecode/model/notification.py:224
+#: rhodecode/model/notification.py:228
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "%(user)s がコミットにコメント %(when)s"
 
-#: rhodecode/model/notification.py:225
+#: rhodecode/model/notification.py:229
 #, python-format
 msgid "%(user)s sent message at %(when)s"
 msgstr "%(user)s がメッセージを送信 %(when)s"
 
-#: rhodecode/model/notification.py:226
+#: rhodecode/model/notification.py:230
 #, python-format
 msgid "%(user)s mentioned you at %(when)s"
 msgstr "%(user)s があなたにメンション %(when)s"
 
-#: rhodecode/model/notification.py:227
+#: rhodecode/model/notification.py:231
 #, python-format
 msgid "%(user)s registered in RhodeCode at %(when)s"
 msgstr "%(user)s がRhodeCodeに登録 %(when)s"
 
-#: rhodecode/model/notification.py:228
+#: rhodecode/model/notification.py:232
 #, python-format
 msgid "%(user)s opened new pull request at %(when)s"
 msgstr "%(user)s が新しいプルリクエストを作成 %(when)s"
 
-#: rhodecode/model/notification.py:229
+#: rhodecode/model/notification.py:233
 #, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "%(user)s がプルリクエストにコメント %(when)s"
 
-#: rhodecode/model/pull_request.py:104
+#: rhodecode/model/pull_request.py:98
 #, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
 msgstr "%(user)s がプリリクエスト #%(pr_id)s のレビューを求めています %(pr_title)s"
 
-#: rhodecode/model/scm.py:598
+#: rhodecode/model/scm.py:674
 msgid "latest tip"
 msgstr "最新のtip"
 
@@ -1296,9 +1447,10 @@
 msgstr "ユーザー名 \"%(username)s\" は許可されていません"
 
 #: rhodecode/model/validators.py:89
+#, fuzzy
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character"
+" dashes and must begin with alphanumeric character or underscore"
 msgstr "ユーザー名はアルファベット、アンダースコア(_)、ピリオド(.)、ダッシュ(-)しか使えません。また、アルファベットから始まる必要があります"
 
 #: rhodecode/model/validators.py:117
@@ -1401,47 +1553,51 @@
 msgid "You don't have permissions to create a group in this location"
 msgstr "この場所にグループを作成する権限がありません"
 
-#: rhodecode/model/validators.py:557
+#: rhodecode/model/validators.py:559
 msgid "This username or user group name is not valid"
 msgstr "ユーザー名かユーザーグループが不正です"
 
-#: rhodecode/model/validators.py:650
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr "不正なパスです"
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr "このメールアドレスはすでに取得されています"
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr "メールアドレス \"%(email)s\" は存在しません"
 
-#: rhodecode/model/validators.py:722
+#: rhodecode/model/validators.py:724
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
 msgstr "LDAPのこのCNに対するログイン属性は必須です。 - これは \"ユーザー名\" と同じです"
 
-#: rhodecode/model/validators.py:735
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
-msgstr "リビジョン %(revs) はすでにプルリクエストの一部かステータスが設定されています"
-
-#: rhodecode/model/validators.py:767
+msgstr "リビジョン %(revs)s はすでにプルリクエストの一部かステータスが設定されています"
+
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
 msgstr "有効なIPv4かIPv6のアドレスを入力してください"
 
-#: rhodecode/model/validators.py:768
+#: rhodecode/model/validators.py:770
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: rhodecode/model/validators.py:800
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr "キー名はアルファベット、アンダースコア(_)、ピリオド(.)、ダッシュ(-)、数字しか使えません。"
 
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
 #: rhodecode/templates/index.html:5
 msgid "Dashboard"
 msgstr "ダッシュボード"
@@ -1487,29 +1643,28 @@
 msgstr ""
 
 #: rhodecode/templates/index_base.html:40
-#: rhodecode/templates/index_base.html:140
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr "グループ名"
 
 #: rhodecode/templates/index_base.html:41
-#: rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142
-#: rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:68
 #: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr "説明"
@@ -1517,27 +1672,25 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr "リポジトリグループ"
 
-#: rhodecode/templates/index_base.html:82
-#: rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
 #: rhodecode/templates/admin/repos/repos.html:71
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
 #: rhodecode/templates/tags/tags.html:48
@@ -1545,109 +1698,78 @@
 msgid "Name"
 msgstr "名前"
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
-msgstr "最後の変更時刻"
-
-#: rhodecode/templates/index_base.html:85
-#: rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr "最後の変更点"
+
+#: rhodecode/templates/index_base.html:126
 #: rhodecode/templates/admin/repos/repos.html:74
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr "Tip"
 
-#: rhodecode/templates/index_base.html:86
-#: rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
 #: rhodecode/templates/admin/repos/repos.html:76
 msgid "Owner"
 msgstr "所有者"
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr "Atom"
-
-#: rhodecode/templates/index_base.html:171
-#: rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr "昇順で並び換え"
 
-#: rhodecode/templates/index_base.html:172
-#: rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr "降順で並び替え"
 
-#: rhodecode/templates/index_base.html:181
-#: rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr "最後の変更点"
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr "レコードが見つかりません"
-
-#: rhodecode/templates/index_base.html:212
-#: rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+msgid "No repositories found."
+msgstr "リポジトリが見つかりません"
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr "データエラー"
 
-#: rhodecode/templates/index_base.html:213
-#: rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr "読み込み中..."
 
-#: rhodecode/templates/index_base.html:298
-msgid "No repositories found."
-msgstr "リポジトリが見つかりません"
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr "ログイン"
 
@@ -1662,7 +1784,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr "ユーザー名"
@@ -1670,7 +1792,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr "パスワード"
 
@@ -1686,7 +1808,7 @@
 msgid "Forgot your password ?"
 msgstr "パスワードを忘れた場合はこちら"
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr "アカウントを持っていない場合はこちら"
 
@@ -1755,7 +1877,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1778,13 +1900,13 @@
 msgstr "まだタグがありません"
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr "まだブックマークがありません"
 
 #: rhodecode/templates/admin/admin.html:5
 #: rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr "管理者ジャーナル"
 
@@ -1809,9 +1931,9 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr "アクション"
 
@@ -1821,7 +1943,7 @@
 msgstr "リポジトリ"
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
@@ -1844,19 +1966,18 @@
 msgstr "リポジトリのデフォルト設定"
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 msgid "Defaults"
 msgstr "デフォルト設定"
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr "リポジトリのタイプ"
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -1864,60 +1985,193 @@
 msgstr "非公開リポジトリはコラボレーターとして明示的に追加された人でないと見つけられません"
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr "統計を有効にする"
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr "概要ページの統計ウィンドウを有効にします"
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr "ダウンロードを有効にする"
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr "概要ページのダウンロードメニューを有効にします"
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 msgid "Enable locking"
 msgstr "ロックを有効にする"
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr "リポジトリのpullのロックを有効にします"
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr "保存"
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, fuzzy, python-format
+msgid "Private Gists for user %s"
+msgstr "ユーザー %s を作成しました"
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+#, fuzzy
+msgid "Create new gist"
+msgstr "新しいファイルを作成"
+
+#: rhodecode/templates/admin/gists/index.html:48
+#, fuzzy
+msgid "Created"
+msgstr "読込"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+#, fuzzy
+msgid "Expires"
+msgstr "リポジトリ"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+#, fuzzy
+msgid "never"
+msgstr "レビュアー"
+
+#: rhodecode/templates/admin/gists/index.html:68
+#, fuzzy
+msgid "There are no gists yet"
+msgstr "まだタグがありません"
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+#, fuzzy
+msgid "Gist description ..."
+msgstr "説明"
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr "リセット"
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+#, fuzzy
+msgid "Private gist"
+msgstr "非公開リポジトリ"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr "削除"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#, fuzzy
+msgid "Confirm to delete this gist"
+msgstr "このIPアドレスを削除してよろしいですか: %s"
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+msgid "Show as raw"
+msgstr "元のファイルを表示"
+
+#: rhodecode/templates/admin/gists/show.html:71
+#, fuzzy
+msgid "created"
+msgstr "読込"
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr "LDAP管理"
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
+#: rhodecode/templates/base/base.html:79
 msgid "LDAP"
 msgstr "LDAP"
 
@@ -2017,7 +2271,7 @@
 msgstr "通知を表示"
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr "通知"
 
@@ -2026,12 +2280,14 @@
 msgstr "権限管理"
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr "権限設定"
 
@@ -2052,6 +2308,7 @@
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
 msgid "Overwrite existing settings"
 msgstr "現在の設定を上書きする"
 
@@ -2063,86 +2320,88 @@
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr "登録"
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+#, fuzzy
+msgid "User group"
+msgstr "ユーザーグループ"
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr "リポジトリ作成"
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+#, fuzzy
+msgid "User group creation"
+msgstr "ユーザーグループ管理"
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 msgid "Repository forking"
 msgstr "リポジトリフォーク"
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr "リセット"
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr "登録"
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+#, fuzzy
+msgid "External auth account activation"
+msgstr "自動でアカウントを有効にする"
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 msgid "Default User Permissions"
 msgstr "デフォルトのユーザー権限"
 
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 msgid "Allowed IP addresses"
 msgstr "許可するIPアドレス"
 
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr "削除"
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
 #, python-format
 msgid "Confirm to delete this ip: %s"
 msgstr "このIPアドレスを削除してよろしいですか: %s"
 
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
 msgstr "すべてのIPアドレスが許可されています"
 
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 msgid "New ip address"
 msgstr "新しいIPアドレス"
 
-#: rhodecode/templates/admin/permissions/permissions.html:153
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 msgid "Add"
 msgstr "追加"
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr "リポジトリ"
 
@@ -2157,7 +2416,7 @@
 msgstr "クローン元"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr "オプション:クローンするリポジトリのHTTP[S]のURLを指定します"
 
@@ -2171,19 +2430,19 @@
 msgstr "作成するリポジトリのタイプを指定します"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 msgid "Landing revision"
 msgstr "ランディングリビジョン"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "ファイルページ、ダウンロード、検索、READMEのデフォルトのリビジョンを指定します"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr "短く要点を絞ってください。長い説明にはREADMEファイルを利用してください。"
@@ -2195,187 +2454,189 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr "設定"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+#, fuzzy
+msgid "Non-changeable id"
+msgstr "変更不能ID %s"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr "クローンURI"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr "オプション: このリポジトリを配置するグループを選択します"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr "リポジトリの所有者を変更"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:184
+#: rhodecode/templates/admin/repos/repo_edit.html:177
 msgid "Advanced settings"
 msgstr "高度な設定"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:187
+#: rhodecode/templates/admin/repos/repo_edit.html:180
 msgid "Statistics"
 msgstr "統計"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Reset current statistics"
 msgstr "現在の統計情報をリセットする"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Confirm to remove current statistics"
 msgstr "現在の統計情報をリセットしてもよろしいですか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:194
+#: rhodecode/templates/admin/repos/repo_edit.html:187
 msgid "Fetched to rev"
 msgstr "収集するリビジョン"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr "収集した統計情報"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr "リモート"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr "リモートから変更を取り込む"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr "リモートから変更を取り込んでもよろしいですか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:218
+#: rhodecode/templates/admin/repos/repo_edit.html:211
 msgid "Cache"
 msgstr "キャッシュ"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Invalidate repository cache"
 msgstr "リポジトリのキャッシュを無効化"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Confirm to invalidate repository cache"
 msgstr "リポジトリのキャッシュを無効化してもよろしいですか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:225
+#: rhodecode/templates/admin/repos/repo_edit.html:218
 msgid ""
 "Manually invalidate cache for this repository. On first access repository"
 " will be cached again"
 msgstr "このリポジトリのキャッシュを手動で無効化します。リポジトリへの初回アクセス時に再びキャッシュされます。"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr "キャッシュしている値の一覧"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr "プレフィックス"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 msgid "Key"
 msgstr "キー"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr "アクティブ"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280
-#: rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr "公開ジャーナル"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:256
+#: rhodecode/templates/admin/repos/repo_edit.html:249
 msgid "Remove from public journal"
 msgstr "公開ジャーナルから削除する"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:258
+#: rhodecode/templates/admin/repos/repo_edit.html:251
 msgid "Add to public journal"
 msgstr "公開ジャーナルに追加する"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:263
+#: rhodecode/templates/admin/repos/repo_edit.html:256
 msgid ""
 "All actions made on this repository will be accessible to everyone in "
 "public journal"
 msgstr "公開ジャーナルでは、このリポジトリに対して行った操作のすべてが公開されます"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:270
+#: rhodecode/templates/admin/repos/repo_edit.html:263
 msgid "Locking"
 msgstr "ロック"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr "リポジトリのアンロック"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Confirm to unlock repository"
 msgstr "このリポジトリのロックを外しますか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+#, fuzzy
+msgid "Lock repo"
 msgstr "リポジトリのロック"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 msgid "Confirm to lock repository"
 msgstr "このリポジトリをロックしますか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 msgid "Repository is not locked"
 msgstr "リポジトリはロックされていません"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:284
+#: rhodecode/templates/admin/repos/repo_edit.html:277
 msgid "Force locking on repository. Works only when anonymous access is disabled"
 msgstr "リポジトリを強制ロックします。匿名アクセスが無効になっている場合のみ動作します。"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:291
+#: rhodecode/templates/admin/repos/repo_edit.html:284
 msgid "Set as fork of"
 msgstr "フォーク元の設定"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+#, fuzzy
+msgid "Set"
 msgstr "保存"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 msgid "Manually set this repository as a fork of another from the list"
 msgstr "このリポジトリをリスト中の他のリポジトリのフォークとして、手動で設定します"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr "削除"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr "このリポジトリを削除"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr "このリポジトリを削除しますか?"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
+#: rhodecode/templates/admin/repos/repo_edit.html:310
 #, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
 msgstr[0] "%s 個のフォークがあります"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:318
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 msgid "Detach forks"
 msgstr "フォークの切り離し"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:319
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 msgid "Delete forks"
 msgstr "フォークも削除"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:322
+#: rhodecode/templates/admin/repos/repo_edit.html:315
 msgid ""
 "This repository will be renamed in a special way in order to be "
 "unaccesible for RhodeCode and VCS systems. If you need to fully delete it"
@@ -2384,57 +2645,62 @@
 "このリポジトリはRhodeCodeとVCSシステムからアクセス出来ないようにするために特別な方法でリネームされます。\n"
 "完全な削除が必要な場合はファイルシステムから手動で削除してください"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
 msgstr "拡張フィールド"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:348
+#: rhodecode/templates/admin/repos/repo_edit.html:341
 #, python-format
 msgid "Confirm to delete this field: %s"
 msgstr "このフィールドを削除してよろしいですか: %s"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:362
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 msgid "New field key"
 msgstr "新しいフィールドのキー"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
 msgstr "新しいフィールドのラベル"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
 msgstr "ラベルを入力してください"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:379
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 msgid "New field description"
 msgstr "新しいフィールドの説明"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
 msgstr "フィールドの説明を入力してください"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr "なし"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr "読込"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr "書込"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr "管理"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr "メンバー"
 
@@ -2446,6 +2712,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 msgid "default"
 msgstr "default"
 
@@ -2453,33 +2721,37 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr "取消"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr "別のメンバーを追加"
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr "ユーザーの削除に失敗しました"
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-msgid "Failed to remove user group"
-msgstr "ユーザーグループの削除に失敗しました"
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr "リポジトリ管理"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
+msgstr "レコードが見つかりません"
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
 msgid "apply to children"
 msgstr "子リポジトリにも適用"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
 msgid ""
 "Set or revoke permission to all children of that group, including non-"
 "private repositories and other groups"
@@ -2505,7 +2777,7 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 msgid "Repository groups"
 msgstr "リポジトリグループ"
 
@@ -2535,7 +2807,7 @@
 msgid "Add child group"
 msgstr "子グループの追加"
 
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
 msgid ""
 "Enable lock-by-pulling on group. This option will be applied to all other"
 " groups and repositories inside"
@@ -2550,15 +2822,21 @@
 msgstr "トップレベルリポジトリの数"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 msgid "Edit"
 msgstr "編集"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr "編集"
 
@@ -2655,8 +2933,8 @@
 msgstr "Google Analyticsコード"
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr "設定を保存"
 
@@ -2669,46 +2947,70 @@
 msgstr "一般"
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr "軽量ダッシュボードを使用"
-
-#: rhodecode/templates/admin/settings/settings.html:140
 msgid "Use repository extra fields"
 msgstr "リポジトリの拡張フィールドを使用"
 
-#: rhodecode/templates/admin/settings/settings.html:147
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+#, fuzzy
+msgid "Dashboard items"
+msgstr "ダッシュボード"
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 msgid "Icons"
 msgstr "アイコン"
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr "公開リポジトリのアイコンを表示"
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 msgid "Show private repo icon on repositories"
 msgstr "非公開リポジトリのアイコンを表示"
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+#, fuzzy
+msgid "Show public/private icons next to repositories names"
+msgstr "公開リポジトリのアイコンを表示"
+
+#: rhodecode/templates/admin/settings/settings.html:172
 msgid "Meta-Tagging"
 msgstr "メタタグ"
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr "次のメタタグを変換する"
 
-#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:204
 msgid "VCS settings"
 msgstr "VCSの設定"
 
-#: rhodecode/templates/admin/settings/settings.html:204
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr "Web"
 
-#: rhodecode/templates/admin/settings/settings.html:209
+#: rhodecode/templates/admin/settings/settings.html:218
 msgid "Require SSL for vcs operations"
 msgstr "VCSの操作にSSLを必須とする"
 
-#: rhodecode/templates/admin/settings/settings.html:211
+#: rhodecode/templates/admin/settings/settings.html:220
 msgid ""
 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
 "will return HTTP Error 406: Not Acceptable"
@@ -2716,88 +3018,87 @@
 "RhodeCodeはPushとPullにSSLを要求します。もしSSLでない場合、HTTP Error 406: Not "
 "Acceptalbeを返します"
 
-#: rhodecode/templates/admin/settings/settings.html:217
+#: rhodecode/templates/admin/settings/settings.html:226
 msgid "Hooks"
 msgstr "フック"
 
-#: rhodecode/templates/admin/settings/settings.html:222
+#: rhodecode/templates/admin/settings/settings.html:231
 msgid "Update repository after push (hg update)"
 msgstr "プッシュ後にリポジトリをを更新する (hg update)"
 
-#: rhodecode/templates/admin/settings/settings.html:226
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr "プッシュ後にリポジトリのサイズを表示する"
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr "ユーザーのプッシュコマンドを記録する"
 
-#: rhodecode/templates/admin/settings/settings.html:234
+#: rhodecode/templates/admin/settings/settings.html:243
 msgid "Log user pull commands"
 msgstr "ユーザーのプルコマンドを記録する"
 
-#: rhodecode/templates/admin/settings/settings.html:238
+#: rhodecode/templates/admin/settings/settings.html:247
 msgid "Advanced setup"
 msgstr "高度な設定"
 
-#: rhodecode/templates/admin/settings/settings.html:243
+#: rhodecode/templates/admin/settings/settings.html:252
 msgid "Mercurial Extensions"
 msgstr "Mercurialエクステンション"
 
-#: rhodecode/templates/admin/settings/settings.html:248
+#: rhodecode/templates/admin/settings/settings.html:257
 msgid "Enable largefiles extension"
 msgstr "largefilesエクステンションを有効化"
 
-#: rhodecode/templates/admin/settings/settings.html:252
+#: rhodecode/templates/admin/settings/settings.html:261
 msgid "Enable hgsubversion extension"
 msgstr "hgsubversionエクステンションを有効化"
 
-#: rhodecode/templates/admin/settings/settings.html:254
+#: rhodecode/templates/admin/settings/settings.html:263
 msgid ""
 "Requires hgsubversion library installed. Allows cloning from svn remote "
 "locations"
 msgstr "hgsubversion のインストールが必要です。リモートロケーションのsvnからクローン出来るようになります"
 
-#: rhodecode/templates/admin/settings/settings.html:264
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr "リポジトリロケーション"
 
-#: rhodecode/templates/admin/settings/settings.html:269
+#: rhodecode/templates/admin/settings/settings.html:279
 msgid ""
-"This a crucial application setting. If you are really sure you need to "
-"change this, you must restart application in order to make this setting "
-"take effect. Click this label to unlock."
-msgstr "これはアプリケーションの重要な設定です。本当に変更が必要でしょうか。もし、変更した場合、変更を反映さ競るためにアプリケーションを再起動する必要があります。アンロックにするにはこのラベルをクリックして下さい"
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
+"Click to unlock. You must restart RhodeCode in order to make this setting"
+" take effect."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 msgid "Unlock"
 msgstr "アンロック"
 
-#: rhodecode/templates/admin/settings/settings.html:272
+#: rhodecode/templates/admin/settings/settings.html:282
 msgid ""
 "Location where repositories are stored. After changing this value a "
 "restart, and rescan is required"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:292
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr "テストメール"
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr "送信先"
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr "送る"
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr "システム情報とパッケージ"
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr "表示"
 
@@ -2807,7 +3108,7 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr "ユーザー"
 
@@ -2864,44 +3165,21 @@
 msgid "New password confirmation"
 msgstr "新しいパスワード 再入力"
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-msgid "Inherit default permissions"
-msgstr "デフォルトの権限を継承する"
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr "リポジトリを作成する"
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-msgid "Fork repositories"
-msgstr "リポジトリをフォークする"
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 msgid "Email addresses"
 msgstr "メールアドレス"
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, python-format
 msgid "Confirm to delete this email: %s"
 msgstr "このメールを削除してよろしいですか: %s"
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 msgid "New email address"
 msgstr "新しいメールアドレス"
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr "アカウント"
 
@@ -2938,7 +3216,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -2958,7 +3236,7 @@
 msgstr "レビュアーとして参加"
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr "プルリクエスト #%s %s によって %s に作成"
@@ -2989,12 +3267,12 @@
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 msgid "User groups"
 msgstr "ユーザーグループ"
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 msgid "Add new user group"
 msgstr "新しいユーザーグループの追加"
 
@@ -3007,7 +3285,7 @@
 msgstr "ユーザーグループ"
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr "メンバー"
 
@@ -3027,45 +3305,55 @@
 msgid "Add all elements"
 msgstr "全ての要素を追加"
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr "グループメンバー"
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 msgid "No members yet"
 msgstr "まだメンバーがいません"
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+#, fuzzy
+msgid "Global Permissions"
+msgstr "権限のコピー"
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
 msgid "User groups administration"
 msgstr "ユーザーグループ管理"
 
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "ユーザグループを削除しますか?: %s"
 
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+#, fuzzy
+msgid "There are no user groups yet"
+msgstr "まだリポジトリグループがありません"
+
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr "バグレポート"
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "要約"
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr "履歴"
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3073,48 +3361,44 @@
 msgid "Files"
 msgstr "ファイル"
 
-#: rhodecode/templates/base/base.html:112
+#: rhodecode/templates/base/base.html:125
 msgid "Switch To"
 msgstr "ブランチの切り替え"
 
-#: rhodecode/templates/base/base.html:114
-#: rhodecode/templates/base/base.html:267
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
 msgid "loading..."
 msgstr "読み込み中..."
 
-#: rhodecode/templates/base/base.html:118
+#: rhodecode/templates/base/base.html:131
 msgid "Options"
 msgstr "オプション"
 
-#: rhodecode/templates/base/base.html:124
+#: rhodecode/templates/base/base.html:137
 #: rhodecode/templates/forks/forks_data.html:21
 msgid "Compare fork"
 msgstr "フォークを比較"
 
-#: rhodecode/templates/base/base.html:126
-msgid "Lightweight changelog"
-msgstr "軽量履歴"
-
-#: rhodecode/templates/base/base.html:127
-#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr "検索"
 
-#: rhodecode/templates/base/base.html:133
+#: rhodecode/templates/base/base.html:145
 msgid "Lock"
 msgstr "ロック"
 
-#: rhodecode/templates/base/base.html:141
+#: rhodecode/templates/base/base.html:153
 msgid "Follow"
 msgstr "フォロー"
 
-#: rhodecode/templates/base/base.html:142
+#: rhodecode/templates/base/base.html:154
 msgid "Unfollow"
 msgstr "アンフォロー"
 
-#: rhodecode/templates/base/base.html:145
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3123,60 +3407,114 @@
 msgid "Fork"
 msgstr "フォーク"
 
-#: rhodecode/templates/base/base.html:147
+#: rhodecode/templates/base/base.html:159
 msgid "Create Pull Request"
 msgstr "プルリクエストを作成"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Show Pull Requests"
 msgstr "プルリクエストを表示"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Pull Requests"
 msgstr "プルリクエスト"
 
-#: rhodecode/templates/base/base.html:190
+#: rhodecode/templates/base/base.html:202
 msgid "Not logged in"
 msgstr "ログインしていません"
 
-#: rhodecode/templates/base/base.html:197
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr "ログイン"
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr "パスワードを忘れた場合はこちら"
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr "ログアウト"
 
-#: rhodecode/templates/base/base.html:262
+#: rhodecode/templates/base/base.html:274
 msgid "Switch repository"
 msgstr "リポジトリの切り替え"
 
-#: rhodecode/templates/base/base.html:274
+#: rhodecode/templates/base/base.html:286
 msgid "Show recent activity"
 msgstr "最近の活動を表示"
 
-#: rhodecode/templates/base/base.html:275
+#: rhodecode/templates/base/base.html:287
 #: rhodecode/templates/journal/journal.html:4
 msgid "Journal"
 msgstr "ジャーナル"
 
-#: rhodecode/templates/base/base.html:286
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 msgid "Search in repositories"
 msgstr "全てのリポジトリから検索"
 
-#: rhodecode/templates/base/perms_summary.html:8
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr "デフォルトの権限を継承する"
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr "リポジトリを作成する"
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+#, fuzzy
+msgid "Create user groups"
+msgstr "ユーザーグループを[作成]"
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr "リポジトリをフォークする"
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 msgid "No permissions defined yet"
 msgstr "まだ権限設定がありません"
 
-#: rhodecode/templates/base/perms_summary.html:15
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr "権限"
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 msgid "Edit Permission"
 msgstr "権限の編集"
 
@@ -3185,7 +3523,7 @@
 msgstr "別のコメントを追加"
 
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
+#: rhodecode/templates/data_table/_dt_elements.html:147
 msgid "Stop following this repository"
 msgstr "このリポジトリのフォローをやめる"
 
@@ -3202,7 +3540,7 @@
 msgstr "メンバー"
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
+#: rhodecode/templates/pullrequests/pullrequest.html:203
 msgid "Loading ..."
 msgstr "読み込み中..."
 
@@ -3215,7 +3553,7 @@
 msgstr "マッチするファイルはありません"
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
+#: rhodecode/templates/changelog/changelog.html:45
 msgid "Open new pull request"
 msgstr "新しいプルリクエストを作成"
 
@@ -3244,31 +3582,50 @@
 msgid "Expand diff"
 msgstr "差分を表示"
 
+#: rhodecode/templates/base/root.html:58
+#, fuzzy
+msgid "Failed to remoke permission"
+msgstr "ユーザーの削除に失敗しました"
+
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, python-format
 msgid "%s Bookmarks"
 msgstr "%s ブックマーク"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+#, fuzzy
+msgid "Compare bookmarks"
+msgstr "フォークを比較"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
 #: rhodecode/templates/tags/tags.html:51
 #: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr "作成者"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
 #: rhodecode/templates/tags/tags.html:52
 #: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr "リビジョン"
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr "比較"
+
 #: rhodecode/templates/branches/branches.html:5
 #, python-format
 msgid "%s Branches"
@@ -3278,64 +3635,67 @@
 msgid "Compare branches"
 msgstr "ブランチの比較"
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54
-#: rhodecode/templates/tags/tags_data.html:10
-msgid "Compare"
-msgstr "比較"
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, python-format
 msgid "%s Changelog"
 msgstr "%s チェンジログ"
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 msgid "showing %d out of %d revision"
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] "%d / %d リビジョンを表示"
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 msgid "Clear selection"
 msgstr "選択を解除"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
 #, python-format
 msgid "Compare fork with %s"
 msgstr "%s とフォークを比較"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 msgid "Compare fork with parent"
 msgstr "フォークを比較"
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr "関連するプルリクエストを開く #%s"
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 msgid "Show more"
 msgstr "もっと表示"
 
-#: rhodecode/templates/changelog/changelog.html:89
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
 #, python-format
 msgid "Bookmark %s"
 msgstr "ブックマーク %s"
 
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
 #, python-format
 msgid "Tag %s"
 msgstr "タグ %s"
 
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
 #, python-format
 msgid "Branch %s"
 msgstr "ブランチ %s"
 
-#: rhodecode/templates/changelog/changelog.html:258
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr "まだ変更がありません"
 
@@ -3364,6 +3724,39 @@
 msgid "Affected %s files"
 msgstr "%s ファイルに影響"
 
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+msgid "Commit message"
+msgstr "コミットメッセージ"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+msgid "Age"
+msgstr "経過時間"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+#, fuzzy
+msgid "Refs"
+msgstr "プレフィックス"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr "RhodeCode経由で直接ファイルを追加またはアップロード"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr "新しいファイルを追加"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr "新しいリポジトリをプッシュ"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr "存在するリポジトリをプッシュ"
+
 #: rhodecode/templates/changeset/changeset.html:6
 #, python-format
 msgid "%s Changeset"
@@ -3384,7 +3777,7 @@
 msgstr "リビジョンステータス"
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
+#: rhodecode/templates/changeset/diff_block.html:22
 msgid "Raw diff"
 msgstr "diffとして差分を表示"
 
@@ -3393,30 +3786,30 @@
 msgstr "パッチとして差分を表示"
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
+#: rhodecode/templates/changeset/diff_block.html:23
 msgid "Download diff"
 msgstr "差分をダウンロード"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] "%d コメント"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
 msgstr[0] "(%d インライン)"
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr "マージ"
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, python-format
@@ -3424,7 +3817,7 @@
 msgid_plural "%s files changed"
 msgstr[0] "%s ファイルに影響"
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, python-format
@@ -3432,15 +3825,15 @@
 msgid_plural "%s files changed with %s insertions and %s deletions"
 msgstr[0] "%s ファイルに影響。 %s 個の追加と %s 個の削除"
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
 msgstr "巨大な差分の表示はすこし時間とリソースがかかる場合があります"
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -3458,51 +3851,65 @@
 msgid "Comment on pull request #%s"
 msgstr "プルリクエストにコメント #%s"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr "サブミット中..."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr "{1} 行目にコメント"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "コメントには %s 構文 ( %s サポートつき ) が利用出来ます"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
+#: rhodecode/templates/changeset/changeset_file_comment.html:61
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
 msgid "Use @username inside this text to send notification to this RhodeCode user"
 msgstr "テキスト内で @username を使うと、この RhodeCode のユーザーに通知を送信します"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+#, fuzzy
+msgid "Preview"
+msgstr "レビュアー"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+#, fuzzy
+msgid "Comment preview"
+msgstr "比較の表示"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr "コメント"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr "キャンセル"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr "コメントするにはログインが必要です"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr "今すぐログインする"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr "隠す"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 msgid "Change status"
 msgstr "ステータスを変更する"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr "コメントしてクローズ"
 
@@ -3515,19 +3922,19 @@
 msgid "Files affected"
 msgstr "影響のあるファイル"
 
-#: rhodecode/templates/changeset/diff_block.html:22
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
 msgstr "このファイルのすべての差分を表示"
 
-#: rhodecode/templates/changeset/diff_block.html:30
+#: rhodecode/templates/changeset/diff_block.html:29
 msgid "Show inline comments"
 msgstr "インラインコメントを表示"
 
-#: rhodecode/templates/changeset/diff_block.html:55
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
 msgstr "このリポジトリの最新バージョンのファイルを表示"
 
-#: rhodecode/templates/changeset/diff_block.html:56
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
 msgstr "このリポジトリの初期バージョンのファイルを表示"
 
@@ -3601,28 +4008,26 @@
 msgid "Confirm to delete this repository: %s"
 msgstr "このリポジトリを削除しますか? : %s"
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "このユーザーを本当に削除してよろしいですか?: %s"
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-msgid "New status"
-msgstr "新しいステータス"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
-msgstr "このコメントを閲覧する"
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+#, fuzzy
+msgid "URL"
+msgstr "ジャーナル"
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, fuzzy, python-format
+msgid "%s commented on a %s changeset."
+msgstr "%s がコミットにコメント %s"
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-msgid "Repo"
-msgstr "リポジトリ"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
-msgstr "説明"
+msgid "The changeset status was changed to"
+msgstr ""
 
 #: rhodecode/templates/email_templates/main.html:8
 msgid "This is a notification from RhodeCode."
@@ -3641,47 +4046,40 @@
 msgid "You can generate it by clicking following URL"
 msgstr "下のURLをクリックすることで再生成が行えます。"
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-msgid "If you did not request new password please ignore this email."
-msgstr "新しいパスワードのリクエストをしていない場合は、このメールを無視して下さい。"
-
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid ""
-"User %s opened pull request for repository %s and wants you to review "
-"changes."
-msgstr "ユーザ %s がリポジトリ %s で新しいプルリクエストを作成しました。変更をレビューしてください。"
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-msgid "View this pull request here"
-msgstr "このプルリクエストを閲覧する"
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
+msgstr ""
 
 #: rhodecode/templates/email_templates/pull_request.html:6
-msgid "title"
+#, python-format
+msgid ""
+"%s opened a pull request for repository %s and wants you to review "
+"changes."
+msgstr "ユーザ %s がリポジトリ %s で新しいプルリクエストを作成しました。変更をレビューしてください。"
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
 msgstr "タイトル"
 
-#: rhodecode/templates/email_templates/pull_request.html:7
-msgid "description"
-msgstr "説明"
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr "レビュー対象のリビジョン"
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
-#, python-format
-msgid "Pull request #%s for repository %s"
-msgstr "プルリクエスト #%s (リポジトリ %s)"
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-msgid "Closing pull request with status"
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
+#, fuzzy, python-format
+msgid "%s commented on pull request \"%s\""
+msgstr "%s プルリクエストにコメント #%s"
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+#, fuzzy
+msgid "Pull request was closed with status"
 msgstr "このステータスでプルリクエストをクローズ"
 
-#: rhodecode/templates/email_templates/registration.html:4
-msgid "A new user have registered in RhodeCode"
-msgstr "新しいユーザがRhodeCodeへ登録しました"
-
-#: rhodecode/templates/email_templates/registration.html:9
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+#, fuzzy
+msgid "Pull request changed status"
+msgstr "プルリクエストステータス"
+
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr "このユーザを閲覧する"
 
@@ -3708,7 +4106,6 @@
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
 msgid "Branch"
 msgstr "ブランチ"
 
@@ -3721,12 +4118,6 @@
 msgid "Add file"
 msgstr "ファイルを追加"
 
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr "新しいファイルを追加"
-
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
 msgstr "ファイル名"
@@ -3755,12 +4146,6 @@
 msgid "use / to separate directories"
 msgstr "ディレクトリの区切りには / を使います"
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-msgid "Commit message"
-msgstr "コミットメッセージ"
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
@@ -3824,12 +4209,6 @@
 msgid "Show annotation"
 msgstr "アノテーションを表示"
 
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-msgid "Show as raw"
-msgstr "元のファイルを表示"
-
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
 msgid "Download as raw"
@@ -4017,37 +4396,51 @@
 msgid "New pull request"
 msgstr "新しいプルリクエスト"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-msgid "Detailed compare view"
-msgstr "比較ビュー詳細"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr "新しいプルリクエストを作成"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+#, fuzzy
+msgid "Write a short description on this pull request"
+msgstr "このプルリクエストを削除しますか?"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+#, fuzzy
+msgid "Changeset flow"
+msgstr "チェンジセット"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+msgid "Origin repository"
+msgstr "Originリポジトリ"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr "プルリクエストを送る"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr "プルリクエストレビュアー"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 msgid "owner"
 msgstr "所有者"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr "このプルリクエストにレビュアーを追加"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-msgid "Create new pull request"
-msgstr "新しいプルリクエストを作成"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-msgid "Title"
-msgstr "タイトル"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
-msgstr "プルリクエストを送る"
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr "比較ビュー詳細"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+#, fuzzy
+msgid "Destination repository"
+msgstr "リポジトリを編集"
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
 #, python-format
@@ -4076,10 +4469,6 @@
 msgid "Pull request was reviewed by all reviewers"
 msgstr "プルリクエストはすべてのレビュアーにレビューされました"
 
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-msgid "Origin repository"
-msgstr "Originリポジトリ"
-
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 msgid "Created on"
 msgstr "作成日"
@@ -4140,37 +4529,6 @@
 msgid "Permission denied"
 msgstr "権限がありません"
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, python-format
-msgid "%s Lightweight Changelog"
-msgstr "%s 軽量履歴"
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr "軽量履歴"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-msgid "Age"
-msgstr "経過時間"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, python-format
-msgid "Click to open associated pull request #%s"
-msgstr "関連するプルリクエストを開く #%s"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr "RhodeCode経由で直接ファイルを追加またはアップロード"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr "新しいリポジトリをプッシュ"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr "存在するリポジトリをプッシュ"
-
 #: rhodecode/templates/summary/summary.html:4
 #, python-format
 msgid "%s Summary"
@@ -4209,7 +4567,7 @@
 msgid "Fork of"
 msgstr "フォーク元: "
 
-#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
 msgid "Remote clone"
 msgstr "リモートクローン"
 
@@ -4235,8 +4593,8 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
+#, fuzzy
+msgid "Enable"
 msgstr "有効にする"
 
 #: rhodecode/templates/summary/summary.html:159
@@ -4251,7 +4609,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr "このリポジトリのダウンロードは無効化されています"
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 msgid "Download as zip"
 msgstr "ZIPとしてダウンロード"
 
@@ -4276,6 +4634,10 @@
 msgid "Commit activity by day / author"
 msgstr "コミットアクティビティ 日/作成者"
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr "有効にする"
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr "収集した統計情報: "
@@ -4289,52 +4651,48 @@
 msgstr "クイックスタート"
 
 #: rhodecode/templates/summary/summary.html:272
-#, python-format
-msgid "Readme file at revision '%s'"
+#, fuzzy, python-format
+msgid "Readme file from revision %s"
 msgstr "リビジョン '%s' のReadmeファイル"
 
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr "パーマリンク"
-
-#: rhodecode/templates/summary/summary.html:333
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr "%s を %sとしてダウンロード"
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr "ファイル"
 
-#: rhodecode/templates/summary/summary.html:690
+#: rhodecode/templates/summary/summary.html:689
 msgid "commits"
 msgstr "コミット"
 
-#: rhodecode/templates/summary/summary.html:691
+#: rhodecode/templates/summary/summary.html:690
 msgid "files added"
 msgstr "追加されたファイル"
 
-#: rhodecode/templates/summary/summary.html:692
+#: rhodecode/templates/summary/summary.html:691
 msgid "files changed"
 msgstr "変更されたファイル"
 
-#: rhodecode/templates/summary/summary.html:693
+#: rhodecode/templates/summary/summary.html:692
 msgid "files removed"
 msgstr "削除されたファイル"
 
-#: rhodecode/templates/summary/summary.html:695
+#: rhodecode/templates/summary/summary.html:694
 msgid "commit"
 msgstr "コミット"
 
+#: rhodecode/templates/summary/summary.html:695
+msgid "file added"
+msgstr "追加されたファイル"
+
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
-msgstr "追加されたファイル"
+msgid "file changed"
+msgstr "変更されたファイル"
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr "変更されたファイル"
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr "削除されたファイル"
 
Binary file rhodecode/i18n/pl/LC_MESSAGES/rhodecode.mo has changed
--- a/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -1,60 +1,58 @@
-# English translations for rhodecode.
-# Copyright (C) 2010 ORGANIZATION
-# This file is distributed under the same license as the rhodecode project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
-# Nemcio <bogdan114@g.pl>, 2012.
-# Nemo <areczek01@gmail.com>, 2012, 2013.
+# Translations template for RhodeCode.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the RhodeCode project.
+# 
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010
+# marcinkuzminski <marcin@python-blog.com>, 2013
+# Nemcio <bogdan114@g.pl>, 2012
+# Nemcio <areczek01@gmail.com>, 2012-2013
 msgid ""
 msgstr ""
-"Project-Id-Version: rhodecode 0.1\n"
+"Project-Id-Version: RhodeCode\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
-"PO-Revision-Date: 2013-01-20 03:44+0100\n"
-"Last-Translator: Nemcio <bogdan114@g.pl>\n"
-"Language-Team: Test\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
-"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
+"PO-Revision-Date: 2013-06-02 14:12+0000\n"
+"Last-Translator: marcinkuzminski <marcin@python-blog.com>\n"
+"Language-Team: Polish (http://www.transifex.com/projects/p/RhodeCode/language/pl/)\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
-
-#: rhodecode/controllers/changelog.py:95
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr "Wszystkie gałęzie"
 
-#: rhodecode/controllers/changeset.py:83
-#, fuzzy
+#: rhodecode/controllers/changeset.py:84
 msgid "Show white space"
-msgstr "pokazuj spacje"
-
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
-#, fuzzy
+msgstr "Pokaż białe znaki"
+
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 msgid "Ignore white space"
-msgstr "ignoruj pokazywanie spacji"
-
-#: rhodecode/controllers/changeset.py:163
+msgstr "Ignoruj białe znaki"
+
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr "%s linia w kontekście"
 
-#: rhodecode/controllers/changeset.py:329
-#: rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
 #, python-format
 msgid "Status change -> %s"
 msgstr "Zmiana statusu -> %s"
 
-#: rhodecode/controllers/changeset.py:360
+#: rhodecode/controllers/changeset.py:376
 msgid ""
-"Changing status on a changeset associated with a closed pull request is "
-"not allowed"
-msgstr ""
-"Zmiana statusu na grupy zmian powiązania łączy zamkniętego wniosku jest "
-"niedozwolona"
+"Changing status on a changeset associated with a closed pull request is not "
+"allowed"
+msgstr "Zmiana statusu na grupy zmian powiązania łączy zamkniętego wniosku jest niedozwolona"
 
 #: rhodecode/controllers/compare.py:74
-#: rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/pullrequests.py:259
 msgid "There are no changesets yet"
 msgstr "Brak zestawienia zmian"
 
@@ -63,10 +61,9 @@
 msgstr "Strona główna"
 
 #: rhodecode/controllers/error.py:98
-msgid "The request could not be understood by the server due to malformed syntax."
-msgstr ""
-"Wniosek nie może być rozumiany przez serwer z powodu zniekształconej "
-"składni."
+msgid ""
+"The request could not be understood by the server due to malformed syntax."
+msgstr "Wniosek nie może być rozumiany przez serwer z powodu zniekształconej składni."
 
 #: rhodecode/controllers/error.py:101
 msgid "Unauthorized access to resource"
@@ -84,9 +81,7 @@
 msgid ""
 "The server encountered an unexpected condition which prevented it from "
 "fulfilling the request."
-msgstr ""
-"Serwer napotkał niespodziewany warunek, który uniemożliwia jej spełnienie"
-" żądania."
+msgstr "Serwer napotkał niespodziewany warunek, który uniemożliwia jej spełnienie żądania."
 
 #: rhodecode/controllers/feed.py:52
 #, python-format
@@ -99,8 +94,8 @@
 msgstr "%s %s zasilać"
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -108,126 +103,125 @@
 msgid "Changeset was too big and was cut off..."
 msgstr "Lista zmian była zbyt duża i została ucięta..."
 
-#: rhodecode/controllers/feed.py:91
-#, fuzzy, python-format
+#: rhodecode/controllers/feed.py:90
+#, python-format
 msgid "%s committed on %s"
-msgstr "%s zakomitowal w %s"
-
-#: rhodecode/controllers/files.py:88
-#, fuzzy
-msgid "Click here to add new file"
-msgstr "Kliknij tutaj, by dodać nowy plik"
+msgstr "%s zakomitowal %s"
 
 #: rhodecode/controllers/files.py:89
+msgid "Click here to add new file"
+msgstr "Kliknij tu aby dodać nowy plik"
+
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr "Brak plików %s"
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr "Repozytorium zostało zablokowane przez %s na %s"
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
-msgstr ""
-
-#: rhodecode/controllers/files.py:293
-#, fuzzy, python-format
+msgstr "Można tylko edytować pliki z rewizji obecnej gałęzi"
+
+#: rhodecode/controllers/files.py:297
+#, python-format
 msgid "Edited file %s via RhodeCode"
-msgstr "Edytowanie %s w RhodeCode"
-
-#: rhodecode/controllers/files.py:309
+msgstr "Wyedytowano plik %s przez RhodeCode"
+
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr "Bez zmian"
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr "Committ wykonany do %s"
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr "Wystąpił błąd w trakcie zatwierdzania"
 
-#: rhodecode/controllers/files.py:347
-#, fuzzy
+#: rhodecode/controllers/files.py:351
 msgid "Added file via RhodeCode"
-msgstr "Dodano %s poprzez RhodeCode"
-
-#: rhodecode/controllers/files.py:364
-msgid "No content"
-msgstr "Brak treści"
+msgstr "Dodano plik poprzez RhodeCode"
 
 #: rhodecode/controllers/files.py:368
-msgid "No filename"
-msgstr "Brak nazwy pliku"
+msgid "No content"
+msgstr "Brak treści"
 
 #: rhodecode/controllers/files.py:372
+msgid "No filename"
+msgstr "Brak nazwy pliku"
+
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
-msgstr ""
-
-#: rhodecode/controllers/files.py:420
-#, fuzzy
-msgid "Downloads disabled"
-msgstr "Pobieranie wyłączone"
+msgstr "Lokalizacja musi być ścieżką względną i nie może zawierać .. ścieżki"
 
 #: rhodecode/controllers/files.py:431
+msgid "Downloads disabled"
+msgstr "pobieranie wyłączone"
+
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Nieznana wersja %s"
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr "Puste repozytorium"
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr "Nieznany typ archiwum"
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr "Różnice"
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632
+#: rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Gałęzie"
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633
+#: rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Etykiety"
 
-#: rhodecode/controllers/forks.py:175
-#, fuzzy, python-format
+#: rhodecode/controllers/forks.py:176
+#, python-format
 msgid "Forked repository %s as %s"
-msgstr "gałęzi %s w repozytorium %s"
-
-#: rhodecode/controllers/forks.py:189
+msgstr ""
+
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Wystąpił błąd podczas rozgałęzienia %s repozytorium"
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 msgid "public journal"
 msgstr "Dziennik publiczny"
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr "dziennik"
 
 #: rhodecode/controllers/login.py:138
-#, fuzzy
 msgid "You have successfully registered into RhodeCode"
-msgstr "Udało Ci się zarejestrować na stronie"
+msgstr "Rejstracja w RhodeCode przebiegła poprawnie"
 
 #: rhodecode/controllers/login.py:159
 msgid "Your password reset link was sent"
@@ -235,80 +229,75 @@
 
 #: rhodecode/controllers/login.py:179
 msgid ""
-"Your password reset was successful, new password has been sent to your "
-"email"
+"Your password reset was successful, new password has been sent to your email"
 msgstr "Twoje hasło zostało zresetowane, nowe hasło zostanie wysłane na e-mail"
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:139
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr "Grupy zmian"
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:149
 msgid "Special"
-msgstr ""
-
-#: rhodecode/controllers/pullrequests.py:129
-#, fuzzy
+msgstr "Specjalne"
+
+#: rhodecode/controllers/pullrequests.py:150
 msgid "Peer branches"
-msgstr "gałęzie"
-
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Zakładki"
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:324
 msgid "Pull request requires a title with min. 3 chars"
 msgstr "Wniosek połączenia gałęzi wymaga tytułu z min. 3 znakami"
 
-#: rhodecode/controllers/pullrequests.py:230
-#, fuzzy
+#: rhodecode/controllers/pullrequests.py:326
 msgid "Error creating pull request"
-msgstr "błąd podczas tworzenia prośby o łączenie gałęzi"
-
-#: rhodecode/controllers/pullrequests.py:251
+msgstr "Wystąpił błąd podczas tworzenia wniosku o rozgałęzienie"
+
+#: rhodecode/controllers/pullrequests.py:346
 msgid "Successfully opened new pull request"
 msgstr "Prośba o wykonanie połączenia gałęzi została wykonana prawidłowo"
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:349
 msgid "Error occurred during sending pull request"
 msgstr "Wystąpił błąd podczas prośby o połączenie gałęzi"
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:388
 msgid "Successfully deleted pull request"
 msgstr "Prośba o skasowanie połączenia gałęzi została wykonana prawidłowo"
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:484
 msgid "Closing with"
-msgstr ""
-
-#: rhodecode/controllers/pullrequests.py:478
-#, fuzzy
-msgid "Closing pull request on other statuses than rejected or approved forbidden"
-msgstr ""
-"Zamknij wszystkie wnioski połączenia gałęzi innych stanów niż odrzucony, "
-"zatwierdzony lub zabroniony"
-
-#: rhodecode/controllers/search.py:134
+msgstr "Zamykanie"
+
+#: rhodecode/controllers/pullrequests.py:521
+msgid ""
+"Closing pull request on other statuses than rejected or approved forbidden"
+msgstr ""
+
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr "Nieprawidłowe zapytania. Spróbuj zacytować go."
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr "Nie ma szukanego indeksu. Proszę uruchomić indeksowanie whoosh"
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr "Wystąpił błąd podczas wyszukiwania tej operacji"
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr "Żadne dane nie zostały załadowane"
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr "Statystyki są wyłączone dla tego repozytorium"
@@ -318,9 +307,41 @@
 msgstr "Domyślne ustawienia zostały pomyślnie zaktualizowane"
 
 #: rhodecode/controllers/admin/defaults.py:110
-#, fuzzy
 msgid "Error occurred during update of defaults"
-msgstr "wystąpił błąd podczas aktualizacji wartości domyślnych"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:56
+msgid "forever"
+msgstr "na zawsze"
+
+#: rhodecode/controllers/admin/gists.py:57
+msgid "5 minutes"
+msgstr "5 minut"
+
+#: rhodecode/controllers/admin/gists.py:58
+msgid "1 hour"
+msgstr "1 godzina"
+
+#: rhodecode/controllers/admin/gists.py:59
+msgid "1 day"
+msgstr "1 dzień"
+
+#: rhodecode/controllers/admin/gists.py:60
+msgid "1 month"
+msgstr "1 miesiąć"
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr "Na zawsze"
+
+#: rhodecode/controllers/admin/gists.py:127
+msgid "Error occurred during gist creation"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:165
+#, python-format
+msgid "Deleted gist %s"
+msgstr ""
 
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
@@ -366,36 +387,39 @@
 msgid "START_TLS on LDAP connection"
 msgstr "START_TLS dla połączenia LDAP"
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr "Ustawienia LDAP zostały zaktualizowane"
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr "Nie można uaktywnić ldap.\"Python-ldap\" brakuje library."
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
-#, fuzzy
+#: rhodecode/controllers/admin/ldap_settings.py:145
 msgid "Error occurred during update of ldap settings"
-msgstr "Wystąpił błąd podczas aktualizacji ustawień ldap"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr "Brak"
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr "Odczyt"
 
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
-msgstr "Brak"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
+msgstr "Zapis"
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr "Odczyt"
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr "Zapis"
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -416,623 +440,601 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292
-#: rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299
-#: rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr "Administracja"
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
 msgid "Disabled"
 msgstr "Wyłączone"
 
-#: rhodecode/controllers/admin/permissions.py:72
-#, fuzzy
-msgid "Allowed with manual account activation"
-msgstr "dozwolona z ręczną aktywacją konta"
-
 #: rhodecode/controllers/admin/permissions.py:74
-#, fuzzy
+msgid "Allowed with manual account activation"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:76
 msgid "Allowed with automatic account activation"
-msgstr "dozwolona z automatyczną aktywacją konta"
-
-#: rhodecode/controllers/admin/permissions.py:77
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr "Włączone"
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr "Domyślne uprawnienia zaktualizowane pomyślnie"
 
-#: rhodecode/controllers/admin/permissions.py:142
-#, fuzzy
+#: rhodecode/controllers/admin/permissions.py:152
 msgid "Error occurred during update of permissions"
-msgstr "wystąpił błąd podczas aktualizacji uprawnień"
-
-#: rhodecode/controllers/admin/repos.py:127
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr "--USUŃ ROZGAŁĘZIENIE--"
 
 #: rhodecode/controllers/admin/repos.py:168
-#, fuzzy, python-format
+#, python-format
 msgid "Created repository %s from %s"
-msgstr "utworzone repozytorium %s z %s"
+msgstr ""
 
 #: rhodecode/controllers/admin/repos.py:174
-#, fuzzy, python-format
+#, python-format
 msgid "Created repository %s"
-msgstr "utworzone repozytorium %s"
+msgstr "Stworzona repozytorium %s"
 
 #: rhodecode/controllers/admin/repos.py:197
-#, fuzzy, python-format
+#, python-format
 msgid "Error creating repository %s"
-msgstr "utworzone repozytorium %s"
-
-#: rhodecode/controllers/admin/repos.py:266
+msgstr "Wystapił błąd podczas tworzenia repozytorium %s"
+
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Repozytorium %s zostało pomyślnie zaktualizowane"
 
-#: rhodecode/controllers/admin/repos.py:284
-#, fuzzy, python-format
+#: rhodecode/controllers/admin/repos.py:288
+#, python-format
 msgid "Error occurred during update of repository %s"
-msgstr "wystąpił błąd podczas aktualizacji repozytorium %s"
-
-#: rhodecode/controllers/admin/repos.py:311
-#: rhodecode/controllers/api/api.py:877
+msgstr "Wystąpił błąd podczas uaktualniania repozytorium %s"
+
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:314
-#: rhodecode/controllers/api/api.py:879
-#, fuzzy, python-format
+msgstr "Oderwane rozgałęzienie %s"
+
+#: rhodecode/controllers/admin/repos.py:318
+#, python-format
 msgid "Deleted %s forks"
-msgstr "usunięte repozytorium %s"
-
-#: rhodecode/controllers/admin/repos.py:319
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:323
+#, python-format
 msgid "Deleted repository %s"
-msgstr "usunięte repozytorium %s"
-
-#: rhodecode/controllers/admin/repos.py:322
+msgstr "Skasowano repozytorium %s"
+
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr "Nie można usunąć %s nadal zawiera załączniki rozgałęzienia"
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Wystąpił błąd podczas usuwania %s"
 
-#: rhodecode/controllers/admin/repos.py:365
-#, fuzzy
+#: rhodecode/controllers/admin/repos.py:345
 msgid "Repository permissions updated"
-msgstr "Repozytorium wyłączone"
-
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr "Wystąpił błąd podczas usunięcia użytkownika z repozytorium"
-
-#: rhodecode/controllers/admin/repos.py:403
-#, fuzzy
-msgid "An error occurred during deletion of repository user groups"
-msgstr "Wystąpił błąd podczas usunięcia grupy użytkowników z repozytorium"
-
-#: rhodecode/controllers/admin/repos.py:421
+msgstr "Uprawnienia repozytorium zostały zakutalizowane"
+
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+msgid "An error occurred during revoking of permission"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr "Wystąpił błąd podczas usuwania z repozytorium statystyk"
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr "Wystąpił błąd podczas unieważniania cache"
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 msgid "An error occurred during unlocking"
 msgstr "Wystąpił błąd podczas odblokowywania"
 
-#: rhodecode/controllers/admin/repos.py:476
-#, fuzzy
+#: rhodecode/controllers/admin/repos.py:447
 msgid "Unlocked"
-msgstr "Odblokowany"
-
-#: rhodecode/controllers/admin/repos.py:479
-#, fuzzy
+msgstr "Odblokowane"
+
+#: rhodecode/controllers/admin/repos.py:450
 msgid "Locked"
-msgstr "zablokowany"
-
-#: rhodecode/controllers/admin/repos.py:481
+msgstr "Zablokowane"
+
+#: rhodecode/controllers/admin/repos.py:452
 #, python-format
 msgid "Repository has been %s"
 msgstr "Repozytoriów jest %s"
 
-#: rhodecode/controllers/admin/repos.py:505
+#: rhodecode/controllers/admin/repos.py:476
 msgid "Updated repository visibility in public journal"
 msgstr "Zaktualizowano widoczność stron w publicznym dzienniku"
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Wystąpił błąd podczas ustawiania tego repozytorium w dzienniku publicznym"
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr "Niezgodność tokenu"
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr "Pobieranie z lokalizacji zdalnej"
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr "Wystąpił błąd podczas pobierania z lokalizacji zdalnej"
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr "Brak"
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr "Oznaczono %s repo jako rozwidlenie %s"
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr "Wystąpił błąd podczas tej operacji"
 
-#: rhodecode/controllers/admin/repos.py:590
-#, fuzzy
+#: rhodecode/controllers/admin/repos.py:562
 msgid "An error occurred during creation of field"
-msgstr "wystąpił błąd podczas tworzenia użytkownika %s"
-
-#: rhodecode/controllers/admin/repos.py:604
-#, fuzzy
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:576
 msgid "An error occurred during removal of field"
-msgstr "Wystąpił błąd podczas zapisywania e-maila"
-
-#: rhodecode/controllers/admin/repos_groups.py:145
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:147
+#, python-format
 msgid "Created repository group %s"
-msgstr "utworzono grupę repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:157
-#, fuzzy, python-format
+msgstr "Utworzono groupę z repozytoriami %s"
+
+#: rhodecode/controllers/admin/repos_groups.py:159
+#, python-format
 msgid "Error occurred during creation of repository group %s"
-msgstr "Wystąpił błąd podczas tworzenia grupy repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:217
+#, python-format
 msgid "Updated repository group %s"
-msgstr "zaktualizowano grupę repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:235
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:232
+#, python-format
 msgid "Error occurred during update of repository group %s"
-msgstr "wystąpił błąd podczas aktualizacji grupy repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:253
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
 
-#: rhodecode/controllers/admin/repos_groups.py:260
-#, fuzzy, python-format
+#: rhodecode/controllers/admin/repos_groups.py:257
+#, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
-msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
-
-#: rhodecode/controllers/admin/repos_groups.py:266
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:263
+#, python-format
 msgid "Removed repository group %s"
-msgstr "usunięto grupę repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:271
-#, fuzzy, python-format
-msgid "Error occurred during deletion of repos group %s"
-msgstr "wystąpił błąd podczas kasowania grupy repo %s"
-
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
-msgstr "Wystąpił błąd podczas usunięcia grupy użytkowników"
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-#, fuzzy
-msgid "An error occurred during deletion of group user groups"
-msgstr "Wystąpił błąd podczas usuwania grup i grup użytkowników"
-
-#: rhodecode/controllers/admin/settings.py:126
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:268
+#, python-format
+msgid "Error occurred during deletion of repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr "Nie można cofnąć zezwolenia dla admina jako admin"
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+msgid "Repository Group permissions updated"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:123
+#, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr ""
-"Repozytoria z powodzeniem zostały ponownie zeskanowane dodano: %s, "
-"usunięto: %s"
-
-#: rhodecode/controllers/admin/settings.py:135
+
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr "Zadanie ponownej indeksacji whoosh zostało zaplanowane"
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr "Aktualizacja ustawień aplikacji"
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
-#, fuzzy
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 msgid "Error occurred during updating application settings"
-msgstr "wystąpił błąd podczas aktualizacji ustawień aplikacji"
-
-#: rhodecode/controllers/admin/settings.py:216
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:219
 msgid "Updated visualisation settings"
 msgstr "Aktualizacja ustawień wizualizacji"
 
-#: rhodecode/controllers/admin/settings.py:221
-#, fuzzy
+#: rhodecode/controllers/admin/settings.py:224
 msgid "Error occurred during updating visualisation settings"
-msgstr "Wystąpił błąd podczas aktualizacji ustawień wizualizacji"
-
-#: rhodecode/controllers/admin/settings.py:297
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:300
 msgid "Updated VCS settings"
 msgstr "Aktualizacja ustawień VCS"
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr "Dodano nowy hook"
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr "Aktualizacja hooku"
 
-#: rhodecode/controllers/admin/settings.py:327
-#, fuzzy
+#: rhodecode/controllers/admin/settings.py:330
 msgid "Error occurred during hook creation"
-msgstr "Wystąpił błąd podczas tworzenia hooku"
-
-#: rhodecode/controllers/admin/settings.py:346
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr "E-mail został wysłany"
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
-msgstr ""
-"Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej "
-"aplikacji"
-
-#: rhodecode/controllers/admin/settings.py:452
+msgstr "Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej aplikacji"
+
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr "Twoje konto zostało pomyślnie zaktualizowane"
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
-#, fuzzy, python-format
+#, python-format
 msgid "Error occurred during update of user %s"
-msgstr "wystąpił błąd podczas aktualizacji użytkownika %s"
+msgstr ""
 
 #: rhodecode/controllers/admin/users.py:130
-#, fuzzy, python-format
+#, python-format
 msgid "Created user %s"
-msgstr "utworzono użytkownika %s"
+msgstr "Stworzono użytkownika %s"
 
 #: rhodecode/controllers/admin/users.py:142
-#, fuzzy, python-format
+#, python-format
 msgid "Error occurred during creation of user %s"
-msgstr "wystąpił błąd podczas tworzenia użytkownika %s"
+msgstr ""
 
 #: rhodecode/controllers/admin/users.py:176
 msgid "User updated successfully"
 msgstr "Użytkownik został zaktualizowany"
 
 #: rhodecode/controllers/admin/users.py:214
-#, fuzzy
 msgid "Successfully deleted user"
-msgstr "użytkownik został usunięty"
+msgstr ""
 
 #: rhodecode/controllers/admin/users.py:219
 msgid "An error occurred during deletion of user"
 msgstr "Wystąpił błąd podczas usuwania użytkownika"
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr "Nie możesz edytować tego użytkownika"
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr "Przyznano użytkownikowi uprawnienie do 'tworzenia repozytorium'"
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr "Cofnięto użytkownikowi uprawnienie do 'tworzenia repozytorium'"
-
-#: rhodecode/controllers/admin/users.py:287
-msgid "Granted 'repository fork' permission to user"
-msgstr "Przyznano użytkownikowi uprawnienie do 'tworzenia rozgałęzień'"
-
-#: rhodecode/controllers/admin/users.py:292
-msgid "Revoked 'repository fork' permission to user"
-msgstr "Cofnięto użytkownikowi uprawnienie do 'tworzenia rozgałęzień'"
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+msgid "Updated permissions"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 msgid "An error occurred during permissions saving"
 msgstr "Wystąpił błąd podczas zapisywania uprawnień"
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr "Dodano e-mail %s do użytkownika"
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 msgid "An error occurred during email saving"
 msgstr "Wystąpił błąd podczas zapisywania e-maila"
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 msgid "Removed email from user"
 msgstr "Usunięto e-mail użytkownikowi"
 
-#: rhodecode/controllers/admin/users.py:341
-#, fuzzy, python-format
+#: rhodecode/controllers/admin/users.py:340
+#, python-format
 msgid "Added ip %s to user"
-msgstr "Dodano e-mail %s do użytkownika"
-
-#: rhodecode/controllers/admin/users.py:347
-#, fuzzy
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:346
 msgid "An error occurred during ip saving"
-msgstr "Wystąpił błąd podczas zapisywania e-maila"
-
-#: rhodecode/controllers/admin/users.py:359
-#, fuzzy
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:358
 msgid "Removed ip from user"
-msgstr "Usunięto e-mail użytkownikowi"
-
-#: rhodecode/controllers/admin/users_groups.py:86
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:162
+#, python-format
 msgid "Created user group %s"
-msgstr "utworzono grupę użytkowników %s"
-
-#: rhodecode/controllers/admin/users_groups.py:97
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:173
+#, python-format
 msgid "Error occurred during creation of user group %s"
-msgstr "wystąpił błąd podczas tworzenia grupy użytkowników %s"
-
-#: rhodecode/controllers/admin/users_groups.py:166
-#, fuzzy, python-format
-msgid "Updated user group %s"
-msgstr "zaktualizowano grupę użytkowników %s"
-
-#: rhodecode/controllers/admin/users_groups.py:188
-#, fuzzy, python-format
-msgid "Error occurred during update of user group %s"
-msgstr "wystąpił błąd podczas aktualizacji grupy użytkowników %s"
-
-#: rhodecode/controllers/admin/users_groups.py:205
-#, fuzzy
-msgid "Successfully deleted user group"
-msgstr "grupa użytkowników została usunięta z powodzeniem"
+msgstr ""
 
 #: rhodecode/controllers/admin/users_groups.py:210
-#, fuzzy
+#, python-format
+msgid "Updated user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:232
+#, python-format
+msgid "Error occurred during update of user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:250
+msgid "Successfully deleted user group"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:255
 msgid "An error occurred during deletion of user group"
-msgstr "Wystąpił błąd podczas usuwania grupy użytkowników"
-
-#: rhodecode/controllers/admin/users_groups.py:259
-#, fuzzy
-msgid "Granted 'repository create' permission to user group"
-msgstr "Przyznano grupie użytkowników uprawnienia do 'tworzenia repozytorium'"
-
-#: rhodecode/controllers/admin/users_groups.py:264
-#, fuzzy
-msgid "Revoked 'repository create' permission to user group"
-msgstr "Cofnięto grupie użytkowników uprawnienia do 'tworzenia repozytorium'"
-
-#: rhodecode/controllers/admin/users_groups.py:270
-#, fuzzy
-msgid "Granted 'repository fork' permission to user group"
-msgstr "Przyznano grupie użytkowników uprawnienia do 'tworzenia rozgałęzień'"
-
-#: rhodecode/controllers/admin/users_groups.py:275
-#, fuzzy
-msgid "Revoked 'repository fork' permission to user group"
-msgstr "Cofnięto grupie użytkowników uprawnienia do 'tworzenia rozgałęzień'"
-
-#: rhodecode/lib/auth.py:530
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+msgid "User Group permissions updated"
+msgstr ""
+
+#: rhodecode/lib/auth.py:544
+#, python-format
 msgid "IP %s not allowed"
-msgstr "Obserwatorzy %s"
-
-#: rhodecode/lib/auth.py:579
+msgstr ""
+
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr "Musisz być zarejestrowanym użytkownikiem, żeby wykonać to działanie"
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr "Musisz być zalogowany, żeby oglądać stronę"
 
 #: rhodecode/lib/diffs.py:66
-#, fuzzy
 msgid "Binary file"
-msgstr "plik binarny"
+msgstr ""
 
 #: rhodecode/lib/diffs.py:82
-msgid "Changeset was too big and was cut off, use diff menu to display this diff"
-msgstr ""
-"Lista zmian była zbyt duża i została obcięta, użyj menu porównań żeby "
-"wyświetlić różnice"
+msgid ""
+"Changeset was too big and was cut off, use diff menu to display this diff"
+msgstr "Lista zmian była zbyt duża i została obcięta, użyj menu porównań żeby wyświetlić różnice"
 
 #: rhodecode/lib/diffs.py:92
 msgid "No changes detected"
 msgstr "Nie wykryto zmian"
 
-#: rhodecode/lib/helpers.py:394
+#: rhodecode/lib/helpers.py:428
 #, python-format
 msgid "%a, %d %b %Y %H:%M:%S"
 msgstr "%d.%m.%Y, %H:%M:%S"
 
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr "Prawda"
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr "Fałsz"
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, python-format
 msgid "Deleted branch: %s"
 msgstr "Usunięta gałąź: %s"
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, python-format
 msgid "Created tag: %s"
 msgstr "Utworzony tag: %s"
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr "Nie znaleziono changeset"
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Pokaż wszystkie zestawienia zmian changesets %s->%s"
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr "Wyświetl porównanie"
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr "i"
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr "%s więcej"
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674
+#: rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr "rewizja"
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, python-format
 msgid "fork name %s"
 msgstr "nazwa rozgałęzienia %s"
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr "Połączonych gałęzi #%s"
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr "[usunięte] repozytorium"
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr "[utworzone] repozytorium"
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr "[utworzone] repozytorium jako rozgałęzienie"
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr "[rozgałęzione] repozytorium"
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr "[zaktualizowane] repozytorium"
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+msgid "[downloaded] archive from repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr "[skasowane] repozytorium"
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 msgid "[created] user"
 msgstr "[utworzony] użytkownik"
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 msgid "[updated] user"
 msgstr "[zaktualizowany] użytkownik"
 
-#: rhodecode/lib/helpers.py:712
-#, fuzzy
+#: rhodecode/lib/helpers.py:749
 msgid "[created] user group"
-msgstr "[utworzona] grupa użytkowników"
-
-#: rhodecode/lib/helpers.py:714
-#, fuzzy
+msgstr ""
+
+#: rhodecode/lib/helpers.py:751
 msgid "[updated] user group"
-msgstr "[zaktualizowana] grupa użytkowników"
-
-#: rhodecode/lib/helpers.py:716
+msgstr ""
+
+#: rhodecode/lib/helpers.py:753
 msgid "[commented] on revision in repository"
 msgstr "[komentarz] do zmiany w repozytorium"
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 msgid "[commented] on pull request for"
 msgstr "[komentarz] wniosek o połączenie gałęzi"
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 msgid "[closed] pull request for"
 msgstr "[zamknięty] wniosek o połączenie gałęzi"
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr "[wysłane zmiany] w"
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 msgid "[committed via RhodeCode] into repository"
 msgstr "[committed przez RhodeCode] do repozytorium"
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 msgid "[pulled from remote] into repository"
 msgstr "[pobieranie z zdalnego] do repozytorium"
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr "[pobrano] z"
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr "[start następnego] repozytorium"
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr "[zatrzymany po] repozytorium"
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr "i %s więcej"
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr "Brak Plików"
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+msgid "new file"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1161
+msgid "mod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1164
+msgid "del"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1167
+msgid "rename"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
 msgid ""
-"%s repository is not mapped to db perhaps it was created or renamed from "
-"the filesystem please run the application again in order to rescan "
-"repositories"
-msgstr ""
-"%s repozytorium nie jest mapowane do db może zostało utworzone lub "
-"zmienione z systemie plików proszę uruchomić aplikację ponownie, aby "
-"ponownie przeskanować repozytoria"
+"%s repository is not mapped to db perhaps it was created or renamed from the"
+" filesystem please run the application again in order to rescan repositories"
+msgstr "%s repozytorium nie jest mapowane do db może zostało utworzone lub zmienione z systemie plików proszę uruchomić aplikację ponownie, aby ponownie przeskanować repozytoria"
 
 #: rhodecode/lib/unionrepo.py:193
-#, fuzzy
 msgid "cannot create new union repository"
-msgstr "[utworzone] repozytorium"
-
-#: rhodecode/lib/utils2.py:411
+msgstr ""
+
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
@@ -1040,7 +1042,7 @@
 msgstr[1] "%d lata"
 msgstr[2] "%d lat"
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
@@ -1048,7 +1050,7 @@
 msgstr[1] "%d miesięcy"
 msgstr[2] "%d miesięcy"
 
-#: rhodecode/lib/utils2.py:413
+#: rhodecode/lib/utils2.py:412
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
@@ -1056,7 +1058,7 @@
 msgstr[1] "%d dni"
 msgstr[2] "%d dni"
 
-#: rhodecode/lib/utils2.py:414
+#: rhodecode/lib/utils2.py:413
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
@@ -1064,7 +1066,7 @@
 msgstr[1] "%d godziny"
 msgstr[2] "%d godzin"
 
-#: rhodecode/lib/utils2.py:415
+#: rhodecode/lib/utils2.py:414
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
@@ -1072,7 +1074,7 @@
 msgstr[1] "%d minuty"
 msgstr[2] "%d minut"
 
-#: rhodecode/lib/utils2.py:416
+#: rhodecode/lib/utils2.py:415
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
@@ -1080,183 +1082,257 @@
 msgstr[1] "%d sekund"
 msgstr[2] "%d sekund"
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, python-format
 msgid "in %s"
 msgstr "w %s"
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr "%s temu"
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, python-format
 msgid "in %s and %s"
 msgstr "w %s i %s"
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s i %s temu"
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr "przed chwilą"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 msgid "Repository no access"
 msgstr "Brak dostępu do repozytorium"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 msgid "Repository read access"
 msgstr "Repozytorium do odczytu"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 msgid "Repository write access"
 msgstr "Repozytorium do zapisu"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 msgid "Repository admin access"
 msgstr "Administracja dostępu do repozytorium"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 msgid "Repositories Group no access"
 msgstr "Grupy repozytoriów brak dostępu"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 msgid "Repositories Group read access"
 msgstr "Grupy repozytoriów dostęp do odczytu"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 msgid "Repositories Group write access"
 msgstr "Grupy repozytoriów dostęp do zapisu"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 msgid "Repositories Group admin access"
 msgstr "Repozytoria Grupy dostęp administratora"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 msgid "RhodeCode Administrator"
 msgstr "Administrator Repo"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 msgid "Repository creation disabled"
 msgstr "Repozytorium wyłączone"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 msgid "Repository creation enabled"
 msgstr "Repozytorium włączone"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 msgid "Repository forking disabled"
 msgstr "Rozwidlenie repozytorium wyłączone"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 msgid "Repository forking enabled"
 msgstr "Rozwidlenie repozytorium włączone"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 msgid "Register disabled"
 msgstr "Rejestracja wyłączona"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr "Rejestracja nowego użytkownika na stronie z ręczną aktywacją"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr "Rejestracja nowego użytkownika na stronie z automatyczną aktywacją"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr "Brak Korekty"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 msgid "Approved"
 msgstr "Zaakceptowano"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr "Odrzucono"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr "Objęty Przeglądem"
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr "najwyższy poziom"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+msgid "Repository group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+msgid "Repository group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+msgid "Repository group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+msgid "Repository group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+msgid "User group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+msgid "User group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+msgid "User group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+msgid "User group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+msgid "Repository Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+msgid "Repository Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+msgid "User Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+msgid "User Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+msgid "Registration disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+msgid "User Registration with manual account activation"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+msgid "User Registration with automatic account activation"
+msgstr ""
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr "widziany %s"
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr "[Wymieniony]"
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-#, fuzzy
-msgid "Repository group no access"
-msgstr "Grupy repozytoriów brak dostępu"
-
-#: rhodecode/model/db.py:1394
-#, fuzzy
-msgid "Repository group read access"
-msgstr "Grupy repozytoriów dostęp do odczytu"
-
-#: rhodecode/model/db.py:1395
-#, fuzzy
-msgid "Repository group write access"
-msgstr "Grupy repozytoriów dostęp do zapisu"
-
-#: rhodecode/model/db.py:1396
-#, fuzzy
-msgid "Repository group admin access"
-msgstr "Repozytoria Grupy dostęp administratora"
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr "Wpisz login"
@@ -1275,85 +1351,76 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Wpisz %(min)i lub więcej znaków"
 
-#: rhodecode/model/notification.py:224
-#, fuzzy, python-format
+#: rhodecode/model/notification.py:228
+#, python-format
 msgid "%(user)s commented on changeset at %(when)s"
-msgstr "%(user)s skomentował zatwierdzenie %(when)s"
-
-#: rhodecode/model/notification.py:225
-#, fuzzy, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr "%(user)s wysłał wiadomość do %(when)s"
-
-#: rhodecode/model/notification.py:226
-#, fuzzy, python-format
-msgid "%(user)s mentioned you at %(when)s"
-msgstr "%(user)s wspomniał o Tobie w %(when)s"
-
-#: rhodecode/model/notification.py:227
-#, fuzzy, python-format
-msgid "%(user)s registered in RhodeCode at %(when)s"
-msgstr "%(user)s zarejestrował na stronie w %(when)s"
-
-#: rhodecode/model/notification.py:228
-#, fuzzy, python-format
-msgid "%(user)s opened new pull request at %(when)s"
-msgstr "%(user)s otworzył nowe połączenie gałęzi w %(when)s"
+msgstr ""
 
 #: rhodecode/model/notification.py:229
-#, fuzzy, python-format
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:230
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:231
+#, python-format
+msgid "%(user)s registered in RhodeCode at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:232
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:233
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
-msgstr "%(user)s skomentował nowe połączenie gałęzi w %(when)s"
-
-#: rhodecode/model/pull_request.py:104
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/model/pull_request.py:98
+#, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
-msgstr "%(user)s chce żeby przejrzeć nowe gałęzie #%(pr_id)s: %(pr_title)s"
-
-#: rhodecode/model/scm.py:598
+msgstr ""
+
+#: rhodecode/model/scm.py:674
 msgid "latest tip"
 msgstr "ostatni tip"
 
 #: rhodecode/model/user.py:232
-#, fuzzy
 msgid "New user registration"
-msgstr "nowy użytkownik się zarejestrował"
+msgstr ""
 
 #: rhodecode/model/user.py:257 rhodecode/model/user.py:281
 msgid "You can't Edit this user since it's crucial for entire application"
-msgstr ""
-"Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej "
-"aplikacji"
+msgstr "Nie możesz edytować tego użytkownika ponieważ jest kluczowy dla całej aplikacji"
 
 #: rhodecode/model/user.py:303
 msgid "You can't remove this user since it's crucial for entire application"
-msgstr ""
-"Nie możesz usunąć tego użytkownika ponieważ jest kluczowy dla całej "
-"aplikacji"
+msgstr "Nie możesz usunąć tego użytkownika ponieważ jest kluczowy dla całej aplikacji"
 
 #: rhodecode/model/user.py:309
 #, python-format
 msgid ""
-"user \"%s\" still owns %s repositories and cannot be removed. Switch "
-"owners or remove those repositories. %s"
-msgstr ""
-"użytkownik \"%s\" wciąż posiada repozytoria następujące %s i nie może "
-"zostać usunięty. Zmień właściciela lub usuń te repozytoria. %s"
+"user \"%s\" still owns %s repositories and cannot be removed. Switch owners "
+"or remove those repositories. %s"
+msgstr "użytkownik \"%s\" wciąż posiada repozytoria następujące %s i nie może zostać usunięty. Zmień właściciela lub usuń te repozytoria. %s"
 
 #: rhodecode/model/user.py:334
-#, fuzzy
 msgid "Password reset link"
-msgstr "łącze resetowania hasła"
+msgstr ""
 
 #: rhodecode/model/user.py:366
-#, fuzzy
 msgid "Your new password"
-msgstr "Nowe hasło"
+msgstr ""
 
 #: rhodecode/model/user.py:367
 #, python-format
 msgid "Your new RhodeCode password:%s"
-msgstr ""
+msgstr "Nowe hasło do strony: %s"
 
 #: rhodecode/model/validators.py:38 rhodecode/model/validators.py:39
 msgid "Value cannot be an empty list"
@@ -1371,11 +1438,9 @@
 
 #: rhodecode/model/validators.py:89
 msgid ""
-"Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character"
-msgstr ""
-"Nazwa użytkownika może zawierać tylko znaki alfanumeryczne, podkreślenia,"
-" kropki lub myślniki i musi zaczynać się znakiem alfanumerycznym"
+"Username may only contain alphanumeric characters underscores, periods or "
+"dashes and must begin with alphanumeric character or underscore"
+msgstr ""
 
 #: rhodecode/model/validators.py:117
 #, python-format
@@ -1383,23 +1448,19 @@
 msgstr "Nazwa użytkownika %(username)s jest nieprawidłowa"
 
 #: rhodecode/model/validators.py:136
-#, fuzzy
 msgid "Invalid user group name"
-msgstr "Niewłaściwa nazwa grupy"
+msgstr ""
 
 #: rhodecode/model/validators.py:137
-#, fuzzy, python-format
+#, python-format
 msgid "User group \"%(usergroup)s\" already exists"
-msgstr "Nazwa grupy \"%(usergroup)s\" już istnieje"
+msgstr ""
 
 #: rhodecode/model/validators.py:139
-#, fuzzy
 msgid ""
 "user group name may only contain alphanumeric characters underscores, "
 "periods or dashes and must begin with alphanumeric character"
 msgstr ""
-"Nazwa grupy może zawierać tylko znaki alfanumeryczne, podkreślenia, "
-"kropki lub myślniki i musi zaczynać się znakiem alfanumerycznym"
 
 #: rhodecode/model/validators.py:177
 msgid "Cannot assign this group as parent"
@@ -1451,9 +1512,9 @@
 msgstr "Repozytorium  \"%(repo)s\" już istnieje w grupie \"%(group)s\""
 
 #: rhodecode/model/validators.py:321
-#, fuzzy, python-format
+#, python-format
 msgid "Repository group with name \"%(repo)s\" already exists"
-msgstr "Grupa repozytoriów z nazwą \"%(repo)s\" już istnieje"
+msgstr ""
 
 #: rhodecode/model/validators.py:438
 msgid "invalid clone url"
@@ -1472,57 +1533,57 @@
 msgstr "Nie masz uprawnień do tworzenia repozytorium w tej grupie"
 
 #: rhodecode/model/validators.py:481
-#, fuzzy
 msgid "no permission to create repository in root location"
-msgstr "Nie masz uprawnień do tworzenia repozytorium w tej grupie"
+msgstr ""
 
 #: rhodecode/model/validators.py:518
-#, fuzzy
 msgid "You don't have permissions to create a group in this location"
-msgstr "Nie masz uprawnień do tworzenia repozytorium w tej grupie"
-
-#: rhodecode/model/validators.py:557
-#, fuzzy
+msgstr ""
+
+#: rhodecode/model/validators.py:559
 msgid "This username or user group name is not valid"
-msgstr "Ta nazwa użytkownika lub grupy użytkowników nie jest prawidłowa"
-
-#: rhodecode/model/validators.py:650
+msgstr ""
+
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr "To nie jest prawidłowa ścieżka"
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr "Ten adres e-mail jest już zajęty"
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr "e-mail \"%(email)s\" nie istnieje."
 
-#: rhodecode/model/validators.py:722
+#: rhodecode/model/validators.py:724
 msgid ""
-"The LDAP Login attribute of the CN must be specified - this is the name "
-"of the attribute that is equivalent to \"username\""
-msgstr ""
-"Atrybut logowania CN do LDAP należy określić, jest to nazwa atrybutu, "
-"który jest odpowiednikiem  \"username\""
-
-#: rhodecode/model/validators.py:735
+"The LDAP Login attribute of the CN must be specified - this is the name of "
+"the attribute that is equivalent to \"username\""
+msgstr "Atrybut logowania CN do LDAP należy określić, jest to nazwa atrybutu, który jest odpowiednikiem  \"username\""
+
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
 msgstr "Rewizja  %(revs)s jest już częścią  nowej gałęzi więc określ jego status"
 
-#: rhodecode/model/validators.py:767
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
-msgstr ""
-
-#: rhodecode/model/validators.py:768
+msgstr "Proszę podać poprawny adres IPv4 lub IPv6"
+
+#: rhodecode/model/validators.py:770
 #, python-format
-msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
-msgstr ""
-
-#: rhodecode/model/validators.py:800
+msgid ""
+"The network size (bits) must be within the range of 0-32 (not %(bits)r)"
+msgstr "Rozmiar sieci (bity) może mieścić się w zakresie od 0-32 (nie %(bits)r)"
+
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
+msgstr "Klucz nazwy może składać się tylko z liter, podkreślenia, myślnika lub numerów"
+
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
 msgstr ""
 
 #: rhodecode/templates/index.html:5
@@ -1558,43 +1619,40 @@
 #: rhodecode/templates/index_base.html:15
 #: rhodecode/templates/index_base.html:20
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:31
-#, fuzzy
 msgid "Add group"
-msgstr "edytuj grupy repo"
+msgstr ""
 
 #: rhodecode/templates/index_base.html:27
-#, fuzzy
 msgid "Edit group"
-msgstr "edytuj grupy repo"
+msgstr ""
 
 #: rhodecode/templates/index_base.html:27
 msgid "You have admin right to this group, and can edit it"
-msgstr ""
+msgstr "Jako administrator uprawnienia tej grupy, i możesz je edytować"
 
 #: rhodecode/templates/index_base.html:40
-#: rhodecode/templates/index_base.html:140
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr "Nazwa grupy"
 
 #: rhodecode/templates/index_base.html:41
-#: rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142
-#: rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:68
 #: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr "Opis"
@@ -1602,27 +1660,25 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr "Repozytorium grupy"
 
-#: rhodecode/templates/index_base.html:82
-#: rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
 #: rhodecode/templates/admin/repos/repos.html:71
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
 #: rhodecode/templates/tags/tags.html:48
@@ -1630,117 +1686,85 @@
 msgid "Name"
 msgstr "Nazwa"
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
-msgstr "Ostatnia aktywność"
-
-#: rhodecode/templates/index_base.html:85
-#: rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr "Ostatnia akytwność"
+
+#: rhodecode/templates/index_base.html:126
 #: rhodecode/templates/admin/repos/repos.html:74
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr "Ostatnia zmiana"
 
-#: rhodecode/templates/index_base.html:86
-#: rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
 #: rhodecode/templates/admin/repos/repos.html:76
 msgid "Owner"
 msgstr "Właściciel"
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr "Atom"
-
-#: rhodecode/templates/index_base.html:171
-#: rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr "Kliknij, aby posortować rosnąco"
 
-#: rhodecode/templates/index_base.html:172
-#: rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr "Kliknij, aby posortować malejąco"
 
-#: rhodecode/templates/index_base.html:181
-#: rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr "Ostatnia akytwność"
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr "Nie znaleziono rekordów."
-
-#: rhodecode/templates/index_base.html:212
-#: rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+msgid "No repositories found."
+msgstr ""
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr "Błąd danych."
 
-#: rhodecode/templates/index_base.html:213
-#: rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr "Wczytywanie..."
 
-#: rhodecode/templates/index_base.html:298
-#, fuzzy
-msgid "No repositories found."
-msgstr "grupy w repozytorium"
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr "Zaloguj się"
 
 #: rhodecode/templates/login.html:21
 #, python-format
 msgid "Log In to %s"
-msgstr ""
+msgstr "Zaloguj się do %s"
 
 #: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
 #: rhodecode/templates/admin/admin_log.html:5
@@ -1748,7 +1772,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr "Nazwa użytkownika"
@@ -1756,7 +1780,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr "Hasło"
 
@@ -1772,14 +1796,13 @@
 msgid "Forgot your password ?"
 msgstr "Zapomniałeś hasła?"
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr "Nie masz konta?"
 
 #: rhodecode/templates/password_reset.html:5
-#, fuzzy
 msgid "Password Reset"
-msgstr "łącze resetowania hasła"
+msgstr ""
 
 #: rhodecode/templates/password_reset.html:11
 msgid "Reset your password to"
@@ -1842,7 +1865,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1865,13 +1888,13 @@
 msgstr "Nie ma jeszcze tagów"
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr "Nie ma jeszcze zakładek"
 
 #: rhodecode/templates/admin/admin.html:5
 #: rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr "Dziennik administratora"
 
@@ -1898,9 +1921,9 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr "Działanie"
 
@@ -1910,7 +1933,7 @@
 msgstr "Repozytorium"
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
@@ -1933,85 +1956,205 @@
 msgstr "Repozytoria domyślne"
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 msgid "Defaults"
 msgstr "Domyślne"
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr "Typ"
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
 msgid ""
 "Private repositories are only visible to people explicitly added as "
 "collaborators."
-msgstr ""
-"Prywatne repozytoria są widoczne tylko dla osób bezpośrednio dodanych "
-"jako współpracownicy."
+msgstr "Prywatne repozytoria są widoczne tylko dla osób bezpośrednio dodanych jako współpracownicy."
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr "Włącz statystyki"
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr "Włącz okno statystyk na stronie podsumowania."
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr "Włącz pobieranie"
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr "Włącz menu pobierania na stronie podsumowania."
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 msgid "Enable locking"
 msgstr "Włącz blokowanie"
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr "Włącz blokowanie pobierania w repozytorium."
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr "Zapisz"
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, python-format
+msgid "Private Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+msgid "Create new gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:48
+msgid "Created"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+msgid "Expires"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+msgid "never"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:68
+msgid "There are no gists yet"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+msgid "Gist description ..."
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr "Zresetuj"
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+msgid "Private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr "Usuń"
+
+#: rhodecode/templates/admin/gists/show.html:54
+msgid "Confirm to delete this gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+msgid "Show as raw"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:71
+msgid "created"
+msgstr ""
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr "Administracja LDAP"
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
-#, fuzzy
+#: rhodecode/templates/base/base.html:79
 msgid "LDAP"
-msgstr "ldap"
+msgstr ""
 
 #: rhodecode/templates/admin/ldap/ldap.html:28
 msgid "Connection settings"
@@ -2109,7 +2252,7 @@
 msgstr "Pokaż powiadomienia"
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr "Powiadomienia"
 
@@ -2118,12 +2261,14 @@
 msgstr "Uprawnienia administracji"
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr "Uprawnienia"
 
@@ -2136,124 +2281,111 @@
 msgstr "Dostęp anonimowy"
 
 #: rhodecode/templates/admin/permissions/permissions.html:49
-#, fuzzy
 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 ""
-"Wszystkie uprawnienia domyślne każdego repozytorium zostaną przywrócone. "
-"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie "
-"niestandardowe uprawnienia w repozytoriach zostaną utracone."
+"permission, note that all custom default permission on repositories will be "
+"lost"
+msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
-#, fuzzy
+#: rhodecode/templates/admin/permissions/permissions.html:77
 msgid "Overwrite existing settings"
-msgstr "Nadpisz ustawienia"
+msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:62
-#, fuzzy
 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 ""
-"Wszystkie uprawnienia domyślne każdego repozytorium zostaną przywrócone. "
-"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie "
-"niestandardowe uprawnienia w repozytoriach zostaną utracone."
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr "Rejestracja"
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+msgid "User group"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr "Tworzenie repozytorium"
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+msgid "User group creation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 msgid "Repository forking"
 msgstr "Rozwidlanie repozytorium"
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr "Zresetuj"
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
-#, fuzzy
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr "Rejestracja"
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+msgid "External auth account activation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 msgid "Default User Permissions"
-msgstr "Domyślne uprawnienia"
-
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 msgid "Allowed IP addresses"
-msgstr "Adresy e-mail"
-
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr "usuń"
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
-#, fuzzy, python-format
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
+#, python-format
 msgid "Confirm to delete this ip: %s"
-msgstr "Potwierdź, aby usunąć ten e-mail: %s"
-
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
-msgstr ""
-
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
-#, fuzzy
+msgstr "Wszystkie adresy IP są dozwolone"
+
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 msgid "New ip address"
-msgstr "Nowy adres e-mail"
-
-#: rhodecode/templates/admin/permissions/permissions.html:153
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 msgid "Add"
 msgstr "Dodaj"
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr "Repozytoria"
 
 #: rhodecode/templates/admin/repos/repo_add.html:19
-#, fuzzy
 msgid "Add new"
-msgstr "dodaj nowe"
+msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:20
 #: rhodecode/templates/summary/summary.html:96
@@ -2262,7 +2394,7 @@
 msgstr "Klonuj z"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr "Opcjonalnie http[s] url z którego repozytorium powinno być klonowane."
 
@@ -2276,21 +2408,22 @@
 msgstr "Rodzaj repozytorium do stworzenia."
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 msgid "Landing revision"
 msgstr "Docelowa rewizja"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr "Wersja domyślna dla plików stronicowania, pobierania plików, readme"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
-msgid "Keep it short and to the point. Use a README file for longer descriptions."
+msgid ""
+"Keep it short and to the point. Use a README file for longer descriptions."
 msgstr "Powinna być krótka i na temat. Użyj pliku README dla dłuższych opisów."
 
 #: rhodecode/templates/admin/repos/repo_edit.html:8
@@ -2300,261 +2433,252 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81
+#: rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr "Ustawienia"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+msgid "Non-changeable id"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr "Klonowane uri"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr "Opcjonalnie wybierz grupę do wprowadzenia tego repozytorium."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr "Zmiana właściciela tego repozytorium."
 
+#: rhodecode/templates/admin/repos/repo_edit.html:177
+msgid "Advanced settings"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:180
+msgid "Statistics"
+msgstr "Statystyki"
+
 #: rhodecode/templates/admin/repos/repo_edit.html:184
-#, fuzzy
-msgid "Advanced settings"
-msgstr "Zapisz ustawienia"
+msgid "Reset current statistics"
+msgstr "Zresetuj bieżące statystyki"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:184
+msgid "Confirm to remove current statistics"
+msgstr "Potwierdź usunięcie aktualnych statystyk"
 
 #: rhodecode/templates/admin/repos/repo_edit.html:187
-msgid "Statistics"
-msgstr "Statystyki"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Reset current statistics"
-msgstr "Zresetuj bieżące statystyki"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Confirm to remove current statistics"
-msgstr "Potwierdź usunięcie aktualnych statystyk"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:194
 msgid "Fetched to rev"
 msgstr "Ściągnięte do rev"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr "statystyki zgromadzone"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr "Zdalnie"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr "Pobierz z zdalnej lokalizacji"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr "Potwierdź pull z zdalnej strony"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:218
+#: rhodecode/templates/admin/repos/repo_edit.html:211
 msgid "Cache"
 msgstr "Pamięć podręczna"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Invalidate repository cache"
 msgstr "Unieważnij pamięć podręczną repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Confirm to invalidate repository cache"
 msgstr "Potwierdź unieważnienie pamięci podręcznej repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:225
+#: rhodecode/templates/admin/repos/repo_edit.html:218
 msgid ""
-"Manually invalidate cache for this repository. On first access repository"
-" will be cached again"
-msgstr ""
-"Ręcznie unieważnienie cache dla tego repozytorium. Przy pierwszym "
-"dostępie do repozytorium zostanie dodany do bufora ponownie"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+"Manually invalidate cache for this repository. On first access repository "
+"will be cached again"
+msgstr "Ręcznie unieważnienie cache dla tego repozytorium. Przy pierwszym dostępie do repozytorium zostanie dodany do bufora ponownie"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr "Lista buforowanych wartości"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr "Prefiks"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 msgid "Key"
 msgstr "Klucz"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr "Aktywny"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280
-#: rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr "Dziennik publiczny"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:256
+#: rhodecode/templates/admin/repos/repo_edit.html:249
 msgid "Remove from public journal"
 msgstr "Usuń z dziennika publicznego"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:258
+#: rhodecode/templates/admin/repos/repo_edit.html:251
 msgid "Add to public journal"
 msgstr "Dodaj do dziennika publicznego"
 
+#: rhodecode/templates/admin/repos/repo_edit.html:256
+msgid ""
+"All actions made on this repository will be accessible to everyone in public"
+" journal"
+msgstr "Wszystkie działania wykonywane na tym repozytorium będą dostępne dla wszystkich w dzienniku publicznym"
+
 #: rhodecode/templates/admin/repos/repo_edit.html:263
-msgid ""
-"All actions made on this repository will be accessible to everyone in "
-"public journal"
-msgstr ""
-"Wszystkie działania wykonywane na tym repozytorium będą dostępne dla "
-"wszystkich w dzienniku publicznym"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:270
 msgid "Locking"
 msgstr "Blokuj"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr "Odblokuj zablokowane repo"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Confirm to unlock repository"
 msgstr "Potwierdź odblokowanie repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
-msgstr "blokada repo"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Lock repo"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 msgid "Confirm to lock repository"
 msgstr "Potwierdź blokowanie repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 msgid "Repository is not locked"
 msgstr "Repozytorium nie jest zablokowane"
 
+#: rhodecode/templates/admin/repos/repo_edit.html:277
+msgid ""
+"Force locking on repository. Works only when anonymous access is disabled"
+msgstr "Wymuś blokowanie na repozytorium. Działa tylko wtedy, gdy dostęp anonimowy jest wyłączony"
+
 #: rhodecode/templates/admin/repos/repo_edit.html:284
-msgid "Force locking on repository. Works only when anonymous access is disabled"
-msgstr ""
-"Wymuś blokowanie na repozytorium. Działa tylko wtedy, gdy dostęp "
-"anonimowy jest wyłączony"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:291
 msgid "Set as fork of"
 msgstr "Ustaw jako rozwidlenie"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
-msgstr "ustaw"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+msgid "Set"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 msgid "Manually set this repository as a fork of another from the list"
 msgstr "Ręczne ustawienie rozwidlenia z listy"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr "Usuń"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr "Usuń to repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr "Potwierdź, aby usunąć repozytorium"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
-#, fuzzy, python-format
+#: rhodecode/templates/admin/repos/repo_edit.html:310
+#, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
-msgstr[0] "to repozytorium ma %s fork"
-msgstr[1] "to repozytorium ma %s forki"
-msgstr[2] "to repozytorium ma %s forków"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:318
-#, fuzzy
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 msgid "Detach forks"
-msgstr "Ustaw jako rozwidlenie"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:319
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 msgid "Delete forks"
-msgstr "usuń"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:322
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:315
 msgid ""
-"This repository will be renamed in a special way in order to be "
-"unaccesible for RhodeCode and VCS systems. If you need to fully delete it"
-" from file system please do it manually"
-msgstr ""
-"To repozytorium zostanie zmienione w sposób szczególny, żeby było "
-"niedostępne dla strony i systemów VCS. Jeśli chcesz całkowicie usunąć go "
-"z systemu plików prosimy zrobić to ręcznie"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+"This repository will be renamed in a special way in order to be unaccesible "
+"for RhodeCode and VCS systems. If you need to fully delete it from file "
+"system please do it manually"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:348
-#, fuzzy, python-format
+msgstr "Dodatkowe pola"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:341
+#, python-format
 msgid "Confirm to delete this field: %s"
-msgstr "Potwierdź, aby usunąć ten e-mail: %s"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:362
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 msgid "New field key"
-msgstr "dodaj nowy plik"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+msgstr "Nowa etykieta pola"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:379
-#, fuzzy
+msgstr "Wpisz krótką etykietę"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 msgid "New field description"
-msgstr "opis"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
-msgstr ""
+msgstr "Wprowadź opis pola"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr "brak"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr "odczyt"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr "zapis"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr "administracja"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr "użytkownik"
 
@@ -2566,6 +2690,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 msgid "default"
 msgstr "domyślne"
 
@@ -2573,42 +2699,41 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr "odwołane"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr "Dodaj kolejnego użytkownika"
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr "Nie udało się usunąć użytkownika"
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-#, fuzzy
-msgid "Failed to remove user group"
-msgstr "Nie udało się usunąć grupy użytkowników"
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr "Administracja repozytoriami"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
-#, fuzzy
-msgid "apply to children"
-msgstr "dotyczy dzieci"
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
+msgstr "Nie znaleziono rekordów."
 
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
-#, fuzzy
+msgid "apply to children"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
 msgid ""
 "Set or revoke permission to all children of that group, including non-"
 "private repositories and other groups"
 msgstr ""
-"Ustawia lub cofa uprawnienia do wszystkich dzieci z tej grupy, w tym "
-"repozytoria oraz innych grup"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
 #, python-format
@@ -2624,22 +2749,19 @@
 msgstr "używając"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
-#, fuzzy
 msgid "Add repository group"
-msgstr "Repozytorium grupy"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
-#, fuzzy
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 msgid "Repository groups"
-msgstr "Repozytorium grupy"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:13
-#, fuzzy
 msgid "Add new repository group"
-msgstr "dodaj nową grupę repozytorium"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:51
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:56
@@ -2651,48 +2773,48 @@
 msgstr "zapisz"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
-#, fuzzy
 msgid "Edit repository group"
-msgstr "edytuj grupy repo"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:13
-#, fuzzy, python-format
+#, python-format
 msgid "Edit repository group %s"
-msgstr "edytuj grupe %s"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:27
-#, fuzzy
 msgid "Add child group"
-msgstr "dodaj nową grupę użytkowników"
-
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
 msgid ""
-"Enable lock-by-pulling on group. This option will be applied to all other"
-" groups and repositories inside"
-msgstr ""
-"Włącz blokowanie pulling przez grupy. Opcja ta będzie stosowana do "
-"wszystkich innych grup i repozytoriów wewnątrz"
+"Enable lock-by-pulling on group. This option will be applied to all other "
+"groups and repositories inside"
+msgstr "Włącz blokowanie pulling przez grupy. Opcja ta będzie stosowana do wszystkich innych grup i repozytoriów wewnątrz"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
-#, fuzzy
 msgid "Repository groups administration"
-msgstr "Repozytoria grup administracyjnych"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:45
 msgid "Number of toplevel repositories"
 msgstr "Liczba najwyższego poziomu repozytorium"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
-#, fuzzy
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 msgid "Edit"
-msgstr "edycja"
+msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr "edycja"
 
@@ -2705,9 +2827,8 @@
 msgstr[2] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:78
-#, fuzzy
 msgid "There are no repository groups yet"
-msgstr "Nie ma jeszcze grup repozytoriów"
+msgstr ""
 
 #: rhodecode/templates/admin/settings/hooks.html:5
 #: rhodecode/templates/admin/settings/settings.html:5
@@ -2735,32 +2856,25 @@
 msgstr "Mapowanie i skanowanie repozytorów"
 
 #: rhodecode/templates/admin/settings/settings.html:34
-#, fuzzy
 msgid "Rescan option"
-msgstr "ponowne skanowanie opcji"
+msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:40
 msgid ""
-"In case a repository was deleted from filesystem and there are leftovers "
-"in the database check this option to scan obsolete data in database and "
-"remove it."
-msgstr ""
-"W przypadku repozytoriów zostaną usunięte systemy plików i jeśli są "
-"pozostałości w bazie danych to ta opcja sprawdzi ją oraz przeskanuje, a "
-"następnie usunie je z bazy danych."
+"In case a repository was deleted from filesystem and there are leftovers in "
+"the database check this option to scan obsolete data in database and remove "
+"it."
+msgstr "W przypadku repozytoriów zostaną usunięte systemy plików i jeśli są pozostałości w bazie danych to ta opcja sprawdzi ją oraz przeskanuje, a następnie usunie je z bazy danych."
 
 #: rhodecode/templates/admin/settings/settings.html:41
-#, fuzzy
 msgid "Destroy old data"
-msgstr "zniszcz stare dane"
+msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:43
 msgid ""
-"Rescan repositories location for new repositories. Also deletes obsolete "
-"if `destroy` flag is checked "
-msgstr ""
-"Skanowanie ponowne lokalizacji dla nowych repozytoriów. Usuwa również "
-"nieaktualne jeśli została zaznaczona flaga `zniszcz` do sprawdzana"
+"Rescan repositories location for new repositories. Also deletes obsolete if "
+"`destroy` flag is checked "
+msgstr "Skanowanie ponowne lokalizacji dla nowych repozytoriów. Usuwa również nieaktualne jeśli została zaznaczona flaga `zniszcz` do sprawdzana"
 
 #: rhodecode/templates/admin/settings/settings.html:48
 msgid "Rescan repositories"
@@ -2771,14 +2885,12 @@
 msgstr "indeksowanie Whoosh"
 
 #: rhodecode/templates/admin/settings/settings.html:62
-#, fuzzy
 msgid "Index build option"
-msgstr "opcja budowania indeksowania"
+msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:67
-#, fuzzy
 msgid "Build from scratch"
-msgstr "buduj od podstaw"
+msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:73
 msgid "Reindex"
@@ -2790,19 +2902,19 @@
 
 #: rhodecode/templates/admin/settings/settings.html:88
 msgid "Site branding"
-msgstr ""
+msgstr "Branding strony"
 
 #: rhodecode/templates/admin/settings/settings.html:97
 msgid "HTTP authentication realm"
-msgstr ""
+msgstr "Sfera uwierzytelniania HTTP"
 
 #: rhodecode/templates/admin/settings/settings.html:106
 msgid "Google Analytics code"
-msgstr ""
+msgstr "Kod Google Analytics"
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr "Zapisz ustawienia"
 
@@ -2815,149 +2927,154 @@
 msgstr "Główne"
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr "Użyj lekkiego pulpitu"
-
-#: rhodecode/templates/admin/settings/settings.html:140
-#, fuzzy
 msgid "Use repository extra fields"
-msgstr "repozytoria"
-
-#: rhodecode/templates/admin/settings/settings.html:147
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+msgid "Dashboard items"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 msgid "Icons"
 msgstr "Ikony"
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr "Pokazuj w publicznym repo ikonę w repozytoriach"
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 msgid "Show private repo icon on repositories"
 msgstr "Pokazuj w prywatnym repo ikonę w repozytoriach"
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+msgid "Show public/private icons next to repositories names"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:172
 msgid "Meta-Tagging"
 msgstr "Tagowanie meta"
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr "Stylizacja rozpoznanych meta tagów:"
 
-#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:204
 msgid "VCS settings"
 msgstr "VCS ustawienia"
 
-#: rhodecode/templates/admin/settings/settings.html:204
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr "www"
 
-#: rhodecode/templates/admin/settings/settings.html:209
-#, fuzzy
+#: rhodecode/templates/admin/settings/settings.html:218
 msgid "Require SSL for vcs operations"
-msgstr "wymagaj ssl dla operacji vcs"
-
-#: rhodecode/templates/admin/settings/settings.html:211
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:220
 msgid ""
-"RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
-"will return HTTP Error 406: Not Acceptable"
-msgstr ""
-"RhodeCode wymaga SSL do wysłania zmian lub pobierania. Jeśli brakuje SSL "
-"zwróci błąd HTTP 406: Not Acceptable"
-
-#: rhodecode/templates/admin/settings/settings.html:217
+"RhodeCode will require SSL for pushing or pulling. If SSL is missing it will"
+" return HTTP Error 406: Not Acceptable"
+msgstr "RhodeCode wymaga SSL do wysłania zmian lub pobierania. Jeśli brakuje SSL zwróci błąd HTTP 406: Not Acceptable"
+
+#: rhodecode/templates/admin/settings/settings.html:226
 msgid "Hooks"
 msgstr "Aktualizacja"
 
-#: rhodecode/templates/admin/settings/settings.html:222
+#: rhodecode/templates/admin/settings/settings.html:231
 msgid "Update repository after push (hg update)"
 msgstr "Aktualizacja repozytorium po wysłaniu zmian (aktualizacja hg)"
 
-#: rhodecode/templates/admin/settings/settings.html:226
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr "Pokaż rozmiar repozytorium po wysłaniu zmian"
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr "Logi poleceń wysłania zmian użytkowników"
 
-#: rhodecode/templates/admin/settings/settings.html:234
-msgid "Log user pull commands"
-msgstr "Logi poleceń połączenia gałęzi użytkowników"
-
-#: rhodecode/templates/admin/settings/settings.html:238
-#, fuzzy
-msgid "Advanced setup"
-msgstr "zaawansowane ustawienia"
-
 #: rhodecode/templates/admin/settings/settings.html:243
+msgid "Log user pull commands"
+msgstr "Logi poleceń połączenia gałęzi użytkowników"
+
+#: rhodecode/templates/admin/settings/settings.html:247
+msgid "Advanced setup"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:252
 msgid "Mercurial Extensions"
 msgstr "Rozszerzenia Mercurial"
 
-#: rhodecode/templates/admin/settings/settings.html:248
-#, fuzzy
+#: rhodecode/templates/admin/settings/settings.html:257
 msgid "Enable largefiles extension"
-msgstr "rozszerzenia dużych pliów"
-
-#: rhodecode/templates/admin/settings/settings.html:252
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:261
 msgid "Enable hgsubversion extension"
-msgstr "rozszerzenia hgsubversion"
-
-#: rhodecode/templates/admin/settings/settings.html:254
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:263
 msgid ""
 "Requires hgsubversion library installed. Allows cloning from svn remote "
 "locations"
 msgstr ""
-"Wymaga biblioteki hgsubversion zainstalowanej. Umożliwia klonowanie z "
-"zdalnych lokalizacji svn"
-
-#: rhodecode/templates/admin/settings/settings.html:264
+
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr "Położenie repozytorium"
 
-#: rhodecode/templates/admin/settings/settings.html:269
+#: rhodecode/templates/admin/settings/settings.html:279
 msgid ""
-"This a crucial application setting. If you are really sure you need to "
-"change this, you must restart application in order to make this setting "
-"take effect. Click this label to unlock."
-msgstr ""
-"To kluczowe ustawienia aplikacji. Jeśli jesteś pewny, że chcesz to "
-"zmienić, należy ponownie uruchomić aplikację w celu zaktualizowania "
-"lokalizacji. Kliknij tą etykietę, żeby odblokować."
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
-#, fuzzy
+"Click to unlock. You must restart RhodeCode in order to make this setting "
+"take effect."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 msgid "Unlock"
-msgstr "odblokowany"
-
-#: rhodecode/templates/admin/settings/settings.html:272
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:282
 msgid ""
-"Location where repositories are stored. After changing this value a "
-"restart, and rescan is required"
-msgstr ""
-"Miejsce, w którym przechowywane są repozytoria. Po zmianie tej wartości "
-"jest wymagany restart i ponowne skanowanie"
-
-#: rhodecode/templates/admin/settings/settings.html:292
+"Location where repositories are stored. After changing this value a restart,"
+" and rescan is required"
+msgstr "Miejsce, w którym przechowywane są repozytoria. Po zmianie tej wartości jest wymagany restart i ponowne skanowanie"
+
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr "Test e-maila"
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr "E-mail do"
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr "Wyślij"
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr "Informacje Systemowe i pakiety"
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr "Wyświetl"
 
@@ -2967,15 +3084,14 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr "Użytkownicy"
 
 #: rhodecode/templates/admin/users/user_add.html:12
 #: rhodecode/templates/admin/users/users.html:23
-#, fuzzy
 msgid "Add new user"
-msgstr "dodaj nowego użytkownika"
+msgstr ""
 
 #: rhodecode/templates/admin/users/user_add.html:50
 msgid "Password confirmation"
@@ -2987,9 +3103,9 @@
 
 #: rhodecode/templates/admin/users/user_edit.html:13
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:13
-#, fuzzy, python-format
+#, python-format
 msgid "Edit %s"
-msgstr "edycja %s"
+msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit.html:34
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:10
@@ -3009,7 +3125,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:50
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:25
 msgid "Current IP"
-msgstr ""
+msgstr "Obecny IP"
 
 #: rhodecode/templates/admin/users/user_edit.html:70
 msgid "LDAP DN"
@@ -3025,46 +3141,21 @@
 msgid "New password confirmation"
 msgstr "Potwierdzenie nowego hasła"
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-msgid "Inherit default permissions"
-msgstr "Dziedziczą uprawnienia domyślne"
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-"Zaznacz, żeby dziedziczyć uprawnienia z %s ustawień. Po wybraniu tej "
-"opcji, poniżej nie ma żadnych działań"
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr "Utwórz repozytorium"
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-msgid "Fork repositories"
-msgstr "Rozwidlenie repozytorium"
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 msgid "Email addresses"
 msgstr "Adresy e-mail"
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, python-format
 msgid "Confirm to delete this email: %s"
 msgstr "Potwierdź, aby usunąć ten e-mail: %s"
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 msgid "New email address"
 msgstr "Nowy adres e-mail"
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr "Moje konto"
 
@@ -3087,9 +3178,8 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:4
-#, fuzzy
 msgid "Show closed pull requests"
-msgstr "[zamknięty] wniosek o połączenie gałęzi"
+msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:6
 msgid "Opened by me"
@@ -3102,7 +3192,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -3122,7 +3212,7 @@
 msgstr "Biorę udział w"
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr "Wniosek połączenia gałęzi #%s otwarty %s dnia %s"
@@ -3136,57 +3226,48 @@
 msgstr "użytkownicy"
 
 #: rhodecode/templates/admin/users/users.html:80
-#, fuzzy
 msgid "Firstname"
-msgstr "imię"
+msgstr ""
 
 #: rhodecode/templates/admin/users/users.html:81
-#, fuzzy
 msgid "Lastname"
-msgstr "nazwisko"
+msgstr ""
 
 #: rhodecode/templates/admin/users/users.html:82
-#, fuzzy
 msgid "Last login"
-msgstr "ostatnio zalogowany"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:5
-#, fuzzy
 msgid "Add user group"
-msgstr "Dodaj grupę użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
-#, fuzzy
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 msgid "User groups"
-msgstr "grupy użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
-#, fuzzy
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 msgid "Add new user group"
-msgstr "dodaj nową grupę użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:5
-#, fuzzy
 msgid "Edit user group"
-msgstr "Edytuj grupę użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:11
-#, fuzzy
 msgid "UserGroups"
-msgstr "grupy użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr "Użytkownik"
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:58
-#, fuzzy
 msgid "Chosen group members"
-msgstr "Wybrane grupy użytkowników"
+msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:61
 msgid "Remove all elements"
@@ -3200,46 +3281,53 @@
 msgid "Add all elements"
 msgstr "Dodaj wszystkie elementy"
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr "Grupy użytkowników"
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 msgid "No members yet"
 msgstr "Nie ma jeszcze żadnego użytkownika"
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+msgid "Global Permissions"
+msgstr ""
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
-#, fuzzy
 msgid "User groups administration"
-msgstr "Użytkownicy grupy administracji"
-
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
+#, python-format
 msgid "Confirm to delete this user group: %s"
-msgstr "Potwierdź usunięcie grupy użytkowników: %s"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+msgid "There are no user groups yet"
+msgstr ""
 
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr "Prześlij błąd"
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Podsumowanie"
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr "Dziennik zmian"
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3247,53 +3335,44 @@
 msgid "Files"
 msgstr "Pliki"
 
-#: rhodecode/templates/base/base.html:112
-#, fuzzy
+#: rhodecode/templates/base/base.html:125
 msgid "Switch To"
-msgstr "Przełącz do"
-
-#: rhodecode/templates/base/base.html:114
-#: rhodecode/templates/base/base.html:267
+msgstr ""
+
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
 msgid "loading..."
 msgstr "wczytywanie..."
 
-#: rhodecode/templates/base/base.html:118
+#: rhodecode/templates/base/base.html:131
 msgid "Options"
 msgstr "Opcje"
 
-#: rhodecode/templates/base/base.html:124
+#: rhodecode/templates/base/base.html:137
 #: rhodecode/templates/forks/forks_data.html:21
 msgid "Compare fork"
 msgstr "Porównaj rozwidlenie"
 
-#: rhodecode/templates/base/base.html:126
-#, fuzzy
-msgid "Lightweight changelog"
-msgstr "Użyj lekkiego pulpitu"
-
-#: rhodecode/templates/base/base.html:127
-#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr "Szukaj"
 
-#: rhodecode/templates/base/base.html:133
-#, fuzzy
+#: rhodecode/templates/base/base.html:145
 msgid "Lock"
-msgstr "zablokowane"
-
-#: rhodecode/templates/base/base.html:141
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/base.html:153
 msgid "Follow"
-msgstr "obserwatorzy"
-
-#: rhodecode/templates/base/base.html:142
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/base.html:154
 msgid "Unfollow"
-msgstr "obserwatorzy"
-
-#: rhodecode/templates/base/base.html:145
+msgstr ""
+
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3302,76 +3381,122 @@
 msgid "Fork"
 msgstr "Gałąź"
 
-#: rhodecode/templates/base/base.html:147
-#, fuzzy
+#: rhodecode/templates/base/base.html:159
 msgid "Create Pull Request"
-msgstr "Stwórz nowe żądanie połączenia gałęzi"
-
-#: rhodecode/templates/base/base.html:153
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/base.html:165
 msgid "Show Pull Requests"
-msgstr "Nowa prośba o połączenie gałęzi"
-
-#: rhodecode/templates/base/base.html:153
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/base.html:165
 msgid "Pull Requests"
-msgstr "Połączone gałęzie"
-
-#: rhodecode/templates/base/base.html:190
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/base.html:202
 msgid "Not logged in"
-msgstr "ostatnio zalogowany"
-
-#: rhodecode/templates/base/base.html:197
+msgstr ""
+
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr "Zaloguj się do swojego konta"
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr "Nie pamiętasz hasła?"
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr "Wyloguj się"
 
-#: rhodecode/templates/base/base.html:262
+#: rhodecode/templates/base/base.html:274
 msgid "Switch repository"
 msgstr "Przełącz repozytorium"
 
-#: rhodecode/templates/base/base.html:274
+#: rhodecode/templates/base/base.html:286
 msgid "Show recent activity"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:275
+msgstr "Pokaż ostatnią aktywność"
+
+#: rhodecode/templates/base/base.html:287
 #: rhodecode/templates/journal/journal.html:4
 msgid "Journal"
 msgstr "Dziennik"
 
-#: rhodecode/templates/base/base.html:286
-#, fuzzy
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 msgid "Search in repositories"
-msgstr "Szukaj we wszystkich repozytoriach"
-
-#: rhodecode/templates/base/perms_summary.html:8
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr "Dziedziczą uprawnienia domyślne"
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr "Zaznacz, żeby dziedziczyć uprawnienia z %s ustawień. Po wybraniu tej opcji, poniżej nie ma żadnych działań"
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr "Utwórz repozytorium"
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr "Wybierz tą opcje aby zezwolnic na tworzenie repozytoriów dla tego użytkownika"
+
+#: rhodecode/templates/base/default_perms_box.html:35
+msgid "Create user groups"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr "Rozwidlenie repozytorium"
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 msgid "No permissions defined yet"
-msgstr "Nie ma jeszcze ustawionych uprawnień"
-
-#: rhodecode/templates/base/perms_summary.html:15
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr "Uprawnienia"
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 msgid "Edit Permission"
 msgstr "Edycja Uprawnień"
 
 #: rhodecode/templates/base/root.html:43
-#, fuzzy
 msgid "Add another comment"
-msgstr "dodaj kolejny komentarz"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
+#: rhodecode/templates/data_table/_dt_elements.html:147
 msgid "Stop following this repository"
 msgstr "Zakończyć obserwację tego repozytorium"
 
@@ -3388,23 +3513,20 @@
 msgstr "użytkownik"
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
-#, fuzzy
+#: rhodecode/templates/pullrequests/pullrequest.html:203
 msgid "Loading ..."
-msgstr "wczytywanie..."
+msgstr ""
 
 #: rhodecode/templates/base/root.html:49
-#, fuzzy
 msgid "Search truncated"
-msgstr "wyszukaj obcięte"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:50
-#, fuzzy
 msgid "No matching files"
-msgstr "nie ma plików pasujących"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
+#: rhodecode/templates/changelog/changelog.html:45
 msgid "Open new pull request"
 msgstr "Otwórz nową prośbę o połączenie gałęzi"
 
@@ -3413,14 +3535,12 @@
 msgstr "Otwórz nową prośbę o połączenie gałęzi w zestawieniu zmian"
 
 #: rhodecode/templates/base/root.html:53
-#, fuzzy
 msgid "Show selected changesets __S -> __E"
-msgstr "Pokaż wybrane zmiany __S -> __E"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:54
-#, fuzzy
 msgid "Show selected changeset __S"
-msgstr "Pokaż wybrane zmiany __S -> __E"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:55
 msgid "Selection link"
@@ -3428,40 +3548,55 @@
 
 #: rhodecode/templates/base/root.html:56
 #: rhodecode/templates/changeset/diff_block.html:8
-#, fuzzy
 msgid "Collapse diff"
-msgstr "Pliki różnic"
+msgstr ""
 
 #: rhodecode/templates/base/root.html:57
-#, fuzzy
 msgid "Expand diff"
-msgstr "poprawka różnic"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:58
+msgid "Failed to remoke permission"
+msgstr ""
 
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, python-format
 msgid "%s Bookmarks"
 msgstr "%s Zakładki"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+msgid "Compare bookmarks"
+msgstr ""
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
 #: rhodecode/templates/tags/tags.html:51
 #: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr "Autor"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
 #: rhodecode/templates/tags/tags.html:52
 #: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr "Rewizja"
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr "Porównaj"
+
 #: rhodecode/templates/branches/branches.html:5
 #, python-format
 msgid "%s Branches"
@@ -3471,19 +3606,12 @@
 msgid "Compare branches"
 msgstr "porównaj gałęzie"
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54
-#: rhodecode/templates/tags/tags_data.html:10
-msgid "Compare"
-msgstr "Porównaj"
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, python-format
 msgid "%s Changelog"
 msgstr "%s Dziennik zmian"
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 msgid "showing %d out of %d revision"
 msgid_plural "showing %d out of %d revisions"
@@ -3491,67 +3619,73 @@
 msgstr[1] "pokazano %d w rewizjach %d"
 msgstr[2] "pokazano %d w rewizjach %d"
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 msgid "Clear selection"
 msgstr "Wyczyść zaznaczenie"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
-#, fuzzy, python-format
+#, python-format
 msgid "Compare fork with %s"
-msgstr "porównaj gałęzie %s"
-
-#: rhodecode/templates/changelog/changelog.html:33
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:42
 msgid "Compare fork with parent"
 msgstr "porównaj gałąź w rodzicem"
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
-#, fuzzy
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 msgid "Show more"
-msgstr "Pokaż więcej"
-
-#: rhodecode/templates/changelog/changelog.html:89
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
-#, fuzzy, python-format
+#, python-format
 msgid "Bookmark %s"
-msgstr "Zakładki %s"
-
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
-#, fuzzy, python-format
+#, python-format
 msgid "Tag %s"
-msgstr "Tagi %s"
-
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
-#, fuzzy, python-format
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
+#, python-format
 msgid "Branch %s"
-msgstr "Gałęzie %s"
-
-#: rhodecode/templates/changelog/changelog.html:258
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr "Nie ma jeszcze zmian"
 
 #: rhodecode/templates/changelog/changelog_details.html:4
 #: rhodecode/templates/changeset/changeset.html:91
-#, fuzzy
 msgid "Removed"
-msgstr "usunięto"
+msgstr "Usunięte"
 
 #: rhodecode/templates/changelog/changelog_details.html:5
 #: rhodecode/templates/changeset/changeset.html:92
-#, fuzzy
 msgid "Changed"
-msgstr "zmiana"
+msgstr "Zmienione"
 
 #: rhodecode/templates/changelog/changelog_details.html:6
 #: rhodecode/templates/changeset/changeset.html:93
-#, fuzzy
 msgid "Added"
-msgstr "dodana"
+msgstr "Dodane"
 
 #: rhodecode/templates/changelog/changelog_details.html:8
 #: rhodecode/templates/changelog/changelog_details.html:9
@@ -3559,9 +3693,41 @@
 #: rhodecode/templates/changeset/changeset.html:95
 #: rhodecode/templates/changeset/changeset.html:96
 #: rhodecode/templates/changeset/changeset.html:97
-#, fuzzy, python-format
+#, python-format
 msgid "Affected %s files"
-msgstr "zarażone pliki %s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+msgid "Commit message"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+msgid "Age"
+msgstr "Wiek"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr "Dodaj lub prześlij pliki bezpośrednio przez stronę"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr "Dodaj nowy plik"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr "Wyślij zmiany do nowego repo"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr "Istniejące repozytorium?"
 
 #: rhodecode/templates/changeset/changeset.html:6
 #, python-format
@@ -3573,7 +3739,6 @@
 msgstr "Brak rewizji"
 
 #: rhodecode/templates/changeset/changeset.html:49
-#, fuzzy
 msgid "No children"
 msgstr "Brak dzieci"
 
@@ -3584,24 +3749,21 @@
 msgstr "Status grupy zmian"
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
-#, fuzzy
+#: rhodecode/templates/changeset/diff_block.html:22
 msgid "Raw diff"
-msgstr "raw różnic"
+msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:68
-#, fuzzy
 msgid "Patch diff"
-msgstr "poprawka różnic"
+msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
-#, fuzzy
+#: rhodecode/templates/changeset/diff_block.html:23
 msgid "Download diff"
-msgstr "pobierz różnice"
+msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -3610,7 +3772,7 @@
 msgstr[2] "%d komentarzy"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
@@ -3619,11 +3781,11 @@
 msgstr[2] "(%d linii)"
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr "połącz"
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, python-format
@@ -3633,7 +3795,7 @@
 msgstr[1] "%s pliki zostały zmienione"
 msgstr[2] "%s plików zostało zmienionych"
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, python-format
@@ -3643,82 +3805,90 @@
 msgstr[1] "%s plików zostało zmienionych z %s inercjami i %s usunięciami"
 msgstr[2] "%s plików zostało zmienionych z %s inercjami i %s usunięciami"
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
-msgstr ""
-
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+msgstr "Pokazuje pełną edycję, może zająć to trochę czasu i zasobów"
+
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
-#, fuzzy
 msgid "Show full diff"
-msgstr "pokaż pełną historię"
+msgstr ""
 
 #: rhodecode/templates/changeset/changeset_file_comment.html:30
-#, fuzzy, python-format
+#, python-format
 msgid "Status change on pull request #%s"
-msgstr "wszystkie prośby połączenia gałęzi %s"
+msgstr ""
 
 #: rhodecode/templates/changeset/changeset_file_comment.html:32
-#, fuzzy, python-format
+#, python-format
 msgid "Comment on pull request #%s"
-msgstr "[komentarz] wniosek o połączenie gałęzi %s"
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr "Przesyłanie..."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr "Komentując linię {1}."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "Komentarze analizowane za pomocą %s składni od %s wsparcia."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
-msgid "Use @username inside this text to send notification to this RhodeCode user"
-msgstr ""
-"Użyj @username wewnątrz tego tekstu, aby wysłać powiadomienie do "
-"użytkownika strony"
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:61
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
+msgid ""
+"Use @username inside this text to send notification to this RhodeCode user"
+msgstr "Użyj @username wewnątrz tego tekstu, aby wysłać powiadomienie do użytkownika strony"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+msgid "Preview"
+msgstr "Podgląd"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+msgid "Comment preview"
+msgstr "Podgląd komentarza"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr "Komentarz"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
-#, fuzzy
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
-msgstr "zmiana"
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+msgstr "Anuluj"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr "Musisz być zalogowany żeby komentarz."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr "Zaloguj się teraz"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr "Ukryj"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
-#, fuzzy
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 msgid "Change status"
-msgstr "zmień status"
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr "Skomentuj i zamknij"
 
@@ -3731,42 +3901,38 @@
 msgid "Files affected"
 msgstr "pliki naruszone"
 
-#: rhodecode/templates/changeset/diff_block.html:22
-#, fuzzy
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
-msgstr "pokaż pełną edycja tego pliku"
-
-#: rhodecode/templates/changeset/diff_block.html:30
-#, fuzzy
+msgstr ""
+
+#: rhodecode/templates/changeset/diff_block.html:29
 msgid "Show inline comments"
-msgstr "pokaż online komentarz"
-
-#: rhodecode/templates/changeset/diff_block.html:55
+msgstr "Pokaż komentarze w liniach"
+
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
-msgstr ""
-
-#: rhodecode/templates/changeset/diff_block.html:56
+msgstr "Pokaż plik w najnowszej wersji, w tym repo"
+
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
-msgstr ""
+msgstr "Pokaż plik w pierwotnej wersji w repo"
 
 #: rhodecode/templates/compare/compare_cs.html:4
 msgid "No changesets"
 msgstr "Brak zestawienia zmian"
 
 #: rhodecode/templates/compare/compare_cs.html:32
-#, fuzzy
 msgid "Ancestor"
-msgstr "gałęzie"
+msgstr ""
 
 #: rhodecode/templates/compare/compare_diff.html:5
-#, fuzzy, python-format
+#, python-format
 msgid "%s Compare"
 msgstr "%s Porównaj"
 
 #: rhodecode/templates/compare/compare_diff.html:9
-#, fuzzy
 msgid "Compare revisions"
-msgstr "poprzednia wersja"
+msgstr ""
 
 #: rhodecode/templates/compare/compare_diff.html:33
 #: rhodecode/templates/pullrequests/pullrequest_show.html:106
@@ -3785,7 +3951,7 @@
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 msgid "confirm to show potentially huge diff"
-msgstr ""
+msgstr "potwierdź pokazanie pełnej edycji"
 
 #: rhodecode/templates/data_table/_dt_elements.html:54
 #: rhodecode/templates/summary/summary.html:69
@@ -3798,9 +3964,9 @@
 msgstr "Repozytorium git"
 
 #: rhodecode/templates/data_table/_dt_elements.html:74
-#, fuzzy, python-format
+#, python-format
 msgid "Fork of %s"
-msgstr "nazwa rozgałęzienia %s"
+msgstr ""
 
 #: rhodecode/templates/data_table/_dt_elements.html:88
 msgid "No changesets yet"
@@ -3823,36 +3989,32 @@
 msgid "Confirm to delete this repository: %s"
 msgstr "Potwierdź usunięcie repozytorium: %s"
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Potwierdź usunięcie tego użytkownika: %s"
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-msgid "New status"
-msgstr "Nowy status"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
-msgstr "Zobacz ten komentarz tutaj"
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+msgid "URL"
+msgstr "URL"
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, python-format
+msgid "%s commented on a %s changeset."
+msgstr ""
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-#, fuzzy
-msgid "Repo"
-msgstr "Moje repo"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
-msgstr ""
+msgid "The changeset status was changed to"
+msgstr "Status zmiany został zmieniony na"
 
 #: rhodecode/templates/email_templates/main.html:8
 msgid "This is a notification from RhodeCode."
 msgstr "To jest powiadomienie z strony"
 
 #: rhodecode/templates/email_templates/password_reset.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "Hello %s"
 msgstr "Witaj %s"
 
@@ -3864,51 +4026,37 @@
 msgid "You can generate it by clicking following URL"
 msgstr "Możesz wygenerować nowe hasło klikając w link URL poniżej:"
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-#, fuzzy
-msgid "If you did not request new password please ignore this email."
-msgstr "Jeśli nie chcesz wygenerować nowego hasła to zignoruj tą wiadomość."
-
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid ""
-"User %s opened pull request for repository %s and wants you to review "
-"changes."
-msgstr ""
-"Użytkownik %s zgłosił wniosek połączenia w repozytorium %s i chce żeby "
-"sprawdzić zmiany."
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-msgid "View this pull request here"
-msgstr "Wyświetl prośby pobrania tutaj"
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
+msgstr ""
 
 #: rhodecode/templates/email_templates/pull_request.html:6
-msgid "title"
-msgstr "tytuł"
-
-#: rhodecode/templates/email_templates/pull_request.html:7
-msgid "description"
-msgstr "opis"
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr "korekty dotyczące rewizji"
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
-#, fuzzy, python-format
-msgid "Pull request #%s for repository %s"
-msgstr "Połączenie gałęzi #%s dla repozytorium %s"
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-#, fuzzy
-msgid "Closing pull request with status"
+#, python-format
+msgid ""
+"%s opened a pull request for repository %s and wants you to review changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
+msgstr "Tytuł"
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
+#, python-format
+msgid "%s commented on pull request \"%s\""
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+msgid "Pull request was closed with status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+msgid "Pull request changed status"
 msgstr "Żądanie statusu połączenia gałęzi"
 
-#: rhodecode/templates/email_templates/registration.html:4
-msgid "A new user have registered in RhodeCode"
-msgstr "Nowy użytkownik został zarejestrowany na stronie"
-
-#: rhodecode/templates/email_templates/registration.html:9
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr "Zobacz tego użytkownika tutaj"
 
@@ -3918,7 +4066,7 @@
 msgstr "Zostaniesz przekierowany do %s za %s sekund"
 
 #: rhodecode/templates/files/file_diff.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "%s File Diff"
 msgstr "%s Pliki różnic"
 
@@ -3928,33 +4076,24 @@
 
 #: rhodecode/templates/files/files.html:4
 #: rhodecode/templates/files/files.html:76
-#, fuzzy, python-format
+#, python-format
 msgid "%s Files"
-msgstr "Pliki %s"
+msgstr "%s Plików"
 
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
-#, fuzzy
 msgid "Branch"
-msgstr "gałąź"
+msgstr "Gałąź"
 
 #: rhodecode/templates/files/files_add.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "%s Files Add"
-msgstr "Pliki %s"
+msgstr "%s Plików Dodano"
 
 #: rhodecode/templates/files/files_add.html:19
-#, fuzzy
 msgid "Add file"
-msgstr "dodaj plik"
-
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr "Dodaj nowy plik"
+msgstr "Dodaj plik"
 
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
@@ -3984,42 +4123,30 @@
 msgid "use / to separate directories"
 msgstr "Użyj / do oddzielenia katalogów"
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-#, fuzzy
-msgid "Commit message"
-msgstr "komentarz"
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
 msgstr "Zatwierdź zmiany"
 
 #: rhodecode/templates/files/files_browser.html:13
-#, fuzzy
 msgid "View"
-msgstr "widok"
+msgstr "Widok"
 
 #: rhodecode/templates/files/files_browser.html:14
-#, fuzzy
 msgid "Previous revision"
-msgstr "poprzednia wersja"
+msgstr "Poprzednia rewizja"
 
 #: rhodecode/templates/files/files_browser.html:16
-#, fuzzy
 msgid "Next revision"
-msgstr "następna wersja"
+msgstr "Następna rewizja"
 
 #: rhodecode/templates/files/files_browser.html:23
-#, fuzzy
 msgid "Follow current branch"
-msgstr "śledź mierzącą gałąź"
+msgstr ""
 
 #: rhodecode/templates/files/files_browser.html:27
-#, fuzzy
 msgid "Search file list"
-msgstr "lista szukanych plików"
+msgstr "Szukaj w liście plików"
 
 #: rhodecode/templates/files/files_browser.html:35
 msgid "Loading file list..."
@@ -4046,36 +4173,25 @@
 msgstr "Autor"
 
 #: rhodecode/templates/files/files_edit.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "%s Files Edit"
-msgstr "Pliki %s"
+msgstr ""
 
 #: rhodecode/templates/files/files_edit.html:19
-#, fuzzy
 msgid "Edit file"
-msgstr "edytuj plik"
+msgstr ""
 
 #: rhodecode/templates/files/files_edit.html:47
 #: rhodecode/templates/files/files_source.html:23
-#, fuzzy
 msgid "Show annotation"
-msgstr "pokaż adnotacje"
-
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-#, fuzzy
-msgid "Show as raw"
-msgstr "wyświetl jako raw"
+msgstr ""
 
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
-#, fuzzy
 msgid "Download as raw"
 msgstr "Pobierz jako raw"
 
 #: rhodecode/templates/files/files_edit.html:52
-#, fuzzy
 msgid "Source"
 msgstr "źródło"
 
@@ -4088,19 +4204,16 @@
 msgstr "Historia"
 
 #: rhodecode/templates/files/files_history_box.html:9
-#, fuzzy
 msgid "Diff to revision"
-msgstr "różnice do rewizji"
+msgstr "Różnice do rewizji"
 
 #: rhodecode/templates/files/files_history_box.html:10
-#, fuzzy
 msgid "Show at revision"
-msgstr "wskaż zmiany"
+msgstr "Wskaż zmiany w rewizji"
 
 #: rhodecode/templates/files/files_history_box.html:11
-#, fuzzy
 msgid "Show full history"
-msgstr "pokaż pełną historię"
+msgstr "Pokaż pełną historię"
 
 #: rhodecode/templates/files/files_history_box.html:16
 #, python-format
@@ -4115,23 +4228,21 @@
 msgstr "Załaduj historię pliku"
 
 #: rhodecode/templates/files/files_source.html:21
-#, fuzzy
 msgid "Show source"
-msgstr "pokaż źródło"
+msgstr "Pokaż źródło"
 
 #: rhodecode/templates/files/files_source.html:29
-#, fuzzy, python-format
+#, python-format
 msgid "Edit on branch:%s"
-msgstr "Usunięta gałąź: %s"
+msgstr "Edytuj w gałąźi: %s"
 
 #: rhodecode/templates/files/files_source.html:31
-#, fuzzy
 msgid "Edit on branch:?"
-msgstr "Usunięta gałąź: %s"
+msgstr ""
 
 #: rhodecode/templates/files/files_source.html:31
 msgid "Editing files allowed only when on branch head revision"
-msgstr ""
+msgstr "Edycja plików dozwolona tylko wtedy, gdy rewizja jest w trakcie rewizji głównej gałęzi"
 
 #: rhodecode/templates/files/files_source.html:46
 #, python-format
@@ -4199,9 +4310,8 @@
 msgstr "Sprawdź źródło po wykonaniu klonowania"
 
 #: rhodecode/templates/forks/fork.html:93
-#, fuzzy
 msgid "Fork this repository"
-msgstr "gałąź tego repozytorium"
+msgstr ""
 
 #: rhodecode/templates/forks/forks.html:5
 #, python-format
@@ -4215,9 +4325,8 @@
 msgstr "Gałęzie"
 
 #: rhodecode/templates/forks/forks_data.html:17
-#, fuzzy
 msgid "Forked"
-msgstr "rozgałęziony"
+msgstr ""
 
 #: rhodecode/templates/forks/forks_data.html:42
 msgid "There are no forks yet"
@@ -4266,42 +4375,53 @@
 msgid "New pull request"
 msgstr "Nowa prośba o połączenie gałęzi"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-msgid "Detailed compare view"
-msgstr "Szczegółowe porównanie widoku"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr "Stwórz nowe żądanie połączenia gałęzi"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+msgid "Write a short description on this pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+msgid "Changeset flow"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+msgid "Origin repository"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr "Wyślij prośbę o połączenie gałęzi"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr "Recenzje wniosków połączenia gałęzi"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 msgid "owner"
 msgstr "właściciel"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr "Pokarz wszystkie zmiany"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-msgid "Create new pull request"
-msgstr "Stwórz nowe żądanie połączenia gałęzi"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-msgid "Title"
-msgstr "Tytuł"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
-msgstr "Wyślij prośbę o połączenie gałęzi"
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr "Szczegółowe porównanie widoku"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+msgid "Destination repository"
+msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "%s Pull Request #%s"
-msgstr "%s Połączonych gałęzi #%s"
+msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:35
 msgid "Review status"
@@ -4324,14 +4444,8 @@
 msgstr[2] "%d recenzentów"
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:59
-#, fuzzy
 msgid "Pull request was reviewed by all reviewers"
-msgstr "połączenie gałęzi zostało zweryfikowane przez wszystkich recenzentów"
-
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-#, fuzzy
-msgid "Origin repository"
-msgstr "Repozytorium git"
+msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 msgid "Created on"
@@ -4346,24 +4460,21 @@
 msgstr "recenzent"
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:164
-#, fuzzy
 msgid "Add or remove reviewer to this pull request."
-msgstr "Pokarz wszystkie zmiany"
+msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:168
-#, fuzzy
 msgid "Save changes"
-msgstr "Bez zmian"
+msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "%s Pull Requests"
-msgstr "%s Moje prośby połączenia gałęzi"
+msgstr ""
 
 #: rhodecode/templates/search/search.html:6
-#, fuzzy
 msgid "Search repository"
-msgstr "Szukaj w repozytorium: %s"
+msgstr "Szukaj w repozytorium"
 
 #: rhodecode/templates/search/search.html:8
 #: rhodecode/templates/search/search.html:16
@@ -4396,52 +4507,20 @@
 msgid "Permission denied"
 msgstr "Brak uprawnień"
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, fuzzy, python-format
-msgid "%s Lightweight Changelog"
-msgstr "%s Prosta lista zmian"
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr "Użyj lekkiego pulpitu"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-#, fuzzy
-msgid "Age"
-msgstr "ostatnia zmiana"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, fuzzy, python-format
-msgid "Click to open associated pull request #%s"
-msgstr "Kliknij żeby otworzyć prośbę o połączenie gałęzi #%s"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr "Dodaj lub prześlij pliki bezpośrednio przez stronę"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr "Wyślij zmiany do nowego repo"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr "Istniejące repozytorium?"
-
 #: rhodecode/templates/summary/summary.html:4
 #, python-format
 msgid "%s Summary"
 msgstr "Podsumowanie %s"
 
 #: rhodecode/templates/summary/summary.html:16
-#, fuzzy, python-format
+#, python-format
 msgid "%s ATOM feed"
-msgstr "%s ATOM"
+msgstr ""
 
 #: rhodecode/templates/summary/summary.html:17
-#, fuzzy, python-format
+#, python-format
 msgid "%s RSS feed"
-msgstr "%s RSS"
+msgstr ""
 
 #: rhodecode/templates/summary/summary.html:62
 #, python-format
@@ -4458,19 +4537,17 @@
 msgstr "Brak ID pełnej zmiany %s"
 
 #: rhodecode/templates/summary/summary.html:88
-#, fuzzy
 msgid "Public"
-msgstr "publiczny"
+msgstr "Publiczny"
 
 #: rhodecode/templates/summary/summary.html:88
 #: rhodecode/templates/summary/summary.html:89
 msgid "Fork of"
 msgstr "Gałąź z"
 
-#: rhodecode/templates/summary/summary.html:96
-#, fuzzy
+#: rhodecode/templates/summary/summary.html:97
 msgid "Remote clone"
-msgstr "zdalne klonowanie"
+msgstr "Zdalne klonowanie"
 
 #: rhodecode/templates/summary/summary.html:117
 msgid "Contact"
@@ -4494,9 +4571,8 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
-msgstr "włącz"
+msgid "Enable"
+msgstr "Włącz"
 
 #: rhodecode/templates/summary/summary.html:159
 msgid "Download"
@@ -4510,7 +4586,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr "Pliki do pobrania są zostały wyłączone dla tego repozytorium"
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 msgid "Download as zip"
 msgstr "Pobierz jako zip"
 
@@ -4523,28 +4599,29 @@
 msgstr "z subrepozytorium"
 
 #: rhodecode/templates/summary/summary.html:197
-#, fuzzy
 msgid "Repository Size"
-msgstr "repozytoria"
+msgstr "Rozmiar repozytorium"
 
 #: rhodecode/templates/summary/summary.html:204
 #: rhodecode/templates/summary/summary.html:206
-#, fuzzy
 msgid "Feed"
-msgstr "Kanał RSS"
+msgstr ""
 
 #: rhodecode/templates/summary/summary.html:224
 msgid "Commit activity by day / author"
 msgstr "komunikaty aktywne w ciągu dnia / autor"
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr "włącz"
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr "Statystyki zebrane: "
 
 #: rhodecode/templates/summary/summary.html:256
-#, fuzzy
 msgid "Latest changes"
-msgstr "Ostatnia aktywność"
+msgstr "Ostatnie zmiany"
 
 #: rhodecode/templates/summary/summary.html:258
 msgid "Quick start"
@@ -4552,51 +4629,47 @@
 
 #: rhodecode/templates/summary/summary.html:272
 #, python-format
-msgid "Readme file at revision '%s'"
-msgstr "Plik readme w rewizji '%s'"
-
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr "Link do tego readme"
-
-#: rhodecode/templates/summary/summary.html:333
+msgid "Readme file from revision %s"
+msgstr "Plik readme z rewizji %s"
+
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr "Pobierz %s jak %s"
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr "pliki"
 
-#: rhodecode/templates/summary/summary.html:690
+#: rhodecode/templates/summary/summary.html:689
 msgid "commits"
 msgstr "komunikaty"
 
-#: rhodecode/templates/summary/summary.html:691
+#: rhodecode/templates/summary/summary.html:690
 msgid "files added"
 msgstr "pliki dodane"
 
-#: rhodecode/templates/summary/summary.html:692
+#: rhodecode/templates/summary/summary.html:691
 msgid "files changed"
 msgstr "pliki zmienione"
 
-#: rhodecode/templates/summary/summary.html:693
+#: rhodecode/templates/summary/summary.html:692
 msgid "files removed"
 msgstr "pliki usunięte"
 
-#: rhodecode/templates/summary/summary.html:695
+#: rhodecode/templates/summary/summary.html:694
 msgid "commit"
 msgstr "komunikaty"
 
+#: rhodecode/templates/summary/summary.html:695
+msgid "file added"
+msgstr "plik dodany"
+
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
-msgstr "plik dodany"
+msgid "file changed"
+msgstr "plik zmieniony"
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr "plik zmieniony"
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr "plik usunięty"
 
@@ -4608,4 +4681,3 @@
 #: rhodecode/templates/tags/tags.html:26
 msgid "Compare tags"
 msgstr "Porównaj tagi"
-
--- a/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: RhodeCode 1.2.0\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
 "PO-Revision-Date: 2012-05-22 16:47-0300\n"
 "Last-Translator: Augusto Herrmann <augusto.herrmann@gmail.com>\n"
 "Language-Team: pt_BR <LL@li.org>\n"
@@ -17,40 +17,39 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr "Todos os Ramos"
 
-#: rhodecode/controllers/changeset.py:83
+#: rhodecode/controllers/changeset.py:84
 #, fuzzy
 msgid "Show white space"
 msgstr "mostrar espaços em branco"
 
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 #, fuzzy
 msgid "Ignore white space"
 msgstr "ignorar espaços em branco"
 
-#: rhodecode/controllers/changeset.py:163
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr "contexto de %s linhas"
 
-#: rhodecode/controllers/changeset.py:329
-#: rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
 #, fuzzy, python-format
 msgid "Status change -> %s"
 msgstr "Última alteração"
 
-#: rhodecode/controllers/changeset.py:360
+#: rhodecode/controllers/changeset.py:376
 msgid ""
 "Changing status on a changeset associated with a closed pull request is "
 "not allowed"
 msgstr ""
 
 #: rhodecode/controllers/compare.py:74
-#: rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/pullrequests.py:259
 #, fuzzy
 msgid "There are no changesets yet"
 msgstr "Ainda não há alteações"
@@ -96,8 +95,8 @@
 msgstr "%s - feed %s"
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -105,119 +104,120 @@
 msgid "Changeset was too big and was cut off..."
 msgstr "Conjunto de mudanças era grande demais e foi cortado..."
 
-#: rhodecode/controllers/feed.py:91
+#: rhodecode/controllers/feed.py:90
 #, fuzzy, python-format
 msgid "%s committed on %s"
 msgstr "commit"
 
-#: rhodecode/controllers/files.py:88
+#: rhodecode/controllers/files.py:89
 #, fuzzy
 msgid "Click here to add new file"
 msgstr "adicionar novo arquivo"
 
-#: rhodecode/controllers/files.py:89
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr "Ainda não há arquivos %s"
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
 
-#: rhodecode/controllers/files.py:293
+#: rhodecode/controllers/files.py:297
 #, fuzzy, python-format
 msgid "Edited file %s via RhodeCode"
 msgstr "Editado %s via RhodeCode"
 
-#: rhodecode/controllers/files.py:309
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr "Sem alterações"
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr "Commit realizado com sucesso para %s"
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr "Ocorreu um erro ao realizar commit"
 
-#: rhodecode/controllers/files.py:347
+#: rhodecode/controllers/files.py:351
 #, fuzzy
 msgid "Added file via RhodeCode"
 msgstr "Adicionado %s via RhodeCode"
 
-#: rhodecode/controllers/files.py:364
+#: rhodecode/controllers/files.py:368
 msgid "No content"
 msgstr "Nenhum conteúdo"
 
-#: rhodecode/controllers/files.py:368
+#: rhodecode/controllers/files.py:372
 msgid "No filename"
 msgstr "Nenhum nomes de arquivo"
 
-#: rhodecode/controllers/files.py:372
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: rhodecode/controllers/files.py:420
+#: rhodecode/controllers/files.py:431
 #, fuzzy
 msgid "Downloads disabled"
 msgstr "downloads desabilitados"
 
-#: rhodecode/controllers/files.py:431
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr "Revisão desconhecida %s"
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr "Repositório vazio"
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr "Arquivo de tipo desconhecido"
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr "Conjuntos de mudanças"
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632 rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr "Ramos"
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633 rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: rhodecode/controllers/forks.py:175
+#: rhodecode/controllers/forks.py:176
 #, fuzzy, python-format
 msgid "Forked repository %s as %s"
 msgstr "bifurcado repositório %s como %s"
 
-#: rhodecode/controllers/forks.py:189
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr "Ocorreu um erro ao bifurcar o repositório %s"
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 #, fuzzy
 msgid "public journal"
 msgstr "Diário público"
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr "diário"
@@ -239,76 +239,76 @@
 "Sua reinicialização de senha foi bem sucedida, sua senha foi enviada ao "
 "seu e-mail"
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:139
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr "Conjunto de Mudanças"
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:149
 msgid "Special"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:129
+#: rhodecode/controllers/pullrequests.py:150
 #, fuzzy
 msgid "Peer branches"
 msgstr "ramos"
 
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr "Marcadores"
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:324
 msgid "Pull request requires a title with min. 3 chars"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:230
+#: rhodecode/controllers/pullrequests.py:326
 #, fuzzy
 msgid "Error creating pull request"
 msgstr "ocorreu um erro ao criar o usuário %s"
 
-#: rhodecode/controllers/pullrequests.py:251
+#: rhodecode/controllers/pullrequests.py:346
 #, fuzzy
 msgid "Successfully opened new pull request"
 msgstr "usuário excluído com sucesso"
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:349
 #, fuzzy
 msgid "Error occurred during sending pull request"
 msgstr "ocorreu um erro ao criar o repositório %s"
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:388
 #, fuzzy
 msgid "Successfully deleted pull request"
 msgstr "usuário excluído com sucesso"
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:484
 msgid "Closing with"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:478
+#: rhodecode/controllers/pullrequests.py:521
 msgid "Closing pull request on other statuses than rejected or approved forbidden"
 msgstr ""
 
-#: rhodecode/controllers/search.py:134
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr "Consulta de busca inválida. Tente usar aspas."
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr "Não há índice onde pesquisa. Por favor execute o indexador whoosh"
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr "Ocorreu um erro durante essa operação de busca"
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr "Ainda não há dados carregados"
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr "As estatísticas estão desabillitadas para este repositório"
@@ -323,6 +323,45 @@
 msgid "Error occurred during update of defaults"
 msgstr "ocorreu um erro ao atualizar o usuário %s"
 
+#: rhodecode/controllers/admin/gists.py:56
+#, fuzzy
+msgid "forever"
+msgstr "revogar"
+
+#: rhodecode/controllers/admin/gists.py:57
+#, fuzzy
+msgid "5 minutes"
+msgstr "%d minuto"
+
+#: rhodecode/controllers/admin/gists.py:58
+#, fuzzy
+msgid "1 hour"
+msgstr "%d hora"
+
+#: rhodecode/controllers/admin/gists.py:59
+#, fuzzy
+msgid "1 day"
+msgstr "%d dia"
+
+#: rhodecode/controllers/admin/gists.py:60
+#, fuzzy
+msgid "1 month"
+msgstr "%d mês"
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+#, fuzzy
+msgid "Error occurred during gist creation"
+msgstr "ocorreu um erro ao criar gancho"
+
+#: rhodecode/controllers/admin/gists.py:165
+#, fuzzy, python-format
+msgid "Deleted gist %s"
+msgstr "excluído o repositório %s"
+
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
 msgstr "BASE"
@@ -367,36 +406,40 @@
 msgid "START_TLS on LDAP connection"
 msgstr "START_TLS na conexão LDAP"
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr "Configurações de LDAP atualizadas com sucesso"
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr "Não foi possível ativar LDAP. A biblioteca \"python-ldap\" está faltando."
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
+#: rhodecode/controllers/admin/ldap_settings.py:145
 #, fuzzy
 msgid "Error occurred during update of ldap settings"
 msgstr "ocorreu um erro ao atualizar as configurações de LDAP"
 
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr "Nenhum"
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr "Ler"
+
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
-msgstr "Nenhum"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
+msgstr "Gravar"
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr "Ler"
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr "Gravar"
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -417,44 +460,58 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292
-#: rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299
-#: rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr "Administrador"
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
 msgid "Disabled"
 msgstr "Desabilitado"
 
-#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:74
 #, fuzzy
 msgid "Allowed with manual account activation"
 msgstr "permitido com ativação manual de conta"
 
-#: rhodecode/controllers/admin/permissions.py:74
+#: rhodecode/controllers/admin/permissions.py:76
 #, fuzzy
 msgid "Allowed with automatic account activation"
 msgstr "permitido com ativação automática de conta"
 
-#: rhodecode/controllers/admin/permissions.py:77
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr "Permissões padrões atualizadas com sucesso"
 
-#: rhodecode/controllers/admin/permissions.py:142
+#: rhodecode/controllers/admin/permissions.py:152
 #, fuzzy
 msgid "Error occurred during update of permissions"
 msgstr "ocorreu um erro ao atualizar as permissões"
 
-#: rhodecode/controllers/admin/repos.py:127
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr "--REMOVER BIFURCAÇÂO--"
 
@@ -473,243 +530,236 @@
 msgid "Error creating repository %s"
 msgstr "repositório %s criado"
 
-#: rhodecode/controllers/admin/repos.py:266
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr "Repositório %s atualizado com sucesso"
 
-#: rhodecode/controllers/admin/repos.py:284
+#: rhodecode/controllers/admin/repos.py:288
 #, fuzzy, python-format
 msgid "Error occurred during update of repository %s"
 msgstr "ocorreu um erro ao atualizar o repositório %s"
 
-#: rhodecode/controllers/admin/repos.py:311
-#: rhodecode/controllers/api/api.py:877
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:314
-#: rhodecode/controllers/api/api.py:879
+#: rhodecode/controllers/admin/repos.py:318
 #, fuzzy, python-format
 msgid "Deleted %s forks"
 msgstr "excluído o repositório %s"
 
-#: rhodecode/controllers/admin/repos.py:319
+#: rhodecode/controllers/admin/repos.py:323
 #, fuzzy, python-format
 msgid "Deleted repository %s"
 msgstr "excluído o repositório %s"
 
-#: rhodecode/controllers/admin/repos.py:322
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr "Nao é possível excluir %s pois ele ainda contém bifurcações vinculadas"
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr "Ocorreu um erro durante a exclusão de %s"
 
-#: rhodecode/controllers/admin/repos.py:365
+#: rhodecode/controllers/admin/repos.py:345
 #, fuzzy
 msgid "Repository permissions updated"
 msgstr "Criação de repositório"
 
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr "Ocorreu um erro ao excluir usuário de repositório"
-
-#: rhodecode/controllers/admin/repos.py:403
-#, fuzzy
-msgid "An error occurred during deletion of repository user groups"
-msgstr "Ocorreu um erro ao excluir grupo de usuário de repositório"
-
-#: rhodecode/controllers/admin/repos.py:421
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+#, fuzzy
+msgid "An error occurred during revoking of permission"
+msgstr "ocorreu um erro ao atualizar as permissões"
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr "Ocorreu um erro ao excluir estatísticas de repositório"
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr "Ocorreu um erro ao invalidar o cache"
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 #, fuzzy
 msgid "An error occurred during unlocking"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/repos.py:476
+#: rhodecode/controllers/admin/repos.py:447
 #, fuzzy
 msgid "Unlocked"
 msgstr "destravar"
 
-#: rhodecode/controllers/admin/repos.py:479
+#: rhodecode/controllers/admin/repos.py:450
 #, fuzzy
 msgid "Locked"
 msgstr "destravar"
 
-#: rhodecode/controllers/admin/repos.py:481
+#: rhodecode/controllers/admin/repos.py:452
 #, fuzzy, python-format
 msgid "Repository has been %s"
 msgstr "bifurcado repositório %s como %s"
 
-#: rhodecode/controllers/admin/repos.py:505
+#: rhodecode/controllers/admin/repos.py:476
 msgid "Updated repository visibility in public journal"
 msgstr "Atualizada a visibilidade do repositório no diário público"
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr "Descompasso de Token"
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr "Realizado pull de localização remota"
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr "Ocorreu um erro ao realizar pull de localização remota"
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr "Nada"
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr "Marcado repositório %s como bifurcação de %s"
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/repos.py:590
+#: rhodecode/controllers/admin/repos.py:562
 #, fuzzy
 msgid "An error occurred during creation of field"
 msgstr "ocorreu um erro ao criar o usuário %s"
 
-#: rhodecode/controllers/admin/repos.py:604
+#: rhodecode/controllers/admin/repos.py:576
 #, fuzzy
 msgid "An error occurred during removal of field"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/repos_groups.py:145
+#: rhodecode/controllers/admin/repos_groups.py:147
 #, fuzzy, python-format
 msgid "Created repository group %s"
 msgstr "criado grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:157
+#: rhodecode/controllers/admin/repos_groups.py:159
 #, fuzzy, python-format
 msgid "Error occurred during creation of repository group %s"
 msgstr "ccorreu um erro ao criar grupo de repositório %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
+#: rhodecode/controllers/admin/repos_groups.py:217
 #, fuzzy, python-format
 msgid "Updated repository group %s"
 msgstr "atualizado grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:235
+#: rhodecode/controllers/admin/repos_groups.py:232
 #, fuzzy, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr "ocorreu um erro ao atualizar grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:253
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr "Esse grupo contém %s repositórios e não pode ser excluído"
 
-#: rhodecode/controllers/admin/repos_groups.py:260
+#: rhodecode/controllers/admin/repos_groups.py:257
 #, fuzzy, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr "Esse grupo contém %s repositórios e não pode ser excluído"
 
-#: rhodecode/controllers/admin/repos_groups.py:266
+#: rhodecode/controllers/admin/repos_groups.py:263
 #, fuzzy, python-format
 msgid "Removed repository group %s"
 msgstr "removido grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:271
+#: rhodecode/controllers/admin/repos_groups.py:268
 #, fuzzy, python-format
 msgid "Error occurred during deletion of repos group %s"
 msgstr "ccorreu um erro ao excluir grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
-msgstr "Ocorreu um erro ao excluir o usuário de grupo"
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-#, fuzzy
-msgid "An error occurred during deletion of group user groups"
-msgstr "Ocorreu um erro ao excluir o grupo do grupo de usuários"
-
-#: rhodecode/controllers/admin/settings.py:126
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+#, fuzzy
+msgid "Repository Group permissions updated"
+msgstr "Criação de repositório"
+
+#: rhodecode/controllers/admin/settings.py:123
 #, fuzzy, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr "Repositórios varridos com sucesso adicionados: %s, removidos: %s"
 
-#: rhodecode/controllers/admin/settings.py:135
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr "Tarefa de reindexação do whoosh agendada"
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr "Configurações da aplicação atualizadas"
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 #, fuzzy
 msgid "Error occurred during updating application settings"
 msgstr "ocorreu um erro ao atualizar as configurações da aplicação"
 
-#: rhodecode/controllers/admin/settings.py:216
+#: rhodecode/controllers/admin/settings.py:219
 #, fuzzy
 msgid "Updated visualisation settings"
 msgstr "Configurações da aplicação atualizadas"
 
-#: rhodecode/controllers/admin/settings.py:221
+#: rhodecode/controllers/admin/settings.py:224
 #, fuzzy
 msgid "Error occurred during updating visualisation settings"
 msgstr "ocorreu um erro ao atualizar as configurações da aplicação"
 
-#: rhodecode/controllers/admin/settings.py:297
+#: rhodecode/controllers/admin/settings.py:300
 #, fuzzy
 msgid "Updated VCS settings"
 msgstr "Atualizadas as configurações do mercurial"
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr "Adicionado novo gancho"
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr "Atualizados os ganchos"
 
-#: rhodecode/controllers/admin/settings.py:327
+#: rhodecode/controllers/admin/settings.py:330
 #, fuzzy
 msgid "Error occurred during hook creation"
 msgstr "ocorreu um erro ao criar gancho"
 
-#: rhodecode/controllers/admin/settings.py:346
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr "Tarefa de e-mail criada"
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr "Você não pode editar esse usuário pois ele é crucial para toda a aplicação"
 
-#: rhodecode/controllers/admin/settings.py:452
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr "Sua conta foi atualizada com sucesso"
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
 #, fuzzy, python-format
 msgid "Error occurred during update of user %s"
@@ -738,124 +788,101 @@
 msgid "An error occurred during deletion of user"
 msgstr "Ocorreu um erro ao excluir o usuário"
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr "Você não pode editar esse usuário"
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr "Concedida permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr "Revogada permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users.py:287
-#, fuzzy
-msgid "Granted 'repository fork' permission to user"
-msgstr "Concedida permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users.py:292
-#, fuzzy
-msgid "Revoked 'repository fork' permission to user"
-msgstr "Revogada permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+#, fuzzy
+msgid "Updated permissions"
+msgstr "Copiar permissões"
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 #, fuzzy
 msgid "An error occurred during permissions saving"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 #, fuzzy
 msgid "An error occurred during email saving"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 #, fuzzy
 msgid "Removed email from user"
 msgstr "removido grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/users.py:341
+#: rhodecode/controllers/admin/users.py:340
 #, python-format
 msgid "Added ip %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:347
+#: rhodecode/controllers/admin/users.py:346
 #, fuzzy
 msgid "An error occurred during ip saving"
 msgstr "Ocorreu um erro durante essa operação"
 
-#: rhodecode/controllers/admin/users.py:359
+#: rhodecode/controllers/admin/users.py:358
 #, fuzzy
 msgid "Removed ip from user"
 msgstr "removido grupo de repositórios %s"
 
-#: rhodecode/controllers/admin/users_groups.py:86
+#: rhodecode/controllers/admin/users_groups.py:162
 #, fuzzy, python-format
 msgid "Created user group %s"
 msgstr "criado grupo de usuários %s"
 
-#: rhodecode/controllers/admin/users_groups.py:97
+#: rhodecode/controllers/admin/users_groups.py:173
 #, fuzzy, python-format
 msgid "Error occurred during creation of user group %s"
 msgstr "ocorreu um erro ao criar o grupo de usuários %s"
 
-#: rhodecode/controllers/admin/users_groups.py:166
+#: rhodecode/controllers/admin/users_groups.py:210
 #, fuzzy, python-format
 msgid "Updated user group %s"
 msgstr "grupo de usuários %s atualizado"
 
-#: rhodecode/controllers/admin/users_groups.py:188
+#: rhodecode/controllers/admin/users_groups.py:232
 #, fuzzy, python-format
 msgid "Error occurred during update of user group %s"
 msgstr "ocorreu um erro ao atualizar o grupo de usuários %s"
 
-#: rhodecode/controllers/admin/users_groups.py:205
+#: rhodecode/controllers/admin/users_groups.py:250
 #, fuzzy
 msgid "Successfully deleted user group"
 msgstr "grupo de usuários excluído com sucesso"
 
-#: rhodecode/controllers/admin/users_groups.py:210
+#: rhodecode/controllers/admin/users_groups.py:255
 #, fuzzy
 msgid "An error occurred during deletion of user group"
 msgstr "Ocorreu um erro ao excluir o grupo de usuários"
 
-#: rhodecode/controllers/admin/users_groups.py:259
-#, fuzzy
-msgid "Granted 'repository create' permission to user group"
-msgstr "Concedida permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users_groups.py:264
-#, fuzzy
-msgid "Revoked 'repository create' permission to user group"
-msgstr "Revogada permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users_groups.py:270
-#, fuzzy
-msgid "Granted 'repository fork' permission to user group"
-msgstr "Concedida permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/controllers/admin/users_groups.py:275
-#, fuzzy
-msgid "Revoked 'repository fork' permission to user group"
-msgstr "Revogada permissão de 'criar repositório' ao usuário"
-
-#: rhodecode/lib/auth.py:530
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+#, fuzzy
+msgid "User Group permissions updated"
+msgstr "Criação de repositório"
+
+#: rhodecode/lib/auth.py:544
 #, fuzzy, python-format
 msgid "IP %s not allowed"
 msgstr "seguidores"
 
-#: rhodecode/lib/auth.py:579
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr "Você precisa ser um usuário registrado para realizar essa ação"
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr "Você precisa estar logado para ver essa página"
 
@@ -874,161 +901,190 @@
 msgid "No changes detected"
 msgstr "Nenhuma alteração detectada"
 
-#: rhodecode/lib/helpers.py:394
+#: rhodecode/lib/helpers.py:428
 #, python-format
 msgid "%a, %d %b %Y %H:%M:%S"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr "Verdadeiro"
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr "Falso"
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, fuzzy, python-format
 msgid "Deleted branch: %s"
 msgstr "excluído o repositório %s"
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, fuzzy, python-format
 msgid "Created tag: %s"
 msgstr "usuário %s criado"
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr "Conjunto de alterações não encontrado"
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Ver todos os conjuntos de mudanças combinados %s->%s"
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr "comparar exibir"
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr "e"
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr "%s mais"
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674 rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr "revisões"
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, fuzzy, python-format
 msgid "fork name %s"
 msgstr "nome da bifurcação"
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr "repositório [excluído]"
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr "repositório [criado]"
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr "repositório [criado] como uma bifurcação"
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr "repositório [bifurcado]"
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr "repositório [atualizado]"
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+#, fuzzy
+msgid "[downloaded] archive from repository"
+msgstr "Downloads estão desabilitados para este repositório"
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr "[excluir] repositório"
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 #, fuzzy
 msgid "[created] user"
 msgstr "usuário %s criado"
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 #, fuzzy
 msgid "[updated] user"
 msgstr "grupo de usuários %s atualizado"
 
-#: rhodecode/lib/helpers.py:712
+#: rhodecode/lib/helpers.py:749
 #, fuzzy
 msgid "[created] user group"
 msgstr "criado grupo de usuários %s"
 
-#: rhodecode/lib/helpers.py:714
+#: rhodecode/lib/helpers.py:751
 #, fuzzy
 msgid "[updated] user group"
 msgstr "grupo de usuários %s atualizado"
 
-#: rhodecode/lib/helpers.py:716
+#: rhodecode/lib/helpers.py:753
 #, fuzzy
 msgid "[commented] on revision in repository"
 msgstr "repositório [criado]"
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 #, fuzzy
 msgid "[commented] on pull request for"
 msgstr "repositório [criado]"
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 #, fuzzy
 msgid "[closed] pull request for"
 msgstr "repositório [criado]"
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr "[realizado push] para"
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 #, fuzzy
 msgid "[committed via RhodeCode] into repository"
 msgstr "[realizado commit via RhodeCode] para"
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 #, fuzzy
 msgid "[pulled from remote] into repository"
 msgstr "[realizado pull remoto] para"
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr "[realizado pull] a partir de"
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr "[passou a seguir] o repositório"
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr "[parou de seguir] o repositório"
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr " e mais %s"
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr "Nenhum Arquivo"
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+#, fuzzy
+msgid "new file"
+msgstr "Adicionar novo arquivo"
+
+#: rhodecode/lib/helpers.py:1161
+#, fuzzy
+msgid "mod"
+msgstr "removidos"
+
+#: rhodecode/lib/helpers.py:1164
+#, fuzzy
+msgid "del"
+msgstr "excluir"
+
+#: rhodecode/lib/helpers.py:1167
+#, fuzzy
+msgid "rename"
+msgstr "Nome de usuário"
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
 msgid ""
 "%s repository is not mapped to db perhaps it was created or renamed from "
@@ -1044,240 +1100,329 @@
 msgid "cannot create new union repository"
 msgstr "repositório [criado]"
 
-#: rhodecode/lib/utils2.py:411
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] "%d ano"
 msgstr[1] "%d anos"
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] "%d mês"
 msgstr[1] "%d meses"
 
-#: rhodecode/lib/utils2.py:413
+#: rhodecode/lib/utils2.py:412
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d dia"
 msgstr[1] "%d dias"
 
-#: rhodecode/lib/utils2.py:414
+#: rhodecode/lib/utils2.py:413
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d hora"
 msgstr[1] "%d horas"
 
-#: rhodecode/lib/utils2.py:415
+#: rhodecode/lib/utils2.py:414
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minuto"
 msgstr[1] "%d minutos"
 
-#: rhodecode/lib/utils2.py:416
+#: rhodecode/lib/utils2.py:415
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d segundo"
 msgstr[1] "%d segundos"
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, fuzzy, python-format
 msgid "in %s"
 msgstr "na linha %s"
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr "%s atrás"
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, fuzzy, python-format
 msgid "in %s and %s"
 msgstr "%s e %s atrás"
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr "%s e %s atrás"
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr "agora há pouco"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 #, fuzzy
 msgid "Repository no access"
 msgstr "repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 #, fuzzy
 msgid "Repository read access"
 msgstr "Esse repositório já existe"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 #, fuzzy
 msgid "Repository write access"
 msgstr "repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 #, fuzzy
 msgid "Repository admin access"
 msgstr "repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 #, fuzzy
 msgid "Repositories Group no access"
 msgstr "grupos de repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 #, fuzzy
 msgid "Repositories Group read access"
 msgstr "grupos de repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 #, fuzzy
 msgid "Repositories Group write access"
 msgstr "grupos de repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 #, fuzzy
 msgid "Repositories Group admin access"
 msgstr "grupos de repositórios"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 #, fuzzy
 msgid "RhodeCode Administrator"
 msgstr "Administração de usuários"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 #, fuzzy
 msgid "Repository creation disabled"
 msgstr "Criação de repositório"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 #, fuzzy
 msgid "Repository creation enabled"
 msgstr "Criação de repositório"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 #, fuzzy
 msgid "Repository forking disabled"
 msgstr "Criação de repositório"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 #, fuzzy
 msgid "Repository forking enabled"
 msgstr "Criação de repositório"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 #, fuzzy
 msgid "Register disabled"
 msgstr "desabilitado"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 #, fuzzy
 msgid "Approved"
 msgstr "removidos"
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr ""
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+#, fuzzy
+msgid "Repository group no access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+#, fuzzy
+msgid "Repository group read access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+#, fuzzy
+msgid "Repository group write access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+#, fuzzy
+msgid "Repository group admin access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+#, fuzzy
+msgid "User group no access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+#, fuzzy
+msgid "User group read access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+#, fuzzy
+msgid "User group write access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+#, fuzzy
+msgid "User group admin access"
+msgstr "grupos de repositórios"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+#, fuzzy
+msgid "Repository Group creation disabled"
+msgstr "Criação de repositório"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+#, fuzzy
+msgid "Repository Group creation enabled"
+msgstr "Criação de repositório"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+#, fuzzy
+msgid "User Group creation disabled"
+msgstr "Criação de repositório"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+#, fuzzy
+msgid "User Group creation enabled"
+msgstr "Criação de repositório"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+#, fuzzy
+msgid "Registration disabled"
+msgstr "desabilitado"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+#, fuzzy
+msgid "User Registration with manual account activation"
+msgstr "permitido com ativação manual de conta"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+#, fuzzy
+msgid "User Registration with automatic account activation"
+msgstr "permitido com ativação automática de conta"
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr "na linha %s"
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr "[Menção]"
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-#, fuzzy
-msgid "Repository group no access"
-msgstr "grupos de repositórios"
-
-#: rhodecode/model/db.py:1394
-#, fuzzy
-msgid "Repository group read access"
-msgstr "grupos de repositórios"
-
-#: rhodecode/model/db.py:1395
-#, fuzzy
-msgid "Repository group write access"
-msgstr "grupos de repositórios"
-
-#: rhodecode/model/db.py:1396
-#, fuzzy
-msgid "Repository group admin access"
-msgstr "grupos de repositórios"
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr "Por favor entre um login"
@@ -1296,42 +1441,42 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Entre com %(min)i caracteres ou mais"
 
-#: rhodecode/model/notification.py:224
+#: rhodecode/model/notification.py:228
 #, fuzzy, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr "comentado no commit"
 
-#: rhodecode/model/notification.py:225
-#, fuzzy, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr "mensagem enviada"
-
-#: rhodecode/model/notification.py:226
-#, fuzzy, python-format
-msgid "%(user)s mentioned you at %(when)s"
-msgstr "mencionou você"
-
-#: rhodecode/model/notification.py:227
-#, fuzzy, python-format
-msgid "%(user)s registered in RhodeCode at %(when)s"
-msgstr "registrado no RhodeCode"
-
-#: rhodecode/model/notification.py:228
-#, fuzzy, python-format
-msgid "%(user)s opened new pull request at %(when)s"
-msgstr "comentado no commit"
-
 #: rhodecode/model/notification.py:229
 #, fuzzy, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr "mensagem enviada"
+
+#: rhodecode/model/notification.py:230
+#, fuzzy, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr "mencionou você"
+
+#: rhodecode/model/notification.py:231
+#, fuzzy, python-format
+msgid "%(user)s registered in RhodeCode at %(when)s"
+msgstr "registrado no RhodeCode"
+
+#: rhodecode/model/notification.py:232
+#, fuzzy, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr "comentado no commit"
+
+#: rhodecode/model/notification.py:233
+#, fuzzy, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr "comentado no commit"
 
-#: rhodecode/model/pull_request.py:104
+#: rhodecode/model/pull_request.py:98
 #, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
 msgstr ""
 
-#: rhodecode/model/scm.py:598
+#: rhodecode/model/scm.py:674
 #, fuzzy
 msgid "latest tip"
 msgstr "último login"
@@ -1394,7 +1539,7 @@
 #: rhodecode/model/validators.py:89
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
-" dashes and must begin with alphanumeric character"
+" dashes and must begin with alphanumeric character or underscore"
 msgstr ""
 "Nome de usuário pode conter somente caracteres alfanuméricos, sublinha, "
 "pontos e hífens e deve iniciar com caractere alfanumérico"
@@ -1508,25 +1653,25 @@
 msgid "You don't have permissions to create a group in this location"
 msgstr "Você não tem permissão para ver esta página"
 
-#: rhodecode/model/validators.py:557
+#: rhodecode/model/validators.py:559
 #, fuzzy
 msgid "This username or user group name is not valid"
 msgstr "Esse nome de usuário ou nome de grupo de usuários não é válido"
 
-#: rhodecode/model/validators.py:650
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr "Esse não é um caminho válido"
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr "Esse endereço de e-mail já está tomado"
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, fuzzy, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr "Esse endereço de e-mail não existe."
 
-#: rhodecode/model/validators.py:722
+#: rhodecode/model/validators.py:724
 msgid ""
 "The LDAP Login attribute of the CN must be specified - this is the name "
 "of the attribute that is equivalent to \"username\""
@@ -1534,24 +1679,28 @@
 "O atributo de login LDAP do CN deve ser especificado - isto é o nome do "
 "atributo que é equivalente ao 'nome de usuário'"
 
-#: rhodecode/model/validators.py:735
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
 msgstr ""
 
-#: rhodecode/model/validators.py:767
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
 msgstr ""
 
-#: rhodecode/model/validators.py:768
+#: rhodecode/model/validators.py:770
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: rhodecode/model/validators.py:800
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
 #: rhodecode/templates/index.html:5
 msgid "Dashboard"
 msgstr "Painel de Controle"
@@ -1599,29 +1748,28 @@
 msgstr ""
 
 #: rhodecode/templates/index_base.html:40
-#: rhodecode/templates/index_base.html:140
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr "Nome do grupo"
 
 #: rhodecode/templates/index_base.html:41
-#: rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142
-#: rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:68
 #: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr "Descrição"
@@ -1629,27 +1777,25 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr "Grupo de repositórios"
 
-#: rhodecode/templates/index_base.html:82
-#: rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
 #: rhodecode/templates/admin/repos/repos.html:71
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
 #: rhodecode/templates/tags/tags.html:48
@@ -1657,110 +1803,79 @@
 msgid "Name"
 msgstr "Nome"
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
-msgstr "Última alteração"
-
-#: rhodecode/templates/index_base.html:85
-#: rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr "Última Alteração"
+
+#: rhodecode/templates/index_base.html:126
 #: rhodecode/templates/admin/repos/repos.html:74
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr "Ponta"
 
-#: rhodecode/templates/index_base.html:86
-#: rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
 #: rhodecode/templates/admin/repos/repos.html:76
 msgid "Owner"
 msgstr "Dono"
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr "Atom"
-
-#: rhodecode/templates/index_base.html:171
-#: rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr "Clique para ordenar em ordem crescente"
 
-#: rhodecode/templates/index_base.html:172
-#: rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr "Clique para ordenar em ordem descrescente"
 
-#: rhodecode/templates/index_base.html:181
-#: rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr "Última Alteração"
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr "Nenhum registro encontrado."
-
-#: rhodecode/templates/index_base.html:212
-#: rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+#, fuzzy
+msgid "No repositories found."
+msgstr "grupos de repositórios"
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr "Erro de dados."
 
-#: rhodecode/templates/index_base.html:213
-#: rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr "Carregando..."
 
-#: rhodecode/templates/index_base.html:298
-#, fuzzy
-msgid "No repositories found."
-msgstr "grupos de repositórios"
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr "Entrar"
 
@@ -1775,7 +1890,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr "Nome de usuário"
@@ -1783,7 +1898,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr "Senha"
 
@@ -1799,7 +1914,7 @@
 msgid "Forgot your password ?"
 msgstr "Esqueceu sua senha ?"
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr "Não possui uma conta ?"
 
@@ -1871,7 +1986,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1894,13 +2009,13 @@
 msgstr "Ainda não há etiquetas"
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr "Ainda não há marcadores"
 
 #: rhodecode/templates/admin/admin.html:5
 #: rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr "Diário do administrador"
 
@@ -1928,9 +2043,9 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr "Ação"
 
@@ -1940,7 +2055,7 @@
 msgstr "Repositório"
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
@@ -1964,20 +2079,19 @@
 msgstr "grupos de repositórios"
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 #, fuzzy
 msgid "Defaults"
 msgstr "excluir"
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr "Tipo"
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
 msgid ""
 "Private repositories are only visible to people explicitly added as "
@@ -1987,61 +2101,195 @@
 "adicionadas como colaboradores."
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr "Habilitar estatísticas"
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr "Habilitar janela de estatísticas na página de sumário."
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr "Habilitar downloads"
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr "Habilitar menu de descarregar na página de sumário."
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 #, fuzzy
 msgid "Enable locking"
 msgstr "habilitar"
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr "Salvar"
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, fuzzy, python-format
+msgid "Private Gists for user %s"
+msgstr "usuário %s criado"
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+#, fuzzy
+msgid "Create new gist"
+msgstr "Criar novo arquivo"
+
+#: rhodecode/templates/admin/gists/index.html:48
+#, fuzzy
+msgid "Created"
+msgstr "ler"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+#, fuzzy
+msgid "Expires"
+msgstr "Repositórios"
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+#, fuzzy
+msgid "never"
+msgstr "Dono"
+
+#: rhodecode/templates/admin/gists/index.html:68
+#, fuzzy
+msgid "There are no gists yet"
+msgstr "Ainda não há etiquetas"
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+#, fuzzy
+msgid "Gist description ..."
+msgstr "Descrição"
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr "Limpar"
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+#, fuzzy
+msgid "Private gist"
+msgstr "repositório privado"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr "Excluir"
+
+#: rhodecode/templates/admin/gists/show.html:54
+#, fuzzy
+msgid "Confirm to delete this gist"
+msgstr "Confirma excluir este usuário: %s"
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+#, fuzzy
+msgid "Show as raw"
+msgstr "mostrar como bruto"
+
+#: rhodecode/templates/admin/gists/show.html:71
+#, fuzzy
+msgid "created"
+msgstr "ler"
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr "Administração de LDAP"
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
+#: rhodecode/templates/base/base.html:79
 #, fuzzy
 msgid "LDAP"
 msgstr "ldap"
@@ -2143,7 +2391,7 @@
 msgstr "Mostrar notificação"
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr "Notificações"
 
@@ -2152,12 +2400,14 @@
 msgstr "Administração de permissões"
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr "Permissões"
 
@@ -2182,6 +2432,7 @@
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
 #, fuzzy
 msgid "Overwrite existing settings"
 msgstr "sobrescrever configurações existentes"
@@ -2198,91 +2449,96 @@
 "customizadas nos repositórios serão perdidas"
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr "Registro"
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+#, fuzzy
+msgid "User group"
+msgstr "grupos de usuários"
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+"Todas as permissões padrão em cada repositório serão reinicializadas para"
+" as permissões escolhidas. Note que todas as permissões padrão "
+"customizadas nos repositórios serão perdidas"
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr "Criação de repositório"
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+#, fuzzy
+msgid "User group creation"
+msgstr "Administração de grupos de usuários"
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 #, fuzzy
 msgid "Repository forking"
 msgstr "Criação de repositório"
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr "Limpar"
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr "Registro"
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+#, fuzzy
+msgid "External auth account activation"
+msgstr "permitido com ativação automática de conta"
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 #, fuzzy
 msgid "Default User Permissions"
 msgstr "Permissões padrão"
 
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 #, fuzzy
 msgid "Allowed IP addresses"
 msgstr "Endereço de e-mail"
 
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr "excluir"
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
 #, fuzzy, python-format
 msgid "Confirm to delete this ip: %s"
 msgstr "Confirma excluir este usuário: %s"
 
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 #, fuzzy
 msgid "New ip address"
 msgstr "Endereço de e-mail"
 
-#: rhodecode/templates/admin/permissions/permissions.html:153
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 #, fuzzy
 msgid "Add"
 msgstr "adicionar"
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr "Repositórios"
 
@@ -2298,7 +2554,7 @@
 msgstr "Clonar de"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr "URL opcional http[s] da qual o repositório deve ser clonado."
 
@@ -2313,20 +2569,20 @@
 msgstr "Tipo de repositório a criar."
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 #, fuzzy
 msgid "Landing revision"
 msgstr "próxima revisão"
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
@@ -2340,116 +2596,121 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr "Configurações"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+#, fuzzy
+msgid "Non-changeable id"
+msgstr "ID não alterável %s"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr "URI de clonagem"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr "Opcionalmente selecione um grupo no qual colocar esse repositório."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr "Mudar o dono desse repositório."
 
-#: rhodecode/templates/admin/repos/repo_edit.html:184
+#: rhodecode/templates/admin/repos/repo_edit.html:177
 #, fuzzy
 msgid "Advanced settings"
 msgstr "Salvar configurações"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:187
+#: rhodecode/templates/admin/repos/repo_edit.html:180
 msgid "Statistics"
 msgstr "Estatísticas"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Reset current statistics"
 msgstr "Reinicializar estatísticas atuais"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:191
+#: rhodecode/templates/admin/repos/repo_edit.html:184
 msgid "Confirm to remove current statistics"
 msgstr "Confirma remover atuais estatísticas"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:194
+#: rhodecode/templates/admin/repos/repo_edit.html:187
 msgid "Fetched to rev"
 msgstr "Trazida à rev"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr "Estatísticas coletadas"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr "Remoto"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr "Realizar pull de alterações a partir de localização remota"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr "Confirma realizar pull de alterações a partir de lado remoto"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:218
+#: rhodecode/templates/admin/repos/repo_edit.html:211
 msgid "Cache"
 msgstr "Cache"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Invalidate repository cache"
 msgstr "Invalidar cache do repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:222
+#: rhodecode/templates/admin/repos/repo_edit.html:215
 msgid "Confirm to invalidate repository cache"
 msgstr "Confirma invalidar cache do repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:225
+#: rhodecode/templates/admin/repos/repo_edit.html:218
 msgid ""
 "Manually invalidate cache for this repository. On first access repository"
 " will be cached again"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 #, fuzzy
 msgid "Key"
 msgstr "Chave de API"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr "Ativo"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280
-#: rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr "Diário público"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:256
+#: rhodecode/templates/admin/repos/repo_edit.html:249
 msgid "Remove from public journal"
 msgstr "Remover do diário público"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:258
+#: rhodecode/templates/admin/repos/repo_edit.html:251
 msgid "Add to public journal"
 msgstr "Adicionar ao diário público"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:263
+#: rhodecode/templates/admin/repos/repo_edit.html:256
 msgid ""
 "All actions made on this repository will be accessible to everyone in "
 "public journal"
@@ -2457,83 +2718,79 @@
 "Todas as ações feitas nesse repositório serão acessíveis a todos no "
 "diário público"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:270
+#: rhodecode/templates/admin/repos/repo_edit.html:263
 #, fuzzy
 msgid "Locking"
 msgstr "destravar"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 #, fuzzy
 msgid "Confirm to unlock repository"
 msgstr "Confirma excluir este repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Lock repo"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 #, fuzzy
 msgid "Confirm to lock repository"
 msgstr "Confirma excluir este repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 #, fuzzy
 msgid "Repository is not locked"
 msgstr "repositórios"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:284
+#: rhodecode/templates/admin/repos/repo_edit.html:277
 msgid "Force locking on repository. Works only when anonymous access is disabled"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:291
+#: rhodecode/templates/admin/repos/repo_edit.html:284
 #, fuzzy
 msgid "Set as fork of"
 msgstr "Marcar como bifurcação"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+#, fuzzy
+msgid "Set"
 msgstr "ajustar"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 #, fuzzy
 msgid "Manually set this repository as a fork of another from the list"
 msgstr "Marcar manualmente este repositório como sendo uma bifurcação de outro"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr "Excluir"
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr "Remover deste repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr "Confirma excluir este repositório"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
+#: rhodecode/templates/admin/repos/repo_edit.html:310
 #, fuzzy, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
 msgstr[0] "repositório [criado] como uma bifurcação"
 msgstr[1] ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:318
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 #, fuzzy
 msgid "Detach forks"
 msgstr "Marcar como bifurcação"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:319
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 #, fuzzy
 msgid "Delete forks"
 msgstr "excluir"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:322
+#: rhodecode/templates/admin/repos/repo_edit.html:315
 #, fuzzy
 msgid ""
 "This repository will be renamed in a special way in order to be "
@@ -2545,59 +2802,64 @@
 "                         Se você precisa exclui-lo completamente do "
 "sistema de arquivos, por favor faça-o manualmente"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:348
+#: rhodecode/templates/admin/repos/repo_edit.html:341
 #, fuzzy, python-format
 msgid "Confirm to delete this field: %s"
 msgstr "Confirma excluir este usuário: %s"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:362
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 #, fuzzy
 msgid "New field key"
 msgstr "adicionar novo arquivo"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:379
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 #, fuzzy
 msgid "New field description"
 msgstr "Descrição"
 
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr "nenhum"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr "ler"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr "escrever"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr "administrador"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr "membro"
 
@@ -2609,6 +2871,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 #, fuzzy
 msgid "default"
 msgstr "excluir"
@@ -2617,34 +2881,37 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr "revogar"
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr "Adicionar outro membro"
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr "Falha ao reomver usuário"
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-#, fuzzy
-msgid "Failed to remove user group"
-msgstr "Falha ao remover grupo de usuários"
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr "Administração de repositórios"
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
+msgstr "Nenhum registro encontrado."
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
 msgid "apply to children"
 msgstr ""
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
 msgid ""
 "Set or revoke permission to all children of that group, including non-"
 "private repositories and other groups"
@@ -2671,7 +2938,7 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 #, fuzzy
 msgid "Repository groups"
 msgstr "Grupo de repositórios"
@@ -2705,7 +2972,7 @@
 msgid "Add child group"
 msgstr "Adicionar novo grupo de usuários"
 
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
 msgid ""
 "Enable lock-by-pulling on group. This option will be applied to all other"
 " groups and repositories inside"
@@ -2721,16 +2988,22 @@
 msgstr "Número de repositórios de nível superior"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 #, fuzzy
 msgid "Edit"
 msgstr "editar"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr "editar"
 
@@ -2836,8 +3109,8 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr "Salvar configurações"
 
@@ -2852,145 +3125,165 @@
 msgstr "habilitar"
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:140
 #, fuzzy
 msgid "Use repository extra fields"
 msgstr "repositórios"
 
-#: rhodecode/templates/admin/settings/settings.html:147
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+#, fuzzy
+msgid "Dashboard items"
+msgstr "Painel de Controle"
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 #, fuzzy
 msgid "Icons"
 msgstr "Opções"
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 #, fuzzy
 msgid "Show private repo icon on repositories"
 msgstr "repositório privado"
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+#, fuzzy
+msgid "Show public/private icons next to repositories names"
+msgstr "repositório privado"
+
+#: rhodecode/templates/admin/settings/settings.html:172
 #, fuzzy
 msgid "Meta-Tagging"
 msgstr "configurações"
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:204
 #, fuzzy
 msgid "VCS settings"
 msgstr "configurações"
 
-#: rhodecode/templates/admin/settings/settings.html:204
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr "Web"
 
-#: rhodecode/templates/admin/settings/settings.html:209
+#: rhodecode/templates/admin/settings/settings.html:218
 #, fuzzy
 msgid "Require SSL for vcs operations"
 msgstr "exigir ssl para realizar push"
 
-#: rhodecode/templates/admin/settings/settings.html:211
+#: rhodecode/templates/admin/settings/settings.html:220
 msgid ""
 "RhodeCode will require SSL for pushing or pulling. If SSL is missing it "
 "will return HTTP Error 406: Not Acceptable"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:217
+#: rhodecode/templates/admin/settings/settings.html:226
 msgid "Hooks"
 msgstr "Ganchos"
 
-#: rhodecode/templates/admin/settings/settings.html:222
+#: rhodecode/templates/admin/settings/settings.html:231
 msgid "Update repository after push (hg update)"
 msgstr "Atualizar repositório após realizar push (hg update)"
 
-#: rhodecode/templates/admin/settings/settings.html:226
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr "Mostrar tamanho do repositório após o push"
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr "Armazenar registro de comandos de push dos usuários"
 
-#: rhodecode/templates/admin/settings/settings.html:234
+#: rhodecode/templates/admin/settings/settings.html:243
 msgid "Log user pull commands"
 msgstr "Armazenar registro de comandos de pull dos usuários"
 
-#: rhodecode/templates/admin/settings/settings.html:238
+#: rhodecode/templates/admin/settings/settings.html:247
 #, fuzzy
 msgid "Advanced setup"
 msgstr "confirguações avançadas"
 
-#: rhodecode/templates/admin/settings/settings.html:243
+#: rhodecode/templates/admin/settings/settings.html:252
 #, fuzzy
 msgid "Mercurial Extensions"
 msgstr "Repositório Mercurial"
 
-#: rhodecode/templates/admin/settings/settings.html:248
+#: rhodecode/templates/admin/settings/settings.html:257
 msgid "Enable largefiles extension"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:252
+#: rhodecode/templates/admin/settings/settings.html:261
 msgid "Enable hgsubversion extension"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:254
+#: rhodecode/templates/admin/settings/settings.html:263
 msgid ""
 "Requires hgsubversion library installed. Allows cloning from svn remote "
 "locations"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:264
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr "Localização dos repositórios"
 
-#: rhodecode/templates/admin/settings/settings.html:269
+#: rhodecode/templates/admin/settings/settings.html:279
 msgid ""
-"This a crucial application setting. If you are really sure you need to "
-"change this, you must restart application in order to make this setting "
-"take effect. Click this label to unlock."
+"Click to unlock. You must restart RhodeCode in order to make this setting"
+" take effect."
 msgstr ""
-"Essa é uma configuração crucial da aplicação. Se você realmente tem "
-"certeza de que quer mudar isto, você precisa reiniciar a aplicação para "
-"que essa configuração tenha efeito. Clique este rótulo para destravar."
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 #, fuzzy
 msgid "Unlock"
 msgstr "destravar"
 
-#: rhodecode/templates/admin/settings/settings.html:272
+#: rhodecode/templates/admin/settings/settings.html:282
 msgid ""
 "Location where repositories are stored. After changing this value a "
 "restart, and rescan is required"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:292
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr "Testar E-mail"
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr "E-mail para"
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr "Enviar"
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr "Informações de Sistema e Pacotes"
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr "Mostrar"
 
@@ -3000,7 +3293,7 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr "Usuários"
 
@@ -3058,48 +3351,23 @@
 msgid "New password confirmation"
 msgstr "Confirmação de nova senha"
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-#, fuzzy
-msgid "Inherit default permissions"
-msgstr "Permissões padrão"
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr "Criar repositórios"
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-#, fuzzy
-msgid "Fork repositories"
-msgstr "repositórios"
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 #, fuzzy
 msgid "Email addresses"
 msgstr "Endereço de e-mail"
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, fuzzy, python-format
 msgid "Confirm to delete this email: %s"
 msgstr "Confirma excluir este usuário: %s"
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 #, fuzzy
 msgid "New email address"
 msgstr "Endereço de e-mail"
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr "Minha conta"
 
@@ -3138,7 +3406,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -3160,7 +3428,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr ""
@@ -3195,13 +3463,13 @@
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 #, fuzzy
 msgid "User groups"
 msgstr "grupos de usuários"
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 #, fuzzy
 msgid "Add new user group"
 msgstr "Adicionar novo grupo de usuários"
@@ -3217,7 +3485,7 @@
 msgstr "grupos de usuários"
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr "Membros"
 
@@ -3238,47 +3506,57 @@
 msgid "Add all elements"
 msgstr "Adicionar todos os elementos"
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr "Membros do grupo"
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 #, fuzzy
 msgid "No members yet"
 msgstr "membros"
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+#, fuzzy
+msgid "Global Permissions"
+msgstr "Copiar permissões"
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
 #, fuzzy
 msgid "User groups administration"
 msgstr "Administração de grupos de usuários"
 
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
 #, fuzzy, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr "Confirme para excluir este grupo de usuários: %s"
 
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+#, fuzzy
+msgid "There are no user groups yet"
+msgstr "Ainda não há grupos de repositórios"
+
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr "Encaminhe um bug"
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr "Sumário"
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr "Registro de alterações"
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3286,53 +3564,49 @@
 msgid "Files"
 msgstr "Arquivos"
 
-#: rhodecode/templates/base/base.html:112
+#: rhodecode/templates/base/base.html:125
 #, fuzzy
 msgid "Switch To"
 msgstr "Trocar para"
 
-#: rhodecode/templates/base/base.html:114
-#: rhodecode/templates/base/base.html:267
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
 msgid "loading..."
 msgstr "carregando..."
 
-#: rhodecode/templates/base/base.html:118
+#: rhodecode/templates/base/base.html:131
 msgid "Options"
 msgstr "Opções"
 
-#: rhodecode/templates/base/base.html:124
+#: rhodecode/templates/base/base.html:137
 #: rhodecode/templates/forks/forks_data.html:21
 #, fuzzy
 msgid "Compare fork"
 msgstr "comparar exibir"
 
-#: rhodecode/templates/base/base.html:126
-msgid "Lightweight changelog"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:127
-#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr "Pesquisar"
 
-#: rhodecode/templates/base/base.html:133
+#: rhodecode/templates/base/base.html:145
 #, fuzzy
 msgid "Lock"
 msgstr "destravar"
 
-#: rhodecode/templates/base/base.html:141
+#: rhodecode/templates/base/base.html:153
 #, fuzzy
 msgid "Follow"
 msgstr "seguidores"
 
-#: rhodecode/templates/base/base.html:142
+#: rhodecode/templates/base/base.html:154
 #, fuzzy
 msgid "Unfollow"
 msgstr "seguidores"
 
-#: rhodecode/templates/base/base.html:145
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3341,66 +3615,122 @@
 msgid "Fork"
 msgstr "Bifurcação"
 
-#: rhodecode/templates/base/base.html:147
+#: rhodecode/templates/base/base.html:159
 #, fuzzy
 msgid "Create Pull Request"
 msgstr "Criar novo arquivo"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 #, fuzzy
 msgid "Show Pull Requests"
 msgstr "comentado no commit"
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 #, fuzzy
 msgid "Pull Requests"
 msgstr "comentado no commit"
 
-#: rhodecode/templates/base/base.html:190
+#: rhodecode/templates/base/base.html:202
 #, fuzzy
 msgid "Not logged in"
 msgstr "último login"
 
-#: rhodecode/templates/base/base.html:197
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr "Entrar com sua conta"
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr "Esqueceu a senha ?"
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr "Sair"
 
-#: rhodecode/templates/base/base.html:262
+#: rhodecode/templates/base/base.html:274
 msgid "Switch repository"
 msgstr "Trocar repositório"
 
-#: rhodecode/templates/base/base.html:274
+#: rhodecode/templates/base/base.html:286
 msgid "Show recent activity"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:275
+#: rhodecode/templates/base/base.html:287
 #: rhodecode/templates/journal/journal.html:4
 msgid "Journal"
 msgstr "Diário"
 
-#: rhodecode/templates/base/base.html:286
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 #, fuzzy
 msgid "Search in repositories"
 msgstr "em todos os repositórios"
 
-#: rhodecode/templates/base/perms_summary.html:8
+#: rhodecode/templates/base/default_perms_box.html:14
+#, fuzzy
+msgid "Inherit default permissions"
+msgstr "Permissões padrão"
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr "Criar repositórios"
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+#, fuzzy
+msgid "Create user groups"
+msgstr "criado grupo de usuários %s"
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+#, fuzzy
+msgid "Fork repositories"
+msgstr "repositórios"
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 #, fuzzy
 msgid "No permissions defined yet"
 msgstr "Copiar permissões"
 
-#: rhodecode/templates/base/perms_summary.html:15
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr "Permissão"
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 #, fuzzy
 msgid "Edit Permission"
 msgstr "Permissão de repositório"
@@ -3411,7 +3741,7 @@
 msgstr "adicionar outro comentário"
 
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
+#: rhodecode/templates/data_table/_dt_elements.html:147
 msgid "Stop following this repository"
 msgstr "Parar de seguir este repositório"
 
@@ -3428,7 +3758,7 @@
 msgstr "membros"
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
+#: rhodecode/templates/pullrequests/pullrequest.html:203
 #, fuzzy
 msgid "Loading ..."
 msgstr "carregando..."
@@ -3444,7 +3774,7 @@
 msgstr "nenhum arquivo corresponde"
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
+#: rhodecode/templates/changelog/changelog.html:45
 msgid "Open new pull request"
 msgstr ""
 
@@ -3477,31 +3807,51 @@
 msgid "Expand diff"
 msgstr "diff bruto"
 
+#: rhodecode/templates/base/root.html:58
+#, fuzzy
+msgid "Failed to remoke permission"
+msgstr "Falha ao reomver usuário"
+
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, fuzzy, python-format
 msgid "%s Bookmarks"
 msgstr "marcadores"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+#, fuzzy
+msgid "Compare bookmarks"
+msgstr "comparar exibir"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
 #: rhodecode/templates/tags/tags.html:51
 #: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr "Autor"
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
 #: rhodecode/templates/tags/tags.html:52
 #: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr "Revisão"
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+#, fuzzy
+msgid "Compare"
+msgstr "comparar exibir"
+
 #: rhodecode/templates/branches/branches.html:5
 #, fuzzy, python-format
 msgid "%s Branches"
@@ -3512,69 +3862,71 @@
 msgid "Compare branches"
 msgstr "ramos"
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54
-#: rhodecode/templates/tags/tags_data.html:10
-#, fuzzy
-msgid "Compare"
-msgstr "comparar exibir"
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, fuzzy, python-format
 msgid "%s Changelog"
 msgstr "Registro de alterações"
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 msgid "showing %d out of %d revision"
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] "mostrando %d de %d revisão"
 msgstr[1] "mostrando %d de %d revisões"
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 #, fuzzy
 msgid "Clear selection"
 msgstr "Configurações de busca"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
 #, fuzzy, python-format
 msgid "Compare fork with %s"
 msgstr "comparar exibir"
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #, fuzzy
 msgid "Compare fork with parent"
 msgstr "comparar exibir"
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, fuzzy, python-format
+msgid "Click to open associated pull request #%s"
+msgstr "repositório [criado]"
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 #, fuzzy
 msgid "Show more"
 msgstr "mostrar mais"
 
-#: rhodecode/templates/changelog/changelog.html:89
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
 #, fuzzy, python-format
 msgid "Bookmark %s"
 msgstr "marcadores"
 
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
 #, fuzzy, python-format
 msgid "Tag %s"
 msgstr "etiquetas"
 
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
 #, fuzzy, python-format
 msgid "Branch %s"
 msgstr "ramos"
 
-#: rhodecode/templates/changelog/changelog.html:258
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr "Ainda não há alteações"
 
@@ -3606,6 +3958,40 @@
 msgid "Affected %s files"
 msgstr "%s arquivos afetados"
 
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+#, fuzzy
+msgid "Commit message"
+msgstr "mensagem de commit"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+#, fuzzy
+msgid "Age"
+msgstr "idade"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr "Adicionar ou enviar arquivos diretamente pelo RhodeCode"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr "Adicionar novo arquivo"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr "Fazer push de novo repositório"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr "Repositório existente?"
+
 #: rhodecode/templates/changeset/changeset.html:6
 #, fuzzy, python-format
 msgid "%s Changeset"
@@ -3627,7 +4013,7 @@
 msgstr "Conjuntos de mudanças"
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
+#: rhodecode/templates/changeset/diff_block.html:22
 #, fuzzy
 msgid "Raw diff"
 msgstr "diff bruto"
@@ -3638,13 +4024,13 @@
 msgstr "diff bruto"
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
+#: rhodecode/templates/changeset/diff_block.html:23
 #, fuzzy
 msgid "Download diff"
 msgstr "descarregar diff"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -3652,7 +4038,7 @@
 msgstr[1] "%d comentários"
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
@@ -3660,11 +4046,11 @@
 msgstr[1] "(%d em linha)"
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr "mesclar"
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, fuzzy, python-format
@@ -3673,7 +4059,7 @@
 msgstr[0] "arquivo alterado"
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, fuzzy, python-format
@@ -3682,15 +4068,15 @@
 msgstr[0] "%s arquivos afetados com %s inserções e %s exclusões"
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -3709,55 +4095,69 @@
 msgid "Comment on pull request #%s"
 msgstr "repositório [criado]"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr "Enviando..."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr "Comentando a linha {1}."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
 #, python-format
 msgid "Comments parsed using %s syntax with %s support."
 msgstr "Comentários interpretados usando a sintaxe %s com suporte a %s."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
+#: rhodecode/templates/changeset/changeset_file_comment.html:61
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
 msgid "Use @username inside this text to send notification to this RhodeCode user"
 msgstr ""
 "Use @nomedeusuário dentro desse texto para enviar notificação a este "
 "usuário do RhodeCode"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+#, fuzzy
+msgid "Preview"
+msgstr "comparar exibir"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+#, fuzzy
+msgid "Comment preview"
+msgstr "comparar exibir"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr "Comentário"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 #, fuzzy
 msgid "Cancel"
 msgstr "alterados"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr "Você precisa estar logado para comentar."
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr "Entrar agora"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr "Ocultar"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 #, fuzzy
 msgid "Change status"
 msgstr "Conjuntos de mudanças"
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr ""
 
@@ -3770,20 +4170,20 @@
 msgid "Files affected"
 msgstr "Arquivos afetados"
 
-#: rhodecode/templates/changeset/diff_block.html:22
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:30
+#: rhodecode/templates/changeset/diff_block.html:29
 #, fuzzy
 msgid "Show inline comments"
 msgstr "mostrar comentários em linha"
 
-#: rhodecode/templates/changeset/diff_block.html:55
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:56
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
 msgstr ""
 
@@ -3862,29 +4262,25 @@
 msgid "Confirm to delete this repository: %s"
 msgstr "Confirma excluir esse repositório: %s"
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr "Confirma excluir este usuário: %s"
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-#, fuzzy
-msgid "New status"
-msgstr "Conjuntos de mudanças"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
-msgstr ""
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+#, fuzzy
+msgid "URL"
+msgstr "diário"
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, fuzzy, python-format
+msgid "%s commented on a %s changeset."
+msgstr "comentado no commit"
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-#, fuzzy
-msgid "Repo"
-msgstr "Meus repositórios"
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
+msgid "The changeset status was changed to"
 msgstr ""
 
 #: rhodecode/templates/email_templates/main.html:8
@@ -3905,52 +4301,41 @@
 msgid "You can generate it by clicking following URL"
 msgstr ""
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-msgid "If you did not request new password please ignore this email."
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
 msgstr ""
 
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid ""
-"User %s opened pull request for repository %s and wants you to review "
-"changes."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-#, fuzzy
-msgid "View this pull request here"
-msgstr "Confirma excluir este repositório"
-
 #: rhodecode/templates/email_templates/pull_request.html:6
-#, fuzzy
-msgid "title"
+#, python-format
+msgid ""
+"%s opened a pull request for repository %s and wants you to review "
+"changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+#, fuzzy
+msgid "Title"
 msgstr "escrever"
 
-#: rhodecode/templates/email_templates/pull_request.html:7
-#, fuzzy
-msgid "description"
-msgstr "Descrição"
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
 #, fuzzy, python-format
-msgid "Pull request #%s for repository %s"
+msgid "%s commented on pull request \"%s\""
 msgstr "repositório [criado]"
 
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-#, fuzzy
-msgid "Closing pull request with status"
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+#, fuzzy
+msgid "Pull request was closed with status"
 msgstr "repositório [criado]"
 
-#: rhodecode/templates/email_templates/registration.html:4
-#, fuzzy
-msgid "A new user have registered in RhodeCode"
-msgstr "Você se registrou com sucesso no rhodecode"
-
-#: rhodecode/templates/email_templates/registration.html:9
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+#, fuzzy
+msgid "Pull request changed status"
+msgstr "repositório [criado]"
+
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr ""
 
@@ -3977,7 +4362,6 @@
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
 #, fuzzy
 msgid "Branch"
 msgstr "ramo"
@@ -3992,12 +4376,6 @@
 msgid "Add file"
 msgstr "adicionar arquivo"
 
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr "Adicionar novo arquivo"
-
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
 msgstr "Nome de Arquivo"
@@ -4026,13 +4404,6 @@
 msgid "use / to separate directories"
 msgstr "use / para separar diretórios"
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-#, fuzzy
-msgid "Commit message"
-msgstr "mensagem de commit"
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
@@ -4103,13 +4474,6 @@
 msgid "Show annotation"
 msgstr "mostrar anotação"
 
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-#, fuzzy
-msgid "Show as raw"
-msgstr "mostrar como bruto"
-
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
 #, fuzzy
@@ -4313,41 +4677,55 @@
 msgid "New pull request"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-#, fuzzy
-msgid "Detailed compare view"
-msgstr "comparar exibir"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+#, fuzzy
+msgid "Create new pull request"
+msgstr "Criar novo arquivo"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+#, fuzzy
+msgid "Write a short description on this pull request"
+msgstr "Confirma excluir este repositório"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+#, fuzzy
+msgid "Changeset flow"
+msgstr "Conjunto de Mudanças"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+#, fuzzy
+msgid "Origin repository"
+msgstr "Repositório Git"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 #, fuzzy
 msgid "owner"
 msgstr "Dono"
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-#, fuzzy
-msgid "Create new pull request"
-msgstr "Criar novo arquivo"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-#, fuzzy
-msgid "Title"
-msgstr "escrever"
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
-msgstr ""
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+#, fuzzy
+msgid "Detailed compare view"
+msgstr "comparar exibir"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+#, fuzzy
+msgid "Destination repository"
+msgstr "Editar repositório"
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
 #, fuzzy, python-format
@@ -4378,11 +4756,6 @@
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-#, fuzzy
-msgid "Origin repository"
-msgstr "Repositório Git"
-
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 #, fuzzy
 msgid "Created on"
@@ -4451,38 +4824,6 @@
 msgid "Permission denied"
 msgstr "Permissão negada"
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, fuzzy, python-format
-msgid "%s Lightweight Changelog"
-msgstr "arquivo alterado"
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-#, fuzzy
-msgid "Age"
-msgstr "idade"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, fuzzy, python-format
-msgid "Click to open associated pull request #%s"
-msgstr "repositório [criado]"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr "Adicionar ou enviar arquivos diretamente pelo RhodeCode"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr "Fazer push de novo repositório"
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr "Repositório existente?"
-
 #: rhodecode/templates/summary/summary.html:4
 #, fuzzy, python-format
 msgid "%s Summary"
@@ -4523,7 +4864,7 @@
 msgid "Fork of"
 msgstr "Bifurcação de"
 
-#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
 #, fuzzy
 msgid "Remote clone"
 msgstr "clone remoto"
@@ -4550,8 +4891,8 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
+#, fuzzy
+msgid "Enable"
 msgstr "habilitar"
 
 #: rhodecode/templates/summary/summary.html:159
@@ -4566,7 +4907,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr "Downloads estão desabilitados para este repositório"
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 #, fuzzy
 msgid "Download as zip"
 msgstr "descarregar como bruto"
@@ -4594,6 +4935,10 @@
 msgid "Commit activity by day / author"
 msgstr "Atividade de commit por dia / autor"
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr "habilitar"
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr "Estatísticas coletadas:"
@@ -4609,51 +4954,47 @@
 
 #: rhodecode/templates/summary/summary.html:272
 #, python-format
-msgid "Readme file at revision '%s'"
+msgid "Readme file from revision %s"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:333
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr "Descarregar %s como %s"
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr "arquivos"
 
-#: rhodecode/templates/summary/summary.html:690
+#: rhodecode/templates/summary/summary.html:689
 msgid "commits"
 msgstr "commits"
 
-#: rhodecode/templates/summary/summary.html:691
+#: rhodecode/templates/summary/summary.html:690
 msgid "files added"
 msgstr "arquivos adicionados"
 
-#: rhodecode/templates/summary/summary.html:692
+#: rhodecode/templates/summary/summary.html:691
 msgid "files changed"
 msgstr "arquivos alterados"
 
-#: rhodecode/templates/summary/summary.html:693
+#: rhodecode/templates/summary/summary.html:692
 msgid "files removed"
 msgstr "arquivos removidos"
 
-#: rhodecode/templates/summary/summary.html:695
+#: rhodecode/templates/summary/summary.html:694
 msgid "commit"
 msgstr "commit"
 
+#: rhodecode/templates/summary/summary.html:695
+msgid "file added"
+msgstr "arquivo adicionado"
+
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
-msgstr "arquivo adicionado"
+msgid "file changed"
+msgstr "arquivo alterado"
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr "arquivo alterado"
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr "arquivo removido"
 
--- a/rhodecode/i18n/rhodecode.pot	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/i18n/rhodecode.pot	Fri Jun 07 00:31:11 2013 +0200
@@ -1,14 +1,13 @@
 # Translations template for RhodeCode.
-# Copyright (C) 2013 ORGANIZATION
+# Copyright (C) 2013 Marcin Kuzminski RhodeCode
 # This file is distributed under the same license as the RhodeCode project.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
-#
-#, fuzzy
+##, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: RhodeCode 1.6.0b\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-04-05 10:19-0700\n"
+"Project-Id-Version: RhodeCode 1.7.0dev\n"
+"Report-Msgid-Bugs-To: marcin@maq.io\n"
+"POT-Creation-Date: 2013-06-05 19:55+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,36 +16,35 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:149
 msgid "All Branches"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:83
+#: rhodecode/controllers/changeset.py:84
 msgid "Show white space"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
 msgid "Ignore white space"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:163
+#: rhodecode/controllers/changeset.py:164
 #, python-format
 msgid "%s line context"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:329 rhodecode/controllers/pullrequests.py:438
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:478
 #, python-format
 msgid "Status change -> %s"
 msgstr ""
 
-#: rhodecode/controllers/changeset.py:360
-msgid ""
-"Changing status on a changeset associated with a closed pull request is not "
-"allowed"
-msgstr ""
-
-#: rhodecode/controllers/compare.py:74 rhodecode/controllers/pullrequests.py:167
-#: rhodecode/controllers/shortlog.py:100
+#: rhodecode/controllers/changeset.py:376
+msgid "Changing status on a changeset associated with a closed pull request is not allowed"
+msgstr ""
+
+#: rhodecode/controllers/compare.py:74
+#: rhodecode/controllers/pullrequests.py:256
 msgid "There are no changesets yet"
 msgstr ""
 
@@ -71,9 +69,7 @@
 msgstr ""
 
 #: rhodecode/controllers/error.py:107
-msgid ""
-"The server encountered an unexpected condition which prevented it from "
-"fulfilling the request."
+msgid "The server encountered an unexpected condition which prevented it from fulfilling the request."
 msgstr ""
 
 #: rhodecode/controllers/feed.py:52
@@ -87,8 +83,8 @@
 msgstr ""
 
 #: rhodecode/controllers/feed.py:86
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -96,115 +92,116 @@
 msgid "Changeset was too big and was cut off..."
 msgstr ""
 
-#: rhodecode/controllers/feed.py:91
+#: rhodecode/controllers/feed.py:90
 #, python-format
 msgid "%s committed on %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:88
-msgid "Click here to add new file"
-msgstr ""
-
 #: rhodecode/controllers/files.py:89
+msgid "Click here to add new file"
+msgstr ""
+
+#: rhodecode/controllers/files.py:90
 #, python-format
 msgid "There are no files yet %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:267 rhodecode/controllers/files.py:335
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
 #, python-format
 msgid "This repository is has been locked by %s on %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:279
+#: rhodecode/controllers/files.py:283
 msgid "You can only edit files with revision being a valid branch "
 msgstr ""
 
-#: rhodecode/controllers/files.py:293
+#: rhodecode/controllers/files.py:297
 #, python-format
 msgid "Edited file %s via RhodeCode"
 msgstr ""
 
-#: rhodecode/controllers/files.py:309
+#: rhodecode/controllers/files.py:313
 msgid "No changes"
 msgstr ""
 
-#: rhodecode/controllers/files.py:318 rhodecode/controllers/files.py:388
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
 #, python-format
 msgid "Successfully committed to %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:323 rhodecode/controllers/files.py:394
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
 msgid "Error occurred during commit"
 msgstr ""
 
-#: rhodecode/controllers/files.py:347
+#: rhodecode/controllers/files.py:351
 msgid "Added file via RhodeCode"
 msgstr ""
 
-#: rhodecode/controllers/files.py:364
-msgid "No content"
-msgstr ""
-
 #: rhodecode/controllers/files.py:368
-msgid "No filename"
+msgid "No content"
 msgstr ""
 
 #: rhodecode/controllers/files.py:372
+msgid "No filename"
+msgstr ""
+
+#: rhodecode/controllers/files.py:397
 msgid "Location must be relative path and must not contain .. in path"
 msgstr ""
 
-#: rhodecode/controllers/files.py:420
-msgid "Downloads disabled"
-msgstr ""
-
 #: rhodecode/controllers/files.py:431
+msgid "Downloads disabled"
+msgstr ""
+
+#: rhodecode/controllers/files.py:442
 #, python-format
 msgid "Unknown revision %s"
 msgstr ""
 
-#: rhodecode/controllers/files.py:433
+#: rhodecode/controllers/files.py:444
 msgid "Empty repository"
 msgstr ""
 
-#: rhodecode/controllers/files.py:435
+#: rhodecode/controllers/files.py:446
 msgid "Unknown archive type"
 msgstr ""
 
-#: rhodecode/controllers/files.py:617
+#: rhodecode/controllers/files.py:631
 #: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
 msgid "Changesets"
 msgstr ""
 
-#: rhodecode/controllers/files.py:618 rhodecode/controllers/pullrequests.py:131
-#: rhodecode/controllers/summary.py:247 rhodecode/model/scm.py:606
+#: rhodecode/controllers/files.py:632 rhodecode/controllers/pullrequests.py:149
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
 #: rhodecode/templates/switch_to_list.html:3
 #: rhodecode/templates/branches/branches.html:10
 msgid "Branches"
 msgstr ""
 
-#: rhodecode/controllers/files.py:619 rhodecode/controllers/pullrequests.py:132
-#: rhodecode/controllers/summary.py:248 rhodecode/model/scm.py:617
+#: rhodecode/controllers/files.py:633 rhodecode/controllers/pullrequests.py:150
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
 #: rhodecode/templates/switch_to_list.html:15
-#: rhodecode/templates/shortlog/shortlog_data.html:10
 #: rhodecode/templates/tags/tags.html:10
 msgid "Tags"
 msgstr ""
 
-#: rhodecode/controllers/forks.py:175
+#: rhodecode/controllers/forks.py:176
 #, python-format
 msgid "Forked repository %s as %s"
 msgstr ""
 
-#: rhodecode/controllers/forks.py:189
+#: rhodecode/controllers/forks.py:190
 #, python-format
 msgid "An error occurred during repository forking %s"
 msgstr ""
 
-#: rhodecode/controllers/journal.py:275 rhodecode/controllers/journal.py:318
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
 msgid "public journal"
 msgstr ""
 
-#: rhodecode/controllers/journal.py:279 rhodecode/controllers/journal.py:322
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
 #: rhodecode/templates/journal/journal.html:12
 msgid "journal"
 msgstr ""
@@ -221,71 +218,71 @@
 msgid "Your password reset was successful, new password has been sent to your email"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:118
+#: rhodecode/controllers/pullrequests.py:136
 #: rhodecode/templates/changeset/changeset.html:10
-#: rhodecode/templates/email_templates/changeset_comment.html:15
+#: rhodecode/templates/email_templates/changeset_comment.html:8
 msgid "Changeset"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:128
+#: rhodecode/controllers/pullrequests.py:146
 msgid "Special"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:129
+#: rhodecode/controllers/pullrequests.py:147
 msgid "Peer branches"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:130 rhodecode/model/scm.py:612
+#: rhodecode/controllers/pullrequests.py:148 rhodecode/model/scm.py:688
 #: rhodecode/templates/switch_to_list.html:28
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 msgid "Bookmarks"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:228
+#: rhodecode/controllers/pullrequests.py:321
 msgid "Pull request requires a title with min. 3 chars"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:230
+#: rhodecode/controllers/pullrequests.py:323
 msgid "Error creating pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:251
+#: rhodecode/controllers/pullrequests.py:343
 msgid "Successfully opened new pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:254
+#: rhodecode/controllers/pullrequests.py:346
 msgid "Error occurred during sending pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:287
+#: rhodecode/controllers/pullrequests.py:385
 msgid "Successfully deleted pull request"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:441
+#: rhodecode/controllers/pullrequests.py:481
 msgid "Closing with"
 msgstr ""
 
-#: rhodecode/controllers/pullrequests.py:478
+#: rhodecode/controllers/pullrequests.py:518
 msgid "Closing pull request on other statuses than rejected or approved forbidden"
 msgstr ""
 
-#: rhodecode/controllers/search.py:134
+#: rhodecode/controllers/search.py:132
 msgid "Invalid search query. Try quoting it."
 msgstr ""
 
-#: rhodecode/controllers/search.py:139
+#: rhodecode/controllers/search.py:137
 msgid "There is no index to search in. Please run whoosh indexer"
 msgstr ""
 
-#: rhodecode/controllers/search.py:143
+#: rhodecode/controllers/search.py:141
 msgid "An error occurred during this search operation"
 msgstr ""
 
-#: rhodecode/controllers/summary.py:141
+#: rhodecode/controllers/summary.py:182
 msgid "No data loaded yet"
 msgstr ""
 
-#: rhodecode/controllers/summary.py:147
+#: rhodecode/controllers/summary.py:188
 #: rhodecode/templates/summary/summary.html:149
 msgid "Statistics are disabled for this repository"
 msgstr ""
@@ -298,6 +295,39 @@
 msgid "Error occurred during update of defaults"
 msgstr ""
 
+#: rhodecode/controllers/admin/gists.py:56
+msgid "forever"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:57
+msgid "5 minutes"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:58
+msgid "1 hour"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:59
+msgid "1 day"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:60
+msgid "1 month"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+msgid "Error occurred during gist creation"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:165
+#, python-format
+msgid "Deleted gist %s"
+msgstr ""
+
 #: rhodecode/controllers/admin/ldap_settings.py:50
 msgid "BASE"
 msgstr ""
@@ -342,35 +372,39 @@
 msgid "START_TLS on LDAP connection"
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:126
+#: rhodecode/controllers/admin/ldap_settings.py:124
 msgid "LDAP settings updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:130
+#: rhodecode/controllers/admin/ldap_settings.py:128
 msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 msgstr ""
 
-#: rhodecode/controllers/admin/ldap_settings.py:147
+#: rhodecode/controllers/admin/ldap_settings.py:145
 msgid "Error occurred during update of ldap settings"
 msgstr ""
 
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:60
 #: rhodecode/controllers/admin/permissions.py:64
-msgid "None"
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
 msgstr ""
 
 #: rhodecode/controllers/admin/permissions.py:61
 #: rhodecode/controllers/admin/permissions.py:65
-msgid "Read"
-msgstr ""
-
-#: rhodecode/controllers/admin/permissions.py:62
-#: rhodecode/controllers/admin/permissions.py:66
-msgid "Write"
-msgstr ""
-
-#: rhodecode/controllers/admin/permissions.py:63
-#: rhodecode/controllers/admin/permissions.py:67
+#: rhodecode/controllers/admin/permissions.py:69
 #: rhodecode/templates/admin/defaults/defaults.html:9
 #: rhodecode/templates/admin/ldap/ldap.html:9
 #: rhodecode/templates/admin/permissions/permissions.html:9
@@ -391,39 +425,55 @@
 #: rhodecode/templates/admin/users_groups/users_group_add.html:8
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:9
 #: rhodecode/templates/admin/users_groups/users_groups.html:9
-#: rhodecode/templates/base/base.html:292 rhodecode/templates/base/base.html:293
-#: rhodecode/templates/base/base.html:299 rhodecode/templates/base/base.html:300
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
 msgid "Admin"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:70
-#: rhodecode/controllers/admin/permissions.py:76
-#: rhodecode/controllers/admin/permissions.py:79
-msgid "Disabled"
-msgstr ""
-
 #: rhodecode/controllers/admin/permissions.py:72
-msgid "Allowed with manual account activation"
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
+msgid "Disabled"
 msgstr ""
 
 #: rhodecode/controllers/admin/permissions.py:74
+msgid "Allowed with manual account activation"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:76
 msgid "Allowed with automatic account activation"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:77
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
 #: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
 msgid "Enabled"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:128
+#: rhodecode/controllers/admin/permissions.py:138
 msgid "Default permissions updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/permissions.py:142
+#: rhodecode/controllers/admin/permissions.py:152
 msgid "Error occurred during update of permissions"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:127
+#: rhodecode/controllers/admin/repos.py:128
 msgid "--REMOVE FORK--"
 msgstr ""
 
@@ -442,228 +492,223 @@
 msgid "Error creating repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:266
+#: rhodecode/controllers/admin/repos.py:270
 #, python-format
 msgid "Repository %s updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:284
+#: rhodecode/controllers/admin/repos.py:288
 #, python-format
 msgid "Error occurred during update of repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:311 rhodecode/controllers/api/api.py:877
+#: rhodecode/controllers/admin/repos.py:315
 #, python-format
 msgid "Detached %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:314 rhodecode/controllers/api/api.py:879
+#: rhodecode/controllers/admin/repos.py:318
 #, python-format
 msgid "Deleted %s forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:319
+#: rhodecode/controllers/admin/repos.py:323
 #, python-format
 msgid "Deleted repository %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:322
+#: rhodecode/controllers/admin/repos.py:326
 #, python-format
 msgid "Cannot delete %s it still contains attached forks"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:327
+#: rhodecode/controllers/admin/repos.py:331
 #, python-format
 msgid "An error occurred during deletion of %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:365
+#: rhodecode/controllers/admin/repos.py:345
 msgid "Repository permissions updated"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:384
-msgid "An error occurred during deletion of repository user"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:403
-msgid "An error occurred during deletion of repository user groups"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:421
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+msgid "An error occurred during revoking of permission"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:392
 msgid "An error occurred during deletion of repository stats"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:438
+#: rhodecode/controllers/admin/repos.py:409
 msgid "An error occurred during cache invalidation"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:458
-#: rhodecode/controllers/admin/repos.py:485
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
 msgid "An error occurred during unlocking"
 msgstr ""
 
+#: rhodecode/controllers/admin/repos.py:447
+msgid "Unlocked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:450
+msgid "Locked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:452
+#, python-format
+msgid "Repository has been %s"
+msgstr ""
+
 #: rhodecode/controllers/admin/repos.py:476
-msgid "Unlocked"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:479
-msgid "Locked"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:481
-#, python-format
-msgid "Repository has been %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos.py:505
 msgid "Updated repository visibility in public journal"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:509
+#: rhodecode/controllers/admin/repos.py:480
 msgid "An error occurred during setting this repository in public journal"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:514 rhodecode/model/validators.py:302
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
 msgid "Token mismatch"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:527
+#: rhodecode/controllers/admin/repos.py:498
 msgid "Pulled from remote location"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:529
+#: rhodecode/controllers/admin/repos.py:501
 msgid "An error occurred during pull from remote location"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:545
+#: rhodecode/controllers/admin/repos.py:517
 msgid "Nothing"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:547
+#: rhodecode/controllers/admin/repos.py:519
 #, python-format
 msgid "Marked repo %s as fork of %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:551
+#: rhodecode/controllers/admin/repos.py:523
 msgid "An error occurred during this operation"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:590
+#: rhodecode/controllers/admin/repos.py:562
 msgid "An error occurred during creation of field"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos.py:604
+#: rhodecode/controllers/admin/repos.py:576
 msgid "An error occurred during removal of field"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:145
+#: rhodecode/controllers/admin/repos_groups.py:147
 #, python-format
 msgid "Created repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:157
+#: rhodecode/controllers/admin/repos_groups.py:159
 #, python-format
 msgid "Error occurred during creation of repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:214
-#: rhodecode/controllers/admin/repos_groups.py:286
-msgid "Cannot revoke permission for yourself as admin"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:220
+#: rhodecode/controllers/admin/repos_groups.py:217
 #, python-format
 msgid "Updated repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:235
+#: rhodecode/controllers/admin/repos_groups.py:232
 #, python-format
 msgid "Error occurred during update of repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:253
+#: rhodecode/controllers/admin/repos_groups.py:250
 #, python-format
 msgid "This group contains %s repositores and cannot be deleted"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:260
+#: rhodecode/controllers/admin/repos_groups.py:257
 #, python-format
 msgid "This group contains %s subgroups and cannot be deleted"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:266
+#: rhodecode/controllers/admin/repos_groups.py:263
 #, python-format
 msgid "Removed repository group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/repos_groups.py:271
+#: rhodecode/controllers/admin/repos_groups.py:268
 #, python-format
-msgid "Error occurred during deletion of repos group %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:297
-msgid "An error occurred during deletion of group user"
-msgstr ""
-
-#: rhodecode/controllers/admin/repos_groups.py:318
-msgid "An error occurred during deletion of group user groups"
-msgstr ""
-
-#: rhodecode/controllers/admin/settings.py:126
+msgid "Error occurred during deletion of repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+msgid "Repository Group permissions updated"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:123
 #, python-format
 msgid "Repositories successfully rescanned added: %s ; removed: %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:135
+#: rhodecode/controllers/admin/settings.py:132
 msgid "Whoosh reindex task scheduled"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:166
+#: rhodecode/controllers/admin/settings.py:163
 msgid "Updated application settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:170
-#: rhodecode/controllers/admin/settings.py:301
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
 msgid "Error occurred during updating application settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:216
+#: rhodecode/controllers/admin/settings.py:219
 msgid "Updated visualisation settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:221
+#: rhodecode/controllers/admin/settings.py:224
 msgid "Error occurred during updating visualisation settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:297
+#: rhodecode/controllers/admin/settings.py:300
 msgid "Updated VCS settings"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:311
+#: rhodecode/controllers/admin/settings.py:314
 msgid "Added new hook"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:323
+#: rhodecode/controllers/admin/settings.py:326
 msgid "Updated hooks"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:327
+#: rhodecode/controllers/admin/settings.py:330
 msgid "Error occurred during hook creation"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:346
+#: rhodecode/controllers/admin/settings.py:349
 msgid "Email task created"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:410
+#: rhodecode/controllers/admin/settings.py:413
 msgid "You can't edit this user since it's crucial for entire application"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:452
+#: rhodecode/controllers/admin/settings.py:455
 msgid "Your account was updated successfully"
 msgstr ""
 
-#: rhodecode/controllers/admin/settings.py:467
+#: rhodecode/controllers/admin/settings.py:470
 #: rhodecode/controllers/admin/users.py:198
 #, python-format
 msgid "Error occurred during update of user %s"
@@ -691,111 +736,92 @@
 msgid "An error occurred during deletion of user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:233
+#: rhodecode/controllers/admin/users.py:234
 msgid "You can't edit this user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:276
-msgid "Granted 'repository create' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:281
-msgid "Revoked 'repository create' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:287
-msgid "Granted 'repository fork' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:292
-msgid "Revoked 'repository fork' permission to user"
-msgstr ""
-
-#: rhodecode/controllers/admin/users.py:298
-#: rhodecode/controllers/admin/users_groups.py:281
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+msgid "Updated permissions"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
 msgid "An error occurred during permissions saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:312
+#: rhodecode/controllers/admin/users.py:311
 #, python-format
 msgid "Added email %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:318
+#: rhodecode/controllers/admin/users.py:317
 msgid "An error occurred during email saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:328
+#: rhodecode/controllers/admin/users.py:327
 msgid "Removed email from user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:341
+#: rhodecode/controllers/admin/users.py:340
 #, python-format
 msgid "Added ip %s to user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:347
+#: rhodecode/controllers/admin/users.py:346
 msgid "An error occurred during ip saving"
 msgstr ""
 
-#: rhodecode/controllers/admin/users.py:359
+#: rhodecode/controllers/admin/users.py:358
 msgid "Removed ip from user"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:86
+#: rhodecode/controllers/admin/users_groups.py:162
 #, python-format
 msgid "Created user group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:97
+#: rhodecode/controllers/admin/users_groups.py:173
 #, python-format
 msgid "Error occurred during creation of user group %s"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:166
-#, python-format
-msgid "Updated user group %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:188
-#, python-format
-msgid "Error occurred during update of user group %s"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:205
-msgid "Successfully deleted user group"
-msgstr ""
-
 #: rhodecode/controllers/admin/users_groups.py:210
+#, python-format
+msgid "Updated user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:232
+#, python-format
+msgid "Error occurred during update of user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:250
+msgid "Successfully deleted user group"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:255
 msgid "An error occurred during deletion of user group"
 msgstr ""
 
-#: rhodecode/controllers/admin/users_groups.py:259
-msgid "Granted 'repository create' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:264
-msgid "Revoked 'repository create' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:270
-msgid "Granted 'repository fork' permission to user group"
-msgstr ""
-
-#: rhodecode/controllers/admin/users_groups.py:275
-msgid "Revoked 'repository fork' permission to user group"
-msgstr ""
-
-#: rhodecode/lib/auth.py:530
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+msgid "User Group permissions updated"
+msgstr ""
+
+#: rhodecode/lib/auth.py:544
 #, python-format
 msgid "IP %s not allowed"
 msgstr ""
 
-#: rhodecode/lib/auth.py:579
+#: rhodecode/lib/auth.py:593
 msgid "You need to be a registered user to perform this action"
 msgstr ""
 
-#: rhodecode/lib/auth.py:620
+#: rhodecode/lib/auth.py:634
 msgid "You need to be a signed in to view this page"
 msgstr ""
 
@@ -811,377 +837,472 @@
 msgid "No changes detected"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:394
-#, python-format
-msgid "%a, %d %b %Y %H:%M:%S"
-msgstr ""
-
-#: rhodecode/lib/helpers.py:506
+#: rhodecode/lib/helpers.py:539
 msgid "True"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:509
+#: rhodecode/lib/helpers.py:542
 msgid "False"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:547
+#: rhodecode/lib/helpers.py:580
 #, python-format
 msgid "Deleted branch: %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:583
 #, python-format
 msgid "Created tag: %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:563
+#: rhodecode/lib/helpers.py:596
 msgid "Changeset not found"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:615
+#: rhodecode/lib/helpers.py:646
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:621
+#: rhodecode/lib/helpers.py:652
 msgid "compare view"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:641
+#: rhodecode/lib/helpers.py:672
 msgid "and"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:642
+#: rhodecode/lib/helpers.py:673
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:643 rhodecode/templates/changelog/changelog.html:44
+#: rhodecode/lib/helpers.py:674 rhodecode/templates/changelog/changelog.html:53
 msgid "revisions"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:667
+#: rhodecode/lib/helpers.py:698
 #, python-format
 msgid "fork name %s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:684
+#: rhodecode/lib/helpers.py:715
 #: rhodecode/templates/pullrequests/pullrequest_show.html:8
 #, python-format
 msgid "Pull request #%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:690
+#: rhodecode/lib/helpers.py:725
 msgid "[deleted] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:692 rhodecode/lib/helpers.py:702
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
 msgid "[created] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:694
+#: rhodecode/lib/helpers.py:729
 msgid "[created] repository as fork"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:696 rhodecode/lib/helpers.py:704
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
 msgid "[forked] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:698 rhodecode/lib/helpers.py:706
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
 msgid "[updated] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:700
+#: rhodecode/lib/helpers.py:735
+msgid "[downloaded] archive from repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:737
 msgid "[delete] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:708
+#: rhodecode/lib/helpers.py:745
 msgid "[created] user"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:710
+#: rhodecode/lib/helpers.py:747
 msgid "[updated] user"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:712
+#: rhodecode/lib/helpers.py:749
 msgid "[created] user group"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:714
+#: rhodecode/lib/helpers.py:751
 msgid "[updated] user group"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:716
+#: rhodecode/lib/helpers.py:753
 msgid "[commented] on revision in repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:718
+#: rhodecode/lib/helpers.py:755
 msgid "[commented] on pull request for"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:720
+#: rhodecode/lib/helpers.py:757
 msgid "[closed] pull request for"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:722
+#: rhodecode/lib/helpers.py:759
 msgid "[pushed] into"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:724
+#: rhodecode/lib/helpers.py:761
 msgid "[committed via RhodeCode] into repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:726
+#: rhodecode/lib/helpers.py:763
 msgid "[pulled from remote] into repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:728
+#: rhodecode/lib/helpers.py:765
 msgid "[pulled] from"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:730
+#: rhodecode/lib/helpers.py:767
 msgid "[started following] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:732
+#: rhodecode/lib/helpers.py:769
 msgid "[stopped following] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:910
+#: rhodecode/lib/helpers.py:1088
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:914
+#: rhodecode/lib/helpers.py:1092
 msgid "No Files"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:1198
+#: rhodecode/lib/helpers.py:1158
+msgid "new file"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1161
+msgid "mod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1164
+msgid "del"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1167
+msgid "rename"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
 #, python-format
-msgid ""
-"%s repository is not mapped to db perhaps it was created or renamed from the "
-"filesystem please run the application again in order to rescan repositories"
+msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories"
 msgstr ""
 
 #: rhodecode/lib/unionrepo.py:193
 msgid "cannot create new union repository"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:411
+#: rhodecode/lib/utils2.py:410
 #, python-format
 msgid "%d year"
 msgid_plural "%d years"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:412
+#: rhodecode/lib/utils2.py:411
 #, python-format
 msgid "%d month"
 msgid_plural "%d months"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:413
+#: rhodecode/lib/utils2.py:412
 #, python-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:414
+#: rhodecode/lib/utils2.py:413
 #, python-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:415
+#: rhodecode/lib/utils2.py:414
 #, python-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:416
+#: rhodecode/lib/utils2.py:415
 #, python-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/lib/utils2.py:432
+#: rhodecode/lib/utils2.py:431
 #, python-format
 msgid "in %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:434
+#: rhodecode/lib/utils2.py:433
 #, python-format
 msgid "%s ago"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:436
+#: rhodecode/lib/utils2.py:435
 #, python-format
 msgid "in %s and %s"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:439
+#: rhodecode/lib/utils2.py:438
 #, python-format
 msgid "%s and %s ago"
 msgstr ""
 
-#: rhodecode/lib/utils2.py:442
+#: rhodecode/lib/utils2.py:441
 msgid "just now"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1289 rhodecode/model/db.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
 msgid "Repository no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1290 rhodecode/model/db.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
 msgid "Repository read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1291 rhodecode/model/db.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
 msgid "Repository write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1292 rhodecode/model/db.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
 msgid "Repository admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1294
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
 msgid "Repositories Group no access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1295
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
 msgid "Repositories Group read access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1296
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
 msgid "Repositories Group write access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1297
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
 msgid "Repositories Group admin access"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1299 rhodecode/model/db.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
 msgid "RhodeCode Administrator"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1300 rhodecode/model/db.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
 msgid "Repository creation disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1301 rhodecode/model/db.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
 msgid "Repository creation enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1302 rhodecode/model/db.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
 msgid "Repository forking disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303 rhodecode/model/db.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
 msgid "Repository forking enabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304 rhodecode/model/db.py:1403
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
 msgid "Register disabled"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305 rhodecode/model/db.py:1404
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
 msgid "Register new user with RhodeCode with manual activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308 rhodecode/model/db.py:1407
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
 msgid "Register new user with RhodeCode with auto activation"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1749 rhodecode/model/db.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
 msgid "Not Reviewed"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1750 rhodecode/model/db.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
 msgid "Approved"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1751 rhodecode/model/db.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
 msgid "Rejected"
 msgstr ""
 
 #: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
 #: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
-#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1752 rhodecode/model/db.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
 msgid "Under Review"
 msgstr ""
 
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+msgid "Repository group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+msgid "Repository group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+msgid "Repository group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+msgid "Repository group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+msgid "User group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+msgid "User group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+msgid "User group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+msgid "User group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+msgid "Repository Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+msgid "Repository Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+msgid "User Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+msgid "User Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+msgid "Registration disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+msgid "User Registration with manual account activation"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+msgid "User Registration with automatic account activation"
+msgstr ""
+
 #: rhodecode/model/comment.py:75
 #, python-format
 msgid "on line %s"
 msgstr ""
 
-#: rhodecode/model/comment.py:219
+#: rhodecode/model/comment.py:220
 msgid "[Mention]"
 msgstr ""
 
-#: rhodecode/model/db.py:1252
-msgid "top level"
-msgstr ""
-
-#: rhodecode/model/db.py:1393
-msgid "Repository group no access"
-msgstr ""
-
-#: rhodecode/model/db.py:1394
-msgid "Repository group read access"
-msgstr ""
-
-#: rhodecode/model/db.py:1395
-msgid "Repository group write access"
-msgstr ""
-
-#: rhodecode/model/db.py:1396
-msgid "Repository group admin access"
-msgstr ""
-
 #: rhodecode/model/forms.py:43
 msgid "Please enter a login"
 msgstr ""
@@ -1200,42 +1321,42 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: rhodecode/model/notification.py:224
+#: rhodecode/model/notification.py:228
 #, python-format
 msgid "%(user)s commented on changeset at %(when)s"
 msgstr ""
 
-#: rhodecode/model/notification.py:225
-#, python-format
-msgid "%(user)s sent message at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:226
-#, python-format
-msgid "%(user)s mentioned you at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:227
-#, python-format
-msgid "%(user)s registered in RhodeCode at %(when)s"
-msgstr ""
-
-#: rhodecode/model/notification.py:228
-#, python-format
-msgid "%(user)s opened new pull request at %(when)s"
-msgstr ""
-
 #: rhodecode/model/notification.py:229
 #, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:230
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:231
+#, python-format
+msgid "%(user)s registered in RhodeCode at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:232
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:233
+#, python-format
 msgid "%(user)s commented on pull request at %(when)s"
 msgstr ""
 
-#: rhodecode/model/pull_request.py:104
+#: rhodecode/model/pull_request.py:98
 #, python-format
 msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
 msgstr ""
 
-#: rhodecode/model/scm.py:598
+#: rhodecode/model/scm.py:674
 msgid "latest tip"
 msgstr ""
 
@@ -1253,9 +1374,7 @@
 
 #: rhodecode/model/user.py:309
 #, python-format
-msgid ""
-"user \"%s\" still owns %s repositories and cannot be removed. Switch owners "
-"or remove those repositories. %s"
+msgid "user \"%s\" still owns %s repositories and cannot be removed. Switch owners or remove those repositories. %s"
 msgstr ""
 
 #: rhodecode/model/user.py:334
@@ -1286,9 +1405,7 @@
 msgstr ""
 
 #: rhodecode/model/validators.py:89
-msgid ""
-"Username may only contain alphanumeric characters underscores, periods or "
-"dashes and must begin with alphanumeric character"
+msgid "Username may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character or underscore"
 msgstr ""
 
 #: rhodecode/model/validators.py:117
@@ -1306,9 +1423,7 @@
 msgstr ""
 
 #: rhodecode/model/validators.py:139
-msgid ""
-"user group name may only contain alphanumeric characters underscores, periods"
-" or dashes and must begin with alphanumeric character"
+msgid "user group name may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character"
 msgstr ""
 
 #: rhodecode/model/validators.py:177
@@ -1389,47 +1504,49 @@
 msgid "You don't have permissions to create a group in this location"
 msgstr ""
 
-#: rhodecode/model/validators.py:557
+#: rhodecode/model/validators.py:559
 msgid "This username or user group name is not valid"
 msgstr ""
 
-#: rhodecode/model/validators.py:650
+#: rhodecode/model/validators.py:652
 msgid "This is not a valid path"
 msgstr ""
 
-#: rhodecode/model/validators.py:665
+#: rhodecode/model/validators.py:667
 msgid "This e-mail address is already taken"
 msgstr ""
 
-#: rhodecode/model/validators.py:685
+#: rhodecode/model/validators.py:687
 #, python-format
 msgid "e-mail \"%(email)s\" does not exist."
 msgstr ""
 
-#: rhodecode/model/validators.py:722
-msgid ""
-"The LDAP Login attribute of the CN must be specified - this is the name of "
-"the attribute that is equivalent to \"username\""
-msgstr ""
-
-#: rhodecode/model/validators.py:735
+#: rhodecode/model/validators.py:724
+msgid "The LDAP Login attribute of the CN must be specified - this is the name of the attribute that is equivalent to \"username\""
+msgstr ""
+
+#: rhodecode/model/validators.py:737
 #, python-format
 msgid "Revisions %(revs)s are already part of pull request or have set status"
 msgstr ""
 
-#: rhodecode/model/validators.py:767
+#: rhodecode/model/validators.py:769
 msgid "Please enter a valid IPv4 or IpV6 address"
 msgstr ""
 
-#: rhodecode/model/validators.py:768
+#: rhodecode/model/validators.py:770
 #, python-format
 msgid "The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 msgstr ""
 
-#: rhodecode/model/validators.py:800
+#: rhodecode/model/validators.py:803
 msgid "Key name can only consist of letters, underscore, dash or numbers"
 msgstr ""
 
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
 #: rhodecode/templates/index.html:5
 msgid "Dashboard"
 msgstr ""
@@ -1443,7 +1560,8 @@
 #: rhodecode/templates/branches/branches.html:9
 #: rhodecode/templates/journal/journal.html:9
 #: rhodecode/templates/journal/journal.html:46
-#: rhodecode/templates/journal/journal.html:47 rhodecode/templates/tags/tags.html:9
+#: rhodecode/templates/journal/journal.html:47
+#: rhodecode/templates/tags/tags.html:9
 msgid "quick filter..."
 msgstr ""
 
@@ -1452,13 +1570,15 @@
 msgid "repositories"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:13 rhodecode/templates/index_base.html:18
+#: rhodecode/templates/index_base.html:13
+#: rhodecode/templates/index_base.html:18
 #: rhodecode/templates/admin/repos/repo_add.html:5
-#: rhodecode/templates/admin/repos/repos.html:21
+#: rhodecode/templates/admin/repos/repos.html:22
 msgid "Add repository"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:15 rhodecode/templates/index_base.html:20
+#: rhodecode/templates/index_base.html:15
+#: rhodecode/templates/index_base.html:20
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:31
 msgid "Add group"
 msgstr ""
@@ -1471,27 +1591,29 @@
 msgid "You have admin right to this group, and can edit it"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:40 rhodecode/templates/index_base.html:140
+#: rhodecode/templates/index_base.html:40
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
 #: rhodecode/templates/admin/users_groups/users_group_add.html:32
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:33
-#: rhodecode/templates/admin/users_groups/users_groups.html:34
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
 msgid "Group name"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:41 rhodecode/templates/index_base.html:83
-#: rhodecode/templates/index_base.html:142 rhodecode/templates/index_base.html:180
-#: rhodecode/templates/index_base.html:270
+#: rhodecode/templates/index_base.html:41
+#: rhodecode/templates/index_base.html:123
 #: rhodecode/templates/admin/repos/repo_add_base.html:56
-#: rhodecode/templates/admin/repos/repo_edit.html:75
-#: rhodecode/templates/admin/repos/repos.html:73
+#: rhodecode/templates/admin/repos/repo_edit.html:68
+#: rhodecode/templates/admin/repos/repos.html:75
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
 #: rhodecode/templates/forks/fork.html:56
-#: rhodecode/templates/pullrequests/pullrequest.html:101
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:106
 msgid "Description"
 msgstr ""
@@ -1499,128 +1621,104 @@
 #: rhodecode/templates/index_base.html:51
 #: rhodecode/templates/admin/permissions/permissions.html:55
 #: rhodecode/templates/admin/repos/repo_add_base.html:29
-#: rhodecode/templates/admin/repos/repo_edit.html:49
+#: rhodecode/templates/admin/repos/repo_edit.html:50
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
 #: rhodecode/templates/forks/fork.html:47
 msgid "Repository group"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:82 rhodecode/templates/index_base.html:178
-#: rhodecode/templates/index_base.html:268
+#: rhodecode/templates/index_base.html:121
 #: rhodecode/templates/admin/repos/repo_add_base.html:9
 #: rhodecode/templates/admin/repos/repo_edit.html:32
-#: rhodecode/templates/admin/repos/repos.html:71
+#: rhodecode/templates/admin/repos/repos.html:73
 #: rhodecode/templates/admin/users/user_edit_my_account.html:172
-#: rhodecode/templates/base/perms_summary.html:14
-#: rhodecode/templates/bookmarks/bookmarks.html:34
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
 #: rhodecode/templates/bookmarks/bookmarks_data.html:6
 #: rhodecode/templates/branches/branches.html:47
 #: rhodecode/templates/branches/branches_data.html:6
 #: rhodecode/templates/files/files_browser.html:47
 #: rhodecode/templates/journal/journal.html:193
-#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/journal/journal.html:283
 #: rhodecode/templates/summary/summary.html:55
 #: rhodecode/templates/summary/summary.html:124
-#: rhodecode/templates/tags/tags.html:48 rhodecode/templates/tags/tags_data.html:6
+#: rhodecode/templates/tags/tags.html:48
+#: rhodecode/templates/tags/tags_data.html:6
 msgid "Name"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:84
-msgid "Last change"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:85 rhodecode/templates/index_base.html:183
-#: rhodecode/templates/index_base.html:273
-#: rhodecode/templates/admin/repos/repos.html:74
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr ""
+
+#: rhodecode/templates/index_base.html:126
+#: rhodecode/templates/admin/repos/repos.html:76
 #: rhodecode/templates/admin/users/user_edit_my_account.html:174
 #: rhodecode/templates/journal/journal.html:195
-#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/journal/journal.html:285
 msgid "Tip"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:86 rhodecode/templates/index_base.html:185
-#: rhodecode/templates/index_base.html:275
-#: rhodecode/templates/admin/repos/repo_edit.html:121
-#: rhodecode/templates/admin/repos/repos.html:76
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
+#: rhodecode/templates/admin/repos/repos.html:78
 msgid "Owner"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:87
-msgid "Atom"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:171 rhodecode/templates/index_base.html:209
-#: rhodecode/templates/index_base.html:296
-#: rhodecode/templates/admin/repos/repos.html:97
-#: rhodecode/templates/admin/users/user_edit_my_account.html:196
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 #: rhodecode/templates/admin/users/users.html:107
-#: rhodecode/templates/bookmarks/bookmarks.html:58
+#: rhodecode/templates/bookmarks/bookmarks.html:74
 #: rhodecode/templates/branches/branches.html:73
-#: rhodecode/templates/journal/journal.html:217
-#: rhodecode/templates/journal/journal.html:320
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
 #: rhodecode/templates/tags/tags.html:74
 msgid "Click to sort ascending"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:172 rhodecode/templates/index_base.html:210
-#: rhodecode/templates/index_base.html:297
-#: rhodecode/templates/admin/repos/repos.html:98
-#: rhodecode/templates/admin/users/user_edit_my_account.html:197
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
 #: rhodecode/templates/admin/users/users.html:108
-#: rhodecode/templates/bookmarks/bookmarks.html:59
+#: rhodecode/templates/bookmarks/bookmarks.html:75
 #: rhodecode/templates/branches/branches.html:74
-#: rhodecode/templates/journal/journal.html:218
-#: rhodecode/templates/journal/journal.html:321
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
 #: rhodecode/templates/tags/tags.html:75
 msgid "Click to sort descending"
 msgstr ""
 
-#: rhodecode/templates/index_base.html:181 rhodecode/templates/index_base.html:271
-msgid "Last Change"
-msgstr ""
-
-#: rhodecode/templates/index_base.html:211
-#: rhodecode/templates/admin/repos/repos.html:99
-#: rhodecode/templates/admin/users/user_edit_my_account.html:198
-#: rhodecode/templates/admin/users/users.html:109
-#: rhodecode/templates/bookmarks/bookmarks.html:60
-#: rhodecode/templates/branches/branches.html:75
-#: rhodecode/templates/journal/journal.html:219
-#: rhodecode/templates/journal/journal.html:322
-#: rhodecode/templates/tags/tags.html:76
-msgid "No records found."
-msgstr ""
-
-#: rhodecode/templates/index_base.html:212 rhodecode/templates/index_base.html:299
-#: rhodecode/templates/admin/repos/repos.html:100
-#: rhodecode/templates/admin/users/user_edit_my_account.html:199
+#: rhodecode/templates/index_base.html:138
+msgid "No repositories found."
+msgstr ""
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:89
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
 #: rhodecode/templates/admin/users/users.html:110
-#: rhodecode/templates/bookmarks/bookmarks.html:61
+#: rhodecode/templates/bookmarks/bookmarks.html:77
 #: rhodecode/templates/branches/branches.html:76
-#: rhodecode/templates/journal/journal.html:220
-#: rhodecode/templates/journal/journal.html:323
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
 #: rhodecode/templates/tags/tags.html:77
 msgid "Data error."
 msgstr ""
 
-#: rhodecode/templates/index_base.html:213 rhodecode/templates/index_base.html:300
-#: rhodecode/templates/admin/repos/repos.html:101
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:90
 #: rhodecode/templates/admin/users/user_edit_my_account.html:58
-#: rhodecode/templates/admin/users/user_edit_my_account.html:200
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
 #: rhodecode/templates/admin/users/users.html:111
-#: rhodecode/templates/bookmarks/bookmarks.html:62
+#: rhodecode/templates/bookmarks/bookmarks.html:78
 #: rhodecode/templates/branches/branches.html:77
-#: rhodecode/templates/journal/journal.html:221
-#: rhodecode/templates/journal/journal.html:324
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
 #: rhodecode/templates/tags/tags.html:78
 msgid "Loading..."
 msgstr ""
 
-#: rhodecode/templates/index_base.html:298
-msgid "No repositories found."
-msgstr ""
-
-#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:227
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
 msgid "Log In"
 msgstr ""
 
@@ -1635,7 +1733,7 @@
 #: rhodecode/templates/admin/users/user_edit.html:57
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
 #: rhodecode/templates/admin/users/users.html:77
-#: rhodecode/templates/base/base.html:203
+#: rhodecode/templates/base/base.html:215
 #: rhodecode/templates/summary/summary.html:123
 msgid "Username"
 msgstr ""
@@ -1643,7 +1741,7 @@
 #: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
 #: rhodecode/templates/admin/ldap/ldap.html:46
 #: rhodecode/templates/admin/users/user_add.html:41
-#: rhodecode/templates/base/base.html:212
+#: rhodecode/templates/base/base.html:224
 msgid "Password"
 msgstr ""
 
@@ -1659,7 +1757,7 @@
 msgid "Forgot your password ?"
 msgstr ""
 
-#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:223
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
 msgid "Don't have an account ?"
 msgstr ""
 
@@ -1728,7 +1826,7 @@
 #: rhodecode/templates/repo_switcher_list.html:10
 #: rhodecode/templates/admin/defaults/defaults.html:44
 #: rhodecode/templates/admin/repos/repo_add_base.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:85
+#: rhodecode/templates/admin/repos/repo_edit.html:78
 #: rhodecode/templates/data_table/_dt_elements.html:61
 #: rhodecode/templates/summary/summary.html:77
 msgid "Private repository"
@@ -1751,12 +1849,13 @@
 msgstr ""
 
 #: rhodecode/templates/switch_to_list.html:35
-#: rhodecode/templates/bookmarks/bookmarks_data.html:32
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
 msgid "There are no bookmarks yet"
 msgstr ""
 
-#: rhodecode/templates/admin/admin.html:5 rhodecode/templates/admin/admin.html:13
-#: rhodecode/templates/base/base.html:68
+#: rhodecode/templates/admin/admin.html:5
+#: rhodecode/templates/admin/admin.html:13
+#: rhodecode/templates/base/base.html:73
 msgid "Admin journal"
 msgstr ""
 
@@ -1778,13 +1877,13 @@
 msgstr[1] ""
 
 #: rhodecode/templates/admin/admin_log.html:6
-#: rhodecode/templates/admin/repos/repos.html:77
+#: rhodecode/templates/admin/repos/repos.html:79
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 #: rhodecode/templates/admin/users/user_edit_my_account.html:176
 #: rhodecode/templates/admin/users/users.html:87
-#: rhodecode/templates/admin/users_groups/users_groups.html:37
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
 #: rhodecode/templates/journal/journal.html:197
-#: rhodecode/templates/journal/journal.html:300
+#: rhodecode/templates/journal/journal.html:287
 msgid "Action"
 msgstr ""
 
@@ -1794,11 +1893,12 @@
 msgstr ""
 
 #: rhodecode/templates/admin/admin_log.html:8
-#: rhodecode/templates/bookmarks/bookmarks.html:35
+#: rhodecode/templates/bookmarks/bookmarks.html:49
 #: rhodecode/templates/bookmarks/bookmarks_data.html:7
 #: rhodecode/templates/branches/branches.html:48
 #: rhodecode/templates/branches/branches_data.html:7
-#: rhodecode/templates/tags/tags.html:49 rhodecode/templates/tags/tags_data.html:7
+#: rhodecode/templates/tags/tags.html:49
+#: rhodecode/templates/tags/tags_data.html:7
 msgid "Date"
 msgstr ""
 
@@ -1816,80 +1916,201 @@
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:11
-#: rhodecode/templates/base/base.html:75
+#: rhodecode/templates/base/base.html:80
 msgid "Defaults"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:35
 #: rhodecode/templates/admin/repos/repo_add_base.html:38
-#: rhodecode/templates/admin/repos/repo_edit.html:58
 msgid "Type"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:48
 #: rhodecode/templates/admin/repos/repo_add_base.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:89
+#: rhodecode/templates/admin/repos/repo_edit.html:82
 #: rhodecode/templates/forks/fork.html:69
-msgid ""
-"Private repositories are only visible to people explicitly added as "
-"collaborators."
+msgid "Private repositories are only visible to people explicitly added as collaborators."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:55
-#: rhodecode/templates/admin/repos/repo_edit.html:94
+#: rhodecode/templates/admin/repos/repo_edit.html:87
 msgid "Enable statistics"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:59
-#: rhodecode/templates/admin/repos/repo_edit.html:98
+#: rhodecode/templates/admin/repos/repo_edit.html:91
 msgid "Enable statistics window on summary page."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:65
-#: rhodecode/templates/admin/repos/repo_edit.html:103
+#: rhodecode/templates/admin/repos/repo_edit.html:96
 msgid "Enable downloads"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:69
-#: rhodecode/templates/admin/repos/repo_edit.html:107
+#: rhodecode/templates/admin/repos/repo_edit.html:100
 msgid "Enable download menu on summary page."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:75
-#: rhodecode/templates/admin/repos/repo_edit.html:112
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
 msgid "Enable locking"
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:79
-#: rhodecode/templates/admin/repos/repo_edit.html:116
+#: rhodecode/templates/admin/repos/repo_edit.html:109
 msgid "Enable lock-by-pulling on repository."
 msgstr ""
 
 #: rhodecode/templates/admin/defaults/defaults.html:84
 #: rhodecode/templates/admin/ldap/ldap.html:89
-#: rhodecode/templates/admin/permissions/permissions.html:92
-#: rhodecode/templates/admin/repos/repo_edit.html:148
-#: rhodecode/templates/admin/repos/repo_edit.html:173
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:80
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
 #: rhodecode/templates/admin/settings/hooks.html:73
 #: rhodecode/templates/admin/users/user_add.html:94
 #: rhodecode/templates/admin/users/user_edit.html:140
-#: rhodecode/templates/admin/users/user_edit.html:185
 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
 #: rhodecode/templates/admin/users_groups/users_group_add.html:49
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:90
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
 msgid "Save"
 msgstr ""
 
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, python-format
+msgid "Private Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+msgid "Create new gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:48
+msgid "Created"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+msgid "Expires"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+msgid "never"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:68
+msgid "There are no gists yet"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+msgid "Gist description ..."
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+msgid "Private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+msgid "Confirm to delete this gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+msgid "Show as raw"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:71
+msgid "created"
+msgstr ""
+
 #: rhodecode/templates/admin/ldap/ldap.html:5
 msgid "LDAP administration"
 msgstr ""
 
 #: rhodecode/templates/admin/ldap/ldap.html:11
 #: rhodecode/templates/admin/users/users.html:86
-#: rhodecode/templates/base/base.html:74
+#: rhodecode/templates/base/base.html:79
 msgid "LDAP"
 msgstr ""
 
@@ -1989,7 +2210,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/notifications/show_notification.html:9
-#: rhodecode/templates/base/base.html:241
+#: rhodecode/templates/base/base.html:253
 msgid "Notifications"
 msgstr ""
 
@@ -1998,12 +2219,14 @@
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
 #: rhodecode/templates/admin/repos/repo_edit.html:158
-#: rhodecode/templates/admin/repos/repo_edit.html:165
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
 #: rhodecode/templates/admin/users/user_edit.html:150
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
-#: rhodecode/templates/base/base.html:73
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
 msgid "Permissions"
 msgstr ""
 
@@ -2016,105 +2239,96 @@
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:49
-msgid ""
-"All default permissions on each repository will be reset to chosen "
-"permission, note that all custom default permission on repositories will be "
-"lost"
+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 ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:50
 #: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
 msgid "Overwrite existing settings"
 msgstr ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:62
-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"
+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 ""
 
 #: rhodecode/templates/admin/permissions/permissions.html:69
-msgid "Registration"
-msgstr ""
-
-#: rhodecode/templates/admin/permissions/permissions.html:77
+msgid "User group"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid "All default permissions on each user group will be reset to chosen permission, note that all custom default permission on repository groups will be lost"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
 msgid "Repository creation"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:85
+#: rhodecode/templates/admin/permissions/permissions.html:91
+msgid "User group creation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
 msgid "Repository forking"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:93
-#: rhodecode/templates/admin/permissions/permissions.html:154
-#: rhodecode/templates/admin/repos/repo_edit.html:149
-#: rhodecode/templates/admin/repos/repo_edit.html:174
-#: rhodecode/templates/admin/repos/repo_edit.html:388
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
-#: rhodecode/templates/admin/settings/settings.html:115
-#: rhodecode/templates/admin/settings/settings.html:187
-#: rhodecode/templates/admin/settings/settings.html:278
-#: rhodecode/templates/admin/users/user_edit.html:141
-#: rhodecode/templates/admin/users/user_edit.html:186
-#: rhodecode/templates/admin/users/user_edit.html:235
-#: rhodecode/templates/admin/users/user_edit.html:283
-#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
-#: rhodecode/templates/files/files_add.html:80
-#: rhodecode/templates/files/files_edit.html:66
-#: rhodecode/templates/pullrequests/pullrequest.html:110
-msgid "Reset"
-msgstr ""
-
-#: rhodecode/templates/admin/permissions/permissions.html:103
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+msgid "External auth account activation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
 msgid "Default User Permissions"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:113
-#: rhodecode/templates/admin/users/user_edit.html:244
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
 msgid "Allowed IP addresses"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:127
-#: rhodecode/templates/admin/repos/repo_edit.html:347
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
-#: rhodecode/templates/admin/users/user_edit.html:212
-#: rhodecode/templates/admin/users/user_edit.html:257
-#: rhodecode/templates/admin/users_groups/users_groups.html:46
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
 #: rhodecode/templates/data_table/_dt_elements.html:122
-#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:136
 msgid "delete"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:128
-#: rhodecode/templates/admin/users/user_edit.html:258
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
 #, python-format
 msgid "Confirm to delete this ip: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:134
-#: rhodecode/templates/admin/users/user_edit.html:264
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
 msgid "All IP addresses are allowed"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:145
-#: rhodecode/templates/admin/users/user_edit.html:275
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
 msgid "New ip address"
 msgstr ""
 
-#: rhodecode/templates/admin/permissions/permissions.html:153
+#: rhodecode/templates/admin/permissions/permissions.html:184
 #: rhodecode/templates/admin/repos/repo_add_base.html:73
-#: rhodecode/templates/admin/repos/repo_edit.html:387
-#: rhodecode/templates/admin/users/user_edit.html:234
-#: rhodecode/templates/admin/users/user_edit.html:282
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
 msgid "Add"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add.html:12
 #: rhodecode/templates/admin/repos/repo_add.html:16
-#: rhodecode/templates/base/base.html:69 rhodecode/templates/base/base.html:103
-#: rhodecode/templates/base/base.html:263
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
 msgid "Repositories"
 msgstr ""
 
@@ -2129,7 +2343,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:24
-#: rhodecode/templates/admin/repos/repo_edit.html:44
+#: rhodecode/templates/admin/repos/repo_edit.html:45
 msgid "Optional http[s] url from which repository should be cloned."
 msgstr ""
 
@@ -2143,19 +2357,19 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:47
-#: rhodecode/templates/admin/repos/repo_edit.html:66
+#: rhodecode/templates/admin/repos/repo_edit.html:59
 #: rhodecode/templates/forks/fork.html:38
 msgid "Landing revision"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:51
-#: rhodecode/templates/admin/repos/repo_edit.html:70
+#: rhodecode/templates/admin/repos/repo_edit.html:63
 #: rhodecode/templates/forks/fork.html:42
 msgid "Default revision for files page, downloads, whoosh and readme"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_add_base.html:60
-#: rhodecode/templates/admin/repos/repo_edit.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:72
 #: rhodecode/templates/forks/fork.html:60
 msgid "Keep it short and to the point. Use a README file for longer descriptions."
 msgstr ""
@@ -2167,244 +2381,242 @@
 #: rhodecode/templates/admin/repos/repo_edit.html:12
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:11
-#: rhodecode/templates/base/base.html:76 rhodecode/templates/base/base.html:121
+#: rhodecode/templates/base/base.html:81 rhodecode/templates/base/base.html:134
 #: rhodecode/templates/summary/summary.html:212
 msgid "Settings"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:40
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+msgid "Non-changeable id"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
 msgid "Clone uri"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:53
+#: rhodecode/templates/admin/repos/repo_edit.html:54
 msgid "Optional select a group to put this repository into."
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:126
+#: rhodecode/templates/admin/repos/repo_edit.html:119
 msgid "Change owner of this repository."
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:177
+msgid "Advanced settings"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:180
+msgid "Statistics"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:184
-msgid "Advanced settings"
+msgid "Reset current statistics"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:184
+msgid "Confirm to remove current statistics"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit.html:187
-msgid "Statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Reset current statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:191
-msgid "Confirm to remove current statistics"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:194
 msgid "Fetched to rev"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:195
+#: rhodecode/templates/admin/repos/repo_edit.html:188
 msgid "Stats gathered"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:203
+#: rhodecode/templates/admin/repos/repo_edit.html:196
 msgid "Remote"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Pull changes from remote location"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:207
+#: rhodecode/templates/admin/repos/repo_edit.html:200
 msgid "Confirm to pull changes from remote side"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:211
+msgid "Cache"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Invalidate repository cache"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Confirm to invalidate repository cache"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:218
-msgid "Cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:222
-msgid "Invalidate repository cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:222
-msgid "Confirm to invalidate repository cache"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:225
-msgid ""
-"Manually invalidate cache for this repository. On first access repository "
-"will be cached again"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:230
+msgid "Manually invalidate cache for this repository. On first access repository will be cached again"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:223
 msgid "List of cached values"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:233
+#: rhodecode/templates/admin/repos/repo_edit.html:226
 msgid "Prefix"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:234
+#: rhodecode/templates/admin/repos/repo_edit.html:227
 msgid "Key"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:235
+#: rhodecode/templates/admin/repos/repo_edit.html:228
 #: rhodecode/templates/admin/users/user_add.html:86
 #: rhodecode/templates/admin/users/user_edit.html:124
 #: rhodecode/templates/admin/users/users.html:84
 #: rhodecode/templates/admin/users_groups/users_group_add.html:41
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:42
-#: rhodecode/templates/admin/users_groups/users_groups.html:36
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
 msgid "Active"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:250
-#: rhodecode/templates/base/base.html:280 rhodecode/templates/base/base.html:281
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
 msgid "Public journal"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:249
+msgid "Remove from public journal"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:251
+msgid "Add to public journal"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:256
-msgid "Remove from public journal"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:258
-msgid "Add to public journal"
+msgid "All actions made on this repository will be accessible to everyone in public journal"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit.html:263
-msgid ""
-"All actions made on this repository will be accessible to everyone in public "
-"journal"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:270
 msgid "Locking"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Unlock locked repo"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:275
+#: rhodecode/templates/admin/repos/repo_edit.html:268
 msgid "Confirm to unlock repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:278
-msgid "lock repo"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:278
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Lock repo"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:271
 msgid "Confirm to lock repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:279
+#: rhodecode/templates/admin/repos/repo_edit.html:272
 msgid "Repository is not locked"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit.html:277
+msgid "Force locking on repository. Works only when anonymous access is disabled"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit.html:284
-msgid "Force locking on repository. Works only when anonymous access is disabled"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:291
 msgid "Set as fork of"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:296
-msgid "set"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:300
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+msgid "Set"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:293
 msgid "Manually set this repository as a fork of another from the list"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:306
-#: rhodecode/templates/changeset/changeset_file_comment.html:41
-msgid "Delete"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Remove this repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:315
+#: rhodecode/templates/admin/repos/repo_edit.html:308
 msgid "Confirm to delete this repository"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:317
+#: rhodecode/templates/admin/repos/repo_edit.html:310
 #, python-format
 msgid "this repository has %s fork"
 msgid_plural "this repository has %s forks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:318
+#: rhodecode/templates/admin/repos/repo_edit.html:311
 msgid "Detach forks"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:319
+#: rhodecode/templates/admin/repos/repo_edit.html:312
 msgid "Delete forks"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:322
-msgid ""
-"This repository will be renamed in a special way in order to be unaccesible "
-"for RhodeCode and VCS systems. If you need to fully delete it from file "
-"system please do it manually"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit.html:336
+#: rhodecode/templates/admin/repos/repo_edit.html:315
+msgid "This repository will be renamed in a special way in order to be unaccesible for RhodeCode and VCS systems. If you need to fully delete it from file system please do it manually"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:329
 msgid "Extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:348
+#: rhodecode/templates/admin/repos/repo_edit.html:341
 #, python-format
 msgid "Confirm to delete this field: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:362
+#: rhodecode/templates/admin/repos/repo_edit.html:355
 msgid "New field key"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:370
+#: rhodecode/templates/admin/repos/repo_edit.html:363
 msgid "New field label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:373
+#: rhodecode/templates/admin/repos/repo_edit.html:366
 msgid "Enter short label"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:379
+#: rhodecode/templates/admin/repos/repo_edit.html:372
 msgid "New field description"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit.html:382
+#: rhodecode/templates/admin/repos/repo_edit.html:375
 msgid "Enter description of a field"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
 msgid "none"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:4
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
 msgid "read"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
 msgid "write"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:6
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
 msgid "admin"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
 msgid "member"
 msgstr ""
 
@@ -2416,6 +2628,8 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
 msgid "default"
 msgstr ""
 
@@ -2423,36 +2637,38 @@
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
 msgid "revoke"
 msgstr ""
 
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:83
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:80
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
 msgid "Add another member"
 msgstr ""
 
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:100
-msgid "Failed to remove user"
-msgstr ""
-
-#: rhodecode/templates/admin/repos/repo_edit_perms.html:112
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:116
-msgid "Failed to remove user group"
-msgstr ""
-
 #: rhodecode/templates/admin/repos/repos.html:5
 msgid "Repositories administration"
 msgstr ""
 
-#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:86
-msgid "apply to children"
+#: rhodecode/templates/admin/repos/repos.html:88
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
-msgid ""
-"Set or revoke permission to all children of that group, including non-private"
-" repositories and other groups"
+msgid "apply to children"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
+msgid "Set or revoke permission to all children of that group, including non-private repositories and other groups"
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups.html:4
@@ -2475,7 +2691,7 @@
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
-#: rhodecode/templates/base/base.html:70 rhodecode/templates/base/base.html:82
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
 msgid "Repository groups"
 msgstr ""
 
@@ -2505,10 +2721,8 @@
 msgid "Add child group"
 msgstr ""
 
-#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:76
-msgid ""
-"Enable lock-by-pulling on group. This option will be applied to all other "
-"groups and repositories inside"
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
+msgid "Enable lock-by-pulling on group. This option will be applied to all other groups and repositories inside"
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
@@ -2520,15 +2734,21 @@
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
 msgid "Edit"
 msgstr ""
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
 #: rhodecode/templates/base/perms_summary.html:29
-#: rhodecode/templates/base/perms_summary.html:48
-#: rhodecode/templates/base/perms_summary.html:50
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
 #: rhodecode/templates/data_table/_dt_elements.html:116
 #: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
 msgid "edit"
 msgstr ""
 
@@ -2573,10 +2793,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:40
-msgid ""
-"In case a repository was deleted from filesystem and there are leftovers in "
-"the database check this option to scan obsolete data in database and remove "
-"it."
+msgid "In case a repository was deleted from filesystem and there are leftovers in the database check this option to scan obsolete data in database and remove it."
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:41
@@ -2584,9 +2801,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:43
-msgid ""
-"Rescan repositories location for new repositories. Also deletes obsolete if "
-"`destroy` flag is checked "
+msgid "Rescan repositories location for new repositories. Also deletes obsolete if `destroy` flag is checked "
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:48
@@ -2626,8 +2841,8 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:114
-#: rhodecode/templates/admin/settings/settings.html:186
-#: rhodecode/templates/admin/settings/settings.html:277
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
 msgid "Save settings"
 msgstr ""
 
@@ -2640,133 +2855,144 @@
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:134
-msgid "Use lightweight dashboard"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:140
 msgid "Use repository extra fields"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:147
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+msgid "Dashboard items"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid "Number of items displayed in lightweight dashboard before pagination is shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
 msgid "Icons"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:152
+#: rhodecode/templates/admin/settings/settings.html:160
 msgid "Show public repo icon on repositories"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:156
+#: rhodecode/templates/admin/settings/settings.html:164
 msgid "Show private repo icon on repositories"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:163
+#: rhodecode/templates/admin/settings/settings.html:166
+msgid "Show public/private icons next to repositories names"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:172
 msgid "Meta-Tagging"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:168
+#: rhodecode/templates/admin/settings/settings.html:177
 msgid "Stylify recognised metatags:"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:195
-msgid "VCS settings"
-msgstr ""
-
 #: rhodecode/templates/admin/settings/settings.html:204
+msgid "VCS settings"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:213
 msgid "Web"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:209
+#: rhodecode/templates/admin/settings/settings.html:218
 msgid "Require SSL for vcs operations"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:211
-msgid ""
-"RhodeCode will require SSL for pushing or pulling. If SSL is missing it will "
-"return HTTP Error 406: Not Acceptable"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:217
-msgid "Hooks"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:222
-msgid "Update repository after push (hg update)"
+#: rhodecode/templates/admin/settings/settings.html:220
+msgid "RhodeCode will require SSL for pushing or pulling. If SSL is missing it will return HTTP Error 406: Not Acceptable"
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:226
+msgid "Hooks"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:231
+msgid "Update repository after push (hg update)"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:235
 msgid "Show repository size after push"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:230
+#: rhodecode/templates/admin/settings/settings.html:239
 msgid "Log user push commands"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:234
-msgid "Log user pull commands"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:238
-msgid "Advanced setup"
-msgstr ""
-
 #: rhodecode/templates/admin/settings/settings.html:243
-msgid "Mercurial Extensions"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:248
-msgid "Enable largefiles extension"
+msgid "Log user pull commands"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:247
+msgid "Advanced setup"
 msgstr ""
 
 #: rhodecode/templates/admin/settings/settings.html:252
+msgid "Mercurial Extensions"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:257
+msgid "Enable largefiles extension"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:261
 msgid "Enable hgsubversion extension"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:254
-msgid ""
-"Requires hgsubversion library installed. Allows cloning from svn remote "
-"locations"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:264
+#: rhodecode/templates/admin/settings/settings.html:263
+msgid "Requires hgsubversion library installed. Allows cloning from svn remote locations"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:274
 msgid "Repositories location"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:269
-msgid ""
-"This a crucial application setting. If you are really sure you need to change"
-" this, you must restart application in order to make this setting take "
-"effect. Click this label to unlock."
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:270
-#: rhodecode/templates/base/base.html:131
+#: rhodecode/templates/admin/settings/settings.html:279
+msgid "Click to unlock. You must restart RhodeCode in order to make this setting take effect."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
 msgid "Unlock"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:272
-msgid ""
-"Location where repositories are stored. After changing this value a restart, "
-"and rescan is required"
-msgstr ""
-
-#: rhodecode/templates/admin/settings/settings.html:292
+#: rhodecode/templates/admin/settings/settings.html:282
+msgid "Location where repositories are stored. After changing this value a restart, and rescan is required"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:303
 msgid "Test Email"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:300
+#: rhodecode/templates/admin/settings/settings.html:311
 msgid "Email to"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:308
+#: rhodecode/templates/admin/settings/settings.html:319
 msgid "Send"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:314
+#: rhodecode/templates/admin/settings/settings.html:325
 msgid "System Info and Packages"
 msgstr ""
 
-#: rhodecode/templates/admin/settings/settings.html:317
-#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
 msgid "Show"
 msgstr ""
 
@@ -2776,7 +3002,7 @@
 
 #: rhodecode/templates/admin/users/user_add.html:10
 #: rhodecode/templates/admin/users/user_edit.html:11
-#: rhodecode/templates/base/base.html:71
+#: rhodecode/templates/base/base.html:76
 msgid "Users"
 msgstr ""
 
@@ -2833,44 +3059,21 @@
 msgid "New password confirmation"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:158
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
-msgid "Inherit default permissions"
-msgstr ""
-
 #: rhodecode/templates/admin/users/user_edit.html:163
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:113
-#, python-format
-msgid ""
-"Select to inherit permissions from %s settings. With this selected below "
-"options does not have any action"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:169
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
-msgid "Create repositories"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:177
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
-msgid "Fork repositories"
-msgstr ""
-
-#: rhodecode/templates/admin/users/user_edit.html:200
 msgid "Email addresses"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:213
+#: rhodecode/templates/admin/users/user_edit.html:176
 #, python-format
 msgid "Confirm to delete this email: %s"
 msgstr ""
 
-#: rhodecode/templates/admin/users/user_edit.html:227
+#: rhodecode/templates/admin/users/user_edit.html:190
 msgid "New email address"
 msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account.html:5
-#: rhodecode/templates/base/base.html:242
+#: rhodecode/templates/base/base.html:254
 msgid "My account"
 msgstr ""
 
@@ -2907,7 +3110,7 @@
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
-#: rhodecode/templates/pullrequests/pullrequest_data.html:7
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
 #: rhodecode/templates/pullrequests/pullrequest_show.html:27
 #: rhodecode/templates/pullrequests/pullrequest_show.html:42
 msgid "Closed"
@@ -2927,7 +3130,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
-#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
 #, python-format
 msgid "Pull request #%s opened by %s on %s"
 msgstr ""
@@ -2958,12 +3161,12 @@
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:10
 #: rhodecode/templates/admin/users_groups/users_groups.html:11
-#: rhodecode/templates/base/base.html:72
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
 msgid "User groups"
 msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_add.html:12
-#: rhodecode/templates/admin/users_groups/users_groups.html:25
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
 msgid "Add new user group"
 msgstr ""
 
@@ -2976,7 +3179,7 @@
 msgstr ""
 
 #: rhodecode/templates/admin/users_groups/users_group_edit.html:50
-#: rhodecode/templates/admin/users_groups/users_groups.html:35
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
 msgid "Members"
 msgstr ""
 
@@ -2996,45 +3199,53 @@
 msgid "Add all elements"
 msgstr ""
 
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:150
-msgid "Group members"
-msgstr ""
-
-#: rhodecode/templates/admin/users_groups/users_group_edit.html:167
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
 msgid "No members yet"
 msgstr ""
 
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+msgid "Global Permissions"
+msgstr ""
+
 #: rhodecode/templates/admin/users_groups/users_groups.html:5
 msgid "User groups administration"
 msgstr ""
 
-#: rhodecode/templates/admin/users_groups/users_groups.html:47
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
 #, python-format
 msgid "Confirm to delete this user group: %s"
 msgstr ""
 
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+msgid "There are no user groups yet"
+msgstr ""
+
 #: rhodecode/templates/base/base.html:42
-msgid "Submit a bug"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:108
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/pullrequests/pullrequest_show.html:81
 #: rhodecode/templates/summary/summary.html:8
 msgid "Summary"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:109
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
 #: rhodecode/templates/data_table/_dt_elements.html:21
 msgid "Changelog"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:110
+#: rhodecode/templates/base/base.html:123
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
@@ -3042,46 +3253,44 @@
 msgid "Files"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:112
+#: rhodecode/templates/base/base.html:125
 msgid "Switch To"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:114 rhodecode/templates/base/base.html:267
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
 msgid "loading..."
 msgstr ""
 
-#: rhodecode/templates/base/base.html:118
+#: rhodecode/templates/base/base.html:131
 msgid "Options"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:124
+#: rhodecode/templates/base/base.html:137
 #: rhodecode/templates/forks/forks_data.html:21
 msgid "Compare fork"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:126
-msgid "Lightweight changelog"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:127 rhodecode/templates/base/base.html:287
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
 #: rhodecode/templates/search/search.html:14
 #: rhodecode/templates/search/search.html:54
 msgid "Search"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:133
+#: rhodecode/templates/base/base.html:145
 msgid "Lock"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:141
+#: rhodecode/templates/base/base.html:153
 msgid "Follow"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:142
+#: rhodecode/templates/base/base.html:154
 msgid "Unfollow"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:145
+#: rhodecode/templates/base/base.html:157
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
@@ -3090,150 +3299,220 @@
 msgid "Fork"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:147
+#: rhodecode/templates/base/base.html:159
 msgid "Create Pull Request"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Show Pull Requests"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:153
+#: rhodecode/templates/base/base.html:165
 msgid "Pull Requests"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:190
+#: rhodecode/templates/base/base.html:202
 msgid "Not logged in"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:197
+#: rhodecode/templates/base/base.html:209
 msgid "Login to your account"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:220
+#: rhodecode/templates/base/base.html:232
 msgid "Forgot password ?"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:243
+#: rhodecode/templates/base/base.html:255
 msgid "Log Out"
 msgstr ""
 
-#: rhodecode/templates/base/base.html:262
-msgid "Switch repository"
-msgstr ""
-
 #: rhodecode/templates/base/base.html:274
-msgid "Show recent activity"
-msgstr ""
-
-#: rhodecode/templates/base/base.html:275
-#: rhodecode/templates/journal/journal.html:4
-msgid "Journal"
+msgid "Switch repository"
 msgstr ""
 
 #: rhodecode/templates/base/base.html:286
+msgid "Show recent activity"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/journal/journal.html:4
+msgid "Journal"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
 msgid "Search in repositories"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:8
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid "Select to inherit permissions from %s settings. With this selected below options does not apply."
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+msgid "Create user groups"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
 msgid "No permissions defined yet"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:15
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
 msgid "Permission"
 msgstr ""
 
-#: rhodecode/templates/base/perms_summary.html:16
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
 msgid "Edit Permission"
 msgstr ""
 
-#: rhodecode/templates/base/root.html:43
-msgid "Add another comment"
-msgstr ""
-
 #: rhodecode/templates/base/root.html:44
-#: rhodecode/templates/data_table/_dt_elements.html:140
-msgid "Stop following this repository"
+msgid "Add another comment"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:45
-msgid "Start following this repository"
+#: rhodecode/templates/data_table/_dt_elements.html:147
+msgid "Stop following this repository"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:46
-msgid "Group"
+msgid "Start following this repository"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:47
-msgid "members"
+msgid "Group"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:48
-#: rhodecode/templates/pullrequests/pullrequest.html:181
-msgid "Loading ..."
+msgid "members"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:49
-msgid "Search truncated"
+#: rhodecode/templates/pullrequests/pullrequest.html:203
+msgid "Loading ..."
 msgstr ""
 
 #: rhodecode/templates/base/root.html:50
-msgid "No matching files"
+msgid "Search truncated"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:51
-#: rhodecode/templates/changelog/changelog.html:36
-msgid "Open new pull request"
+msgid "No matching files"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:52
-msgid "Open new pull request for selected changesets"
+#: rhodecode/templates/changelog/changelog.html:45
+msgid "Open new pull request"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:53
-msgid "Show selected changesets __S -> __E"
+msgid "Open new pull request for selected changesets"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:54
-msgid "Show selected changeset __S"
+msgid "Show selected changesets __S -> __E"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:55
-msgid "Selection link"
+msgid "Show selected changeset __S"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:56
-#: rhodecode/templates/changeset/diff_block.html:8
-msgid "Collapse diff"
+msgid "Selection link"
 msgstr ""
 
 #: rhodecode/templates/base/root.html:57
+#: rhodecode/templates/changeset/diff_block.html:8
+msgid "Collapse diff"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:58
 msgid "Expand diff"
 msgstr ""
 
+#: rhodecode/templates/base/root.html:59
+msgid "Failed to revoke permission"
+msgstr ""
+
 #: rhodecode/templates/bookmarks/bookmarks.html:5
 #, python-format
 msgid "%s Bookmarks"
 msgstr ""
 
-#: rhodecode/templates/bookmarks/bookmarks.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+msgid "Compare bookmarks"
+msgstr ""
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
 #: rhodecode/templates/branches/branches.html:50
 #: rhodecode/templates/branches/branches_data.html:8
-#: rhodecode/templates/shortlog/shortlog_data.html:8
-#: rhodecode/templates/tags/tags.html:51 rhodecode/templates/tags/tags_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
+#: rhodecode/templates/tags/tags.html:51
+#: rhodecode/templates/tags/tags_data.html:8
 msgid "Author"
 msgstr ""
 
-#: rhodecode/templates/bookmarks/bookmarks.html:38
+#: rhodecode/templates/bookmarks/bookmarks.html:52
 #: rhodecode/templates/bookmarks/bookmarks_data.html:9
 #: rhodecode/templates/branches/branches.html:51
 #: rhodecode/templates/branches/branches_data.html:9
-#: rhodecode/templates/shortlog/shortlog_data.html:5
-#: rhodecode/templates/tags/tags.html:52 rhodecode/templates/tags/tags_data.html:9
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
+#: rhodecode/templates/tags/tags.html:52
+#: rhodecode/templates/tags/tags_data.html:9
 msgid "Revision"
 msgstr ""
 
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr ""
+
 #: rhodecode/templates/branches/branches.html:5
 #, python-format
 msgid "%s Branches"
@@ -3243,64 +3522,68 @@
 msgid "Compare branches"
 msgstr ""
 
-#: rhodecode/templates/branches/branches.html:53
-#: rhodecode/templates/branches/branches_data.html:10
-#: rhodecode/templates/tags/tags.html:54 rhodecode/templates/tags/tags_data.html:10
-msgid "Compare"
-msgstr ""
-
 #: rhodecode/templates/changelog/changelog.html:6
 #, python-format
 msgid "%s Changelog"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:11
+#: rhodecode/templates/changelog/changelog.html:19
 #, python-format
 msgid "showing %d out of %d revision"
 msgid_plural "showing %d out of %d revisions"
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changelog/changelog.html:30
+#: rhodecode/templates/changelog/changelog.html:39
 msgid "Clear selection"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 #: rhodecode/templates/forks/forks_data.html:19
 #, python-format
 msgid "Compare fork with %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:33
+#: rhodecode/templates/changelog/changelog.html:42
 msgid "Compare fork with parent"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:76
-#: rhodecode/templates/summary/summary.html:404
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
 msgid "Show more"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:89
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
 #: rhodecode/templates/changeset/changeset_range.html:86
 #, python-format
 msgid "Bookmark %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:95
-#: rhodecode/templates/changeset/changeset.html:111
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
 #: rhodecode/templates/changeset/changeset_range.html:92
 #, python-format
 msgid "Tag %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:100
-#: rhodecode/templates/changeset/changeset.html:106
-#: rhodecode/templates/changeset/changeset_range.html:80
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
 #, python-format
 msgid "Branch %s"
 msgstr ""
 
-#: rhodecode/templates/changelog/changelog.html:258
+#: rhodecode/templates/changelog/changelog.html:286
 msgid "There are no changes yet"
 msgstr ""
 
@@ -3329,6 +3612,38 @@
 msgid "Affected %s files"
 msgstr ""
 
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+msgid "Commit message"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+msgid "Age"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset.html:6
 #, python-format
 msgid "%s Changeset"
@@ -3349,7 +3664,7 @@
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:67
-#: rhodecode/templates/changeset/diff_block.html:23
+#: rhodecode/templates/changeset/diff_block.html:22
 msgid "Raw diff"
 msgstr ""
 
@@ -3358,12 +3673,12 @@
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:69
-#: rhodecode/templates/changeset/diff_block.html:24
+#: rhodecode/templates/changeset/diff_block.html:23
 msgid "Download diff"
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -3371,7 +3686,7 @@
 msgstr[1] ""
 
 #: rhodecode/templates/changeset/changeset.html:73
-#: rhodecode/templates/changeset/changeset_file_comment.html:97
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
 #, python-format
 msgid "(%d inline)"
 msgid_plural "(%d inline)"
@@ -3379,11 +3694,11 @@
 msgstr[1] ""
 
 #: rhodecode/templates/changeset/changeset.html:103
-#: rhodecode/templates/changeset/changeset_range.html:77
+#: rhodecode/templates/changeset/changeset_range.html:82
 msgid "merge"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:119
+#: rhodecode/templates/changeset/changeset.html:126
 #: rhodecode/templates/compare/compare_diff.html:40
 #: rhodecode/templates/pullrequests/pullrequest_show.html:113
 #, python-format
@@ -3392,7 +3707,7 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:121
+#: rhodecode/templates/changeset/changeset.html:128
 #: rhodecode/templates/compare/compare_diff.html:42
 #: rhodecode/templates/pullrequests/pullrequest_show.html:115
 #, python-format
@@ -3401,15 +3716,15 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
 #: rhodecode/templates/pullrequests/pullrequest_show.html:195
 msgid "Showing a huge diff might take some time and resources"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset.html:134
-#: rhodecode/templates/changeset/changeset.html:146
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
 #: rhodecode/templates/compare/compare_diff.html:58
 #: rhodecode/templates/compare/compare_diff.html:69
 #: rhodecode/templates/pullrequests/pullrequest_show.html:131
@@ -3427,51 +3742,63 @@
 msgid "Comment on pull request #%s"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:57
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
 msgid "Submitting..."
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:60
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
 msgid "Commenting on line {1}."
 msgstr ""
 
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
+#, python-format
+msgid "Comments parsed using %s syntax with %s support."
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset_file_comment.html:61
-#: rhodecode/templates/changeset/changeset_file_comment.html:139
-#, python-format
-msgid "Comments parsed using %s syntax with %s support."
-msgstr ""
-
-#: rhodecode/templates/changeset/changeset_file_comment.html:63
-#: rhodecode/templates/changeset/changeset_file_comment.html:141
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
 msgid "Use @username inside this text to send notification to this RhodeCode user"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:74
-#: rhodecode/templates/changeset/changeset_file_comment.html:161
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+msgid "Preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+msgid "Comment preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
 msgid "Comment"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:75
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
 msgid "Cancel"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "You need to be logged in to comment."
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:82
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
 msgid "Login now"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:86
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
 msgid "Hide"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:143
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
 msgid "Change status"
 msgstr ""
 
-#: rhodecode/templates/changeset/changeset_file_comment.html:163
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
 msgid "Comment and close"
 msgstr ""
 
@@ -3484,19 +3811,19 @@
 msgid "Files affected"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:22
+#: rhodecode/templates/changeset/diff_block.html:21
 msgid "Show full diff for this file"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:30
+#: rhodecode/templates/changeset/diff_block.html:29
 msgid "Show inline comments"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:55
+#: rhodecode/templates/changeset/diff_block.html:53
 msgid "Show file at latest version in this repo"
 msgstr ""
 
-#: rhodecode/templates/changeset/diff_block.html:56
+#: rhodecode/templates/changeset/diff_block.html:54
 msgid "Show file at initial version in this repo"
 msgstr ""
 
@@ -3571,27 +3898,24 @@
 msgid "Confirm to delete this repository: %s"
 msgstr ""
 
-#: rhodecode/templates/data_table/_dt_elements.html:131
+#: rhodecode/templates/data_table/_dt_elements.html:137
 #, python-format
 msgid "Confirm to delete this user: %s"
 msgstr ""
 
-#: rhodecode/templates/email_templates/changeset_comment.html:9
-#: rhodecode/templates/email_templates/pull_request_comment.html:15
-msgid "New status"
-msgstr ""
-
-#: rhodecode/templates/email_templates/changeset_comment.html:11
-#: rhodecode/templates/email_templates/pull_request_comment.html:9
-msgid "View this comment here"
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+msgid "URL"
+msgstr ""
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, python-format
+msgid "%s commented on a %s changeset."
 msgstr ""
 
 #: rhodecode/templates/email_templates/changeset_comment.html:14
-msgid "Repo"
-msgstr ""
-
-#: rhodecode/templates/email_templates/changeset_comment.html:16
-msgid "desc"
+msgid "The changeset status was changed to"
 msgstr ""
 
 #: rhodecode/templates/email_templates/main.html:8
@@ -3611,45 +3935,36 @@
 msgid "You can generate it by clicking following URL"
 msgstr ""
 
-#: rhodecode/templates/email_templates/password_reset.html:11
-msgid "If you did not request new password please ignore this email."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:4
-#, python-format
-msgid "User %s opened pull request for repository %s and wants you to review changes."
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:5
-msgid "View this pull request here"
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
 msgstr ""
 
 #: rhodecode/templates/email_templates/pull_request.html:6
-msgid "title"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:7
-msgid "description"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request.html:12
-msgid "revisions for reviewing"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:3
+#, python-format
+msgid "%s opened a pull request for repository %s and wants you to review changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
 #, python-format
-msgid "Pull request #%s for repository %s"
-msgstr ""
-
-#: rhodecode/templates/email_templates/pull_request_comment.html:13
-msgid "Closing pull request with status"
-msgstr ""
-
-#: rhodecode/templates/email_templates/registration.html:4
-msgid "A new user have registered in RhodeCode"
-msgstr ""
-
-#: rhodecode/templates/email_templates/registration.html:9
+msgid "%s commented on pull request \"%s\""
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+msgid "Pull request was closed with status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+msgid "Pull request changed status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/registration.html:6
 msgid "View this user here"
 msgstr ""
 
@@ -3667,7 +3982,8 @@
 msgid "File diff"
 msgstr ""
 
-#: rhodecode/templates/files/files.html:4 rhodecode/templates/files/files.html:76
+#: rhodecode/templates/files/files.html:4
+#: rhodecode/templates/files/files.html:76
 #, python-format
 msgid "%s Files"
 msgstr ""
@@ -3675,7 +3991,6 @@
 #: rhodecode/templates/files/files.html:30
 #: rhodecode/templates/files/files_add.html:31
 #: rhodecode/templates/files/files_edit.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:9
 msgid "Branch"
 msgstr ""
 
@@ -3688,12 +4003,6 @@
 msgid "Add file"
 msgstr ""
 
-#: rhodecode/templates/files/files_add.html:38
-#: rhodecode/templates/files/files_browser.html:31
-#: rhodecode/templates/shortlog/shortlog_data.html:78
-msgid "Add new file"
-msgstr ""
-
 #: rhodecode/templates/files/files_add.html:43
 msgid "File Name"
 msgstr ""
@@ -3722,12 +4031,6 @@
 msgid "use / to separate directories"
 msgstr ""
 
-#: rhodecode/templates/files/files_add.html:75
-#: rhodecode/templates/files/files_edit.html:61
-#: rhodecode/templates/shortlog/shortlog_data.html:6
-msgid "Commit message"
-msgstr ""
-
 #: rhodecode/templates/files/files_add.html:79
 #: rhodecode/templates/files/files_edit.html:65
 msgid "Commit changes"
@@ -3791,12 +4094,6 @@
 msgid "Show annotation"
 msgstr ""
 
-#: rhodecode/templates/files/files_edit.html:48
-#: rhodecode/templates/files/files_source.html:25
-#: rhodecode/templates/files/files_source.html:55
-msgid "Show as raw"
-msgstr ""
-
 #: rhodecode/templates/files/files_edit.html:49
 #: rhodecode/templates/files/files_source.html:26
 msgid "Download as raw"
@@ -3985,36 +4282,47 @@
 msgid "New pull request"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:52
-msgid "Detailed compare view"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+msgid "Write a short description on this pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+msgid "Changeset flow"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+msgid "Origin repository"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
 #: rhodecode/templates/pullrequests/pullrequest_show.html:137
 msgid "Pull request reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:65
+#: rhodecode/templates/pullrequests/pullrequest.html:103
 #: rhodecode/templates/pullrequests/pullrequest_show.html:149
 msgid "owner"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:77
+#: rhodecode/templates/pullrequests/pullrequest.html:115
 msgid "Add reviewer to this pull request."
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest.html:83
-msgid "Create new pull request"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:92
-#: rhodecode/templates/pullrequests/pullrequest_data.html:14
-#: rhodecode/templates/pullrequests/pullrequest_show.html:25
-msgid "Title"
-msgstr ""
-
-#: rhodecode/templates/pullrequests/pullrequest.html:109
-msgid "Send pull request"
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+msgid "Destination repository"
 msgstr ""
 
 #: rhodecode/templates/pullrequests/pullrequest_show.html:4
@@ -4045,10 +4353,6 @@
 msgid "Pull request was reviewed by all reviewers"
 msgstr ""
 
-#: rhodecode/templates/pullrequests/pullrequest_show.html:65
-msgid "Origin repository"
-msgstr ""
-
 #: rhodecode/templates/pullrequests/pullrequest_show.html:89
 msgid "Created on"
 msgstr ""
@@ -4109,37 +4413,6 @@
 msgid "Permission denied"
 msgstr ""
 
-#: rhodecode/templates/shortlog/shortlog.html:5
-#, python-format
-msgid "%s Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog.html:11
-#: rhodecode/templates/shortlog/shortlog.html:15
-msgid "Lightweight Changelog"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:7
-msgid "Age"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:20
-#, python-format
-msgid "Click to open associated pull request #%s"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:75
-msgid "Add or upload files directly via RhodeCode"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:84
-msgid "Push new repo"
-msgstr ""
-
-#: rhodecode/templates/shortlog/shortlog_data.html:92
-msgid "Existing repository?"
-msgstr ""
-
 #: rhodecode/templates/summary/summary.html:4
 #, python-format
 msgid "%s Summary"
@@ -4178,7 +4451,7 @@
 msgid "Fork of"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
 msgid "Remote clone"
 msgstr ""
 
@@ -4204,8 +4477,7 @@
 
 #: rhodecode/templates/summary/summary.html:151
 #: rhodecode/templates/summary/summary.html:167
-#: rhodecode/templates/summary/summary.html:232
-msgid "enable"
+msgid "Enable"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:159
@@ -4220,7 +4492,7 @@
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:171
+#: rhodecode/templates/summary/summary.html:170
 msgid "Download as zip"
 msgstr ""
 
@@ -4245,6 +4517,10 @@
 msgid "Commit activity by day / author"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:235
 msgid "Stats gathered: "
 msgstr ""
@@ -4259,51 +4535,47 @@
 
 #: rhodecode/templates/summary/summary.html:272
 #, python-format
-msgid "Readme file at revision '%s'"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:275
-msgid "Permalink to this readme"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:333
+msgid "Readme file from revision %s"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:332
 #, python-format
 msgid "Download %s as %s"
 msgstr ""
 
-#: rhodecode/templates/summary/summary.html:380
+#: rhodecode/templates/summary/summary.html:379
 msgid "files"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:689
+msgid "commits"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:690
-msgid "commits"
+msgid "files added"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:691
-msgid "files added"
+msgid "files changed"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:692
-msgid "files changed"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:693
 msgid "files removed"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:694
+msgid "commit"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:695
-msgid "commit"
+msgid "file added"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:696
-msgid "file added"
+msgid "file changed"
 msgstr ""
 
 #: rhodecode/templates/summary/summary.html:697
-msgid "file changed"
-msgstr ""
-
-#: rhodecode/templates/summary/summary.html:698
 msgid "file removed"
 msgstr ""
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/i18n/ru/LC_MESSAGES/rhodecode.po	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,4684 @@
+# Translations template for RhodeCode.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the RhodeCode project.
+# 
+# Translators:
+# mokeev1995 <mokeev_andre@mail.ru>, 2013
+# ivlevdenis <ivlevdenis.ru@gmail.com>, 2013
+# Михаил Жолобов <legal90@gmail.com>, 2013
+# Andrey Mivrenik <myvrenik@gmail.com>, 2013
+# zhmylove <zhmylove@narod.ru>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: RhodeCode\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-06-01 18:38+0200\n"
+"PO-Revision-Date: 2013-06-02 08:29+0000\n"
+"Last-Translator: marcinkuzminski <marcin@python-blog.com>\n"
+"Language-Team: Russian (http://www.transifex.com/projects/p/RhodeCode/language/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: rhodecode/controllers/changelog.py:149
+msgid "All Branches"
+msgstr "Все ветки"
+
+#: rhodecode/controllers/changeset.py:84
+msgid "Show white space"
+msgstr ""
+
+#: rhodecode/controllers/changeset.py:91 rhodecode/controllers/changeset.py:98
+msgid "Ignore white space"
+msgstr ""
+
+#: rhodecode/controllers/changeset.py:164
+#, python-format
+msgid "%s line context"
+msgstr "контекст строки %s"
+
+#: rhodecode/controllers/changeset.py:345
+#: rhodecode/controllers/pullrequests.py:481
+#, python-format
+msgid "Status change -> %s"
+msgstr ""
+
+#: rhodecode/controllers/changeset.py:376
+msgid ""
+"Changing status on a changeset associated with a closed pull request is not "
+"allowed"
+msgstr ""
+
+#: rhodecode/controllers/compare.py:74
+#: rhodecode/controllers/pullrequests.py:259
+msgid "There are no changesets yet"
+msgstr ""
+
+#: rhodecode/controllers/error.py:69
+msgid "Home page"
+msgstr "Домашняя страница"
+
+#: rhodecode/controllers/error.py:98
+msgid ""
+"The request could not be understood by the server due to malformed syntax."
+msgstr "Запрос не распознан сервером из-за неправильного синтаксиса."
+
+#: rhodecode/controllers/error.py:101
+msgid "Unauthorized access to resource"
+msgstr "Несанкционированный доступ к ресурсу"
+
+#: rhodecode/controllers/error.py:103
+msgid "You don't have permission to view this page"
+msgstr "У вас нет прав для просмотра этой страницы"
+
+#: rhodecode/controllers/error.py:105
+msgid "The resource could not be found"
+msgstr "Ресурс не найден"
+
+#: rhodecode/controllers/error.py:107
+msgid ""
+"The server encountered an unexpected condition which prevented it from "
+"fulfilling the request."
+msgstr "Сервер не может выполнить запрос, из-за неправильного условия в запросе"
+
+#: rhodecode/controllers/feed.py:52
+#, python-format
+msgid "Changes on %s repository"
+msgstr "Изменения в репозитарии %s"
+
+#: rhodecode/controllers/feed.py:53
+#, python-format
+msgid "%s %s feed"
+msgstr "%s %s обзор"
+
+#: rhodecode/controllers/feed.py:86
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
+#: rhodecode/templates/compare/compare_diff.html:58
+#: rhodecode/templates/compare/compare_diff.html:69
+#: rhodecode/templates/pullrequests/pullrequest_show.html:131
+#: rhodecode/templates/pullrequests/pullrequest_show.html:195
+msgid "Changeset was too big and was cut off..."
+msgstr "Изменения оказались слишком большими и были вырезаны..."
+
+#: rhodecode/controllers/feed.py:90
+#, python-format
+msgid "%s committed on %s"
+msgstr ""
+
+#: rhodecode/controllers/files.py:89
+msgid "Click here to add new file"
+msgstr ""
+
+#: rhodecode/controllers/files.py:90
+#, python-format
+msgid "There are no files yet %s"
+msgstr "Отсутствуют файлы %s"
+
+#: rhodecode/controllers/files.py:271 rhodecode/controllers/files.py:339
+#, python-format
+msgid "This repository is has been locked by %s on %s"
+msgstr ""
+
+#: rhodecode/controllers/files.py:283
+msgid "You can only edit files with revision being a valid branch "
+msgstr ""
+
+#: rhodecode/controllers/files.py:297
+#, python-format
+msgid "Edited file %s via RhodeCode"
+msgstr ""
+
+#: rhodecode/controllers/files.py:313
+msgid "No changes"
+msgstr "Без изменений"
+
+#: rhodecode/controllers/files.py:322 rhodecode/controllers/files.py:394
+#, python-format
+msgid "Successfully committed to %s"
+msgstr "Изменения применены в %s"
+
+#: rhodecode/controllers/files.py:327 rhodecode/controllers/files.py:405
+msgid "Error occurred during commit"
+msgstr "Во время фиксации произошла ошибка"
+
+#: rhodecode/controllers/files.py:351
+msgid "Added file via RhodeCode"
+msgstr ""
+
+#: rhodecode/controllers/files.py:368
+msgid "No content"
+msgstr "Пусто"
+
+#: rhodecode/controllers/files.py:372
+msgid "No filename"
+msgstr "Безымянный"
+
+#: rhodecode/controllers/files.py:397
+msgid "Location must be relative path and must not contain .. in path"
+msgstr ""
+
+#: rhodecode/controllers/files.py:431
+msgid "Downloads disabled"
+msgstr ""
+
+#: rhodecode/controllers/files.py:442
+#, python-format
+msgid "Unknown revision %s"
+msgstr "Неизвестная версия %s"
+
+#: rhodecode/controllers/files.py:444
+msgid "Empty repository"
+msgstr "Пустой репозитарий"
+
+#: rhodecode/controllers/files.py:446
+msgid "Unknown archive type"
+msgstr "Неизвестный тип архива"
+
+#: rhodecode/controllers/files.py:631
+#: rhodecode/templates/changeset/changeset_range.html:9
+#: rhodecode/templates/email_templates/pull_request.html:12
+#: rhodecode/templates/pullrequests/pullrequest.html:124
+msgid "Changesets"
+msgstr "Изменения"
+
+#: rhodecode/controllers/files.py:632
+#: rhodecode/controllers/pullrequests.py:152
+#: rhodecode/controllers/summary.py:76 rhodecode/model/scm.py:682
+#: rhodecode/templates/switch_to_list.html:3
+#: rhodecode/templates/branches/branches.html:10
+msgid "Branches"
+msgstr "Ветки"
+
+#: rhodecode/controllers/files.py:633
+#: rhodecode/controllers/pullrequests.py:153
+#: rhodecode/controllers/summary.py:77 rhodecode/model/scm.py:693
+#: rhodecode/templates/switch_to_list.html:15
+#: rhodecode/templates/tags/tags.html:10
+msgid "Tags"
+msgstr "Метки"
+
+#: rhodecode/controllers/forks.py:176
+#, python-format
+msgid "Forked repository %s as %s"
+msgstr ""
+
+#: rhodecode/controllers/forks.py:190
+#, python-format
+msgid "An error occurred during repository forking %s"
+msgstr "Произошла ошибка во время создания форка репозитория %s"
+
+#: rhodecode/controllers/journal.py:110 rhodecode/controllers/journal.py:153
+msgid "public journal"
+msgstr "общедоступный журнал"
+
+#: rhodecode/controllers/journal.py:114 rhodecode/controllers/journal.py:157
+#: rhodecode/templates/journal/journal.html:12
+msgid "journal"
+msgstr "журнал"
+
+#: rhodecode/controllers/login.py:138
+msgid "You have successfully registered into RhodeCode"
+msgstr ""
+
+#: rhodecode/controllers/login.py:159
+msgid "Your password reset link was sent"
+msgstr "Ссылка для сброса пароля отправлена"
+
+#: rhodecode/controllers/login.py:179
+msgid ""
+"Your password reset was successful, new password has been sent to your email"
+msgstr "Сброс пароля прошел успешно, новый пароль был отправлен на ваш email"
+
+#: rhodecode/controllers/pullrequests.py:139
+#: rhodecode/templates/changeset/changeset.html:10
+#: rhodecode/templates/email_templates/changeset_comment.html:8
+msgid "Changeset"
+msgstr "Изменения"
+
+#: rhodecode/controllers/pullrequests.py:149
+msgid "Special"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:150
+msgid "Peer branches"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:151 rhodecode/model/scm.py:688
+#: rhodecode/templates/switch_to_list.html:28
+#: rhodecode/templates/bookmarks/bookmarks.html:10
+msgid "Bookmarks"
+msgstr "Закладки"
+
+#: rhodecode/controllers/pullrequests.py:324
+msgid "Pull request requires a title with min. 3 chars"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:326
+msgid "Error creating pull request"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:346
+msgid "Successfully opened new pull request"
+msgstr "Pull запрос создан успешно"
+
+#: rhodecode/controllers/pullrequests.py:349
+msgid "Error occurred during sending pull request"
+msgstr "Произошла ошибка при создании Pull запроса"
+
+#: rhodecode/controllers/pullrequests.py:388
+msgid "Successfully deleted pull request"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:484
+msgid "Closing with"
+msgstr ""
+
+#: rhodecode/controllers/pullrequests.py:521
+msgid ""
+"Closing pull request on other statuses than rejected or approved forbidden"
+msgstr ""
+
+#: rhodecode/controllers/search.py:132
+msgid "Invalid search query. Try quoting it."
+msgstr "Недопустимый поисковый запрос. Попробуйте заключить его в кавычки."
+
+#: rhodecode/controllers/search.py:137
+msgid "There is no index to search in. Please run whoosh indexer"
+msgstr "Индексы отсутствуют. Пожалуйста, запустите индексатор."
+
+#: rhodecode/controllers/search.py:141
+msgid "An error occurred during this search operation"
+msgstr "Произошла ошибка при выполнении этого поиска"
+
+#: rhodecode/controllers/summary.py:182
+msgid "No data loaded yet"
+msgstr "Данные пока не загружены"
+
+#: rhodecode/controllers/summary.py:188
+#: rhodecode/templates/summary/summary.html:149
+msgid "Statistics are disabled for this repository"
+msgstr "Статистические данные отключены для этого репозитария"
+
+#: rhodecode/controllers/admin/defaults.py:96
+msgid "Default settings updated successfully"
+msgstr ""
+
+#: rhodecode/controllers/admin/defaults.py:110
+msgid "Error occurred during update of defaults"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:56
+msgid "forever"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:57
+msgid "5 minutes"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:58
+msgid "1 hour"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:59
+msgid "1 day"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:60
+msgid "1 month"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:62
+msgid "Lifetime"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:127
+msgid "Error occurred during gist creation"
+msgstr ""
+
+#: rhodecode/controllers/admin/gists.py:165
+#, python-format
+msgid "Deleted gist %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/ldap_settings.py:50
+msgid "BASE"
+msgstr "BASE"
+
+#: rhodecode/controllers/admin/ldap_settings.py:51
+msgid "ONELEVEL"
+msgstr "ONELEVEL"
+
+#: rhodecode/controllers/admin/ldap_settings.py:52
+msgid "SUBTREE"
+msgstr "SUBTREE"
+
+#: rhodecode/controllers/admin/ldap_settings.py:56
+msgid "NEVER"
+msgstr "NEVER"
+
+#: rhodecode/controllers/admin/ldap_settings.py:57
+msgid "ALLOW"
+msgstr "ALLOW"
+
+#: rhodecode/controllers/admin/ldap_settings.py:58
+msgid "TRY"
+msgstr "TRY"
+
+#: rhodecode/controllers/admin/ldap_settings.py:59
+msgid "DEMAND"
+msgstr "DEMAND"
+
+#: rhodecode/controllers/admin/ldap_settings.py:60
+msgid "HARD"
+msgstr "HARD"
+
+#: rhodecode/controllers/admin/ldap_settings.py:64
+msgid "No encryption"
+msgstr "Без шифрования"
+
+#: rhodecode/controllers/admin/ldap_settings.py:65
+msgid "LDAPS connection"
+msgstr "Соединение LDAPS"
+
+#: rhodecode/controllers/admin/ldap_settings.py:66
+msgid "START_TLS on LDAP connection"
+msgstr ""
+
+#: rhodecode/controllers/admin/ldap_settings.py:124
+msgid "LDAP settings updated successfully"
+msgstr ""
+
+#: rhodecode/controllers/admin/ldap_settings.py:128
+msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
+msgstr "Невозможно использовать LDAP. Библиотека \"python-ldap\" недоступна."
+
+#: rhodecode/controllers/admin/ldap_settings.py:145
+msgid "Error occurred during update of ldap settings"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:58
+#: rhodecode/controllers/admin/permissions.py:62
+#: rhodecode/controllers/admin/permissions.py:66
+msgid "None"
+msgstr "Ничего"
+
+#: rhodecode/controllers/admin/permissions.py:59
+#: rhodecode/controllers/admin/permissions.py:63
+#: rhodecode/controllers/admin/permissions.py:67
+msgid "Read"
+msgstr "Чтение"
+
+#: rhodecode/controllers/admin/permissions.py:60
+#: rhodecode/controllers/admin/permissions.py:64
+#: rhodecode/controllers/admin/permissions.py:68
+msgid "Write"
+msgstr "Запись"
+
+#: rhodecode/controllers/admin/permissions.py:61
+#: rhodecode/controllers/admin/permissions.py:65
+#: rhodecode/controllers/admin/permissions.py:69
+#: rhodecode/templates/admin/defaults/defaults.html:9
+#: rhodecode/templates/admin/ldap/ldap.html:9
+#: rhodecode/templates/admin/permissions/permissions.html:9
+#: rhodecode/templates/admin/repos/repo_add.html:10
+#: rhodecode/templates/admin/repos/repo_add.html:14
+#: rhodecode/templates/admin/repos/repos.html:9
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:9
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:9
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:11
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:13
+#: rhodecode/templates/admin/settings/hooks.html:9
+#: rhodecode/templates/admin/settings/settings.html:9
+#: rhodecode/templates/admin/users/user_add.html:8
+#: rhodecode/templates/admin/users/user_edit.html:9
+#: rhodecode/templates/admin/users/user_edit.html:133
+#: rhodecode/templates/admin/users/users.html:9
+#: rhodecode/templates/admin/users/users.html:85
+#: rhodecode/templates/admin/users_groups/users_group_add.html:8
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:9
+#: rhodecode/templates/admin/users_groups/users_groups.html:9
+#: rhodecode/templates/base/base.html:317
+#: rhodecode/templates/base/base.html:318
+#: rhodecode/templates/base/base.html:324
+#: rhodecode/templates/base/base.html:325
+msgid "Admin"
+msgstr "Администратор"
+
+#: rhodecode/controllers/admin/permissions.py:72
+#: rhodecode/controllers/admin/permissions.py:83
+#: rhodecode/controllers/admin/permissions.py:86
+#: rhodecode/controllers/admin/permissions.py:89
+#: rhodecode/controllers/admin/permissions.py:92
+msgid "Disabled"
+msgstr "Отключено"
+
+#: rhodecode/controllers/admin/permissions.py:74
+msgid "Allowed with manual account activation"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:76
+msgid "Allowed with automatic account activation"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:79
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1439 rhodecode/model/db.py:1444
+msgid "Manual activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:80
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1440 rhodecode/model/db.py:1445
+msgid "Automatic activation of external account"
+msgstr ""
+
+#: rhodecode/controllers/admin/permissions.py:84
+#: rhodecode/controllers/admin/permissions.py:87
+#: rhodecode/controllers/admin/permissions.py:90
+#: rhodecode/controllers/admin/permissions.py:93
+msgid "Enabled"
+msgstr "Включено"
+
+#: rhodecode/controllers/admin/permissions.py:138
+msgid "Default permissions updated successfully"
+msgstr "Стандартные привилегии успешно обновлены"
+
+#: rhodecode/controllers/admin/permissions.py:152
+msgid "Error occurred during update of permissions"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:128
+msgid "--REMOVE FORK--"
+msgstr "--УДАЛИТЬ ФОРК--"
+
+#: rhodecode/controllers/admin/repos.py:168
+#, python-format
+msgid "Created repository %s from %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:174
+#, python-format
+msgid "Created repository %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:197
+#, python-format
+msgid "Error creating repository %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:270
+#, python-format
+msgid "Repository %s updated successfully"
+msgstr "Репозитарий %s успешно обновлён"
+
+#: rhodecode/controllers/admin/repos.py:288
+#, python-format
+msgid "Error occurred during update of repository %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:315
+#, python-format
+msgid "Detached %s forks"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:318
+#, python-format
+msgid "Deleted %s forks"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:323
+#, python-format
+msgid "Deleted repository %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:326
+#, python-format
+msgid "Cannot delete %s it still contains attached forks"
+msgstr "Невозможно удалить %s, он всё-ещё содержит форки"
+
+#: rhodecode/controllers/admin/repos.py:331
+#, python-format
+msgid "An error occurred during deletion of %s"
+msgstr "Произошла ошибка во время удаления %s"
+
+#: rhodecode/controllers/admin/repos.py:345
+msgid "Repository permissions updated"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:375
+#: rhodecode/controllers/admin/repos_groups.py:332
+#: rhodecode/controllers/admin/users_groups.py:312
+msgid "An error occurred during revoking of permission"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:392
+msgid "An error occurred during deletion of repository stats"
+msgstr "Произошла ошибка при удалении статистики репозитория"
+
+#: rhodecode/controllers/admin/repos.py:409
+msgid "An error occurred during cache invalidation"
+msgstr "Произошла ошибка при очистке кэша"
+
+#: rhodecode/controllers/admin/repos.py:429
+#: rhodecode/controllers/admin/repos.py:456
+msgid "An error occurred during unlocking"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:447
+msgid "Unlocked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:450
+msgid "Locked"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:452
+#, python-format
+msgid "Repository has been %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:476
+msgid "Updated repository visibility in public journal"
+msgstr "Видимость репозитория в публичном журнале обновлена"
+
+#: rhodecode/controllers/admin/repos.py:480
+msgid "An error occurred during setting this repository in public journal"
+msgstr "Произошла ошибка при установке репозитария в общедоступный журнал"
+
+#: rhodecode/controllers/admin/repos.py:485 rhodecode/model/validators.py:302
+msgid "Token mismatch"
+msgstr "Несовпадение токенов"
+
+#: rhodecode/controllers/admin/repos.py:498
+msgid "Pulled from remote location"
+msgstr "Получено от удалённого репозитория"
+
+#: rhodecode/controllers/admin/repos.py:501
+msgid "An error occurred during pull from remote location"
+msgstr "Произошла ошибка при получении данных из удалённого репозитория "
+
+#: rhodecode/controllers/admin/repos.py:517
+msgid "Nothing"
+msgstr "Ничего"
+
+#: rhodecode/controllers/admin/repos.py:519
+#, python-format
+msgid "Marked repo %s as fork of %s"
+msgstr "Отмеченный репозиторий %s форком %s"
+
+#: rhodecode/controllers/admin/repos.py:523
+msgid "An error occurred during this operation"
+msgstr "Произошла ошибка при выполнении операции"
+
+#: rhodecode/controllers/admin/repos.py:562
+msgid "An error occurred during creation of field"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos.py:576
+msgid "An error occurred during removal of field"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:147
+#, python-format
+msgid "Created repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:159
+#, python-format
+msgid "Error occurred during creation of repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:217
+#, python-format
+msgid "Updated repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:232
+#, python-format
+msgid "Error occurred during update of repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:250
+#, python-format
+msgid "This group contains %s repositores and cannot be deleted"
+msgstr "Данная группа содержит %s репозитариев и не может быть удалена"
+
+#: rhodecode/controllers/admin/repos_groups.py:257
+#, python-format
+msgid "This group contains %s subgroups and cannot be deleted"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:263
+#, python-format
+msgid "Removed repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:268
+#, python-format
+msgid "Error occurred during deletion of repository group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:279
+#: rhodecode/controllers/admin/repos_groups.py:314
+#: rhodecode/controllers/admin/users_groups.py:300
+msgid "Cannot revoke permission for yourself as admin"
+msgstr ""
+
+#: rhodecode/controllers/admin/repos_groups.py:294
+msgid "Repository Group permissions updated"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:123
+#, python-format
+msgid "Repositories successfully rescanned added: %s ; removed: %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:132
+msgid "Whoosh reindex task scheduled"
+msgstr "Запланирована переиндексация базы Whoosh"
+
+#: rhodecode/controllers/admin/settings.py:163
+msgid "Updated application settings"
+msgstr "Обновленные параметры настройки приложения"
+
+#: rhodecode/controllers/admin/settings.py:167
+#: rhodecode/controllers/admin/settings.py:304
+msgid "Error occurred during updating application settings"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:219
+msgid "Updated visualisation settings"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:224
+msgid "Error occurred during updating visualisation settings"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:300
+msgid "Updated VCS settings"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:314
+msgid "Added new hook"
+msgstr "Добавлен новый хук"
+
+#: rhodecode/controllers/admin/settings.py:326
+msgid "Updated hooks"
+msgstr "Обновлённые хуки"
+
+#: rhodecode/controllers/admin/settings.py:330
+msgid "Error occurred during hook creation"
+msgstr ""
+
+#: rhodecode/controllers/admin/settings.py:349
+msgid "Email task created"
+msgstr "Письмо поставлено в очередь"
+
+#: rhodecode/controllers/admin/settings.py:413
+msgid "You can't edit this user since it's crucial for entire application"
+msgstr "Вы не можете редактировать пользователя, поскольку это критично для работы всего приложения"
+
+#: rhodecode/controllers/admin/settings.py:455
+msgid "Your account was updated successfully"
+msgstr "Ваша учетная запись успешно обновлена"
+
+#: rhodecode/controllers/admin/settings.py:470
+#: rhodecode/controllers/admin/users.py:198
+#, python-format
+msgid "Error occurred during update of user %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:130
+#, python-format
+msgid "Created user %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:142
+#, python-format
+msgid "Error occurred during creation of user %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:176
+msgid "User updated successfully"
+msgstr "Пользователь успешно обновлён"
+
+#: rhodecode/controllers/admin/users.py:214
+msgid "Successfully deleted user"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:219
+msgid "An error occurred during deletion of user"
+msgstr "Произошла ошибка при удалении пользователя"
+
+#: rhodecode/controllers/admin/users.py:234
+msgid "You can't edit this user"
+msgstr "Вы не можете редактировать данного пользователя"
+
+#: rhodecode/controllers/admin/users.py:293
+#: rhodecode/controllers/admin/users_groups.py:372
+msgid "Updated permissions"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:297
+#: rhodecode/controllers/admin/users_groups.py:376
+msgid "An error occurred during permissions saving"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:311
+#, python-format
+msgid "Added email %s to user"
+msgstr "Пользователю добавлен E-mail %s"
+
+#: rhodecode/controllers/admin/users.py:317
+msgid "An error occurred during email saving"
+msgstr "Произошла ошибка при сохранении E-mail"
+
+#: rhodecode/controllers/admin/users.py:327
+msgid "Removed email from user"
+msgstr "E-mail пользователя удалён"
+
+#: rhodecode/controllers/admin/users.py:340
+#, python-format
+msgid "Added ip %s to user"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:346
+msgid "An error occurred during ip saving"
+msgstr ""
+
+#: rhodecode/controllers/admin/users.py:358
+msgid "Removed ip from user"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:162
+#, python-format
+msgid "Created user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:173
+#, python-format
+msgid "Error occurred during creation of user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:210
+#, python-format
+msgid "Updated user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:232
+#, python-format
+msgid "Error occurred during update of user group %s"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:250
+msgid "Successfully deleted user group"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:255
+msgid "An error occurred during deletion of user group"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:274
+msgid "Target group cannot be the same"
+msgstr ""
+
+#: rhodecode/controllers/admin/users_groups.py:280
+msgid "User Group permissions updated"
+msgstr ""
+
+#: rhodecode/lib/auth.py:544
+#, python-format
+msgid "IP %s not allowed"
+msgstr ""
+
+#: rhodecode/lib/auth.py:593
+msgid "You need to be a registered user to perform this action"
+msgstr "Вы должны быть зарегистрированным пользователем, чтобы выполнить это действие"
+
+#: rhodecode/lib/auth.py:634
+msgid "You need to be a signed in to view this page"
+msgstr "Страница доступна только авторизованным пользователям"
+
+#: rhodecode/lib/diffs.py:66
+msgid "Binary file"
+msgstr ""
+
+#: rhodecode/lib/diffs.py:82
+msgid ""
+"Changeset was too big and was cut off, use diff menu to display this diff"
+msgstr "Изменения оказались слишком большими и были урезаны, используйте меню сравнения для показа результата сравнения"
+
+#: rhodecode/lib/diffs.py:92
+msgid "No changes detected"
+msgstr "Изменений не обнаружено"
+
+#: rhodecode/lib/helpers.py:428
+#, python-format
+msgid "%a, %d %b %Y %H:%M:%S"
+msgstr "%a, %d %b %Y %H:%M:%S"
+
+#: rhodecode/lib/helpers.py:539
+msgid "True"
+msgstr "Истина"
+
+#: rhodecode/lib/helpers.py:542
+msgid "False"
+msgstr "Ложь"
+
+#: rhodecode/lib/helpers.py:580
+#, python-format
+msgid "Deleted branch: %s"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:583
+#, python-format
+msgid "Created tag: %s"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:596
+msgid "Changeset not found"
+msgstr "Набор изменений не найден"
+
+#: rhodecode/lib/helpers.py:646
+#, python-format
+msgid "Show all combined changesets %s->%s"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:652
+msgid "compare view"
+msgstr "сравнение"
+
+#: rhodecode/lib/helpers.py:672
+msgid "and"
+msgstr "и"
+
+#: rhodecode/lib/helpers.py:673
+#, python-format
+msgid "%s more"
+msgstr "на %s больше"
+
+#: rhodecode/lib/helpers.py:674
+#: rhodecode/templates/changelog/changelog.html:53
+msgid "revisions"
+msgstr "ревизии"
+
+#: rhodecode/lib/helpers.py:698
+#, python-format
+msgid "fork name %s"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:715
+#: rhodecode/templates/pullrequests/pullrequest_show.html:8
+#, python-format
+msgid "Pull request #%s"
+msgstr "Pull запрос #%s"
+
+#: rhodecode/lib/helpers.py:725
+msgid "[deleted] repository"
+msgstr "[удален] репозиторий"
+
+#: rhodecode/lib/helpers.py:727 rhodecode/lib/helpers.py:739
+msgid "[created] repository"
+msgstr "[создан] репозиторий"
+
+#: rhodecode/lib/helpers.py:729
+msgid "[created] repository as fork"
+msgstr "[создан] репозиторий как форк"
+
+#: rhodecode/lib/helpers.py:731 rhodecode/lib/helpers.py:741
+msgid "[forked] repository"
+msgstr "[форкнут] репозиторий"
+
+#: rhodecode/lib/helpers.py:733 rhodecode/lib/helpers.py:743
+msgid "[updated] repository"
+msgstr "[обновлён] репозиторий"
+
+#: rhodecode/lib/helpers.py:735
+msgid "[downloaded] archive from repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:737
+msgid "[delete] repository"
+msgstr "[удален] репозиторий"
+
+#: rhodecode/lib/helpers.py:745
+msgid "[created] user"
+msgstr "[создан] пользователь"
+
+#: rhodecode/lib/helpers.py:747
+msgid "[updated] user"
+msgstr "[обновлён] пользователь"
+
+#: rhodecode/lib/helpers.py:749
+msgid "[created] user group"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:751
+msgid "[updated] user group"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:753
+msgid "[commented] on revision in repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:755
+msgid "[commented] on pull request for"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:757
+msgid "[closed] pull request for"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:759
+msgid "[pushed] into"
+msgstr "[отправлено] в"
+
+#: rhodecode/lib/helpers.py:761
+msgid "[committed via RhodeCode] into repository"
+msgstr "[commit с помощью RhodeCode] в репозитории"
+
+#: rhodecode/lib/helpers.py:763
+msgid "[pulled from remote] into repository"
+msgstr "[получено из удаленного] в репозитории"
+
+#: rhodecode/lib/helpers.py:765
+msgid "[pulled] from"
+msgstr "[получено] из"
+
+#: rhodecode/lib/helpers.py:767
+msgid "[started following] repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:769
+msgid "[stopped following] repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1088
+#, python-format
+msgid " and %s more"
+msgstr "и на %s больше"
+
+#: rhodecode/lib/helpers.py:1092
+msgid "No Files"
+msgstr "Файлов нет"
+
+#: rhodecode/lib/helpers.py:1158
+msgid "new file"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1161
+msgid "mod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1164
+msgid "del"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1167
+msgid "rename"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1172
+msgid "chmod"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:1404
+#, python-format
+msgid ""
+"%s repository is not mapped to db perhaps it was created or renamed from the"
+" filesystem please run the application again in order to rescan repositories"
+msgstr ""
+
+#: rhodecode/lib/unionrepo.py:193
+msgid "cannot create new union repository"
+msgstr ""
+
+#: rhodecode/lib/utils2.py:410
+#, python-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d год"
+msgstr[1] "%d лет"
+msgstr[2] "%d года"
+
+#: rhodecode/lib/utils2.py:411
+#, python-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d месяц"
+msgstr[1] "%d месяца"
+msgstr[2] "%d месяцев"
+
+#: rhodecode/lib/utils2.py:412
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d день"
+msgstr[1] "%d дня"
+msgstr[2] "%d дней"
+
+#: rhodecode/lib/utils2.py:413
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d час"
+msgstr[1] "%d часов"
+msgstr[2] "%d часа"
+
+#: rhodecode/lib/utils2.py:414
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минута"
+msgstr[1] "%d минут"
+msgstr[2] "%d минуты"
+
+#: rhodecode/lib/utils2.py:415
+#, python-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунды"
+msgstr[1] "%d секунды"
+msgstr[2] "%d секунды"
+
+#: rhodecode/lib/utils2.py:431
+#, python-format
+msgid "in %s"
+msgstr ""
+
+#: rhodecode/lib/utils2.py:433
+#, python-format
+msgid "%s ago"
+msgstr "%s назад"
+
+#: rhodecode/lib/utils2.py:435
+#, python-format
+msgid "in %s and %s"
+msgstr ""
+
+#: rhodecode/lib/utils2.py:438
+#, python-format
+msgid "%s and %s ago"
+msgstr "%s и %s назад"
+
+#: rhodecode/lib/utils2.py:441
+msgid "just now"
+msgstr "прямо сейчас"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1163
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1183
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1303
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1388
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1408 rhodecode/model/db.py:1413
+msgid "Repository no access"
+msgstr "Нет доступа к репозиторию"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1164
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1184
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1304
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1389
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1409 rhodecode/model/db.py:1414
+msgid "Repository read access"
+msgstr "Доступ к репозиторию только в режиме чтения"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1165
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1185
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1305
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1390
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1410 rhodecode/model/db.py:1415
+msgid "Repository write access"
+msgstr "Доступ к репозиторию с возможностью введения изменений"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1166
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1186
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1306
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1391
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1411 rhodecode/model/db.py:1416
+msgid "Repository admin access"
+msgstr "Доступ к репозиторию с правами администратора"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1168
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1188
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1308
+msgid "Repositories Group no access"
+msgstr "Группа Репозиториев - нет доступа"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1169
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1189
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1309
+msgid "Repositories Group read access"
+msgstr "Группа Репозиториев - доступ на чтение"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1170
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1190
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1310
+msgid "Repositories Group write access"
+msgstr "Группа Репозиториев - доступ на запись"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1171
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1191
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1311
+msgid "Repositories Group admin access"
+msgstr "Группа Репозиториев - администрирование"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1173
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1193
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1313
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1398
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1406 rhodecode/model/db.py:1411
+msgid "RhodeCode Administrator"
+msgstr "Администратор RhodeCode "
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1174
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1194
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1314
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1399
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1429 rhodecode/model/db.py:1434
+msgid "Repository creation disabled"
+msgstr "Создание репозиториев отключено"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1175
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1195
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1315
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1400
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1430 rhodecode/model/db.py:1435
+msgid "Repository creation enabled"
+msgstr "Создание репозиториев включено"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1176
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1196
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1316
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1401
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1432 rhodecode/model/db.py:1437
+msgid "Repository forking disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1177
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1197
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1317
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1402
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1433 rhodecode/model/db.py:1438
+msgid "Repository forking enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1178
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1198
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1318
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1403
+msgid "Register disabled"
+msgstr "Регистрация отключена"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1179
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1199
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1319
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1404
+msgid "Register new user with RhodeCode with manual activation"
+msgstr "Регистрация нового пользователя в RhodeCode с ручной активацией"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1182
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1202
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1322
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1407
+msgid "Register new user with RhodeCode with auto activation"
+msgstr "Регистрация нового пользователя в RhodeCode с автоматической активацией"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1623
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1643
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1763
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1838
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1934 rhodecode/model/db.py:1939
+msgid "Not Reviewed"
+msgstr "Не просмотрено"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1624
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1644
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1764
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1839
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1935 rhodecode/model/db.py:1940
+msgid "Approved"
+msgstr "Одобрено"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1625
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1645
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1765
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1840
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1936 rhodecode/model/db.py:1941
+msgid "Rejected"
+msgstr "Отклонено"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_4_0.py:1626
+#: rhodecode/lib/dbmigrate/schema/db_1_5_0.py:1646
+#: rhodecode/lib/dbmigrate/schema/db_1_5_2.py:1766
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1841
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1937 rhodecode/model/db.py:1942
+msgid "Under Review"
+msgstr "На рассмотрении"
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1252
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1270 rhodecode/model/db.py:1275
+msgid "top level"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1393
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1413 rhodecode/model/db.py:1418
+msgid "Repository group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1394
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1414 rhodecode/model/db.py:1419
+msgid "Repository group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1395
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1415 rhodecode/model/db.py:1420
+msgid "Repository group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_6_0.py:1396
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1416 rhodecode/model/db.py:1421
+msgid "Repository group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1418 rhodecode/model/db.py:1423
+msgid "User group no access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1419 rhodecode/model/db.py:1424
+msgid "User group read access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1420 rhodecode/model/db.py:1425
+msgid "User group write access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1421 rhodecode/model/db.py:1426
+msgid "User group admin access"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1423 rhodecode/model/db.py:1428
+msgid "Repository Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1424 rhodecode/model/db.py:1429
+msgid "Repository Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1426 rhodecode/model/db.py:1431
+msgid "User Group creation disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1427 rhodecode/model/db.py:1432
+msgid "User Group creation enabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1435 rhodecode/model/db.py:1440
+msgid "Registration disabled"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1436 rhodecode/model/db.py:1441
+msgid "User Registration with manual account activation"
+msgstr ""
+
+#: rhodecode/lib/dbmigrate/schema/db_1_7_0.py:1437 rhodecode/model/db.py:1442
+msgid "User Registration with automatic account activation"
+msgstr ""
+
+#: rhodecode/model/comment.py:75
+#, python-format
+msgid "on line %s"
+msgstr "на строке %s"
+
+#: rhodecode/model/comment.py:220
+msgid "[Mention]"
+msgstr "[Упоминание]"
+
+#: rhodecode/model/forms.py:43
+msgid "Please enter a login"
+msgstr "Пожалуйста, введите логин"
+
+#: rhodecode/model/forms.py:44
+#, python-format
+msgid "Enter a value %(min)i characters long or more"
+msgstr "Введите значение длиной не менее %(min)i символов"
+
+#: rhodecode/model/forms.py:52
+msgid "Please enter a password"
+msgstr "Пожалуйста, введите пароль"
+
+#: rhodecode/model/forms.py:53
+#, python-format
+msgid "Enter %(min)i characters or more"
+msgstr "Введите не менее %(min)i символов"
+
+#: rhodecode/model/notification.py:228
+#, python-format
+msgid "%(user)s commented on changeset at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:229
+#, python-format
+msgid "%(user)s sent message at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:230
+#, python-format
+msgid "%(user)s mentioned you at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:231
+#, python-format
+msgid "%(user)s registered in RhodeCode at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:232
+#, python-format
+msgid "%(user)s opened new pull request at %(when)s"
+msgstr ""
+
+#: rhodecode/model/notification.py:233
+#, python-format
+msgid "%(user)s commented on pull request at %(when)s"
+msgstr ""
+
+#: rhodecode/model/pull_request.py:98
+#, python-format
+msgid "%(user)s wants you to review pull request #%(pr_id)s: %(pr_title)s"
+msgstr ""
+
+#: rhodecode/model/scm.py:674
+msgid "latest tip"
+msgstr "последняя заметка"
+
+#: rhodecode/model/user.py:232
+msgid "New user registration"
+msgstr ""
+
+#: rhodecode/model/user.py:257 rhodecode/model/user.py:281
+msgid "You can't Edit this user since it's crucial for entire application"
+msgstr "Вы не можете редактировать пользователя, поскольку это критично для работы всего приложения"
+
+#: rhodecode/model/user.py:303
+msgid "You can't remove this user since it's crucial for entire application"
+msgstr "Вы не можете удалить пользователя, поскольку это критично для работы всего приложения"
+
+#: rhodecode/model/user.py:309
+#, python-format
+msgid ""
+"user \"%s\" still owns %s repositories and cannot be removed. Switch owners "
+"or remove those repositories. %s"
+msgstr "пользователь \"%s\" является владельцем репозиториев %s и поэтому не может быть удалён. Смените владельца или удалите данные репозитории. %s"
+
+#: rhodecode/model/user.py:334
+msgid "Password reset link"
+msgstr ""
+
+#: rhodecode/model/user.py:366
+msgid "Your new password"
+msgstr ""
+
+#: rhodecode/model/user.py:367
+#, python-format
+msgid "Your new RhodeCode password:%s"
+msgstr ""
+
+#: rhodecode/model/validators.py:38 rhodecode/model/validators.py:39
+msgid "Value cannot be an empty list"
+msgstr ""
+
+#: rhodecode/model/validators.py:85
+#, python-format
+msgid "Username \"%(username)s\" already exists"
+msgstr "Пользователь с именем \"%(username)s\" уже существует"
+
+#: rhodecode/model/validators.py:87
+#, python-format
+msgid "Username \"%(username)s\" is forbidden"
+msgstr "Имя \"%(username)s\" отклонено"
+
+#: rhodecode/model/validators.py:89
+msgid ""
+"Username may only contain alphanumeric characters underscores, periods or "
+"dashes and must begin with alphanumeric character or underscore"
+msgstr ""
+
+#: rhodecode/model/validators.py:117
+#, python-format
+msgid "Username %(username)s is not valid"
+msgstr "Имя \"%(username)s\" недопустимо"
+
+#: rhodecode/model/validators.py:136
+msgid "Invalid user group name"
+msgstr ""
+
+#: rhodecode/model/validators.py:137
+#, python-format
+msgid "User group \"%(usergroup)s\" already exists"
+msgstr ""
+
+#: rhodecode/model/validators.py:139
+msgid ""
+"user group name may only contain alphanumeric characters underscores, "
+"periods or dashes and must begin with alphanumeric character"
+msgstr ""
+
+#: rhodecode/model/validators.py:177
+msgid "Cannot assign this group as parent"
+msgstr "Невозможно использовать эту группу как родителя"
+
+#: rhodecode/model/validators.py:178
+#, python-format
+msgid "Group \"%(group_name)s\" already exists"
+msgstr "Группа \"%(group_name)s\" уже существует"
+
+#: rhodecode/model/validators.py:180
+#, python-format
+msgid "Repository with name \"%(group_name)s\" already exists"
+msgstr "Репозитарий с  именем \"%(group_name)s\" уже существует"
+
+#: rhodecode/model/validators.py:238
+msgid "Invalid characters (non-ascii) in password"
+msgstr "Недопустимые символы (не ascii) в пароле"
+
+#: rhodecode/model/validators.py:253
+msgid "Passwords do not match"
+msgstr "Пароли не совпадают"
+
+#: rhodecode/model/validators.py:270
+msgid "invalid password"
+msgstr "неверный пароль"
+
+#: rhodecode/model/validators.py:271
+msgid "invalid user name"
+msgstr "неверное имя пользователя"
+
+#: rhodecode/model/validators.py:272
+msgid "Your account is disabled"
+msgstr "Ваш аккаунт выключен"
+
+#: rhodecode/model/validators.py:316
+#, python-format
+msgid "Repository name %(repo)s is disallowed"
+msgstr "Имя репозитория %(repo)s запрещено"
+
+#: rhodecode/model/validators.py:318
+#, python-format
+msgid "Repository named %(repo)s already exists"
+msgstr "Репозитарий %(repo)s уже существует"
+
+#: rhodecode/model/validators.py:319
+#, python-format
+msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
+msgstr "Репозитарий \"%(repo)s\" уже существует в группе \"%(group)s\""
+
+#: rhodecode/model/validators.py:321
+#, python-format
+msgid "Repository group with name \"%(repo)s\" already exists"
+msgstr ""
+
+#: rhodecode/model/validators.py:438
+msgid "invalid clone url"
+msgstr "неверный URL"
+
+#: rhodecode/model/validators.py:439
+msgid "Invalid clone url, provide a valid clone http(s)/svn+http(s) url"
+msgstr ""
+
+#: rhodecode/model/validators.py:464
+msgid "Fork have to be the same type as parent"
+msgstr "Тип форка будет совпадать с родительским"
+
+#: rhodecode/model/validators.py:479
+msgid "You don't have permissions to create repository in this group"
+msgstr ""
+
+#: rhodecode/model/validators.py:481
+msgid "no permission to create repository in root location"
+msgstr ""
+
+#: rhodecode/model/validators.py:518
+msgid "You don't have permissions to create a group in this location"
+msgstr ""
+
+#: rhodecode/model/validators.py:559
+msgid "This username or user group name is not valid"
+msgstr ""
+
+#: rhodecode/model/validators.py:652
+msgid "This is not a valid path"
+msgstr "Этот путь ошибочен"
+
+#: rhodecode/model/validators.py:667
+msgid "This e-mail address is already taken"
+msgstr "Этот E-mail уже занят"
+
+#: rhodecode/model/validators.py:687
+#, python-format
+msgid "e-mail \"%(email)s\" does not exist."
+msgstr "\"%(email)s\" не существует"
+
+#: rhodecode/model/validators.py:724
+msgid ""
+"The LDAP Login attribute of the CN must be specified - this is the name of "
+"the attribute that is equivalent to \"username\""
+msgstr ""
+
+#: rhodecode/model/validators.py:737
+#, python-format
+msgid "Revisions %(revs)s are already part of pull request or have set status"
+msgstr ""
+
+#: rhodecode/model/validators.py:769
+msgid "Please enter a valid IPv4 or IpV6 address"
+msgstr ""
+
+#: rhodecode/model/validators.py:770
+#, python-format
+msgid ""
+"The network size (bits) must be within the range of 0-32 (not %(bits)r)"
+msgstr ""
+
+#: rhodecode/model/validators.py:803
+msgid "Key name can only consist of letters, underscore, dash or numbers"
+msgstr ""
+
+#: rhodecode/model/validators.py:817
+msgid "Filename cannot be inside a directory"
+msgstr ""
+
+#: rhodecode/templates/index.html:5
+msgid "Dashboard"
+msgstr "Панель управления"
+
+#: rhodecode/templates/index_base.html:6
+#: rhodecode/templates/repo_switcher_list.html:4
+#: rhodecode/templates/admin/repos/repos.html:9
+#: rhodecode/templates/admin/users/user_edit_my_account.html:31
+#: rhodecode/templates/admin/users/users.html:9
+#: rhodecode/templates/bookmarks/bookmarks.html:9
+#: rhodecode/templates/branches/branches.html:9
+#: rhodecode/templates/journal/journal.html:9
+#: rhodecode/templates/journal/journal.html:46
+#: rhodecode/templates/journal/journal.html:47
+#: rhodecode/templates/tags/tags.html:9
+msgid "quick filter..."
+msgstr "быстрый фильтр..."
+
+#: rhodecode/templates/index_base.html:6
+#: rhodecode/templates/admin/repos/repos.html:9
+msgid "repositories"
+msgstr "репозитарии"
+
+#: rhodecode/templates/index_base.html:13
+#: rhodecode/templates/index_base.html:18
+#: rhodecode/templates/admin/repos/repo_add.html:5
+#: rhodecode/templates/admin/repos/repos.html:21
+msgid "Add repository"
+msgstr "Добавить репозиторий"
+
+#: rhodecode/templates/index_base.html:15
+#: rhodecode/templates/index_base.html:20
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:31
+msgid "Add group"
+msgstr ""
+
+#: rhodecode/templates/index_base.html:27
+msgid "Edit group"
+msgstr ""
+
+#: rhodecode/templates/index_base.html:27
+msgid "You have admin right to this group, and can edit it"
+msgstr ""
+
+#: rhodecode/templates/index_base.html:40
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:33
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:38
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:43
+#: rhodecode/templates/admin/users_groups/users_group_add.html:32
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:33
+#: rhodecode/templates/admin/users_groups/users_groups.html:37
+msgid "Group name"
+msgstr "Имя группы"
+
+#: rhodecode/templates/index_base.html:41
+#: rhodecode/templates/index_base.html:123
+#: rhodecode/templates/admin/repos/repo_add_base.html:56
+#: rhodecode/templates/admin/repos/repo_edit.html:68
+#: rhodecode/templates/admin/repos/repos.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:42
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:47
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:44
+#: rhodecode/templates/email_templates/changeset_comment.html:9
+#: rhodecode/templates/email_templates/pull_request.html:9
+#: rhodecode/templates/forks/fork.html:56
+#: rhodecode/templates/pullrequests/pullrequest.html:43
+#: rhodecode/templates/pullrequests/pullrequest_show.html:81
+#: rhodecode/templates/summary/summary.html:106
+msgid "Description"
+msgstr "Описание"
+
+#: rhodecode/templates/index_base.html:51
+#: rhodecode/templates/admin/permissions/permissions.html:55
+#: rhodecode/templates/admin/repos/repo_add_base.html:29
+#: rhodecode/templates/admin/repos/repo_edit.html:50
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:57
+#: rhodecode/templates/forks/fork.html:47
+msgid "Repository group"
+msgstr "Группа репозиториев"
+
+#: rhodecode/templates/index_base.html:121
+#: rhodecode/templates/admin/repos/repo_add_base.html:9
+#: rhodecode/templates/admin/repos/repo_edit.html:32
+#: rhodecode/templates/admin/repos/repos.html:71
+#: rhodecode/templates/admin/users/user_edit_my_account.html:172
+#: rhodecode/templates/base/perms_summary.html:37
+#: rhodecode/templates/bookmarks/bookmarks.html:48
+#: rhodecode/templates/bookmarks/bookmarks_data.html:6
+#: rhodecode/templates/branches/branches.html:47
+#: rhodecode/templates/branches/branches_data.html:6
+#: rhodecode/templates/files/files_browser.html:47
+#: rhodecode/templates/journal/journal.html:193
+#: rhodecode/templates/journal/journal.html:283
+#: rhodecode/templates/summary/summary.html:55
+#: rhodecode/templates/summary/summary.html:124
+#: rhodecode/templates/tags/tags.html:48
+#: rhodecode/templates/tags/tags_data.html:6
+msgid "Name"
+msgstr "Имя"
+
+#: rhodecode/templates/index_base.html:124
+msgid "Last Change"
+msgstr "Последнее изменение"
+
+#: rhodecode/templates/index_base.html:126
+#: rhodecode/templates/admin/repos/repos.html:74
+#: rhodecode/templates/admin/users/user_edit_my_account.html:174
+#: rhodecode/templates/journal/journal.html:195
+#: rhodecode/templates/journal/journal.html:285
+msgid "Tip"
+msgstr "Подсказка"
+
+#: rhodecode/templates/index_base.html:128
+#: rhodecode/templates/admin/repos/repo_edit.html:114
+#: rhodecode/templates/admin/repos/repos.html:76
+msgid "Owner"
+msgstr "Владелец"
+
+#: rhodecode/templates/index_base.html:136
+#: rhodecode/templates/admin/repos/repos.html:84
+#: rhodecode/templates/admin/users/user_edit_my_account.html:183
+#: rhodecode/templates/admin/users/users.html:107
+#: rhodecode/templates/bookmarks/bookmarks.html:74
+#: rhodecode/templates/branches/branches.html:73
+#: rhodecode/templates/journal/journal.html:204
+#: rhodecode/templates/journal/journal.html:294
+#: rhodecode/templates/tags/tags.html:74
+msgid "Click to sort ascending"
+msgstr "По возрастанию"
+
+#: rhodecode/templates/index_base.html:137
+#: rhodecode/templates/admin/repos/repos.html:85
+#: rhodecode/templates/admin/users/user_edit_my_account.html:184
+#: rhodecode/templates/admin/users/users.html:108
+#: rhodecode/templates/bookmarks/bookmarks.html:75
+#: rhodecode/templates/branches/branches.html:74
+#: rhodecode/templates/journal/journal.html:205
+#: rhodecode/templates/journal/journal.html:295
+#: rhodecode/templates/tags/tags.html:75
+msgid "Click to sort descending"
+msgstr "По убыванию"
+
+#: rhodecode/templates/index_base.html:138
+msgid "No repositories found."
+msgstr ""
+
+#: rhodecode/templates/index_base.html:139
+#: rhodecode/templates/admin/repos/repos.html:87
+#: rhodecode/templates/admin/users/user_edit_my_account.html:186
+#: rhodecode/templates/admin/users/users.html:110
+#: rhodecode/templates/bookmarks/bookmarks.html:77
+#: rhodecode/templates/branches/branches.html:76
+#: rhodecode/templates/journal/journal.html:207
+#: rhodecode/templates/journal/journal.html:297
+#: rhodecode/templates/tags/tags.html:77
+msgid "Data error."
+msgstr "Ошибка данных."
+
+#: rhodecode/templates/index_base.html:140
+#: rhodecode/templates/admin/repos/repos.html:88
+#: rhodecode/templates/admin/users/user_edit_my_account.html:58
+#: rhodecode/templates/admin/users/user_edit_my_account.html:187
+#: rhodecode/templates/admin/users/users.html:111
+#: rhodecode/templates/bookmarks/bookmarks.html:78
+#: rhodecode/templates/branches/branches.html:77
+#: rhodecode/templates/journal/journal.html:208
+#: rhodecode/templates/journal/journal.html:298
+#: rhodecode/templates/tags/tags.html:78
+msgid "Loading..."
+msgstr "Загрузка..."
+
+#: rhodecode/templates/login.html:5 rhodecode/templates/base/base.html:239
+msgid "Log In"
+msgstr "Войти"
+
+#: rhodecode/templates/login.html:21
+#, python-format
+msgid "Log In to %s"
+msgstr ""
+
+#: rhodecode/templates/login.html:31 rhodecode/templates/register.html:20
+#: rhodecode/templates/admin/admin_log.html:5
+#: rhodecode/templates/admin/users/user_add.html:32
+#: rhodecode/templates/admin/users/user_edit.html:57
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:31
+#: rhodecode/templates/admin/users/users.html:77
+#: rhodecode/templates/base/base.html:215
+#: rhodecode/templates/summary/summary.html:123
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: rhodecode/templates/login.html:40 rhodecode/templates/register.html:29
+#: rhodecode/templates/admin/ldap/ldap.html:46
+#: rhodecode/templates/admin/users/user_add.html:41
+#: rhodecode/templates/base/base.html:224
+msgid "Password"
+msgstr "Пароль"
+
+#: rhodecode/templates/login.html:50
+msgid "Remember me"
+msgstr "Запомнить"
+
+#: rhodecode/templates/login.html:54
+msgid "Sign In"
+msgstr "Войти"
+
+#: rhodecode/templates/login.html:60
+msgid "Forgot your password ?"
+msgstr "Забыли пароль?"
+
+#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:235
+msgid "Don't have an account ?"
+msgstr "Нет аккаунта?"
+
+#: rhodecode/templates/password_reset.html:5
+msgid "Password Reset"
+msgstr ""
+
+#: rhodecode/templates/password_reset.html:11
+msgid "Reset your password to"
+msgstr "Сбросить пароль на"
+
+#: rhodecode/templates/password_reset.html:21
+msgid "Email address"
+msgstr "Почтовый адрес"
+
+#: rhodecode/templates/password_reset.html:30
+msgid "Reset my password"
+msgstr "Сбросить пароль"
+
+#: rhodecode/templates/password_reset.html:31
+msgid "Password reset link will be send to matching email address"
+msgstr "Ссылка для сброса пароля была отправлена на соответствующий E-mail"
+
+#: rhodecode/templates/register.html:5 rhodecode/templates/register.html:74
+msgid "Sign Up"
+msgstr "Вступить"
+
+#: rhodecode/templates/register.html:11
+msgid "Sign Up to"
+msgstr "Вступить в"
+
+#: rhodecode/templates/register.html:38
+msgid "Re-enter password"
+msgstr "Повторите пароль"
+
+#: rhodecode/templates/register.html:47
+#: rhodecode/templates/admin/users/user_add.html:59
+#: rhodecode/templates/admin/users/user_edit.html:97
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:62
+msgid "First Name"
+msgstr "Имя"
+
+#: rhodecode/templates/register.html:56
+#: rhodecode/templates/admin/users/user_add.html:68
+#: rhodecode/templates/admin/users/user_edit.html:106
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:71
+msgid "Last Name"
+msgstr "Фамилия"
+
+#: rhodecode/templates/register.html:65
+#: rhodecode/templates/admin/users/user_add.html:77
+#: rhodecode/templates/admin/users/user_edit.html:115
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:80
+#: rhodecode/templates/summary/summary.html:125
+msgid "Email"
+msgstr "E-mail"
+
+#: rhodecode/templates/register.html:76
+msgid "Your account will be activated right after registration"
+msgstr "Ваш аккаунт будет активирован сразу после регистрации"
+
+#: rhodecode/templates/register.html:78
+msgid "Your account must wait for activation by administrator"
+msgstr "Ваш аккаунт ожидает модерации"
+
+#: rhodecode/templates/repo_switcher_list.html:10
+#: rhodecode/templates/admin/defaults/defaults.html:44
+#: rhodecode/templates/admin/repos/repo_add_base.html:65
+#: rhodecode/templates/admin/repos/repo_edit.html:78
+#: rhodecode/templates/data_table/_dt_elements.html:61
+#: rhodecode/templates/summary/summary.html:77
+msgid "Private repository"
+msgstr "Частный репозиторий"
+
+#: rhodecode/templates/repo_switcher_list.html:12
+#: rhodecode/templates/data_table/_dt_elements.html:63
+#: rhodecode/templates/summary/summary.html:79
+msgid "Public repository"
+msgstr "Публичный репозиторий"
+
+#: rhodecode/templates/switch_to_list.html:10
+#: rhodecode/templates/branches/branches_data.html:57
+msgid "There are no branches yet"
+msgstr "Ветки ещё не созданы"
+
+#: rhodecode/templates/switch_to_list.html:22
+#: rhodecode/templates/tags/tags_data.html:38
+msgid "There are no tags yet"
+msgstr "Метки отсутсвуют"
+
+#: rhodecode/templates/switch_to_list.html:35
+#: rhodecode/templates/bookmarks/bookmarks_data.html:37
+msgid "There are no bookmarks yet"
+msgstr "Закладок ещё нет"
+
+#: rhodecode/templates/admin/admin.html:5
+#: rhodecode/templates/admin/admin.html:13
+#: rhodecode/templates/base/base.html:73
+msgid "Admin journal"
+msgstr "Журнал администратора"
+
+#: rhodecode/templates/admin/admin.html:10
+msgid "journal filter..."
+msgstr ""
+
+#: rhodecode/templates/admin/admin.html:12
+#: rhodecode/templates/journal/journal.html:11
+msgid "filter"
+msgstr ""
+
+#: rhodecode/templates/admin/admin.html:13
+#: rhodecode/templates/journal/journal.html:12
+#, python-format
+msgid "%s entry"
+msgid_plural "%s entries"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/admin/admin_log.html:6
+#: rhodecode/templates/admin/repos/repos.html:77
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
+#: rhodecode/templates/admin/users/user_edit_my_account.html:176
+#: rhodecode/templates/admin/users/users.html:87
+#: rhodecode/templates/admin/users_groups/users_groups.html:40
+#: rhodecode/templates/journal/journal.html:197
+#: rhodecode/templates/journal/journal.html:287
+msgid "Action"
+msgstr "Действие"
+
+#: rhodecode/templates/admin/admin_log.html:7
+#: rhodecode/templates/admin/permissions/permissions.html:41
+msgid "Repository"
+msgstr "Репозитарий"
+
+#: rhodecode/templates/admin/admin_log.html:8
+#: rhodecode/templates/bookmarks/bookmarks.html:49
+#: rhodecode/templates/bookmarks/bookmarks_data.html:7
+#: rhodecode/templates/branches/branches.html:48
+#: rhodecode/templates/branches/branches_data.html:7
+#: rhodecode/templates/tags/tags.html:49
+#: rhodecode/templates/tags/tags_data.html:7
+msgid "Date"
+msgstr "Дата"
+
+#: rhodecode/templates/admin/admin_log.html:9
+msgid "From IP"
+msgstr "С IP"
+
+#: rhodecode/templates/admin/admin_log.html:63
+msgid "No actions yet"
+msgstr "Действия ещё не производились"
+
+#: rhodecode/templates/admin/defaults/defaults.html:5
+#: rhodecode/templates/admin/defaults/defaults.html:25
+msgid "Repositories defaults"
+msgstr ""
+
+#: rhodecode/templates/admin/defaults/defaults.html:11
+#: rhodecode/templates/base/base.html:80
+msgid "Defaults"
+msgstr ""
+
+#: rhodecode/templates/admin/defaults/defaults.html:35
+#: rhodecode/templates/admin/repos/repo_add_base.html:38
+msgid "Type"
+msgstr "Тип"
+
+#: rhodecode/templates/admin/defaults/defaults.html:48
+#: rhodecode/templates/admin/repos/repo_add_base.html:69
+#: rhodecode/templates/admin/repos/repo_edit.html:82
+#: rhodecode/templates/forks/fork.html:69
+msgid ""
+"Private repositories are only visible to people explicitly added as "
+"collaborators."
+msgstr "Приватные репозитории видны только их участникам"
+
+#: rhodecode/templates/admin/defaults/defaults.html:55
+#: rhodecode/templates/admin/repos/repo_edit.html:87
+msgid "Enable statistics"
+msgstr "Включить статистику."
+
+#: rhodecode/templates/admin/defaults/defaults.html:59
+#: rhodecode/templates/admin/repos/repo_edit.html:91
+msgid "Enable statistics window on summary page."
+msgstr "Включить окно статистики на странице summary."
+
+#: rhodecode/templates/admin/defaults/defaults.html:65
+#: rhodecode/templates/admin/repos/repo_edit.html:96
+msgid "Enable downloads"
+msgstr "Включить скачивание"
+
+#: rhodecode/templates/admin/defaults/defaults.html:69
+#: rhodecode/templates/admin/repos/repo_edit.html:100
+msgid "Enable download menu on summary page."
+msgstr "Включить меню скачивания на странице summary."
+
+#: rhodecode/templates/admin/defaults/defaults.html:75
+#: rhodecode/templates/admin/repos/repo_edit.html:105
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:64
+msgid "Enable locking"
+msgstr ""
+
+#: rhodecode/templates/admin/defaults/defaults.html:79
+#: rhodecode/templates/admin/repos/repo_edit.html:109
+msgid "Enable lock-by-pulling on repository."
+msgstr ""
+
+#: rhodecode/templates/admin/defaults/defaults.html:84
+#: rhodecode/templates/admin/ldap/ldap.html:89
+#: rhodecode/templates/admin/permissions/permissions.html:122
+#: rhodecode/templates/admin/repos/repo_edit.html:141
+#: rhodecode/templates/admin/repos/repo_edit.html:166
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:72
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:96
+#: rhodecode/templates/admin/settings/hooks.html:73
+#: rhodecode/templates/admin/users/user_add.html:94
+#: rhodecode/templates/admin/users/user_edit.html:140
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:88
+#: rhodecode/templates/admin/users_groups/users_group_add.html:49
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:90
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:143
+#: rhodecode/templates/base/default_perms_box.html:53
+msgid "Save"
+msgstr "Сохранить"
+
+#: rhodecode/templates/admin/gists/index.html:5
+#: rhodecode/templates/base/base.html:299
+msgid "Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:10
+#, python-format
+msgid "Private Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:12
+#, python-format
+msgid "Public Gists for user %s"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:14
+msgid "Public Gists"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:31
+#: rhodecode/templates/admin/gists/show.html:24
+#: rhodecode/templates/base/base.html:302
+msgid "Create new gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:48
+msgid "Created"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/index.html:53
+#: rhodecode/templates/admin/gists/show.html:43
+#: rhodecode/templates/admin/gists/show.html:45
+msgid "Expires"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:51
+#: rhodecode/templates/admin/gists/show.html:43
+msgid "never"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/index.html:68
+msgid "There are no gists yet"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:5
+#: rhodecode/templates/admin/gists/new.html:16
+msgid "New gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:37
+msgid "Gist description ..."
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:52
+msgid "Create private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:53
+msgid "Create public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/new.html:54
+#: rhodecode/templates/admin/permissions/permissions.html:123
+#: rhodecode/templates/admin/permissions/permissions.html:185
+#: rhodecode/templates/admin/repos/repo_edit.html:142
+#: rhodecode/templates/admin/repos/repo_edit.html:167
+#: rhodecode/templates/admin/repos/repo_edit.html:381
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:73
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:97
+#: rhodecode/templates/admin/settings/settings.html:115
+#: rhodecode/templates/admin/settings/settings.html:196
+#: rhodecode/templates/admin/settings/settings.html:288
+#: rhodecode/templates/admin/users/user_edit.html:141
+#: rhodecode/templates/admin/users/user_edit.html:198
+#: rhodecode/templates/admin/users/user_edit.html:246
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:89
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:144
+#: rhodecode/templates/base/default_perms_box.html:54
+#: rhodecode/templates/files/files_add.html:80
+#: rhodecode/templates/files/files_edit.html:66
+#: rhodecode/templates/pullrequests/pullrequest.html:86
+msgid "Reset"
+msgstr "Сброс"
+
+#: rhodecode/templates/admin/gists/show.html:5
+msgid "gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:9
+msgid "Gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:36
+msgid "Public gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:38
+msgid "Private gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:54
+#: rhodecode/templates/admin/repos/repo_edit.html:299
+#: rhodecode/templates/changeset/changeset_file_comment.html:40
+msgid "Delete"
+msgstr "Удалить"
+
+#: rhodecode/templates/admin/gists/show.html:54
+msgid "Confirm to delete this gist"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:63
+#: rhodecode/templates/admin/gists/show.html:84
+#: rhodecode/templates/files/files_edit.html:48
+#: rhodecode/templates/files/files_source.html:25
+#: rhodecode/templates/files/files_source.html:55
+msgid "Show as raw"
+msgstr ""
+
+#: rhodecode/templates/admin/gists/show.html:71
+msgid "created"
+msgstr ""
+
+#: rhodecode/templates/admin/ldap/ldap.html:5
+msgid "LDAP administration"
+msgstr "администрирование LDAP"
+
+#: rhodecode/templates/admin/ldap/ldap.html:11
+#: rhodecode/templates/admin/users/users.html:86
+#: rhodecode/templates/base/base.html:79
+msgid "LDAP"
+msgstr ""
+
+#: rhodecode/templates/admin/ldap/ldap.html:28
+msgid "Connection settings"
+msgstr "Настройки подключения"
+
+#: rhodecode/templates/admin/ldap/ldap.html:30
+msgid "Enable LDAP"
+msgstr "Включить LDAP"
+
+#: rhodecode/templates/admin/ldap/ldap.html:34
+msgid "Host"
+msgstr "Хост"
+
+#: rhodecode/templates/admin/ldap/ldap.html:38
+msgid "Port"
+msgstr "Порт"
+
+#: rhodecode/templates/admin/ldap/ldap.html:42
+msgid "Account"
+msgstr "Аккаунт"
+
+#: rhodecode/templates/admin/ldap/ldap.html:50
+msgid "Connection security"
+msgstr "Безопасность соединения"
+
+#: rhodecode/templates/admin/ldap/ldap.html:54
+msgid "Certificate Checks"
+msgstr "Проверки сертификатов"
+
+#: rhodecode/templates/admin/ldap/ldap.html:57
+msgid "Search settings"
+msgstr "Настройки поиска"
+
+#: rhodecode/templates/admin/ldap/ldap.html:59
+msgid "Base DN"
+msgstr "Base DN"
+
+#: rhodecode/templates/admin/ldap/ldap.html:63
+msgid "LDAP Filter"
+msgstr "Фильтр LDAP"
+
+#: rhodecode/templates/admin/ldap/ldap.html:67
+msgid "LDAP Search Scope"
+msgstr "Область поиска LDAP"
+
+#: rhodecode/templates/admin/ldap/ldap.html:70
+msgid "Attribute mappings"
+msgstr "Маппинги атрибутов"
+
+#: rhodecode/templates/admin/ldap/ldap.html:72
+msgid "Login Attribute"
+msgstr "Атрибут \"Логин\""
+
+#: rhodecode/templates/admin/ldap/ldap.html:76
+msgid "First Name Attribute"
+msgstr "Атрибут \"Имя\""
+
+#: rhodecode/templates/admin/ldap/ldap.html:80
+msgid "Last Name Attribute"
+msgstr "Атрибут \"Фамилия\""
+
+#: rhodecode/templates/admin/ldap/ldap.html:84
+msgid "E-mail Attribute"
+msgstr "Атрибут \"E-mail\""
+
+#: rhodecode/templates/admin/notifications/notifications.html:5
+#: rhodecode/templates/admin/notifications/notifications.html:9
+msgid "My Notifications"
+msgstr "Мои уведомления"
+
+#: rhodecode/templates/admin/notifications/notifications.html:29
+msgid "All"
+msgstr "Всё"
+
+#: rhodecode/templates/admin/notifications/notifications.html:30
+msgid "Comments"
+msgstr "Комментарии"
+
+#: rhodecode/templates/admin/notifications/notifications.html:31
+#: rhodecode/templates/pullrequests/pullrequest_show_all.html:8
+msgid "Pull requests"
+msgstr "Запросы pull"
+
+#: rhodecode/templates/admin/notifications/notifications.html:35
+msgid "Mark all read"
+msgstr "Пометить прочтённым"
+
+#: rhodecode/templates/admin/notifications/notifications_data.html:39
+msgid "No notifications here yet"
+msgstr "Уведомлений нет"
+
+#: rhodecode/templates/admin/notifications/show_notification.html:5
+#: rhodecode/templates/admin/notifications/show_notification.html:11
+msgid "Show notification"
+msgstr "Показать уведомление"
+
+#: rhodecode/templates/admin/notifications/show_notification.html:9
+#: rhodecode/templates/base/base.html:253
+msgid "Notifications"
+msgstr "Уведомления"
+
+#: rhodecode/templates/admin/permissions/permissions.html:5
+msgid "Permissions administration"
+msgstr "Управление привилегиями"
+
+#: rhodecode/templates/admin/permissions/permissions.html:11
+#: rhodecode/templates/admin/repos/repo_edit.html:151
+#: rhodecode/templates/admin/repos/repo_edit.html:158
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:81
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:88
+#: rhodecode/templates/admin/users/user_edit.html:150
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:129
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
+#: rhodecode/templates/base/base.html:78
+msgid "Permissions"
+msgstr "Привилегии"
+
+#: rhodecode/templates/admin/permissions/permissions.html:24
+msgid "Default permissions"
+msgstr "Стандартные привилегии"
+
+#: rhodecode/templates/admin/permissions/permissions.html:31
+msgid "Anonymous access"
+msgstr "Анонимный доступ"
+
+#: rhodecode/templates/admin/permissions/permissions.html:49
+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 ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:50
+#: rhodecode/templates/admin/permissions/permissions.html:63
+#: rhodecode/templates/admin/permissions/permissions.html:77
+msgid "Overwrite existing settings"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:62
+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 ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:69
+msgid "User group"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:76
+msgid ""
+"All default permissions on each user group will be reset to chosen "
+"permission, note that all custom default permission on repository groups "
+"will be lost"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:83
+msgid "Repository creation"
+msgstr "Создание репозитория"
+
+#: rhodecode/templates/admin/permissions/permissions.html:91
+msgid "User group creation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:99
+msgid "Repository forking"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:107
+msgid "Registration"
+msgstr "Регистрация"
+
+#: rhodecode/templates/admin/permissions/permissions.html:115
+msgid "External auth account activation"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:133
+msgid "Default User Permissions"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:144
+#: rhodecode/templates/admin/users/user_edit.html:207
+msgid "Allowed IP addresses"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:158
+#: rhodecode/templates/admin/repos/repo_edit.html:340
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
+#: rhodecode/templates/admin/users/user_edit.html:175
+#: rhodecode/templates/admin/users/user_edit.html:220
+#: rhodecode/templates/admin/users_groups/users_groups.html:54
+#: rhodecode/templates/data_table/_dt_elements.html:122
+#: rhodecode/templates/data_table/_dt_elements.html:136
+msgid "delete"
+msgstr "удалить"
+
+#: rhodecode/templates/admin/permissions/permissions.html:159
+#: rhodecode/templates/admin/users/user_edit.html:221
+#, python-format
+msgid "Confirm to delete this ip: %s"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:165
+#: rhodecode/templates/admin/users/user_edit.html:227
+msgid "All IP addresses are allowed"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:176
+#: rhodecode/templates/admin/users/user_edit.html:238
+msgid "New ip address"
+msgstr ""
+
+#: rhodecode/templates/admin/permissions/permissions.html:184
+#: rhodecode/templates/admin/repos/repo_add_base.html:73
+#: rhodecode/templates/admin/repos/repo_edit.html:380
+#: rhodecode/templates/admin/users/user_edit.html:197
+#: rhodecode/templates/admin/users/user_edit.html:245
+msgid "Add"
+msgstr "Добавить"
+
+#: rhodecode/templates/admin/repos/repo_add.html:12
+#: rhodecode/templates/admin/repos/repo_add.html:16
+#: rhodecode/templates/base/base.html:74 rhodecode/templates/base/base.html:88
+#: rhodecode/templates/base/base.html:116
+#: rhodecode/templates/base/base.html:275
+msgid "Repositories"
+msgstr "Репозитории"
+
+#: rhodecode/templates/admin/repos/repo_add.html:19
+msgid "Add new"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:20
+#: rhodecode/templates/summary/summary.html:96
+#: rhodecode/templates/summary/summary.html:97
+msgid "Clone from"
+msgstr "Склонировать из"
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:24
+#: rhodecode/templates/admin/repos/repo_edit.html:45
+msgid "Optional http[s] url from which repository should be cloned."
+msgstr "Опциональный url http[s], с которого требуется склонировать репозиторий."
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:33
+#: rhodecode/templates/forks/fork.html:51
+msgid "Optionaly select a group to put this repository into."
+msgstr "Опционально выбрать группу, в которую поместить данный репозиторий."
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:42
+msgid "Type of repository to create."
+msgstr "Тип создаваемого репозитория."
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:47
+#: rhodecode/templates/admin/repos/repo_edit.html:59
+#: rhodecode/templates/forks/fork.html:38
+msgid "Landing revision"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:51
+#: rhodecode/templates/admin/repos/repo_edit.html:63
+#: rhodecode/templates/forks/fork.html:42
+msgid "Default revision for files page, downloads, whoosh and readme"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_add_base.html:60
+#: rhodecode/templates/admin/repos/repo_edit.html:72
+#: rhodecode/templates/forks/fork.html:60
+msgid ""
+"Keep it short and to the point. Use a README file for longer descriptions."
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:8
+msgid "Edit repository"
+msgstr "Редактировать репозиторий"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:12
+#: rhodecode/templates/admin/settings/hooks.html:9
+#: rhodecode/templates/admin/settings/settings.html:11
+#: rhodecode/templates/base/base.html:81
+#: rhodecode/templates/base/base.html:134
+#: rhodecode/templates/summary/summary.html:212
+msgid "Settings"
+msgstr "Настройки"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:36
+msgid "Non-changeable id"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:41
+msgid "Clone uri"
+msgstr "URI для клонирования"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:54
+msgid "Optional select a group to put this repository into."
+msgstr "Опционально выбрать группу, в которую поместить данный репозиторий."
+
+#: rhodecode/templates/admin/repos/repo_edit.html:119
+msgid "Change owner of this repository."
+msgstr "Изменить владельца репозитория"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:177
+msgid "Advanced settings"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:180
+msgid "Statistics"
+msgstr "Статистика"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:184
+msgid "Reset current statistics"
+msgstr "Сбросить статистику"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:184
+msgid "Confirm to remove current statistics"
+msgstr "Подтвердите сброс статистики"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:187
+msgid "Fetched to rev"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:188
+msgid "Stats gathered"
+msgstr "Полученная статистика"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:196
+msgid "Remote"
+msgstr "Удалённый"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:200
+msgid "Pull changes from remote location"
+msgstr "Получить изменения с удалённой стороны"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:200
+msgid "Confirm to pull changes from remote side"
+msgstr "Подтвердите скачивание изменений"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:211
+msgid "Cache"
+msgstr "Кэш"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Invalidate repository cache"
+msgstr "Сбросить кэш репозитория"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:215
+msgid "Confirm to invalidate repository cache"
+msgstr "Подтвердите сброс кэша"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:218
+msgid ""
+"Manually invalidate cache for this repository. On first access repository "
+"will be cached again"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:223
+msgid "List of cached values"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:226
+msgid "Prefix"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:227
+msgid "Key"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:228
+#: rhodecode/templates/admin/users/user_add.html:86
+#: rhodecode/templates/admin/users/user_edit.html:124
+#: rhodecode/templates/admin/users/users.html:84
+#: rhodecode/templates/admin/users_groups/users_group_add.html:41
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:42
+#: rhodecode/templates/admin/users_groups/users_groups.html:39
+msgid "Active"
+msgstr "Активный"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:243
+#: rhodecode/templates/base/base.html:292
+#: rhodecode/templates/base/base.html:293
+msgid "Public journal"
+msgstr "Общедоступный журнал"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:249
+msgid "Remove from public journal"
+msgstr "Удалить из общедоступного журнала"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:251
+msgid "Add to public journal"
+msgstr "Добавить в общедоступный журнал"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:256
+msgid ""
+"All actions made on this repository will be accessible to everyone in public"
+" journal"
+msgstr "Все производимые с этим репозиторием действия будут доступны для всех из общедоступного журнала"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:263
+msgid "Locking"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:268
+msgid "Unlock locked repo"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:268
+msgid "Confirm to unlock repository"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Lock repo"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:271
+msgid "Confirm to lock repository"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:272
+msgid "Repository is not locked"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:277
+msgid ""
+"Force locking on repository. Works only when anonymous access is disabled"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:284
+msgid "Set as fork of"
+msgstr "Сделать форком от"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:289
+msgid "Set"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:293
+msgid "Manually set this repository as a fork of another from the list"
+msgstr "Вручную сделать этот репозиторий форком выбранного из списка"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:308
+msgid "Remove this repository"
+msgstr "Удалить репозиторий"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:308
+msgid "Confirm to delete this repository"
+msgstr "Подтвердите удаление репозитория"
+
+#: rhodecode/templates/admin/repos/repo_edit.html:310
+#, python-format
+msgid "this repository has %s fork"
+msgid_plural "this repository has %s forks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:311
+msgid "Detach forks"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:312
+msgid "Delete forks"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:315
+msgid ""
+"This repository will be renamed in a special way in order to be unaccesible "
+"for RhodeCode and VCS systems. If you need to fully delete it from file "
+"system please do it manually"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:329
+msgid "Extra fields"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:341
+#, python-format
+msgid "Confirm to delete this field: %s"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:355
+msgid "New field key"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:363
+msgid "New field label"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:366
+msgid "Enter short label"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:372
+msgid "New field description"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit.html:375
+msgid "Enter description of a field"
+msgstr ""
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:3
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:3
+msgid "none"
+msgstr "ничего"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:4
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:4
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:4
+msgid "read"
+msgstr "читать"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:5
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:5
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:5
+msgid "write"
+msgstr "записывать"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:6
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:6
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:6
+msgid "admin"
+msgstr "администратор"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:7
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:7
+msgid "member"
+msgstr "участник"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:16
+msgid "private repository"
+msgstr "приватный репозиторий"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:19
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:28
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:20
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:35
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:20
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:35
+msgid "default"
+msgstr "по-умолчанию"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:33
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:58
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:25
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:55
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:25
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:55
+msgid "revoke"
+msgstr "вернуть"
+
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:83
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
+#: rhodecode/templates/admin/users_groups/user_group_edit_perms.html:81
+msgid "Add another member"
+msgstr "Добавить другого участника"
+
+#: rhodecode/templates/admin/repos/repos.html:5
+msgid "Repositories administration"
+msgstr "Администрирование репозиториев"
+
+#: rhodecode/templates/admin/repos/repos.html:86
+#: rhodecode/templates/admin/users/user_edit_my_account.html:185
+#: rhodecode/templates/admin/users/users.html:109
+#: rhodecode/templates/bookmarks/bookmarks.html:76
+#: rhodecode/templates/branches/branches.html:75
+#: rhodecode/templates/journal/journal.html:206
+#: rhodecode/templates/journal/journal.html:296
+#: rhodecode/templates/tags/tags.html:76
+msgid "No records found."
+msgstr "Записи не найдены."
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
+msgid "apply to children"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:88
+msgid ""
+"Set or revoke permission to all children of that group, including non-"
+"private repositories and other groups"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups.html:4
+#, python-format
+msgid "%s Group Dashboard"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups.html:9
+msgid "Home"
+msgstr "Домой"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups.html:13
+msgid "with"
+msgstr "с"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
+msgid "Add repository group"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:11
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:11
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:16
+#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91
+msgid "Repository groups"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:13
+msgid "Add new repository group"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:51
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:56
+msgid "Group parent"
+msgstr "Родительская группа"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:59
+msgid "save"
+msgstr "сохранить"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
+msgid "Edit repository group"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:13
+#, python-format
+msgid "Edit repository group %s"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:27
+msgid "Add child group"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:68
+msgid ""
+"Enable lock-by-pulling on group. This option will be applied to all other "
+"groups and repositories inside"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5
+msgid "Repository groups administration"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:45
+msgid "Number of toplevel repositories"
+msgstr "Число репозиториев верхнего уровня"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:64
+#: rhodecode/templates/admin/users_groups/users_groups.html:48
+#: rhodecode/templates/changeset/changeset_file_comment.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:171
+msgid "Edit"
+msgstr ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:65
+#: rhodecode/templates/admin/users_groups/users_groups.html:49
+#: rhodecode/templates/base/perms_summary.html:29
+#: rhodecode/templates/base/perms_summary.html:60
+#: rhodecode/templates/base/perms_summary.html:62
+#: rhodecode/templates/data_table/_dt_elements.html:116
+#: rhodecode/templates/data_table/_dt_elements.html:117
+#: rhodecode/templates/data_table/_dt_elements.html:130
+#: rhodecode/templates/data_table/_dt_elements.html:131
+msgid "edit"
+msgstr "редактировать"
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:70
+#, python-format
+msgid "Confirm to delete this group: %s with %s repository"
+msgid_plural "Confirm to delete this group: %s with %s repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:78
+msgid "There are no repository groups yet"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/hooks.html:5
+#: rhodecode/templates/admin/settings/settings.html:5
+msgid "Settings administration"
+msgstr "Администрирование настроек"
+
+#: rhodecode/templates/admin/settings/hooks.html:24
+msgid "Built in hooks - read only"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/hooks.html:40
+msgid "Custom hooks"
+msgstr "Пользовательские хуки"
+
+#: rhodecode/templates/admin/settings/hooks.html:56
+msgid "remove"
+msgstr "удалить"
+
+#: rhodecode/templates/admin/settings/hooks.html:88
+msgid "Failed to remove hook"
+msgstr "Не удалось удалить хук"
+
+#: rhodecode/templates/admin/settings/settings.html:26
+msgid "Remap and rescan repositories"
+msgstr "Ремапить и пересканировать репозитории"
+
+#: rhodecode/templates/admin/settings/settings.html:34
+msgid "Rescan option"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:40
+msgid ""
+"In case a repository was deleted from filesystem and there are leftovers in "
+"the database check this option to scan obsolete data in database and remove "
+"it."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:41
+msgid "Destroy old data"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:43
+msgid ""
+"Rescan repositories location for new repositories. Also deletes obsolete if "
+"`destroy` flag is checked "
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:48
+msgid "Rescan repositories"
+msgstr "Пересканировать репозитории"
+
+#: rhodecode/templates/admin/settings/settings.html:54
+msgid "Whoosh indexing"
+msgstr "Индексация Whoosh"
+
+#: rhodecode/templates/admin/settings/settings.html:62
+msgid "Index build option"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:67
+msgid "Build from scratch"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:73
+msgid "Reindex"
+msgstr "Перестроить индекс"
+
+#: rhodecode/templates/admin/settings/settings.html:79
+msgid "Global application settings"
+msgstr "Глобальные настройки"
+
+#: rhodecode/templates/admin/settings/settings.html:88
+msgid "Site branding"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:97
+msgid "HTTP authentication realm"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:106
+msgid "Google Analytics code"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:114
+#: rhodecode/templates/admin/settings/settings.html:195
+#: rhodecode/templates/admin/settings/settings.html:287
+msgid "Save settings"
+msgstr "Сохранить настройки"
+
+#: rhodecode/templates/admin/settings/settings.html:121
+msgid "Visualisation settings"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:129
+msgid "General"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:134
+msgid "Use repository extra fields"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:136
+msgid "Allows storing additional customized fields per repository."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:139
+msgid "Show RhodeCode version"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:141
+msgid "Shows or hides displayed version of RhodeCode in the footer"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:146
+msgid "Dashboard items"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:150
+msgid ""
+"Number of items displayed in lightweight dashboard before pagination is "
+"shown."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:155
+msgid "Icons"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:160
+msgid "Show public repo icon on repositories"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:164
+msgid "Show private repo icon on repositories"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:166
+msgid "Show public/private icons next to repositories names"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:172
+msgid "Meta-Tagging"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:177
+msgid "Stylify recognised metatags:"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:204
+msgid "VCS settings"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:213
+msgid "Web"
+msgstr "Веб"
+
+#: rhodecode/templates/admin/settings/settings.html:218
+msgid "Require SSL for vcs operations"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:220
+msgid ""
+"RhodeCode will require SSL for pushing or pulling. If SSL is missing it will"
+" return HTTP Error 406: Not Acceptable"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:226
+msgid "Hooks"
+msgstr "Хуки"
+
+#: rhodecode/templates/admin/settings/settings.html:231
+msgid "Update repository after push (hg update)"
+msgstr "Обновлять репозиторий после отправки (hg update)"
+
+#: rhodecode/templates/admin/settings/settings.html:235
+msgid "Show repository size after push"
+msgstr "Показывать размер репозитория после отправки"
+
+#: rhodecode/templates/admin/settings/settings.html:239
+msgid "Log user push commands"
+msgstr "Логировать пользовательские команды отправки"
+
+#: rhodecode/templates/admin/settings/settings.html:243
+msgid "Log user pull commands"
+msgstr "Логировать пользовательские команды получения"
+
+#: rhodecode/templates/admin/settings/settings.html:247
+msgid "Advanced setup"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:252
+msgid "Mercurial Extensions"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:257
+msgid "Enable largefiles extension"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:261
+msgid "Enable hgsubversion extension"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:263
+msgid ""
+"Requires hgsubversion library installed. Allows cloning from svn remote "
+"locations"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:274
+msgid "Repositories location"
+msgstr "Расположение репозитариев"
+
+#: rhodecode/templates/admin/settings/settings.html:279
+msgid ""
+"Click to unlock. You must restart RhodeCode in order to make this setting "
+"take effect."
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:280
+#: rhodecode/templates/base/base.html:143
+msgid "Unlock"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:282
+msgid ""
+"Location where repositories are stored. After changing this value a restart,"
+" and rescan is required"
+msgstr ""
+
+#: rhodecode/templates/admin/settings/settings.html:303
+msgid "Test Email"
+msgstr "Тестовый E-mail"
+
+#: rhodecode/templates/admin/settings/settings.html:311
+msgid "Email to"
+msgstr "Написать E-mail"
+
+#: rhodecode/templates/admin/settings/settings.html:319
+msgid "Send"
+msgstr "Отправить"
+
+#: rhodecode/templates/admin/settings/settings.html:325
+msgid "System Info and Packages"
+msgstr "Информация о системе и пакеты"
+
+#: rhodecode/templates/admin/settings/settings.html:328
+#: rhodecode/templates/changelog/changelog.html:51
+msgid "Show"
+msgstr "Показать"
+
+#: rhodecode/templates/admin/users/user_add.html:5
+msgid "Add user"
+msgstr "Добавить пользователя"
+
+#: rhodecode/templates/admin/users/user_add.html:10
+#: rhodecode/templates/admin/users/user_edit.html:11
+#: rhodecode/templates/base/base.html:76
+msgid "Users"
+msgstr "Пользователи"
+
+#: rhodecode/templates/admin/users/user_add.html:12
+#: rhodecode/templates/admin/users/users.html:23
+msgid "Add new user"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_add.html:50
+msgid "Password confirmation"
+msgstr "Подтверждение пароля"
+
+#: rhodecode/templates/admin/users/user_edit.html:5
+msgid "Edit user"
+msgstr "Редактировать пользователя"
+
+#: rhodecode/templates/admin/users/user_edit.html:13
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:13
+#, python-format
+msgid "Edit %s"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit.html:34
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:10
+msgid "Change your avatar at"
+msgstr "Измените аватарку через сайт"
+
+#: rhodecode/templates/admin/users/user_edit.html:35
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:11
+msgid "Using"
+msgstr "Используемый"
+
+#: rhodecode/templates/admin/users/user_edit.html:43
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:20
+msgid "API key"
+msgstr "API ключ"
+
+#: rhodecode/templates/admin/users/user_edit.html:50
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:25
+msgid "Current IP"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit.html:70
+msgid "LDAP DN"
+msgstr "LDAP DN"
+
+#: rhodecode/templates/admin/users/user_edit.html:79
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:44
+msgid "New password"
+msgstr "Новый пароль"
+
+#: rhodecode/templates/admin/users/user_edit.html:88
+#: rhodecode/templates/admin/users/user_edit_my_account_form.html:53
+msgid "New password confirmation"
+msgstr "Подтвердите новый пароль"
+
+#: rhodecode/templates/admin/users/user_edit.html:163
+msgid "Email addresses"
+msgstr "Адрес E-mail"
+
+#: rhodecode/templates/admin/users/user_edit.html:176
+#, python-format
+msgid "Confirm to delete this email: %s"
+msgstr "Подтвердите удаление E-mail: %s"
+
+#: rhodecode/templates/admin/users/user_edit.html:190
+msgid "New email address"
+msgstr "Новый E-mail"
+
+#: rhodecode/templates/admin/users/user_edit_my_account.html:5
+#: rhodecode/templates/base/base.html:254
+msgid "My account"
+msgstr "Мой аккаунт"
+
+#: rhodecode/templates/admin/users/user_edit_my_account.html:9
+msgid "My Account"
+msgstr "Мой Аккаунт"
+
+#: rhodecode/templates/admin/users/user_edit_my_account.html:35
+msgid "My permissions"
+msgstr "Мои привилегии"
+
+#: rhodecode/templates/admin/users/user_edit_my_account.html:38
+#: rhodecode/templates/journal/journal.html:54
+msgid "My repos"
+msgstr "Мои репозитории"
+
+#: rhodecode/templates/admin/users/user_edit_my_account.html:41
+msgid "My pull requests"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:4
+msgid "Show closed pull requests"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:6
+msgid "Opened by me"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:15
+#, python-format
+msgid "Pull request #%s opened on %s"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:17
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:45
+#: rhodecode/templates/pullrequests/pullrequest_data.html:11
+#: rhodecode/templates/pullrequests/pullrequest_show.html:27
+#: rhodecode/templates/pullrequests/pullrequest_show.html:42
+msgid "Closed"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:23
+msgid "Confirm to delete this pull request"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:30
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:51
+msgid "Nothing here yet"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:34
+msgid "I participate in"
+msgstr ""
+
+#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:42
+#: rhodecode/templates/pullrequests/pullrequest_data.html:8
+#, python-format
+msgid "Pull request #%s opened by %s on %s"
+msgstr ""
+
+#: rhodecode/templates/admin/users/users.html:5
+msgid "Users administration"
+msgstr "Администрирование пользователей"
+
+#: rhodecode/templates/admin/users/users.html:9
+msgid "users"
+msgstr "пользователи"
+
+#: rhodecode/templates/admin/users/users.html:80
+msgid "Firstname"
+msgstr ""
+
+#: rhodecode/templates/admin/users/users.html:81
+msgid "Lastname"
+msgstr ""
+
+#: rhodecode/templates/admin/users/users.html:82
+msgid "Last login"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_add.html:5
+msgid "Add user group"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_add.html:10
+#: rhodecode/templates/admin/users_groups/users_groups.html:11
+#: rhodecode/templates/base/base.html:77 rhodecode/templates/base/base.html:94
+msgid "User groups"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_add.html:12
+#: rhodecode/templates/admin/users_groups/users_groups.html:26
+msgid "Add new user group"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:5
+msgid "Edit user group"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:11
+msgid "UserGroups"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:50
+#: rhodecode/templates/admin/users_groups/users_groups.html:38
+msgid "Members"
+msgstr "Участники"
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:58
+msgid "Chosen group members"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:61
+msgid "Remove all elements"
+msgstr "Удалить всё"
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:75
+msgid "Available members"
+msgstr "Доступные участники"
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:79
+msgid "Add all elements"
+msgstr "Добавить всё"
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:109
+msgid "No members yet"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_group_edit.html:117
+msgid "Global Permissions"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_groups.html:5
+msgid "User groups administration"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_groups.html:55
+#, python-format
+msgid "Confirm to delete this user group: %s"
+msgstr ""
+
+#: rhodecode/templates/admin/users_groups/users_groups.html:62
+msgid "There are no user groups yet"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:42
+#, python-format
+msgid "Server instance: %s"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:52
+msgid "Report a bug"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:121
+#: rhodecode/templates/data_table/_dt_elements.html:9
+#: rhodecode/templates/data_table/_dt_elements.html:11
+#: rhodecode/templates/data_table/_dt_elements.html:13
+#: rhodecode/templates/summary/summary.html:8
+msgid "Summary"
+msgstr "Итого"
+
+#: rhodecode/templates/base/base.html:122
+#: rhodecode/templates/changelog/changelog.html:15
+#: rhodecode/templates/data_table/_dt_elements.html:17
+#: rhodecode/templates/data_table/_dt_elements.html:19
+#: rhodecode/templates/data_table/_dt_elements.html:21
+msgid "Changelog"
+msgstr "Лог изменений"
+
+#: rhodecode/templates/base/base.html:123
+#: rhodecode/templates/data_table/_dt_elements.html:25
+#: rhodecode/templates/data_table/_dt_elements.html:27
+#: rhodecode/templates/data_table/_dt_elements.html:29
+#: rhodecode/templates/files/files.html:12
+msgid "Files"
+msgstr "Файлы"
+
+#: rhodecode/templates/base/base.html:125
+msgid "Switch To"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:127
+#: rhodecode/templates/base/base.html:279
+msgid "loading..."
+msgstr "Загрузка..."
+
+#: rhodecode/templates/base/base.html:131
+msgid "Options"
+msgstr "Опции"
+
+#: rhodecode/templates/base/base.html:137
+#: rhodecode/templates/forks/forks_data.html:21
+msgid "Compare fork"
+msgstr "Сравнить форк"
+
+#: rhodecode/templates/base/base.html:139
+#: rhodecode/templates/base/base.html:312
+#: rhodecode/templates/search/search.html:14
+#: rhodecode/templates/search/search.html:54
+msgid "Search"
+msgstr "Поиск"
+
+#: rhodecode/templates/base/base.html:145
+msgid "Lock"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:153
+msgid "Follow"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:154
+msgid "Unfollow"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:157
+#: rhodecode/templates/data_table/_dt_elements.html:33
+#: rhodecode/templates/data_table/_dt_elements.html:35
+#: rhodecode/templates/data_table/_dt_elements.html:37
+#: rhodecode/templates/data_table/_dt_elements.html:74
+#: rhodecode/templates/forks/fork.html:9
+msgid "Fork"
+msgstr "Форк"
+
+#: rhodecode/templates/base/base.html:159
+msgid "Create Pull Request"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:165
+msgid "Show Pull Requests"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:165
+msgid "Pull Requests"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:202
+msgid "Not logged in"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:209
+msgid "Login to your account"
+msgstr "Авторизоваться"
+
+#: rhodecode/templates/base/base.html:232
+msgid "Forgot password ?"
+msgstr "Забыли пароль?"
+
+#: rhodecode/templates/base/base.html:255
+msgid "Log Out"
+msgstr "Выход"
+
+#: rhodecode/templates/base/base.html:274
+msgid "Switch repository"
+msgstr "Переключить репозиторий"
+
+#: rhodecode/templates/base/base.html:286
+msgid "Show recent activity"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:287
+#: rhodecode/templates/journal/journal.html:4
+msgid "Journal"
+msgstr "Журнал"
+
+#: rhodecode/templates/base/base.html:298
+msgid "Show public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:303
+msgid "All public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:305
+msgid "My public gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:306
+msgid "My private gists"
+msgstr ""
+
+#: rhodecode/templates/base/base.html:311
+msgid "Search in repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:14
+msgid "Inherit default permissions"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:18
+#, python-format
+msgid ""
+"Select to inherit permissions from %s settings. With this selected below "
+"options does not apply."
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:26
+msgid "Create repositories"
+msgstr "Создать репозитории"
+
+#: rhodecode/templates/base/default_perms_box.html:30
+msgid "Select this option to allow repository creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:35
+msgid "Create user groups"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:39
+msgid "Select this option to allow user group creation for this user"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:44
+msgid "Fork repositories"
+msgstr ""
+
+#: rhodecode/templates/base/default_perms_box.html:48
+msgid "Select this option to allow repository forking for this user"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:11
+msgid "No permissions defined yet"
+msgstr ""
+
+#: rhodecode/templates/base/perms_summary.html:19
+#: rhodecode/templates/base/perms_summary.html:38
+msgid "Permission"
+msgstr "Привилегия"
+
+#: rhodecode/templates/base/perms_summary.html:20
+#: rhodecode/templates/base/perms_summary.html:39
+msgid "Edit Permission"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:43
+msgid "Add another comment"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:44
+#: rhodecode/templates/data_table/_dt_elements.html:147
+msgid "Stop following this repository"
+msgstr "Отменить наблюдение за репозиторием"
+
+#: rhodecode/templates/base/root.html:45
+msgid "Start following this repository"
+msgstr "Наблюдать за репозиторием"
+
+#: rhodecode/templates/base/root.html:46
+msgid "Group"
+msgstr "Группа"
+
+#: rhodecode/templates/base/root.html:47
+msgid "members"
+msgstr "участники"
+
+#: rhodecode/templates/base/root.html:48
+#: rhodecode/templates/pullrequests/pullrequest.html:203
+msgid "Loading ..."
+msgstr ""
+
+#: rhodecode/templates/base/root.html:49
+msgid "Search truncated"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:50
+msgid "No matching files"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:51
+#: rhodecode/templates/changelog/changelog.html:45
+msgid "Open new pull request"
+msgstr "Создать новый pull запрос"
+
+#: rhodecode/templates/base/root.html:52
+msgid "Open new pull request for selected changesets"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:53
+msgid "Show selected changesets __S -> __E"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:54
+msgid "Show selected changeset __S"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:55
+msgid "Selection link"
+msgstr "Ссылка выбора"
+
+#: rhodecode/templates/base/root.html:56
+#: rhodecode/templates/changeset/diff_block.html:8
+msgid "Collapse diff"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:57
+msgid "Expand diff"
+msgstr ""
+
+#: rhodecode/templates/base/root.html:58
+msgid "Failed to remoke permission"
+msgstr ""
+
+#: rhodecode/templates/bookmarks/bookmarks.html:5
+#, python-format
+msgid "%s Bookmarks"
+msgstr "Закладки %s"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:26
+msgid "Compare bookmarks"
+msgstr ""
+
+#: rhodecode/templates/bookmarks/bookmarks.html:51
+#: rhodecode/templates/bookmarks/bookmarks_data.html:8
+#: rhodecode/templates/branches/branches.html:50
+#: rhodecode/templates/branches/branches_data.html:8
+#: rhodecode/templates/changelog/changelog_summary_data.html:8
+#: rhodecode/templates/tags/tags.html:51
+#: rhodecode/templates/tags/tags_data.html:8
+msgid "Author"
+msgstr "Автор"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:52
+#: rhodecode/templates/bookmarks/bookmarks_data.html:9
+#: rhodecode/templates/branches/branches.html:51
+#: rhodecode/templates/branches/branches_data.html:9
+#: rhodecode/templates/changelog/changelog_summary_data.html:5
+#: rhodecode/templates/tags/tags.html:52
+#: rhodecode/templates/tags/tags_data.html:9
+msgid "Revision"
+msgstr "Ревизия"
+
+#: rhodecode/templates/bookmarks/bookmarks.html:54
+#: rhodecode/templates/bookmarks/bookmarks_data.html:10
+#: rhodecode/templates/branches/branches.html:53
+#: rhodecode/templates/branches/branches_data.html:10
+#: rhodecode/templates/tags/tags.html:54
+#: rhodecode/templates/tags/tags_data.html:10
+msgid "Compare"
+msgstr "Сравнить"
+
+#: rhodecode/templates/branches/branches.html:5
+#, python-format
+msgid "%s Branches"
+msgstr "Ветки %s"
+
+#: rhodecode/templates/branches/branches.html:26
+msgid "Compare branches"
+msgstr "Сравнить ветки"
+
+#: rhodecode/templates/changelog/changelog.html:6
+#, python-format
+msgid "%s Changelog"
+msgstr "Логи изменений %s"
+
+#: rhodecode/templates/changelog/changelog.html:19
+#, python-format
+msgid "showing %d out of %d revision"
+msgid_plural "showing %d out of %d revisions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/changelog/changelog.html:39
+msgid "Clear selection"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:42
+#: rhodecode/templates/forks/forks_data.html:19
+#, python-format
+msgid "Compare fork with %s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:42
+msgid "Compare fork with parent"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:78
+#: rhodecode/templates/changelog/changelog_summary_data.html:28
+#, python-format
+msgid "Click to open associated pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:102
+#: rhodecode/templates/summary/summary.html:403
+msgid "Show more"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:115
+#: rhodecode/templates/changelog/changelog_summary_data.html:50
+#: rhodecode/templates/changeset/changeset.html:107
+#: rhodecode/templates/changeset/changeset_range.html:86
+#, python-format
+msgid "Bookmark %s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:121
+#: rhodecode/templates/changelog/changelog_summary_data.html:56
+#: rhodecode/templates/changeset/changeset.html:113
+#: rhodecode/templates/changeset/changeset_range.html:92
+#, python-format
+msgid "Tag %s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:126
+#: rhodecode/templates/changelog/changelog_summary_data.html:61
+#: rhodecode/templates/changeset/changeset.html:117
+#: rhodecode/templates/changeset/changeset_range.html:96
+#, python-format
+msgid "Branch %s"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog.html:286
+msgid "There are no changes yet"
+msgstr "Изменений ещё нет"
+
+#: rhodecode/templates/changelog/changelog_details.html:4
+#: rhodecode/templates/changeset/changeset.html:91
+msgid "Removed"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_details.html:5
+#: rhodecode/templates/changeset/changeset.html:92
+msgid "Changed"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_details.html:6
+#: rhodecode/templates/changeset/changeset.html:93
+msgid "Added"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_details.html:8
+#: rhodecode/templates/changelog/changelog_details.html:9
+#: rhodecode/templates/changelog/changelog_details.html:10
+#: rhodecode/templates/changeset/changeset.html:95
+#: rhodecode/templates/changeset/changeset.html:96
+#: rhodecode/templates/changeset/changeset.html:97
+#, python-format
+msgid "Affected %s files"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:6
+#: rhodecode/templates/files/files_add.html:75
+#: rhodecode/templates/files/files_edit.html:61
+msgid "Commit message"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:7
+msgid "Age"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:9
+msgid "Refs"
+msgstr ""
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:86
+msgid "Add or upload files directly via RhodeCode"
+msgstr "Добавить или загрузить файлы через RhodeCode"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:89
+#: rhodecode/templates/files/files_add.html:38
+#: rhodecode/templates/files/files_browser.html:31
+msgid "Add new file"
+msgstr "Добавить файл"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:95
+msgid "Push new repo"
+msgstr "Отправить новый репозиторий"
+
+#: rhodecode/templates/changelog/changelog_summary_data.html:103
+msgid "Existing repository?"
+msgstr "Существующий репозиторий?"
+
+#: rhodecode/templates/changeset/changeset.html:6
+#, python-format
+msgid "%s Changeset"
+msgstr "%s Изменения"
+
+#: rhodecode/templates/changeset/changeset.html:39
+msgid "No parents"
+msgstr "Родители отсутвуют"
+
+#: rhodecode/templates/changeset/changeset.html:49
+msgid "No children"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset.html:62
+#: rhodecode/templates/changeset/changeset_file_comment.html:20
+#: rhodecode/templates/changeset/changeset_range.html:44
+msgid "Changeset status"
+msgstr "Статут изменений"
+
+#: rhodecode/templates/changeset/changeset.html:67
+#: rhodecode/templates/changeset/diff_block.html:22
+msgid "Raw diff"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset.html:68
+msgid "Patch diff"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset.html:69
+#: rhodecode/templates/changeset/diff_block.html:23
+msgid "Download diff"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
+#, python-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d комментарий"
+msgstr[1] "%d комментариев"
+msgstr[2] "%d комментария"
+
+#: rhodecode/templates/changeset/changeset.html:73
+#: rhodecode/templates/changeset/changeset_file_comment.html:103
+#, python-format
+msgid "(%d inline)"
+msgid_plural "(%d inline)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/changeset/changeset.html:103
+#: rhodecode/templates/changeset/changeset_range.html:82
+msgid "merge"
+msgstr "свести"
+
+#: rhodecode/templates/changeset/changeset.html:126
+#: rhodecode/templates/compare/compare_diff.html:40
+#: rhodecode/templates/pullrequests/pullrequest_show.html:113
+#, python-format
+msgid "%s file changed"
+msgid_plural "%s files changed"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/changeset/changeset.html:128
+#: rhodecode/templates/compare/compare_diff.html:42
+#: rhodecode/templates/pullrequests/pullrequest_show.html:115
+#, 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[2] ""
+
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
+#: rhodecode/templates/pullrequests/pullrequest_show.html:131
+#: rhodecode/templates/pullrequests/pullrequest_show.html:195
+msgid "Showing a huge diff might take some time and resources"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset.html:141
+#: rhodecode/templates/changeset/changeset.html:153
+#: rhodecode/templates/compare/compare_diff.html:58
+#: rhodecode/templates/compare/compare_diff.html:69
+#: rhodecode/templates/pullrequests/pullrequest_show.html:131
+#: rhodecode/templates/pullrequests/pullrequest_show.html:195
+msgid "Show full diff"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:30
+#, python-format
+msgid "Status change on pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:32
+#, python-format
+msgid "Comment on pull request #%s"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:55
+msgid "Submitting..."
+msgstr "Применение..."
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:58
+msgid "Commenting on line {1}."
+msgstr "Комментирование строки {1}."
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:59
+#: rhodecode/templates/changeset/changeset_file_comment.html:145
+#, python-format
+msgid "Comments parsed using %s syntax with %s support."
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:61
+#: rhodecode/templates/changeset/changeset_file_comment.html:147
+msgid ""
+"Use @username inside this text to send notification to this RhodeCode user"
+msgstr "Используйте @имя_пользователя в тексте, чтобы отправить оповещение указанному пользователю RhodeCode"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:65
+#: rhodecode/templates/changeset/changeset_file_comment.html:152
+msgid "Preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:72
+#: rhodecode/templates/changeset/changeset_file_comment.html:170
+msgid "Comment preview"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:80
+#: rhodecode/templates/changeset/changeset_file_comment.html:177
+#: rhodecode/templates/email_templates/changeset_comment.html:16
+#: rhodecode/templates/email_templates/pull_request_comment.html:16
+msgid "Comment"
+msgstr "Комментировать"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:81
+msgid "Cancel"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
+msgid "You need to be logged in to comment."
+msgstr "Вам необходимо авторизоваться, чтобы оставлять комментарии"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:88
+msgid "Login now"
+msgstr "Авторизоваться сейчас"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:92
+msgid "Hide"
+msgstr "Скрыть"
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:149
+msgid "Change status"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_file_comment.html:179
+msgid "Comment and close"
+msgstr ""
+
+#: rhodecode/templates/changeset/changeset_range.html:5
+#, python-format
+msgid "%s Changesets"
+msgstr "%s Изменения"
+
+#: rhodecode/templates/changeset/changeset_range.html:52
+msgid "Files affected"
+msgstr "Затронутые файлы"
+
+#: rhodecode/templates/changeset/diff_block.html:21
+msgid "Show full diff for this file"
+msgstr ""
+
+#: rhodecode/templates/changeset/diff_block.html:29
+msgid "Show inline comments"
+msgstr ""
+
+#: rhodecode/templates/changeset/diff_block.html:53
+msgid "Show file at latest version in this repo"
+msgstr ""
+
+#: rhodecode/templates/changeset/diff_block.html:54
+msgid "Show file at initial version in this repo"
+msgstr ""
+
+#: rhodecode/templates/compare/compare_cs.html:4
+msgid "No changesets"
+msgstr "Нет изменений"
+
+#: rhodecode/templates/compare/compare_cs.html:32
+msgid "Ancestor"
+msgstr ""
+
+#: rhodecode/templates/compare/compare_diff.html:5
+#, python-format
+msgid "%s Compare"
+msgstr ""
+
+#: rhodecode/templates/compare/compare_diff.html:9
+msgid "Compare revisions"
+msgstr ""
+
+#: rhodecode/templates/compare/compare_diff.html:33
+#: rhodecode/templates/pullrequests/pullrequest_show.html:106
+#, python-format
+msgid "Showing %s commit"
+msgid_plural "Showing %s commits"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/compare/compare_diff.html:48
+#: rhodecode/templates/pullrequests/pullrequest_show.html:121
+msgid "No files"
+msgstr ""
+
+#: rhodecode/templates/compare/compare_diff.html:58
+#: rhodecode/templates/compare/compare_diff.html:69
+msgid "confirm to show potentially huge diff"
+msgstr ""
+
+#: rhodecode/templates/data_table/_dt_elements.html:54
+#: rhodecode/templates/summary/summary.html:69
+msgid "Mercurial repository"
+msgstr "Репозиторий Mercurial"
+
+#: rhodecode/templates/data_table/_dt_elements.html:56
+#: rhodecode/templates/summary/summary.html:72
+msgid "Git repository"
+msgstr "Git репозиторий"
+
+#: rhodecode/templates/data_table/_dt_elements.html:74
+#, python-format
+msgid "Fork of %s"
+msgstr ""
+
+#: rhodecode/templates/data_table/_dt_elements.html:88
+msgid "No changesets yet"
+msgstr "Изменений ещё не было"
+
+#: rhodecode/templates/data_table/_dt_elements.html:95
+#: rhodecode/templates/data_table/_dt_elements.html:97
+#, python-format
+msgid "Subscribe to %s rss feed"
+msgstr "Подписаться на ленту %s"
+
+#: rhodecode/templates/data_table/_dt_elements.html:103
+#: rhodecode/templates/data_table/_dt_elements.html:105
+#, python-format
+msgid "Subscribe to %s atom feed"
+msgstr "Подписаться на ленту Atom %s"
+
+#: rhodecode/templates/data_table/_dt_elements.html:122
+#, python-format
+msgid "Confirm to delete this repository: %s"
+msgstr "Подтвердите удаление этого репозитория: %s"
+
+#: rhodecode/templates/data_table/_dt_elements.html:137
+#, python-format
+msgid "Confirm to delete this user: %s"
+msgstr "Подтвердите удаление пользователя %s"
+
+#: rhodecode/templates/email_templates/changeset_comment.html:4
+#: rhodecode/templates/email_templates/pull_request.html:4
+#: rhodecode/templates/email_templates/pull_request_comment.html:4
+msgid "URL"
+msgstr ""
+
+#: rhodecode/templates/email_templates/changeset_comment.html:6
+#, python-format
+msgid "%s commented on a %s changeset."
+msgstr ""
+
+#: rhodecode/templates/email_templates/changeset_comment.html:14
+msgid "The changeset status was changed to"
+msgstr ""
+
+#: rhodecode/templates/email_templates/main.html:8
+msgid "This is a notification from RhodeCode."
+msgstr ""
+
+#: rhodecode/templates/email_templates/password_reset.html:4
+#, python-format
+msgid "Hello %s"
+msgstr ""
+
+#: rhodecode/templates/email_templates/password_reset.html:5
+msgid "We received a request to create a new password for your account."
+msgstr ""
+
+#: rhodecode/templates/email_templates/password_reset.html:6
+msgid "You can generate it by clicking following URL"
+msgstr ""
+
+#: rhodecode/templates/email_templates/password_reset.html:10
+msgid "Please ignore this email if you did not request a new password ."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:6
+#, python-format
+msgid ""
+"%s opened a pull request for repository %s and wants you to review changes."
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request.html:8
+#: rhodecode/templates/pullrequests/pullrequest.html:34
+#: rhodecode/templates/pullrequests/pullrequest_data.html:14
+#: rhodecode/templates/pullrequests/pullrequest_show.html:25
+msgid "Title"
+msgstr "Заголовок"
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:6
+#, python-format
+msgid "%s commented on pull request \"%s\""
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:10
+msgid "Pull request was closed with status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/pull_request_comment.html:12
+msgid "Pull request changed status"
+msgstr ""
+
+#: rhodecode/templates/email_templates/registration.html:6
+msgid "View this user here"
+msgstr ""
+
+#: rhodecode/templates/errors/error_document.html:55
+#, python-format
+msgid "You will be redirected to %s in %s seconds"
+msgstr "Вы будете посланы на %s через %s секунд"
+
+#: rhodecode/templates/files/file_diff.html:4
+#, python-format
+msgid "%s File Diff"
+msgstr ""
+
+#: rhodecode/templates/files/file_diff.html:8
+msgid "File diff"
+msgstr ""
+
+#: rhodecode/templates/files/files.html:4
+#: rhodecode/templates/files/files.html:76
+#, python-format
+msgid "%s Files"
+msgstr "%s Файлы"
+
+#: rhodecode/templates/files/files.html:30
+#: rhodecode/templates/files/files_add.html:31
+#: rhodecode/templates/files/files_edit.html:31
+msgid "Branch"
+msgstr ""
+
+#: rhodecode/templates/files/files_add.html:4
+#, python-format
+msgid "%s Files Add"
+msgstr ""
+
+#: rhodecode/templates/files/files_add.html:19
+msgid "Add file"
+msgstr ""
+
+#: rhodecode/templates/files/files_add.html:43
+msgid "File Name"
+msgstr "Имя файла"
+
+#: rhodecode/templates/files/files_add.html:47
+#: rhodecode/templates/files/files_add.html:56
+msgid "or"
+msgstr "или"
+
+#: rhodecode/templates/files/files_add.html:47
+#: rhodecode/templates/files/files_add.html:52
+msgid "Upload file"
+msgstr "Загрузить файл"
+
+#: rhodecode/templates/files/files_add.html:56
+msgid "Create new file"
+msgstr "Создать файл"
+
+#: rhodecode/templates/files/files_add.html:61
+#: rhodecode/templates/files/files_edit.html:37
+#: rhodecode/templates/files/files_ypjax.html:3
+msgid "Location"
+msgstr "Расположение"
+
+#: rhodecode/templates/files/files_add.html:65
+msgid "use / to separate directories"
+msgstr "используйте / для разделения директорий"
+
+#: rhodecode/templates/files/files_add.html:79
+#: rhodecode/templates/files/files_edit.html:65
+msgid "Commit changes"
+msgstr "Применить изменения"
+
+#: rhodecode/templates/files/files_browser.html:13
+msgid "View"
+msgstr ""
+
+#: rhodecode/templates/files/files_browser.html:14
+msgid "Previous revision"
+msgstr ""
+
+#: rhodecode/templates/files/files_browser.html:16
+msgid "Next revision"
+msgstr ""
+
+#: rhodecode/templates/files/files_browser.html:23
+msgid "Follow current branch"
+msgstr ""
+
+#: rhodecode/templates/files/files_browser.html:27
+msgid "Search file list"
+msgstr ""
+
+#: rhodecode/templates/files/files_browser.html:35
+msgid "Loading file list..."
+msgstr "Загружается список файлов..."
+
+#: rhodecode/templates/files/files_browser.html:48
+msgid "Size"
+msgstr "Размер"
+
+#: rhodecode/templates/files/files_browser.html:49
+msgid "Mimetype"
+msgstr "Тип файла"
+
+#: rhodecode/templates/files/files_browser.html:50
+msgid "Last Revision"
+msgstr "Последняя ревизия"
+
+#: rhodecode/templates/files/files_browser.html:51
+msgid "Last modified"
+msgstr "Последнее изменение"
+
+#: rhodecode/templates/files/files_browser.html:52
+msgid "Last committer"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:4
+#, python-format
+msgid "%s Files Edit"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:19
+msgid "Edit file"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:47
+#: rhodecode/templates/files/files_source.html:23
+msgid "Show annotation"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:49
+#: rhodecode/templates/files/files_source.html:26
+msgid "Download as raw"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:52
+msgid "Source"
+msgstr ""
+
+#: rhodecode/templates/files/files_edit.html:57
+msgid "Editing file"
+msgstr "Редактирование файла"
+
+#: rhodecode/templates/files/files_history_box.html:2
+msgid "History"
+msgstr "История"
+
+#: rhodecode/templates/files/files_history_box.html:9
+msgid "Diff to revision"
+msgstr ""
+
+#: rhodecode/templates/files/files_history_box.html:10
+msgid "Show at revision"
+msgstr ""
+
+#: rhodecode/templates/files/files_history_box.html:11
+msgid "Show full history"
+msgstr ""
+
+#: rhodecode/templates/files/files_history_box.html:16
+#, python-format
+msgid "%s author"
+msgid_plural "%s authors"
+msgstr[0] "%s автор"
+msgstr[1] "%s авторов"
+msgstr[2] "%s автора"
+
+#: rhodecode/templates/files/files_source.html:6
+msgid "Load file history"
+msgstr ""
+
+#: rhodecode/templates/files/files_source.html:21
+msgid "Show source"
+msgstr ""
+
+#: rhodecode/templates/files/files_source.html:29
+#, python-format
+msgid "Edit on branch:%s"
+msgstr ""
+
+#: rhodecode/templates/files/files_source.html:31
+msgid "Edit on branch:?"
+msgstr ""
+
+#: rhodecode/templates/files/files_source.html:31
+msgid "Editing files allowed only when on branch head revision"
+msgstr ""
+
+#: rhodecode/templates/files/files_source.html:46
+#, python-format
+msgid "Binary file (%s)"
+msgstr "Бинарный файл (%s)"
+
+#: rhodecode/templates/files/files_source.html:55
+msgid "File is too big to display"
+msgstr "Файл слишком большой для отображения"
+
+#: rhodecode/templates/files/files_ypjax.html:5
+msgid "annotation"
+msgstr "аннотация"
+
+#: rhodecode/templates/files/files_ypjax.html:15
+msgid "Go back"
+msgstr "Назад"
+
+#: rhodecode/templates/files/files_ypjax.html:16
+msgid "No files at given path"
+msgstr "По заданному пути файлы отсутствуют"
+
+#: rhodecode/templates/followers/followers.html:5
+#, python-format
+msgid "%s Followers"
+msgstr "%s Наблюдатели"
+
+#: rhodecode/templates/followers/followers.html:9
+#: rhodecode/templates/summary/summary.html:183
+#: rhodecode/templates/summary/summary.html:184
+msgid "Followers"
+msgstr "Наблюдатели"
+
+#: rhodecode/templates/followers/followers_data.html:12
+msgid "Started following -"
+msgstr ""
+
+#: rhodecode/templates/forks/fork.html:5
+#, python-format
+msgid "%s Fork"
+msgstr "Форк %s"
+
+#: rhodecode/templates/forks/fork.html:28
+msgid "Fork name"
+msgstr "Имя форка"
+
+#: rhodecode/templates/forks/fork.html:65
+msgid "Private"
+msgstr "Частный"
+
+#: rhodecode/templates/forks/fork.html:74
+msgid "Copy permissions"
+msgstr "Права копирования"
+
+#: rhodecode/templates/forks/fork.html:78
+msgid "Copy permissions from forked repository"
+msgstr "Скопировать привилегии с форкнутого репозитория"
+
+#: rhodecode/templates/forks/fork.html:84
+msgid "Update after clone"
+msgstr "Обновлять после клонирования"
+
+#: rhodecode/templates/forks/fork.html:88
+msgid "Checkout source after making a clone"
+msgstr "Скачивать исходники после создания клона"
+
+#: rhodecode/templates/forks/fork.html:93
+msgid "Fork this repository"
+msgstr ""
+
+#: rhodecode/templates/forks/forks.html:5
+#, python-format
+msgid "%s Forks"
+msgstr "Форки %s"
+
+#: rhodecode/templates/forks/forks.html:9
+#: rhodecode/templates/summary/summary.html:189
+#: rhodecode/templates/summary/summary.html:190
+msgid "Forks"
+msgstr "Ответвления"
+
+#: rhodecode/templates/forks/forks_data.html:17
+msgid "Forked"
+msgstr ""
+
+#: rhodecode/templates/forks/forks_data.html:42
+msgid "There are no forks yet"
+msgstr "Форки ещё не созданы"
+
+#: rhodecode/templates/journal/journal.html:21
+msgid "ATOM journal feed"
+msgstr "Лента журнала ATOM"
+
+#: rhodecode/templates/journal/journal.html:22
+msgid "RSS journal feed"
+msgstr "Лента журнала RSS"
+
+#: rhodecode/templates/journal/journal.html:32
+msgid "Refresh"
+msgstr "Обновить"
+
+#: rhodecode/templates/journal/journal.html:35
+#: rhodecode/templates/journal/public_journal.html:24
+msgid "ATOM feed"
+msgstr "ATOM лента"
+
+#: rhodecode/templates/journal/journal.html:51
+msgid "Watched"
+msgstr "Просмотрено"
+
+#: rhodecode/templates/journal/journal_data.html:55
+msgid "No entries yet"
+msgstr "Записи отсуствуют"
+
+#: rhodecode/templates/journal/public_journal.html:4
+#: rhodecode/templates/journal/public_journal.html:21
+msgid "Public Journal"
+msgstr "Публичный журнал"
+
+#: rhodecode/templates/journal/public_journal.html:13
+msgid "ATOM public journal feed"
+msgstr "Общая лента журнала ATOM"
+
+#: rhodecode/templates/journal/public_journal.html:14
+msgid "RSS public journal feed"
+msgstr "Общая лента журнала RSS"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:4
+#: rhodecode/templates/pullrequests/pullrequest.html:8
+msgid "New pull request"
+msgstr "Новый pull запрос"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:25
+msgid "Create new pull request"
+msgstr "Создать новый Pull запрос"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:47
+msgid "Write a short description on this pull request"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:53
+msgid "Changeset flow"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:60
+#: rhodecode/templates/pullrequests/pullrequest_show.html:65
+msgid "Origin repository"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:85
+msgid "Send pull request"
+msgstr "Отправить pull запрос"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:94
+#: rhodecode/templates/pullrequests/pullrequest_show.html:137
+msgid "Pull request reviewers"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:103
+#: rhodecode/templates/pullrequests/pullrequest_show.html:149
+msgid "owner"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:115
+msgid "Add reviewer to this pull request."
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest.html:129
+msgid "Detailed compare view"
+msgstr "Детальное сравнение"
+
+#: rhodecode/templates/pullrequests/pullrequest.html:150
+msgid "Destination repository"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:4
+#, python-format
+msgid "%s Pull Request #%s"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:35
+msgid "Review status"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:40
+msgid "Pull request status"
+msgstr "Статус pull-запроса"
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:53
+msgid "Still not reviewed by"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:57
+#, python-format
+msgid "%d reviewer"
+msgid_plural "%d reviewers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:59
+msgid "Pull request was reviewed by all reviewers"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:89
+msgid "Created on"
+msgstr "Создано"
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:102
+msgid "Compare view"
+msgstr "Сравнение"
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:149
+msgid "reviewer"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:164
+msgid "Add or remove reviewer to this pull request."
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show.html:168
+msgid "Save changes"
+msgstr ""
+
+#: rhodecode/templates/pullrequests/pullrequest_show_all.html:4
+#, python-format
+msgid "%s Pull Requests"
+msgstr ""
+
+#: rhodecode/templates/search/search.html:6
+msgid "Search repository"
+msgstr ""
+
+#: rhodecode/templates/search/search.html:8
+#: rhodecode/templates/search/search.html:16
+msgid "Search in all repositories"
+msgstr "Искать по всем репозиториям"
+
+#: rhodecode/templates/search/search.html:50
+msgid "Search term"
+msgstr "Искать термин"
+
+#: rhodecode/templates/search/search.html:62
+msgid "Search in"
+msgstr "Искать в"
+
+#: rhodecode/templates/search/search.html:65
+msgid "File contents"
+msgstr "Содержимое файла"
+
+#: rhodecode/templates/search/search.html:66
+msgid "Commit messages"
+msgstr ""
+
+#: rhodecode/templates/search/search.html:67
+msgid "File names"
+msgstr "Имя файла"
+
+#: rhodecode/templates/search/search_commit.html:35
+#: rhodecode/templates/search/search_content.html:21
+#: rhodecode/templates/search/search_path.html:15
+msgid "Permission denied"
+msgstr "Нет прав"
+
+#: rhodecode/templates/summary/summary.html:4
+#, python-format
+msgid "%s Summary"
+msgstr "Итого %s"
+
+#: rhodecode/templates/summary/summary.html:16
+#, python-format
+msgid "%s ATOM feed"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:17
+#, python-format
+msgid "%s RSS feed"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:62
+#, python-format
+msgid "Repository locked by %s"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:64
+msgid "Repository unlocked"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:83
+#, python-format
+msgid "Non changable ID %s"
+msgstr "Неизменяемый ID %s"
+
+#: rhodecode/templates/summary/summary.html:88
+msgid "Public"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:88
+#: rhodecode/templates/summary/summary.html:89
+msgid "Fork of"
+msgstr "Форк от"
+
+#: rhodecode/templates/summary/summary.html:97
+msgid "Remote clone"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:117
+msgid "Contact"
+msgstr "Контакты"
+
+#: rhodecode/templates/summary/summary.html:131
+msgid "Clone url"
+msgstr "Клонировать URL"
+
+#: rhodecode/templates/summary/summary.html:136
+msgid "Show by Name"
+msgstr "Показать по имени"
+
+#: rhodecode/templates/summary/summary.html:137
+msgid "Show by ID"
+msgstr "Показать по ID"
+
+#: rhodecode/templates/summary/summary.html:143
+msgid "Trending files"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:151
+#: rhodecode/templates/summary/summary.html:167
+msgid "Enable"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:159
+msgid "Download"
+msgstr "Скачать"
+
+#: rhodecode/templates/summary/summary.html:163
+msgid "There are no downloads yet"
+msgstr "Скачиваний ещё нет"
+
+#: rhodecode/templates/summary/summary.html:165
+msgid "Downloads are disabled for this repository"
+msgstr "Скачивание отключено в этом репозитории"
+
+#: rhodecode/templates/summary/summary.html:170
+msgid "Download as zip"
+msgstr "Скачать в zip"
+
+#: rhodecode/templates/summary/summary.html:174
+msgid "Check this to download archive with subrepos"
+msgstr "Отметьте для скачивания архива с дочерними репозиториями"
+
+#: rhodecode/templates/summary/summary.html:174
+msgid "with subrepos"
+msgstr "с дочерними репозиториями"
+
+#: rhodecode/templates/summary/summary.html:197
+msgid "Repository Size"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:204
+#: rhodecode/templates/summary/summary.html:206
+msgid "Feed"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:224
+msgid "Commit activity by day / author"
+msgstr "Активность изменений по дням/авторам"
+
+#: rhodecode/templates/summary/summary.html:232
+msgid "enable"
+msgstr "включить"
+
+#: rhodecode/templates/summary/summary.html:235
+msgid "Stats gathered: "
+msgstr "Полученная статистика:"
+
+#: rhodecode/templates/summary/summary.html:256
+msgid "Latest changes"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:258
+msgid "Quick start"
+msgstr "Быстрый старт"
+
+#: rhodecode/templates/summary/summary.html:272
+#, python-format
+msgid "Readme file from revision %s"
+msgstr ""
+
+#: rhodecode/templates/summary/summary.html:332
+#, python-format
+msgid "Download %s as %s"
+msgstr "Скачать %s как %s"
+
+#: rhodecode/templates/summary/summary.html:379
+msgid "files"
+msgstr "файлы"
+
+#: rhodecode/templates/summary/summary.html:689
+msgid "commits"
+msgstr "правки"
+
+#: rhodecode/templates/summary/summary.html:690
+msgid "files added"
+msgstr "файлы добавлены"
+
+#: rhodecode/templates/summary/summary.html:691
+msgid "files changed"
+msgstr "файлы изменены"
+
+#: rhodecode/templates/summary/summary.html:692
+msgid "files removed"
+msgstr "файлы удалены"
+
+#: rhodecode/templates/summary/summary.html:694
+msgid "commit"
+msgstr "правка"
+
+#: rhodecode/templates/summary/summary.html:695
+msgid "file added"
+msgstr "файл удалён"
+
+#: rhodecode/templates/summary/summary.html:696
+msgid "file changed"
+msgstr "файл изменён"
+
+#: rhodecode/templates/summary/summary.html:697
+msgid "file removed"
+msgstr "файл удалён"
+
+#: rhodecode/templates/tags/tags.html:5
+#, python-format
+msgid "%s Tags"
+msgstr "Тэги %s"
+
+#: rhodecode/templates/tags/tags.html:26
+msgid "Compare tags"
+msgstr ""
--- a/rhodecode/lib/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -12,11 +12,13 @@
     try:
         from rhodecode.lib.vcs import get_repo
         from rhodecode.lib.vcs.utils.helpers import get_scm
-        repopath = os.path.join(os.path.dirname(__file__), '..', '..')
+        repopath = os.path.abspath(os.path.join(os.path.dirname(__file__),
+                                                '..', '..'))
         scm = get_scm(repopath)[0]
         repo = get_repo(path=repopath, alias=scm)
-        tip = repo.get_changeset()
-        return (tip.revision, tip.short_id)
+        wk_dir = repo.workdir
+        cur_rev = wk_dir.get_changeset()
+        return (cur_rev.revision, cur_rev.short_id)
     except Exception, err:
         if not quiet:
             print ("WARNING: Cannot retrieve rhodecode's revision. "
--- a/rhodecode/lib/auth.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/auth.py	Fri Jun 07 00:31:11 2013 +0200
@@ -39,10 +39,11 @@
 from rhodecode import __platform__, is_windows, is_unix
 from rhodecode.model.meta import Session
 
-from rhodecode.lib.utils2 import str2bool, safe_unicode
+from rhodecode.lib.utils2 import str2bool, safe_unicode, aslist
 from rhodecode.lib.exceptions import LdapPasswordError, LdapUsernameError,\
     LdapImportError
-from rhodecode.lib.utils import get_repo_slug, get_repos_group_slug
+from rhodecode.lib.utils import get_repo_slug, get_repos_group_slug,\
+    get_user_group_slug
 from rhodecode.lib.auth_ldap import AuthLdap
 
 from rhodecode.model import meta
@@ -227,8 +228,8 @@
                  'name': safe_unicode(get_ldap_attr('ldap_attr_firstname')),
                  'lastname': safe_unicode(get_ldap_attr('ldap_attr_lastname')),
                  'email': get_ldap_attr('ldap_attr_email'),
-                 'active': 'hg.register.auto_activate' in User\
-                    .get_by_username('default').AuthUser.permissions['global']
+                 'active': 'hg.extern_activate.auto' in User.get_default_user()\
+                                                .AuthUser.permissions['global']
                 }
 
                 # don't store LDAP password since we don't need it. Override
@@ -257,8 +258,8 @@
             'name': username,
             'lastname': None,
             'email': None,
-            'active': 'hg.register.auto_activate' in User\
-               .get_by_username('default').AuthUser.permissions['global']
+            'active': 'hg.extern_activate.auto' in User.get_default_user()\
+                                            .AuthUser.permissions['global']
         }
         user = UserModel().create_for_container_auth(username, user_attrs)
         if not user:
@@ -402,7 +403,7 @@
         return self.admin
 
     @property
-    def repos_admin(self):
+    def repositories_admin(self):
         """
         Returns list of repositories you're an admin of
         """
@@ -410,7 +411,7 @@
                 if x[1] == 'repository.admin']
 
     @property
-    def groups_admin(self):
+    def repository_groups_admin(self):
         """
         Returns list of repository groups you're an admin of
         """
@@ -418,6 +419,14 @@
                 if x[1] == 'group.admin']
 
     @property
+    def user_groups_admin(self):
+        """
+        Returns list of user groups you're an admin of
+        """
+        return [x[0] for x in self.permissions['user_groups'].iteritems()
+                if x[1] == 'usergroup.admin']
+
+    @property
     def ip_allowed(self):
         """
         Checks if ip_addr used in constructor is allowed from defined list of
@@ -436,8 +445,8 @@
             return False
 
     def __repr__(self):
-        return "<AuthUser('id:%s:%s|%s')>" % (self.user_id, self.username,
-                                              self.is_authenticated)
+        return "<AuthUser('id:%s[%s] ip:%s auth:%s')>"\
+            % (self.user_id, self.username, self.ip_addr, self.is_authenticated)
 
     def set_authenticated(self, authenticated=True):
         if self.user_id != self.anonymous_user.user_id:
@@ -522,7 +531,12 @@
         cls = fargs[0]
         user = cls.rhodecode_user
         loc = "%s:%s" % (cls.__class__.__name__, func.__name__)
-
+        # defined whitelist of controllers which API access will be enabled
+        whitelist = aslist(config.get('api_access_controllers_whitelist'),
+                           sep=',')
+        api_access_whitelist = loc in whitelist
+        log.debug('loc:%s is in API whitelist:%s:%s' % (loc, whitelist,
+                                                        api_access_whitelist))
         #check IP
         ip_access_ok = True
         if not user.ip_allowed:
@@ -532,7 +546,7 @@
             ip_access_ok = False
 
         api_access_ok = False
-        if self.api_access:
+        if self.api_access or api_access_whitelist:
             log.debug('Checking API KEY access for %s' % cls)
             if user.api_key == request.GET.get('api_key'):
                 api_access_ok = True
@@ -693,7 +707,7 @@
 class HasReposGroupPermissionAllDecorator(PermsDecorator):
     """
     Checks for access permission for all given predicates for specific
-    repository. All of them have to be meet in order to fulfill the request
+    repository group. All of them have to be meet in order to fulfill the request
     """
 
     def check_permissions(self):
@@ -711,7 +725,7 @@
 class HasReposGroupPermissionAnyDecorator(PermsDecorator):
     """
     Checks for access permission for any of given predicates for specific
-    repository. In order to fulfill the request any of predicates must be meet
+    repository group. In order to fulfill the request any of predicates must be meet
     """
 
     def check_permissions(self):
@@ -726,6 +740,42 @@
         return False
 
 
+class HasUserGroupPermissionAllDecorator(PermsDecorator):
+    """
+    Checks for access permission for all given predicates for specific
+    user group. All of them have to be meet in order to fulfill the request
+    """
+
+    def check_permissions(self):
+        group_name = get_user_group_slug(request)
+        try:
+            user_perms = set([self.user_perms['user_groups'][group_name]])
+        except KeyError:
+            return False
+
+        if self.required_perms.issubset(user_perms):
+            return True
+        return False
+
+
+class HasUserGroupPermissionAnyDecorator(PermsDecorator):
+    """
+    Checks for access permission for any of given predicates for specific
+    user group. In order to fulfill the request any of predicates must be meet
+    """
+
+    def check_permissions(self):
+        group_name = get_user_group_slug(request)
+        try:
+            user_perms = set([self.user_perms['user_groups'][group_name]])
+        except KeyError:
+            return False
+
+        if self.required_perms.intersection(user_perms):
+            return True
+        return False
+
+
 #==============================================================================
 # CHECK FUNCTIONS
 #==============================================================================
@@ -865,6 +915,39 @@
         return False
 
 
+class HasUserGroupPermissionAny(PermsFunction):
+    def __call__(self, user_group_name=None, check_location=''):
+        self.user_group_name = user_group_name
+        return super(HasUserGroupPermissionAny, self).__call__(check_location)
+
+    def check_permissions(self):
+        try:
+            self._user_perms = set(
+                [self.user_perms['user_groups'][self.user_group_name]]
+            )
+        except KeyError:
+            return False
+        if self.required_perms.intersection(self._user_perms):
+            return True
+        return False
+
+
+class HasUserGroupPermissionAll(PermsFunction):
+    def __call__(self, user_group_name=None, check_location=''):
+        self.user_group_name = user_group_name
+        return super(HasUserGroupPermissionAll, self).__call__(check_location)
+
+    def check_permissions(self):
+        try:
+            self._user_perms = set(
+                [self.user_perms['user_groups'][self.user_group_name]]
+            )
+        except KeyError:
+            return False
+        if self.required_perms.issubset(self._user_perms):
+            return True
+        return False
+
 #==============================================================================
 # SPECIAL VERSION TO HANDLE MIDDLEWARE AUTH
 #==============================================================================
--- a/rhodecode/lib/base.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/base.py	Fri Jun 07 00:31:11 2013 +0200
@@ -21,7 +21,7 @@
     safe_str, safe_int
 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
     HasPermissionAnyMiddleware, CookieStoreWrapper
-from rhodecode.lib.utils import get_repo_slug, invalidate_cache
+from rhodecode.lib.utils import get_repo_slug
 from rhodecode.model import meta
 
 from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting
@@ -149,7 +149,7 @@
 
         :param repo_name: full repo name, also a cache key
         """
-        invalidate_cache('get_repo_cached_%s' % repo_name)
+        ScmModel().mark_for_invalidation(repo_name)
 
     def _check_permission(self, action, user, repo_name, ip_addr=None):
         """
@@ -267,19 +267,22 @@
         # Visual options
         c.visual = AttributeDict({})
         rc_config = RhodeCodeSetting.get_app_settings()
-
+        ## DB stored
         c.visual.show_public_icon = str2bool(rc_config.get('rhodecode_show_public_icon'))
         c.visual.show_private_icon = str2bool(rc_config.get('rhodecode_show_private_icon'))
         c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags'))
-        c.visual.lightweight_dashboard = str2bool(rc_config.get('rhodecode_lightweight_dashboard'))
-        c.visual.lightweight_dashboard_items = safe_int(config.get('dashboard_items', 100))
+        c.visual.dashboard_items = safe_int(rc_config.get('rhodecode_dashboard_items', 100))
         c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
+        c.visual.show_version = str2bool(rc_config.get('rhodecode_show_version'))
+
+        ## INI stored
+        self.cut_off_limit = int(config.get('cut_off_limit'))
+        c.visual.allow_repo_location_change = str2bool(config.get('allow_repo_location_change', True))
+
         c.repo_name = get_repo_slug(request)  # can be empty
         c.backends = BACKENDS.keys()
         c.unread_notifications = NotificationModel()\
                         .get_unread_cnt_for_user(c.rhodecode_user.user_id)
-        self.cut_off_limit = int(config.get('cut_off_limit'))
-
         self.sa = meta.Session
         self.scm_model = ScmModel(self.sa)
 
--- a/rhodecode/lib/celerypylons/commands.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/celerypylons/commands.py	Fri Jun 07 00:31:11 2013 +0200
@@ -35,7 +35,7 @@
         except KeyError:
             CELERY_ON = False
 
-        if CELERY_ON == False:
+        if not CELERY_ON:
             raise Exception('Please enable celery_on in .ini config '
                             'file before running celeryd')
         rhodecode.CELERY_ON = CELERY_ON
--- a/rhodecode/lib/compat.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/compat.py	Fri Jun 07 00:31:11 2013 +0200
@@ -25,14 +25,17 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
-from rhodecode import __platform__, PLATFORM_WIN, __py_version__
+from rhodecode import __py_version__, is_windows
 
 #==============================================================================
 # json
 #==============================================================================
 from rhodecode.lib.ext_json import json
-import array
 
+if __py_version__ >= (2, 7):
+    import unittest
+else:
+    import unittest2 as unittest
 
 #==============================================================================
 # izip_longest
@@ -366,7 +369,7 @@
 #==============================================================================
 # kill FUNCTIONS
 #==============================================================================
-if __platform__ in PLATFORM_WIN:
+if is_windows:
     import ctypes
 
     def kill(pid, sig):
@@ -419,6 +422,7 @@
 if __py_version__ >= (2, 6):
     _bytearray = bytearray
 else:
+    import array
     # no idea if this is correct but all integration tests are passing
     # i think we never use bytearray anyway
     _bytearray = array
@@ -548,173 +552,3 @@
             memo[id(self)] = result
             result.__init__(deepcopy(tuple(self), memo))
             return result
-
-
-#==============================================================================
-# threading.Event
-#==============================================================================
-
-if __py_version__ >= (2, 6):
-    from threading import Event, Thread
-else:
-    from threading import _Verbose, Condition, Lock, Thread, _time, \
-        _allocate_lock, RLock, _sleep
-
-    def Condition(*args, **kwargs):
-        return _Condition(*args, **kwargs)
-
-    class _Condition(_Verbose):
-
-        def __init__(self, lock=None, verbose=None):
-            _Verbose.__init__(self, verbose)
-            if lock is None:
-                lock = RLock()
-            self.__lock = lock
-            # Export the lock's acquire() and release() methods
-            self.acquire = lock.acquire
-            self.release = lock.release
-            # If the lock defines _release_save() and/or _acquire_restore(),
-            # these override the default implementations (which just call
-            # release() and acquire() on the lock).  Ditto for _is_owned().
-            try:
-                self._release_save = lock._release_save
-            except AttributeError:
-                pass
-            try:
-                self._acquire_restore = lock._acquire_restore
-            except AttributeError:
-                pass
-            try:
-                self._is_owned = lock._is_owned
-            except AttributeError:
-                pass
-            self.__waiters = []
-
-        def __enter__(self):
-            return self.__lock.__enter__()
-
-        def __exit__(self, *args):
-            return self.__lock.__exit__(*args)
-
-        def __repr__(self):
-            return "<Condition(%s, %d)>" % (self.__lock, len(self.__waiters))
-
-        def _release_save(self):
-            self.__lock.release()           # No state to save
-
-        def _acquire_restore(self, x):
-            self.__lock.acquire()           # Ignore saved state
-
-        def _is_owned(self):
-            # Return True if lock is owned by current_thread.
-            # This method is called only if __lock doesn't have _is_owned().
-            if self.__lock.acquire(0):
-                self.__lock.release()
-                return False
-            else:
-                return True
-
-        def wait(self, timeout=None):
-            if not self._is_owned():
-                raise RuntimeError("cannot wait on un-acquired lock")
-            waiter = _allocate_lock()
-            waiter.acquire()
-            self.__waiters.append(waiter)
-            saved_state = self._release_save()
-            try:    # restore state no matter what (e.g., KeyboardInterrupt)
-                if timeout is None:
-                    waiter.acquire()
-                    if __debug__:
-                        self._note("%s.wait(): got it", self)
-                else:
-                    # Balancing act:  We can't afford a pure busy loop, so we
-                    # have to sleep; but if we sleep the whole timeout time,
-                    # we'll be unresponsive.  The scheme here sleeps very
-                    # little at first, longer as time goes on, but never longer
-                    # than 20 times per second (or the timeout time remaining).
-                    endtime = _time() + timeout
-                    delay = 0.0005 # 500 us -> initial delay of 1 ms
-                    while True:
-                        gotit = waiter.acquire(0)
-                        if gotit:
-                            break
-                        remaining = endtime - _time()
-                        if remaining <= 0:
-                            break
-                        delay = min(delay * 2, remaining, .05)
-                        _sleep(delay)
-                    if not gotit:
-                        if __debug__:
-                            self._note("%s.wait(%s): timed out", self, timeout)
-                        try:
-                            self.__waiters.remove(waiter)
-                        except ValueError:
-                            pass
-                    else:
-                        if __debug__:
-                            self._note("%s.wait(%s): got it", self, timeout)
-            finally:
-                self._acquire_restore(saved_state)
-
-        def notify(self, n=1):
-            if not self._is_owned():
-                raise RuntimeError("cannot notify on un-acquired lock")
-            __waiters = self.__waiters
-            waiters = __waiters[:n]
-            if not waiters:
-                if __debug__:
-                    self._note("%s.notify(): no waiters", self)
-                return
-            self._note("%s.notify(): notifying %d waiter%s", self, n,
-                       n != 1 and "s" or "")
-            for waiter in waiters:
-                waiter.release()
-                try:
-                    __waiters.remove(waiter)
-                except ValueError:
-                    pass
-
-        def notifyAll(self):
-            self.notify(len(self.__waiters))
-
-        notify_all = notifyAll
-
-    def Event(*args, **kwargs):
-        return _Event(*args, **kwargs)
-
-    class _Event(_Verbose):
-
-        # After Tim Peters' event class (without is_posted())
-
-        def __init__(self, verbose=None):
-            _Verbose.__init__(self, verbose)
-            self.__cond = Condition(Lock())
-            self.__flag = False
-
-        def isSet(self):
-            return self.__flag
-
-        is_set = isSet
-
-        def set(self):
-            self.__cond.acquire()
-            try:
-                self.__flag = True
-                self.__cond.notify_all()
-            finally:
-                self.__cond.release()
-
-        def clear(self):
-            self.__cond.acquire()
-            try:
-                self.__flag = False
-            finally:
-                self.__cond.release()
-
-        def wait(self, timeout=None):
-            self.__cond.acquire()
-            try:
-                if not self.__flag:
-                    self.__cond.wait(timeout)
-            finally:
-                self.__cond.release()
--- a/rhodecode/lib/db_manage.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/db_manage.py	Fri Jun 07 00:31:11 2013 +0200
@@ -26,6 +26,7 @@
 
 import os
 import sys
+import time
 import uuid
 import logging
 from os.path import dirname as dn, join as jn
@@ -37,13 +38,15 @@
 from rhodecode.model import init_model
 from rhodecode.model.db import User, Permission, RhodeCodeUi, \
     RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup, \
-    UserRepoGroupToPerm
+    UserRepoGroupToPerm, CacheInvalidation, UserGroup
 
 from sqlalchemy.engine import create_engine
 from rhodecode.model.repos_group import ReposGroupModel
 #from rhodecode.model import meta
 from rhodecode.model.meta import Session, Base
 from rhodecode.model.repo import RepoModel
+from rhodecode.model.permission import PermissionModel
+from rhodecode.model.users_group import UserGroupModel
 
 
 log = logging.getLogger(__name__)
@@ -54,7 +57,164 @@
     Notification for migrations messages
     """
     ml = len(msg) + (4 * 2)
-    print >> sys.stdout, ('*** %s ***\n%s' % (msg, '*' * ml)).upper()
+    print('\n%s\n*** %s ***\n%s' % ('*' * ml, msg, '*' * ml)).upper()
+
+
+class UpgradeSteps(object):
+    """
+    Those steps follow schema versions so for example schema
+    for example schema with seq 002 == step_2 and so on.
+    """
+
+    def __init__(self, klass):
+        self.klass = klass
+
+    def step_1(self):
+        pass
+
+    def step_2(self):
+        notify('Patching repo paths for newer version of RhodeCode')
+        self.klass.fix_repo_paths()
+
+        notify('Patching default user of RhodeCode')
+        self.klass.fix_default_user()
+
+        log.info('Changing ui settings')
+        self.klass.create_ui_settings()
+
+    def step_3(self):
+        notify('Adding additional settings into RhodeCode db')
+        self.klass.fix_settings()
+        notify('Adding ldap defaults')
+        self.klass.create_ldap_options(skip_existing=True)
+
+    def step_4(self):
+        notify('create permissions and fix groups')
+        self.klass.create_permissions()
+        self.klass.fixup_groups()
+
+    def step_5(self):
+        pass
+
+    def step_6(self):
+
+        notify('re-checking permissions')
+        self.klass.create_permissions()
+
+        notify('installing new UI options')
+        sett4 = RhodeCodeSetting('show_public_icon', True)
+        Session().add(sett4)
+        sett5 = RhodeCodeSetting('show_private_icon', True)
+        Session().add(sett5)
+        sett6 = RhodeCodeSetting('stylify_metatags', False)
+        Session().add(sett6)
+
+        notify('fixing old PULL hook')
+        _pull = RhodeCodeUi.get_by_key('preoutgoing.pull_logger')
+        if _pull:
+            _pull.ui_key = RhodeCodeUi.HOOK_PULL
+            Session().add(_pull)
+
+        notify('fixing old PUSH hook')
+        _push = RhodeCodeUi.get_by_key('pretxnchangegroup.push_logger')
+        if _push:
+            _push.ui_key = RhodeCodeUi.HOOK_PUSH
+            Session().add(_push)
+
+        notify('installing new pre-push hook')
+        hooks4 = RhodeCodeUi()
+        hooks4.ui_section = 'hooks'
+        hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH
+        hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push'
+        Session().add(hooks4)
+
+        notify('installing new pre-pull hook')
+        hooks6 = RhodeCodeUi()
+        hooks6.ui_section = 'hooks'
+        hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL
+        hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull'
+        Session().add(hooks6)
+
+        notify('installing hgsubversion option')
+        # enable hgsubversion disabled by default
+        hgsubversion = RhodeCodeUi()
+        hgsubversion.ui_section = 'extensions'
+        hgsubversion.ui_key = 'hgsubversion'
+        hgsubversion.ui_value = ''
+        hgsubversion.ui_active = False
+        Session().add(hgsubversion)
+
+        notify('installing hg git option')
+        # enable hggit disabled by default
+        hggit = RhodeCodeUi()
+        hggit.ui_section = 'extensions'
+        hggit.ui_key = 'hggit'
+        hggit.ui_value = ''
+        hggit.ui_active = False
+        Session().add(hggit)
+
+        notify('re-check default permissions')
+        default_user = User.get_by_username(User.DEFAULT_USER)
+        perm = Permission.get_by_key('hg.fork.repository')
+        reg_perm = UserToPerm()
+        reg_perm.user = default_user
+        reg_perm.permission = perm
+        Session().add(reg_perm)
+
+    def step_7(self):
+        perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER)
+        Session().commit()
+        if perm_fixes:
+            notify('There was an inconsistent state of permissions '
+                   'detected for default user. Permissions are now '
+                   'reset to the default value for default user. '
+                   'Please validate and check default permissions '
+                   'in admin panel')
+
+    def step_8(self):
+        self.klass.create_permissions()
+        self.klass.populate_default_permissions()
+        self.klass.create_default_options(skip_existing=True)
+        Session().commit()
+
+    def step_9(self):
+        pass
+
+    def step_10(self):
+        pass
+
+    def step_11(self):
+        self.klass.update_repo_info()
+
+    def step_12(self):
+        self.klass.create_permissions()
+        Session().commit()
+
+        self.klass.populate_default_permissions()
+        Session().commit()
+
+        #fix all usergroups
+        ug_model = UserGroupModel()
+        for ug in UserGroup.get_all():
+            perm_obj = ug_model._create_default_perms(ug)
+            Session().add(perm_obj)
+        Session().commit()
+
+        adm = User.get_first_admin()
+        # fix owners of UserGroup
+        for ug in Session().query(UserGroup).all():
+            ug.user_id = adm.user_id
+            Session().add(ug)
+        Session().commit()
+
+        # fix owners of RepoGroup
+        for ug in Session().query(RepoGroup).all():
+            ug.user_id = adm.user_id
+            Session().add(ug)
+        Session().commit()
+
+    def step_13(self):
+        pass
 
 
 class DbManage(object):
@@ -89,7 +249,7 @@
         else:
             destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
         if not destroy:
-            sys.exit('Nothing done')
+            sys.exit('Nothing tables created')
         if destroy:
             Base.metadata.drop_all()
 
@@ -127,7 +287,7 @@
                          'sure You backed up your database before. '
                          'Continue ? [y/n]')
         if not upgrade:
-            sys.exit('Nothing done')
+            sys.exit('No upgrade performed')
 
         repository_path = jn(dn(dn(dn(os.path.realpath(__file__)))),
                              'rhodecode/lib/dbmigrate')
@@ -149,157 +309,28 @@
         if curr_version == __dbversion__:
             sys.exit('This database is already at the newest version')
 
-        #======================================================================
-        # UPGRADE STEPS
-        #======================================================================
-
-        class UpgradeSteps(object):
-            """
-            Those steps follow schema versions so for example schema
-            for example schema with seq 002 == step_2 and so on.
-            """
-
-            def __init__(self, klass):
-                self.klass = klass
-
-            def step_0(self):
-                # step 0 is the schema upgrade, and than follow proper upgrades
-                notify('attempting to do database upgrade from '
-                       'version %s to version %s' %(curr_version, __dbversion__))
-                api.upgrade(db_uri, repository_path, __dbversion__)
-                notify('Schema upgrade completed')
-
-            def step_1(self):
-                pass
-
-            def step_2(self):
-                notify('Patching repo paths for newer version of RhodeCode')
-                self.klass.fix_repo_paths()
-
-                notify('Patching default user of RhodeCode')
-                self.klass.fix_default_user()
-
-                log.info('Changing ui settings')
-                self.klass.create_ui_settings()
-
-            def step_3(self):
-                notify('Adding additional settings into RhodeCode db')
-                self.klass.fix_settings()
-                notify('Adding ldap defaults')
-                self.klass.create_ldap_options(skip_existing=True)
-
-            def step_4(self):
-                notify('create permissions and fix groups')
-                self.klass.create_permissions()
-                self.klass.fixup_groups()
-
-            def step_5(self):
-                pass
-
-            def step_6(self):
-
-                notify('re-checking permissions')
-                self.klass.create_permissions()
-
-                notify('installing new UI options')
-                sett4 = RhodeCodeSetting('show_public_icon', True)
-                Session().add(sett4)
-                sett5 = RhodeCodeSetting('show_private_icon', True)
-                Session().add(sett5)
-                sett6 = RhodeCodeSetting('stylify_metatags', False)
-                Session().add(sett6)
-
-                notify('fixing old PULL hook')
-                _pull = RhodeCodeUi.get_by_key('preoutgoing.pull_logger')
-                if _pull:
-                    _pull.ui_key = RhodeCodeUi.HOOK_PULL
-                    Session().add(_pull)
-
-                notify('fixing old PUSH hook')
-                _push = RhodeCodeUi.get_by_key('pretxnchangegroup.push_logger')
-                if _push:
-                    _push.ui_key = RhodeCodeUi.HOOK_PUSH
-                    Session().add(_push)
+        # clear cache keys
+        log.info("Clearing cache keys now...")
+        CacheInvalidation.clear_cache()
 
-                notify('installing new pre-push hook')
-                hooks4 = RhodeCodeUi()
-                hooks4.ui_section = 'hooks'
-                hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH
-                hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push'
-                Session().add(hooks4)
-
-                notify('installing new pre-pull hook')
-                hooks6 = RhodeCodeUi()
-                hooks6.ui_section = 'hooks'
-                hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL
-                hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull'
-                Session().add(hooks6)
-
-                notify('installing hgsubversion option')
-                # enable hgsubversion disabled by default
-                hgsubversion = RhodeCodeUi()
-                hgsubversion.ui_section = 'extensions'
-                hgsubversion.ui_key = 'hgsubversion'
-                hgsubversion.ui_value = ''
-                hgsubversion.ui_active = False
-                Session().add(hgsubversion)
-
-                notify('installing hg git option')
-                # enable hggit disabled by default
-                hggit = RhodeCodeUi()
-                hggit.ui_section = 'extensions'
-                hggit.ui_key = 'hggit'
-                hggit.ui_value = ''
-                hggit.ui_active = False
-                Session().add(hggit)
-
-                notify('re-check default permissions')
-                default_user = User.get_by_username(User.DEFAULT_USER)
-                perm = Permission.get_by_key('hg.fork.repository')
-                reg_perm = UserToPerm()
-                reg_perm.user = default_user
-                reg_perm.permission = perm
-                Session().add(reg_perm)
-
-            def step_7(self):
-                perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER)
-                Session().commit()
-                if perm_fixes:
-                    notify('There was an inconsistent state of permissions '
-                           'detected for default user. Permissions are now '
-                           'reset to the default value for default user. '
-                           'Please validate and check default permissions '
-                           'in admin panel')
-
-            def step_8(self):
-                self.klass.populate_default_permissions()
-                self.klass.create_default_options(skip_existing=True)
-                Session().commit()
-
-            def step_9(self):
-                perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER)
-                Session().commit()
-                if perm_fixes:
-                    notify('There was an inconsistent state of permissions '
-                           'detected for default user. Permissions are now '
-                           'reset to the default value for default user. '
-                           'Please validate and check default permissions '
-                           'in admin panel')
-
-            def step_10(self):
-                pass
-
-            def step_11(self):
-                self.klass.update_repo_info()
-
-        upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1)
+        upgrade_steps = range(curr_version + 1, __dbversion__ + 1)
+        notify('attempting to do database upgrade from '
+               'version %s to version %s' % (curr_version, __dbversion__))
 
         # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE
         _step = None
         for step in upgrade_steps:
             notify('performing upgrade step %s' % step)
-            getattr(UpgradeSteps(self), 'step_%s' % step)()
+            time.sleep(2)
+
+            api.upgrade(db_uri, repository_path, step)
+            notify('schema upgrade for step %s completed' % (step,))
+
+            fixture = 'step_%s' % step
+            notify('performing fixture step %s' % fixture)
+            getattr(UpgradeSteps(self), fixture)()
             self.sa.commit()
+            notify('fixture %s completed' % (fixture,))
             _step = step
 
         notify('upgrade to version %s successful' % _step)
@@ -493,7 +524,7 @@
                     ('ldap_attr_login', ''), ('ldap_attr_firstname', ''),
                     ('ldap_attr_lastname', ''), ('ldap_attr_email', '')]:
 
-            if skip_existing and RhodeCodeSetting.get_by_name(k) != None:
+            if skip_existing and RhodeCodeSetting.get_by_name(k) is not None:
                 log.debug('Skipping option %s' % k)
                 continue
             setting = RhodeCodeSetting(k, v)
@@ -509,14 +540,14 @@
             ('default_repo_private', False),
             ('default_repo_type', 'hg')]:
 
-            if skip_existing and RhodeCodeSetting.get_by_name(k) != None:
+            if skip_existing and RhodeCodeSetting.get_by_name(k) is not None:
                 log.debug('Skipping option %s' % k)
                 continue
             setting = RhodeCodeSetting(k, v)
             self.sa.add(setting)
 
     def fixup_groups(self):
-        def_usr = User.get_by_username('default')
+        def_usr = User.get_default_user()
         for g in RepoGroup.query().all():
             g.group_name = g.get_new_name(g.name)
             self.sa.add(g)
@@ -528,7 +559,8 @@
 
             if default is None:
                 log.debug('missing default permission for group %s adding' % g)
-                ReposGroupModel()._create_default_perms(g)
+                perm_obj = ReposGroupModel()._create_default_perms(g)
+                self.sa.add(perm_obj)
 
     def reset_permissions(self, username):
         """
@@ -536,7 +568,6 @@
         bad permissions, we must clean them up
 
         :param username:
-        :type username:
         """
         default_user = User.get_by_username(username)
         if not default_user:
@@ -545,7 +576,7 @@
         u2p = UserToPerm.query()\
             .filter(UserToPerm.user == default_user).all()
         fixed = False
-        if len(u2p) != len(User.DEFAULT_PERMISSIONS):
+        if len(u2p) != len(Permission.DEFAULT_USER_PERMISSIONS):
             for p in u2p:
                 Session().delete(p)
             fixed = True
@@ -606,56 +637,34 @@
 
         self.create_ui_settings()
 
-        #HG UI OPTIONS
-        web1 = RhodeCodeUi()
-        web1.ui_section = 'web'
-        web1.ui_key = 'push_ssl'
-        web1.ui_value = 'false'
-
-        web2 = RhodeCodeUi()
-        web2.ui_section = 'web'
-        web2.ui_key = 'allow_archive'
-        web2.ui_value = 'gz zip bz2'
-
-        web3 = RhodeCodeUi()
-        web3.ui_section = 'web'
-        web3.ui_key = 'allow_push'
-        web3.ui_value = '*'
-
-        web4 = RhodeCodeUi()
-        web4.ui_section = 'web'
-        web4.ui_key = 'baseurl'
-        web4.ui_value = '/'
+        ui_config = [
+            ('web', 'push_ssl', 'false'),
+            ('web', 'allow_archive', 'gz zip bz2'),
+            ('web', 'allow_push', '*'),
+            ('web', 'baseurl', '/'),
+            ('paths', '/', path),
+            #('phases', 'publish', 'false')
+        ]
+        for section, key, value in ui_config:
+            ui_conf = RhodeCodeUi()
+            setattr(ui_conf, 'ui_section', section)
+            setattr(ui_conf, 'ui_key', key)
+            setattr(ui_conf, 'ui_value', value)
+            self.sa.add(ui_conf)
 
-        paths = RhodeCodeUi()
-        paths.ui_section = 'paths'
-        paths.ui_key = '/'
-        paths.ui_value = path
-
-        phases = RhodeCodeUi()
-        phases.ui_section = 'phases'
-        phases.ui_key = 'publish'
-        phases.ui_value = False
-
-        sett1 = RhodeCodeSetting('realm', 'RhodeCode authentication')
-        sett2 = RhodeCodeSetting('title', 'RhodeCode')
-        sett3 = RhodeCodeSetting('ga_code', '')
-
-        sett4 = RhodeCodeSetting('show_public_icon', True)
-        sett5 = RhodeCodeSetting('show_private_icon', True)
-        sett6 = RhodeCodeSetting('stylify_metatags', False)
-
-        self.sa.add(web1)
-        self.sa.add(web2)
-        self.sa.add(web3)
-        self.sa.add(web4)
-        self.sa.add(paths)
-        self.sa.add(sett1)
-        self.sa.add(sett2)
-        self.sa.add(sett3)
-        self.sa.add(sett4)
-        self.sa.add(sett5)
-        self.sa.add(sett6)
+        settings = [
+            ('realm', 'RhodeCode authentication', unicode),
+            ('title', 'RhodeCode', unicode),
+            ('ga_code', '', unicode),
+            ('show_public_icon', True, bool),
+            ('show_private_icon', True, bool),
+            ('stylify_metatags', False, bool),
+            ('dashboard_items', 100, int),
+            ('show_version', True, bool)
+        ]
+        for key, val, type_ in settings:
+            sett = RhodeCodeSetting(key, val)
+            self.sa.add(sett)
 
         self.create_ldap_options()
         self.create_default_options()
@@ -677,38 +686,21 @@
                               firstname='Anonymous', lastname='User')
 
     def create_permissions(self):
+        """
+        Creates all permissions defined in the system
+        """
         # module.(access|create|change|delete)_[name]
         # module.(none|read|write|admin)
-
-        for p in Permission.PERMS:
-            if not Permission.get_by_key(p[0]):
-                new_perm = Permission()
-                new_perm.permission_name = p[0]
-                new_perm.permission_longname = p[0]
-                self.sa.add(new_perm)
+        log.info('creating permissions')
+        PermissionModel(self.sa).create_permissions()
 
     def populate_default_permissions(self):
+        """
+        Populate default permissions. It will create only the default
+        permissions that are missing, and not alter already defined ones
+        """
         log.info('creating default user permissions')
-
-        default_user = User.get_by_username('default')
-
-        for def_perm in User.DEFAULT_PERMISSIONS:
-
-            perm = self.sa.query(Permission)\
-             .filter(Permission.permission_name == def_perm)\
-             .scalar()
-            if not perm:
-                raise Exception(
-                  'CRITICAL: permission %s not found inside database !!'
-                  % def_perm
-                )
-            if not UserToPerm.query()\
-                .filter(UserToPerm.permission == perm)\
-                .filter(UserToPerm.user == default_user).scalar():
-                reg_perm = UserToPerm()
-                reg_perm.user = default_user
-                reg_perm.permission = perm
-                self.sa.add(reg_perm)
+        PermissionModel(self.sa).create_default_permissions(user=User.DEFAULT_USER)
 
     @staticmethod
     def check_waitress():
--- a/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py	Fri Jun 07 00:31:11 2013 +0200
@@ -144,11 +144,11 @@
         return '\n'.join(out)
 
     def genB2AMigration(self, indent='    '):
-        '''Generate a migration from B to A.
+        """Generate a migration from B to A.
 
         Was: toUpgradeDowngradePython
         Assume model (A) is most current and database (B) is out-of-date.
-        '''
+        """
 
         decls = ['from migrate.changeset import schema',
                  'pre_meta = MetaData()',
--- a/rhodecode/lib/dbmigrate/migrate/versioning/schema.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/migrate/versioning/schema.py	Fri Jun 07 00:31:11 2013 +0200
@@ -7,7 +7,7 @@
 from sqlalchemy import (Table, Column, MetaData, String, Text, Integer,
     create_engine)
 from sqlalchemy.sql import and_
-from sqlalchemy import exceptions as sa_exceptions
+from sqlalchemy import exc as sa_exceptions
 from sqlalchemy.sql import bindparam
 
 from rhodecode.lib.dbmigrate.migrate import exceptions
@@ -20,6 +20,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class ControlledSchema(object):
     """A database under version control"""
 
--- a/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py	Fri Jun 07 00:31:11 2013 +0200
@@ -10,6 +10,7 @@
 
 log = logging.getLogger(__name__)
 
+
 def getDiffOfModelAgainstDatabase(metadata, engine, excludeTables=None):
     """
     Return differences of model against database.
@@ -17,7 +18,8 @@
     :return: object which will evaluate to :keyword:`True` if there \
       are differences else :keyword:`False`.
     """
-    db_metadata = sqlalchemy.MetaData(engine, reflect=True)
+    db_metadata = sqlalchemy.MetaData(engine)
+    db_metadata.reflect()
 
     # sqlite will include a dynamically generated 'sqlite_sequence' table if
     # there are autoincrement sequences in the database; this should not be
@@ -242,7 +244,7 @@
                 self.tables_different[table_name]=td
 
     def __str__(self):
-        ''' Summarize differences. '''
+        """ Summarize differences. """
         out = []
         column_template ='      %%%is: %%r' % self.label_width
 
--- a/rhodecode/lib/dbmigrate/migrate/versioning/version.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/migrate/versioning/version.py	Fri Jun 07 00:31:11 2013 +0200
@@ -90,7 +90,7 @@
         return max([VerNum(0)] + self.versions.keys())
 
     def _next_ver_num(self, use_timestamp_numbering):
-        if use_timestamp_numbering == True:
+        if use_timestamp_numbering:
             return VerNum(int(datetime.utcnow().strftime('%Y%m%d%H%M%S')))
         else:
             return self.latest + 1
--- a/rhodecode/lib/dbmigrate/schema/db_1_4_0.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/schema/db_1_4_0.py	Fri Jun 07 00:31:11 2013 +0200
@@ -787,7 +787,7 @@
         from rhodecode.lib.vcs.backends.git import GitRepository
         required = (MercurialRepository, GitRepository)
         if not isinstance(repo, required):
-            raise Exception('repo must be instance of %s' % required)
+            raise Exception('repo must be instance of %s' % (','.join(required)))
 
         # inject ui extra param to log this action via push logger
         for k, v in extras.items():
--- a/rhodecode/lib/dbmigrate/schema/db_1_5_0.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/schema/db_1_5_0.py	Fri Jun 07 00:31:11 2013 +0200
@@ -807,7 +807,7 @@
         from rhodecode.lib.vcs.backends.git import GitRepository
         required = (MercurialRepository, GitRepository)
         if not isinstance(repo, required):
-            raise Exception('repo must be instance of %s' % required)
+            raise Exception('repo must be instance of %s' % (','.join(required)))
 
         # inject ui extra param to log this action via push logger
         for k, v in extras.items():
--- a/rhodecode/lib/dbmigrate/schema/db_1_5_2.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/dbmigrate/schema/db_1_5_2.py	Fri Jun 07 00:31:11 2013 +0200
@@ -873,7 +873,7 @@
         from rhodecode.lib.vcs.backends.git import GitRepository
         required = (MercurialRepository, GitRepository)
         if not isinstance(repo, required):
-            raise Exception('repo must be instance of %s' % required)
+            raise Exception('repo must be instance of %s' % (','.join(required)))
 
         # inject ui extra param to log this action via push logger
         for k, v in extras.items():
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/dbmigrate/schema/db_1_7_0.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,2223 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.model.db
+    ~~~~~~~~~~~~~~~~~~
+
+    Database Models for RhodeCode
+
+    :created_on: Apr 08, 2010
+    :author: marcink
+    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import time
+import logging
+import datetime
+import traceback
+import hashlib
+import collections
+
+from sqlalchemy import *
+from sqlalchemy.ext.hybrid import hybrid_property
+from sqlalchemy.orm import relationship, joinedload, class_mapper, validates
+from sqlalchemy.exc import DatabaseError
+from beaker.cache import cache_region, region_invalidate
+from webob.exc import HTTPNotFound
+
+from pylons.i18n.translation import lazy_ugettext as _
+
+from rhodecode.lib.vcs import get_backend
+from rhodecode.lib.vcs.utils.helpers import get_scm
+from rhodecode.lib.vcs.exceptions import VCSError
+from rhodecode.lib.vcs.utils.lazy import LazyProperty
+from rhodecode.lib.vcs.backends.base import EmptyChangeset
+
+from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
+    safe_unicode, remove_suffix, remove_prefix, time_to_datetime, _set_extras
+from rhodecode.lib.compat import json
+from rhodecode.lib.caching_query import FromCache
+
+from rhodecode.model.meta import Base, Session
+
+URL_SEP = '/'
+log = logging.getLogger(__name__)
+
+#==============================================================================
+# BASE CLASSES
+#==============================================================================
+
+_hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
+
+
+class BaseModel(object):
+    """
+    Base Model for all classess
+    """
+
+    @classmethod
+    def _get_keys(cls):
+        """return column names for this model """
+        return class_mapper(cls).c.keys()
+
+    def get_dict(self):
+        """
+        return dict with keys and values corresponding
+        to this model data """
+
+        d = {}
+        for k in self._get_keys():
+            d[k] = getattr(self, k)
+
+        # also use __json__() if present to get additional fields
+        _json_attr = getattr(self, '__json__', None)
+        if _json_attr:
+            # update with attributes from __json__
+            if callable(_json_attr):
+                _json_attr = _json_attr()
+            for k, val in _json_attr.iteritems():
+                d[k] = val
+        return d
+
+    def get_appstruct(self):
+        """return list with keys and values tupples corresponding
+        to this model data """
+
+        l = []
+        for k in self._get_keys():
+            l.append((k, getattr(self, k),))
+        return l
+
+    def populate_obj(self, populate_dict):
+        """populate model with data from given populate_dict"""
+
+        for k in self._get_keys():
+            if k in populate_dict:
+                setattr(self, k, populate_dict[k])
+
+    @classmethod
+    def query(cls):
+        return Session().query(cls)
+
+    @classmethod
+    def get(cls, id_):
+        if id_:
+            return cls.query().get(id_)
+
+    @classmethod
+    def get_or_404(cls, id_):
+        try:
+            id_ = int(id_)
+        except (TypeError, ValueError):
+            raise HTTPNotFound
+
+        res = cls.query().get(id_)
+        if not res:
+            raise HTTPNotFound
+        return res
+
+    @classmethod
+    def getAll(cls):
+        # deprecated and left for backward compatibility
+        return cls.get_all()
+
+    @classmethod
+    def get_all(cls):
+        return cls.query().all()
+
+    @classmethod
+    def delete(cls, id_):
+        obj = cls.query().get(id_)
+        Session().delete(obj)
+
+    def __repr__(self):
+        if hasattr(self, '__unicode__'):
+            # python repr needs to return str
+            return safe_str(self.__unicode__())
+        return '<DB:%s>' % (self.__class__.__name__)
+
+
+class RhodeCodeSetting(Base, BaseModel):
+    __tablename__ = 'rhodecode_settings'
+    __table_args__ = (
+        UniqueConstraint('app_settings_name'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+
+    def __init__(self, k='', v=''):
+        self.app_settings_name = k
+        self.app_settings_value = v
+
+    @validates('_app_settings_value')
+    def validate_settings_value(self, key, val):
+        assert type(val) == unicode
+        return val
+
+    @hybrid_property
+    def app_settings_value(self):
+        v = self._app_settings_value
+        if self.app_settings_name in ["ldap_active",
+                                      "default_repo_enable_statistics",
+                                      "default_repo_enable_locking",
+                                      "default_repo_private",
+                                      "default_repo_enable_downloads"]:
+            v = str2bool(v)
+        return v
+
+    @app_settings_value.setter
+    def app_settings_value(self, val):
+        """
+        Setter that will always make sure we use unicode in app_settings_value
+
+        :param val:
+        """
+        self._app_settings_value = safe_unicode(val)
+
+    def __unicode__(self):
+        return u"<%s('%s:%s')>" % (
+            self.__class__.__name__,
+            self.app_settings_name, self.app_settings_value
+        )
+
+    @classmethod
+    def get_by_name(cls, key):
+        return cls.query()\
+            .filter(cls.app_settings_name == key).scalar()
+
+    @classmethod
+    def get_by_name_or_create(cls, key):
+        res = cls.get_by_name(key)
+        if not res:
+            res = cls(key)
+        return res
+
+    @classmethod
+    def get_app_settings(cls, cache=False):
+
+        ret = cls.query()
+
+        if cache:
+            ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
+
+        if not ret:
+            raise Exception('Could not get application settings !')
+        settings = {}
+        for each in ret:
+            settings['rhodecode_' + each.app_settings_name] = \
+                each.app_settings_value
+
+        return settings
+
+    @classmethod
+    def get_ldap_settings(cls, cache=False):
+        ret = cls.query()\
+                .filter(cls.app_settings_name.startswith('ldap_')).all()
+        fd = {}
+        for row in ret:
+            fd.update({row.app_settings_name: row.app_settings_value})
+
+        return fd
+
+    @classmethod
+    def get_default_repo_settings(cls, cache=False, strip_prefix=False):
+        ret = cls.query()\
+                .filter(cls.app_settings_name.startswith('default_')).all()
+        fd = {}
+        for row in ret:
+            key = row.app_settings_name
+            if strip_prefix:
+                key = remove_prefix(key, prefix='default_')
+            fd.update({key: row.app_settings_value})
+
+        return fd
+
+
+class RhodeCodeUi(Base, BaseModel):
+    __tablename__ = 'rhodecode_ui'
+    __table_args__ = (
+        UniqueConstraint('ui_key'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+
+    HOOK_UPDATE = 'changegroup.update'
+    HOOK_REPO_SIZE = 'changegroup.repo_size'
+    HOOK_PUSH = 'changegroup.push_logger'
+    HOOK_PRE_PUSH = 'prechangegroup.pre_push'
+    HOOK_PULL = 'outgoing.pull_logger'
+    HOOK_PRE_PULL = 'preoutgoing.pre_pull'
+
+    ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
+
+    @classmethod
+    def get_by_key(cls, key):
+        return cls.query().filter(cls.ui_key == key).scalar()
+
+    @classmethod
+    def get_builtin_hooks(cls):
+        q = cls.query()
+        q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
+                                     cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
+                                     cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
+        return q.all()
+
+    @classmethod
+    def get_custom_hooks(cls):
+        q = cls.query()
+        q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
+                                      cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
+                                      cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
+        q = q.filter(cls.ui_section == 'hooks')
+        return q.all()
+
+    @classmethod
+    def get_repos_location(cls):
+        return cls.get_by_key('/').ui_value
+
+    @classmethod
+    def create_or_update_hook(cls, key, val):
+        new_ui = cls.get_by_key(key) or cls()
+        new_ui.ui_section = 'hooks'
+        new_ui.ui_active = True
+        new_ui.ui_key = key
+        new_ui.ui_value = val
+
+        Session().add(new_ui)
+
+    def __repr__(self):
+        return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
+                                   self.ui_value)
+
+
+class User(Base, BaseModel):
+    __tablename__ = 'users'
+    __table_args__ = (
+        UniqueConstraint('username'), UniqueConstraint('email'),
+        Index('u_username_idx', 'username'),
+        Index('u_email_idx', 'email'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    DEFAULT_USER = 'default'
+
+    user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    active = Column("active", Boolean(), nullable=True, unique=None, default=True)
+    admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
+    name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
+    ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
+
+    user_log = relationship('UserLog')
+    user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
+
+    repositories = relationship('Repository')
+    user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
+    followings = relationship('UserFollowing', primaryjoin='UserFollowing.user_id==User.user_id', cascade='all')
+
+    repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
+    repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
+
+    group_member = relationship('UserGroupMember', cascade='all')
+
+    notifications = relationship('UserNotification', cascade='all')
+    # notifications assigned to this user
+    user_created_notifications = relationship('Notification', cascade='all')
+    # comments created by this user
+    user_comments = relationship('ChangesetComment', cascade='all')
+    #extra emails for this user
+    user_emails = relationship('UserEmailMap', cascade='all')
+
+    @hybrid_property
+    def email(self):
+        return self._email
+
+    @email.setter
+    def email(self, val):
+        self._email = val.lower() if val else None
+
+    @property
+    def firstname(self):
+        # alias for future
+        return self.name
+
+    @property
+    def emails(self):
+        other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
+        return [self.email] + [x.email for x in other]
+
+    @property
+    def ip_addresses(self):
+        ret = UserIpMap.query().filter(UserIpMap.user == self).all()
+        return [x.ip_addr for x in ret]
+
+    @property
+    def username_and_name(self):
+        return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
+
+    @property
+    def full_name(self):
+        return '%s %s' % (self.firstname, self.lastname)
+
+    @property
+    def full_name_or_username(self):
+        return ('%s %s' % (self.firstname, self.lastname)
+                if (self.firstname and self.lastname) else self.username)
+
+    @property
+    def full_contact(self):
+        return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
+
+    @property
+    def short_contact(self):
+        return '%s %s' % (self.firstname, self.lastname)
+
+    @property
+    def is_admin(self):
+        return self.admin
+
+    @property
+    def AuthUser(self):
+        """
+        Returns instance of AuthUser for this user
+        """
+        from rhodecode.lib.auth import AuthUser
+        return AuthUser(user_id=self.user_id, api_key=self.api_key,
+                        username=self.username)
+
+    def __unicode__(self):
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
+                                     self.user_id, self.username)
+
+    @classmethod
+    def get_by_username(cls, username, case_insensitive=False, cache=False):
+        if case_insensitive:
+            q = cls.query().filter(cls.username.ilike(username))
+        else:
+            q = cls.query().filter(cls.username == username)
+
+        if cache:
+            q = q.options(FromCache(
+                            "sql_cache_short",
+                            "get_user_%s" % _hash_key(username)
+                          )
+            )
+        return q.scalar()
+
+    @classmethod
+    def get_by_api_key(cls, api_key, cache=False):
+        q = cls.query().filter(cls.api_key == api_key)
+
+        if cache:
+            q = q.options(FromCache("sql_cache_short",
+                                    "get_api_key_%s" % api_key))
+        return q.scalar()
+
+    @classmethod
+    def get_by_email(cls, email, case_insensitive=False, cache=False):
+        if case_insensitive:
+            q = cls.query().filter(cls.email.ilike(email))
+        else:
+            q = cls.query().filter(cls.email == email)
+
+        if cache:
+            q = q.options(FromCache("sql_cache_short",
+                                    "get_email_key_%s" % email))
+
+        ret = q.scalar()
+        if ret is None:
+            q = UserEmailMap.query()
+            # try fetching in alternate email map
+            if case_insensitive:
+                q = q.filter(UserEmailMap.email.ilike(email))
+            else:
+                q = q.filter(UserEmailMap.email == email)
+            q = q.options(joinedload(UserEmailMap.user))
+            if cache:
+                q = q.options(FromCache("sql_cache_short",
+                                        "get_email_map_key_%s" % email))
+            ret = getattr(q.scalar(), 'user', None)
+
+        return ret
+
+    @classmethod
+    def get_from_cs_author(cls, author):
+        """
+        Tries to get User objects out of commit author string
+
+        :param author:
+        """
+        from rhodecode.lib.helpers import email, author_name
+        # Valid email in the attribute passed, see if they're in the system
+        _email = email(author)
+        if _email:
+            user = cls.get_by_email(_email, case_insensitive=True)
+            if user:
+                return user
+        # Maybe we can match by username?
+        _author = author_name(author)
+        user = cls.get_by_username(_author, case_insensitive=True)
+        if user:
+            return user
+
+    def update_lastlogin(self):
+        """Update user lastlogin"""
+        self.last_login = datetime.datetime.now()
+        Session().add(self)
+        log.debug('updated user %s lastlogin' % self.username)
+
+    @classmethod
+    def get_first_admin(cls):
+        user = User.query().filter(User.admin == True).first()
+        if user is None:
+            raise Exception('Missing administrative account!')
+        return user
+
+    @classmethod
+    def get_default_user(cls, cache=False):
+        user = User.get_by_username(User.DEFAULT_USER, cache=cache)
+        if user is None:
+            raise Exception('Missing default account!')
+        return user
+
+    def get_api_data(self):
+        """
+        Common function for generating user related data for API
+        """
+        user = self
+        data = dict(
+            user_id=user.user_id,
+            username=user.username,
+            firstname=user.name,
+            lastname=user.lastname,
+            email=user.email,
+            emails=user.emails,
+            api_key=user.api_key,
+            active=user.active,
+            admin=user.admin,
+            ldap_dn=user.ldap_dn,
+            last_login=user.last_login,
+            ip_addresses=user.ip_addresses
+        )
+        return data
+
+    def __json__(self):
+        data = dict(
+            full_name=self.full_name,
+            full_name_or_username=self.full_name_or_username,
+            short_contact=self.short_contact,
+            full_contact=self.full_contact
+        )
+        data.update(self.get_api_data())
+        return data
+
+
+class UserEmailMap(Base, BaseModel):
+    __tablename__ = 'user_email_map'
+    __table_args__ = (
+        Index('uem_email_idx', 'email'),
+        UniqueConstraint('email'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    __mapper_args__ = {}
+
+    email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
+    user = relationship('User', lazy='joined')
+
+    @validates('_email')
+    def validate_email(self, key, email):
+        # check if this email is not main one
+        main_email = Session().query(User).filter(User.email == email).scalar()
+        if main_email is not None:
+            raise AttributeError('email %s is present is user table' % email)
+        return email
+
+    @hybrid_property
+    def email(self):
+        return self._email
+
+    @email.setter
+    def email(self, val):
+        self._email = val.lower() if val else None
+
+
+class UserIpMap(Base, BaseModel):
+    __tablename__ = 'user_ip_map'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'ip_addr'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    __mapper_args__ = {}
+
+    ip_id = Column("ip_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    ip_addr = Column("ip_addr", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
+    active = Column("active", Boolean(), nullable=True, unique=None, default=True)
+    user = relationship('User', lazy='joined')
+
+    @classmethod
+    def _get_ip_range(cls, ip_addr):
+        from rhodecode.lib import ipaddr
+        net = ipaddr.IPNetwork(address=ip_addr)
+        return [str(net.network), str(net.broadcast)]
+
+    def __json__(self):
+        return dict(
+          ip_addr=self.ip_addr,
+          ip_range=self._get_ip_range(self.ip_addr)
+        )
+
+
+class UserLog(Base, BaseModel):
+    __tablename__ = 'user_logs'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
+    repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
+
+    def __unicode__(self):
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
+                                      self.repository_name,
+                                      self.action)
+
+    @property
+    def action_as_day(self):
+        return datetime.date(*self.action_date.timetuple()[:3])
+
+    user = relationship('User')
+    repository = relationship('Repository', cascade='')
+
+
+class UserGroup(Base, BaseModel):
+    __tablename__ = 'users_groups'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
+    users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
+    inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+
+    members = relationship('UserGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
+    users_group_to_perm = relationship('UserGroupToPerm', cascade='all')
+    users_group_repo_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
+    users_group_repo_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
+    user_user_group_to_perm = relationship('UserUserGroupToPerm ', cascade='all')
+    user_group_user_group_to_perm = relationship('UserGroupUserGroupToPerm ', primaryjoin="UserGroupUserGroupToPerm.target_user_group_id==UserGroup.users_group_id", cascade='all')
+
+    user = relationship('User')
+
+    def __unicode__(self):
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
+                                      self.users_group_id,
+                                      self.users_group_name)
+
+    @classmethod
+    def get_by_group_name(cls, group_name, cache=False,
+                          case_insensitive=False):
+        if case_insensitive:
+            q = cls.query().filter(cls.users_group_name.ilike(group_name))
+        else:
+            q = cls.query().filter(cls.users_group_name == group_name)
+        if cache:
+            q = q.options(FromCache(
+                            "sql_cache_short",
+                            "get_user_%s" % _hash_key(group_name)
+                          )
+            )
+        return q.scalar()
+
+    @classmethod
+    def get(cls, users_group_id, cache=False):
+        users_group = cls.query()
+        if cache:
+            users_group = users_group.options(FromCache("sql_cache_short",
+                                    "get_users_group_%s" % users_group_id))
+        return users_group.get(users_group_id)
+
+    def get_api_data(self):
+        users_group = self
+
+        data = dict(
+            users_group_id=users_group.users_group_id,
+            group_name=users_group.users_group_name,
+            active=users_group.users_group_active,
+        )
+
+        return data
+
+
+class UserGroupMember(Base, BaseModel):
+    __tablename__ = 'users_groups_members'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User', lazy='joined')
+    users_group = relationship('UserGroup')
+
+    def __init__(self, gr_id='', u_id=''):
+        self.users_group_id = gr_id
+        self.user_id = u_id
+
+
+class RepositoryField(Base, BaseModel):
+    __tablename__ = 'repositories_fields'
+    __table_args__ = (
+        UniqueConstraint('repository_id', 'field_key'),  # no-multi field
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    PREFIX = 'ex_'  # prefix used in form to not conflict with already existing fields
+
+    repo_field_id = Column("repo_field_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+    field_key = Column("field_key", String(250, convert_unicode=False, assert_unicode=None))
+    field_label = Column("field_label", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
+    field_value = Column("field_value", String(10000, convert_unicode=False, assert_unicode=None), nullable=False)
+    field_desc = Column("field_desc", String(1024, convert_unicode=False, assert_unicode=None), nullable=False)
+    field_type = Column("field_type", String(256), nullable=False, unique=None)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+
+    repository = relationship('Repository')
+
+    @property
+    def field_key_prefixed(self):
+        return 'ex_%s' % self.field_key
+
+    @classmethod
+    def un_prefix_key(cls, key):
+        if key.startswith(cls.PREFIX):
+            return key[len(cls.PREFIX):]
+        return key
+
+    @classmethod
+    def get_by_key_name(cls, key, repo):
+        row = cls.query()\
+                .filter(cls.repository == repo)\
+                .filter(cls.field_key == key).scalar()
+        return row
+
+
+class Repository(Base, BaseModel):
+    __tablename__ = 'repositories'
+    __table_args__ = (
+        UniqueConstraint('repo_name'),
+        Index('r_repo_name_idx', 'repo_name'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
+    clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
+    repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+    private = Column("private", Boolean(), nullable=True, unique=None, default=None)
+    enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
+    enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
+    description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
+    updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
+    landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
+    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
+    _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
+    _changeset_cache = Column("changeset_cache", LargeBinary(), nullable=True) #JSON data
+
+    fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
+    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
+
+    user = relationship('User')
+    fork = relationship('Repository', remote_side=repo_id)
+    group = relationship('RepoGroup')
+    repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
+    users_group_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
+    stats = relationship('Statistics', cascade='all', uselist=False)
+
+    followers = relationship('UserFollowing',
+                             primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
+                             cascade='all')
+    extra_fields = relationship('RepositoryField',
+                                cascade="all, delete, delete-orphan")
+
+    logs = relationship('UserLog')
+    comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
+
+    pull_requests_org = relationship('PullRequest',
+                    primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
+                    cascade="all, delete, delete-orphan")
+
+    pull_requests_other = relationship('PullRequest',
+                    primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
+                    cascade="all, delete, delete-orphan")
+
+    def __unicode__(self):
+        return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
+                                   self.repo_name)
+
+    @hybrid_property
+    def locked(self):
+        # always should return [user_id, timelocked]
+        if self._locked:
+            _lock_info = self._locked.split(':')
+            return int(_lock_info[0]), _lock_info[1]
+        return [None, None]
+
+    @locked.setter
+    def locked(self, val):
+        if val and isinstance(val, (list, tuple)):
+            self._locked = ':'.join(map(str, val))
+        else:
+            self._locked = None
+
+    @hybrid_property
+    def changeset_cache(self):
+        from rhodecode.lib.vcs.backends.base import EmptyChangeset
+        dummy = EmptyChangeset().__json__()
+        if not self._changeset_cache:
+            return dummy
+        try:
+            return json.loads(self._changeset_cache)
+        except TypeError:
+            return dummy
+
+    @changeset_cache.setter
+    def changeset_cache(self, val):
+        try:
+            self._changeset_cache = json.dumps(val)
+        except Exception:
+            log.error(traceback.format_exc())
+
+    @classmethod
+    def url_sep(cls):
+        return URL_SEP
+
+    @classmethod
+    def normalize_repo_name(cls, repo_name):
+        """
+        Normalizes os specific repo_name to the format internally stored inside
+        dabatabase using URL_SEP
+
+        :param cls:
+        :param repo_name:
+        """
+        return cls.url_sep().join(repo_name.split(os.sep))
+
+    @classmethod
+    def get_by_repo_name(cls, repo_name):
+        q = Session().query(cls).filter(cls.repo_name == repo_name)
+        q = q.options(joinedload(Repository.fork))\
+                .options(joinedload(Repository.user))\
+                .options(joinedload(Repository.group))
+        return q.scalar()
+
+    @classmethod
+    def get_by_full_path(cls, repo_full_path):
+        repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
+        repo_name = cls.normalize_repo_name(repo_name)
+        return cls.get_by_repo_name(repo_name.strip(URL_SEP))
+
+    @classmethod
+    def get_repo_forks(cls, repo_id):
+        return cls.query().filter(Repository.fork_id == repo_id)
+
+    @classmethod
+    def base_path(cls):
+        """
+        Returns base path when all repos are stored
+
+        :param cls:
+        """
+        q = Session().query(RhodeCodeUi)\
+            .filter(RhodeCodeUi.ui_key == cls.url_sep())
+        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
+        return q.one().ui_value
+
+    @property
+    def forks(self):
+        """
+        Return forks of this repo
+        """
+        return Repository.get_repo_forks(self.repo_id)
+
+    @property
+    def parent(self):
+        """
+        Returns fork parent
+        """
+        return self.fork
+
+    @property
+    def just_name(self):
+        return self.repo_name.split(Repository.url_sep())[-1]
+
+    @property
+    def groups_with_parents(self):
+        groups = []
+        if self.group is None:
+            return groups
+
+        cur_gr = self.group
+        groups.insert(0, cur_gr)
+        while 1:
+            gr = getattr(cur_gr, 'parent_group', None)
+            cur_gr = cur_gr.parent_group
+            if gr is None:
+                break
+            groups.insert(0, gr)
+
+        return groups
+
+    @property
+    def groups_and_repo(self):
+        return self.groups_with_parents, self.just_name, self.repo_name
+
+    @LazyProperty
+    def repo_path(self):
+        """
+        Returns base full path for that repository means where it actually
+        exists on a filesystem
+        """
+        q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
+                                              Repository.url_sep())
+        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
+        return q.one().ui_value
+
+    @property
+    def repo_full_path(self):
+        p = [self.repo_path]
+        # we need to split the name by / since this is how we store the
+        # names in the database, but that eventually needs to be converted
+        # into a valid system path
+        p += self.repo_name.split(Repository.url_sep())
+        return os.path.join(*map(safe_unicode, p))
+
+    @property
+    def cache_keys(self):
+        """
+        Returns associated cache keys for that repo
+        """
+        return CacheInvalidation.query()\
+            .filter(CacheInvalidation.cache_args == self.repo_name)\
+            .order_by(CacheInvalidation.cache_key)\
+            .all()
+
+    def get_new_name(self, repo_name):
+        """
+        returns new full repository name based on assigned group and new new
+
+        :param group_name:
+        """
+        path_prefix = self.group.full_path_splitted if self.group else []
+        return Repository.url_sep().join(path_prefix + [repo_name])
+
+    @property
+    def _ui(self):
+        """
+        Creates an db based ui object for this repository
+        """
+        from rhodecode.lib.utils import make_ui
+        return make_ui('db', clear_session=False)
+
+    @classmethod
+    def is_valid(cls, repo_name):
+        """
+        returns True if given repo name is a valid filesystem repository
+
+        :param cls:
+        :param repo_name:
+        """
+        from rhodecode.lib.utils import is_valid_repo
+
+        return is_valid_repo(repo_name, cls.base_path())
+
+    def get_api_data(self):
+        """
+        Common function for generating repo api data
+
+        """
+        repo = self
+        data = dict(
+            repo_id=repo.repo_id,
+            repo_name=repo.repo_name,
+            repo_type=repo.repo_type,
+            clone_uri=repo.clone_uri,
+            private=repo.private,
+            created_on=repo.created_on,
+            description=repo.description,
+            landing_rev=repo.landing_rev,
+            owner=repo.user.username,
+            fork_of=repo.fork.repo_name if repo.fork else None,
+            enable_statistics=repo.enable_statistics,
+            enable_locking=repo.enable_locking,
+            enable_downloads=repo.enable_downloads,
+            last_changeset=repo.changeset_cache,
+            locked_by=User.get(self.locked[0]).get_api_data() \
+                if self.locked[0] else None,
+            locked_date=time_to_datetime(self.locked[1]) \
+                if self.locked[1] else None
+        )
+        rc_config = RhodeCodeSetting.get_app_settings()
+        repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
+        if repository_fields:
+            for f in self.extra_fields:
+                data[f.field_key_prefixed] = f.field_value
+
+        return data
+
+    @classmethod
+    def lock(cls, repo, user_id, lock_time=None):
+        if not lock_time:
+            lock_time = time.time()
+        repo.locked = [user_id, lock_time]
+        Session().add(repo)
+        Session().commit()
+
+    @classmethod
+    def unlock(cls, repo):
+        repo.locked = None
+        Session().add(repo)
+        Session().commit()
+
+    @classmethod
+    def getlock(cls, repo):
+        return repo.locked
+
+    @property
+    def last_db_change(self):
+        return self.updated_on
+
+    def clone_url(self, **override):
+        from pylons import url
+        from urlparse import urlparse
+        import urllib
+        parsed_url = urlparse(url('home', qualified=True))
+        default_clone_uri = '%(scheme)s://%(user)s%(pass)s%(netloc)s%(prefix)s%(path)s'
+        decoded_path = safe_unicode(urllib.unquote(parsed_url.path))
+        args = {
+           'user': '',
+           'pass': '',
+           'scheme': parsed_url.scheme,
+           'netloc': parsed_url.netloc,
+           'prefix': decoded_path,
+           'path': self.repo_name
+        }
+
+        args.update(override)
+        return default_clone_uri % args
+
+    #==========================================================================
+    # SCM PROPERTIES
+    #==========================================================================
+
+    def get_changeset(self, rev=None):
+        return get_changeset_safe(self.scm_instance, rev)
+
+    def get_landing_changeset(self):
+        """
+        Returns landing changeset, or if that doesn't exist returns the tip
+        """
+        cs = self.get_changeset(self.landing_rev) or self.get_changeset()
+        return cs
+
+    def update_changeset_cache(self, cs_cache=None):
+        """
+        Update cache of last changeset for repository, keys should be::
+
+            short_id
+            raw_id
+            revision
+            message
+            date
+            author
+
+        :param cs_cache:
+        """
+        from rhodecode.lib.vcs.backends.base import BaseChangeset
+        if cs_cache is None:
+            cs_cache = EmptyChangeset()
+            # use no-cache version here
+            scm_repo = self.scm_instance_no_cache()
+            if scm_repo:
+                cs_cache = scm_repo.get_changeset()
+
+        if isinstance(cs_cache, BaseChangeset):
+            cs_cache = cs_cache.__json__()
+
+        if (cs_cache != self.changeset_cache or not self.changeset_cache):
+            _default = datetime.datetime.fromtimestamp(0)
+            last_change = cs_cache.get('date') or _default
+            log.debug('updated repo %s with new cs cache %s'
+                      % (self.repo_name, cs_cache))
+            self.updated_on = last_change
+            self.changeset_cache = cs_cache
+            Session().add(self)
+            Session().commit()
+        else:
+            log.debug('Skipping repo:%s already with latest changes'
+                      % self.repo_name)
+
+    @property
+    def tip(self):
+        return self.get_changeset('tip')
+
+    @property
+    def author(self):
+        return self.tip.author
+
+    @property
+    def last_change(self):
+        return self.scm_instance.last_change
+
+    def get_comments(self, revisions=None):
+        """
+        Returns comments for this repository grouped by revisions
+
+        :param revisions: filter query by revisions only
+        """
+        cmts = ChangesetComment.query()\
+            .filter(ChangesetComment.repo == self)
+        if revisions:
+            cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
+        grouped = collections.defaultdict(list)
+        for cmt in cmts.all():
+            grouped[cmt.revision].append(cmt)
+        return grouped
+
+    def statuses(self, revisions=None):
+        """
+        Returns statuses for this repository
+
+        :param revisions: list of revisions to get statuses for
+        """
+
+        statuses = ChangesetStatus.query()\
+            .filter(ChangesetStatus.repo == self)\
+            .filter(ChangesetStatus.version == 0)
+        if revisions:
+            statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
+        grouped = {}
+
+        #maybe we have open new pullrequest without a status ?
+        stat = ChangesetStatus.STATUS_UNDER_REVIEW
+        status_lbl = ChangesetStatus.get_status_lbl(stat)
+        for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
+            for rev in pr.revisions:
+                pr_id = pr.pull_request_id
+                pr_repo = pr.other_repo.repo_name
+                grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
+
+        for stat in statuses.all():
+            pr_id = pr_repo = None
+            if stat.pull_request:
+                pr_id = stat.pull_request.pull_request_id
+                pr_repo = stat.pull_request.other_repo.repo_name
+            grouped[stat.revision] = [str(stat.status), stat.status_lbl,
+                                      pr_id, pr_repo]
+        return grouped
+
+    def _repo_size(self):
+        from rhodecode.lib import helpers as h
+        log.debug('calculating repository size...')
+        return h.format_byte_size(self.scm_instance.size)
+
+    #==========================================================================
+    # SCM CACHE INSTANCE
+    #==========================================================================
+
+    def set_invalidate(self):
+        """
+        Mark caches of this repo as invalid.
+        """
+        CacheInvalidation.set_invalidate(self.repo_name)
+
+    def scm_instance_no_cache(self):
+        return self.__get_instance()
+
+    @property
+    def scm_instance(self):
+        import rhodecode
+        full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
+        if full_cache:
+            return self.scm_instance_cached()
+        return self.__get_instance()
+
+    def scm_instance_cached(self, valid_cache_keys=None):
+        @cache_region('long_term')
+        def _c(repo_name):
+            return self.__get_instance()
+        rn = self.repo_name
+
+        valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
+        if not valid:
+            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            region_invalidate(_c, None, rn)
+        else:
+            log.debug('Getting obj for %s from cache' % (rn))
+        return _c(rn)
+
+    def __get_instance(self):
+        repo_full_path = self.repo_full_path
+        try:
+            alias = get_scm(repo_full_path)[0]
+            log.debug('Creating instance of %s repository from %s'
+                      % (alias, repo_full_path))
+            backend = get_backend(alias)
+        except VCSError:
+            log.error(traceback.format_exc())
+            log.error('Perhaps this repository is in db and not in '
+                      'filesystem run rescan repositories with '
+                      '"destroy old data " option from admin panel')
+            return
+
+        if alias == 'hg':
+
+            repo = backend(safe_str(repo_full_path), create=False,
+                           baseui=self._ui)
+            # skip hidden web repository
+            if repo._get_hidden():
+                return
+        else:
+            repo = backend(repo_full_path, create=False)
+
+        return repo
+
+
+class RepoGroup(Base, BaseModel):
+    __tablename__ = 'groups'
+    __table_args__ = (
+        UniqueConstraint('group_name', 'group_parent_id'),
+        CheckConstraint('group_id != group_parent_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    __mapper_args__ = {'order_by': 'group_name'}
+
+    group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
+    group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
+    group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
+
+    repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
+    users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
+    parent_group = relationship('RepoGroup', remote_side=group_id)
+    user = relationship('User')
+
+    def __init__(self, group_name='', parent_group=None):
+        self.group_name = group_name
+        self.parent_group = parent_group
+
+    def __unicode__(self):
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__, self.group_id,
+                                      self.group_name)
+
+    @classmethod
+    def groups_choices(cls, groups=None, show_empty_group=True):
+        from webhelpers.html import literal as _literal
+        if not groups:
+            groups = cls.query().all()
+
+        repo_groups = []
+        if show_empty_group:
+            repo_groups = [('-1', '-- %s --' % _('top level'))]
+        sep = ' &raquo; '
+        _name = lambda k: _literal(sep.join(k))
+
+        repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
+                              for x in groups])
+
+        repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
+        return repo_groups
+
+    @classmethod
+    def url_sep(cls):
+        return URL_SEP
+
+    @classmethod
+    def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
+        if case_insensitive:
+            gr = cls.query()\
+                .filter(cls.group_name.ilike(group_name))
+        else:
+            gr = cls.query()\
+                .filter(cls.group_name == group_name)
+        if cache:
+            gr = gr.options(FromCache(
+                            "sql_cache_short",
+                            "get_group_%s" % _hash_key(group_name)
+                            )
+            )
+        return gr.scalar()
+
+    @property
+    def parents(self):
+        parents_recursion_limit = 5
+        groups = []
+        if self.parent_group is None:
+            return groups
+        cur_gr = self.parent_group
+        groups.insert(0, cur_gr)
+        cnt = 0
+        while 1:
+            cnt += 1
+            gr = getattr(cur_gr, 'parent_group', None)
+            cur_gr = cur_gr.parent_group
+            if gr is None:
+                break
+            if cnt == parents_recursion_limit:
+                # this will prevent accidental infinit loops
+                log.error('group nested more than %s' %
+                          parents_recursion_limit)
+                break
+
+            groups.insert(0, gr)
+        return groups
+
+    @property
+    def children(self):
+        return RepoGroup.query().filter(RepoGroup.parent_group == self)
+
+    @property
+    def name(self):
+        return self.group_name.split(RepoGroup.url_sep())[-1]
+
+    @property
+    def full_path(self):
+        return self.group_name
+
+    @property
+    def full_path_splitted(self):
+        return self.group_name.split(RepoGroup.url_sep())
+
+    @property
+    def repositories(self):
+        return Repository.query()\
+                .filter(Repository.group == self)\
+                .order_by(Repository.repo_name)
+
+    @property
+    def repositories_recursive_count(self):
+        cnt = self.repositories.count()
+
+        def children_count(group):
+            cnt = 0
+            for child in group.children:
+                cnt += child.repositories.count()
+                cnt += children_count(child)
+            return cnt
+
+        return cnt + children_count(self)
+
+    def _recursive_objects(self, include_repos=True):
+        all_ = []
+
+        def _get_members(root_gr):
+            if include_repos:
+                for r in root_gr.repositories:
+                    all_.append(r)
+            childs = root_gr.children.all()
+            if childs:
+                for gr in childs:
+                    all_.append(gr)
+                    _get_members(gr)
+
+        _get_members(self)
+        return [self] + all_
+
+    def recursive_groups_and_repos(self):
+        """
+        Recursive return all groups, with repositories in those groups
+        """
+        return self._recursive_objects()
+
+    def recursive_groups(self):
+        """
+        Returns all children groups for this group including children of children
+        """
+        return self._recursive_objects(include_repos=False)
+
+    def get_new_name(self, group_name):
+        """
+        returns new full group name based on parent and new name
+
+        :param group_name:
+        """
+        path_prefix = (self.parent_group.full_path_splitted if
+                       self.parent_group else [])
+        return RepoGroup.url_sep().join(path_prefix + [group_name])
+
+
+class Permission(Base, BaseModel):
+    __tablename__ = 'permissions'
+    __table_args__ = (
+        Index('p_perm_name_idx', 'permission_name'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    PERMS = [
+        ('hg.admin', _('RhodeCode Administrator')),
+
+        ('repository.none', _('Repository no access')),
+        ('repository.read', _('Repository read access')),
+        ('repository.write', _('Repository write access')),
+        ('repository.admin', _('Repository admin access')),
+
+        ('group.none', _('Repository group no access')),
+        ('group.read', _('Repository group read access')),
+        ('group.write', _('Repository group write access')),
+        ('group.admin', _('Repository group admin access')),
+
+        ('usergroup.none', _('User group no access')),
+        ('usergroup.read', _('User group read access')),
+        ('usergroup.write', _('User group write access')),
+        ('usergroup.admin', _('User group admin access')),
+
+        ('hg.repogroup.create.false', _('Repository Group creation disabled')),
+        ('hg.repogroup.create.true', _('Repository Group creation enabled')),
+
+        ('hg.usergroup.create.false', _('User Group creation disabled')),
+        ('hg.usergroup.create.true', _('User Group creation enabled')),
+
+        ('hg.create.none', _('Repository creation disabled')),
+        ('hg.create.repository', _('Repository creation enabled')),
+
+        ('hg.fork.none', _('Repository forking disabled')),
+        ('hg.fork.repository', _('Repository forking enabled')),
+
+        ('hg.register.none', _('Registration disabled')),
+        ('hg.register.manual_activate', _('User Registration with manual account activation')),
+        ('hg.register.auto_activate', _('User Registration with automatic account activation')),
+
+        ('hg.extern_activate.manual', _('Manual activation of external account')),
+        ('hg.extern_activate.auto', _('Automatic activation of external account')),
+
+    ]
+
+    #definition of system default permissions for DEFAULT user
+    DEFAULT_USER_PERMISSIONS = [
+        'repository.read',
+        'group.read',
+        'usergroup.read',
+        'hg.create.repository',
+        'hg.fork.repository',
+        'hg.register.manual_activate',
+        'hg.extern_activate.auto',
+    ]
+
+    # defines which permissions are more important higher the more important
+    # Weight defines which permissions are more important.
+    # The higher number the more important.
+    PERM_WEIGHTS = {
+        'repository.none': 0,
+        'repository.read': 1,
+        'repository.write': 3,
+        'repository.admin': 4,
+
+        'group.none': 0,
+        'group.read': 1,
+        'group.write': 3,
+        'group.admin': 4,
+
+        'usergroup.none': 0,
+        'usergroup.read': 1,
+        'usergroup.write': 3,
+        'usergroup.admin': 4,
+        'hg.repogroup.create.false': 0,
+        'hg.repogroup.create.true': 1,
+
+        'hg.usergroup.create.false': 0,
+        'hg.usergroup.create.true': 1,
+
+        'hg.fork.none': 0,
+        'hg.fork.repository': 1,
+        'hg.create.none': 0,
+        'hg.create.repository': 1
+    }
+
+    permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+
+    def __unicode__(self):
+        return u"<%s('%s:%s')>" % (
+            self.__class__.__name__, self.permission_id, self.permission_name
+        )
+
+    @classmethod
+    def get_by_key(cls, key):
+        return cls.query().filter(cls.permission_name == key).scalar()
+
+    @classmethod
+    def get_default_perms(cls, default_user_id):
+        q = Session().query(UserRepoToPerm, Repository, cls)\
+         .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
+         .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
+         .filter(UserRepoToPerm.user_id == default_user_id)
+
+        return q.all()
+
+    @classmethod
+    def get_default_group_perms(cls, default_user_id):
+        q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
+         .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
+         .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
+         .filter(UserRepoGroupToPerm.user_id == default_user_id)
+
+        return q.all()
+
+    @classmethod
+    def get_default_user_group_perms(cls, default_user_id):
+        q = Session().query(UserUserGroupToPerm, UserGroup, cls)\
+         .join((UserGroup, UserUserGroupToPerm.user_group_id == UserGroup.users_group_id))\
+         .join((cls, UserUserGroupToPerm.permission_id == cls.permission_id))\
+         .filter(UserUserGroupToPerm.user_id == default_user_id)
+
+        return q.all()
+
+
+class UserRepoToPerm(Base, BaseModel):
+    __tablename__ = 'repo_to_perm'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'repository_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User')
+    repository = relationship('Repository')
+    permission = relationship('Permission')
+
+    @classmethod
+    def create(cls, user, repository, permission):
+        n = cls()
+        n.user = user
+        n.repository = repository
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<%s => %s >' % (self.user, self.repository)
+
+
+class UserUserGroupToPerm(Base, BaseModel):
+    __tablename__ = 'user_user_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'user_group_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_user_group_to_perm_id = Column("user_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User')
+    user_group = relationship('UserGroup')
+    permission = relationship('Permission')
+
+    @classmethod
+    def create(cls, user, user_group, permission):
+        n = cls()
+        n.user = user
+        n.user_group = user_group
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<%s => %s >' % (self.user, self.user_group)
+
+
+class UserToPerm(Base, BaseModel):
+    __tablename__ = 'user_to_perm'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User')
+    permission = relationship('Permission', lazy='joined')
+
+    def __unicode__(self):
+        return u'<%s => %s >' % (self.user, self.permission)
+
+
+class UserGroupRepoToPerm(Base, BaseModel):
+    __tablename__ = 'users_group_repo_to_perm'
+    __table_args__ = (
+        UniqueConstraint('repository_id', 'users_group_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
+
+    users_group = relationship('UserGroup')
+    permission = relationship('Permission')
+    repository = relationship('Repository')
+
+    @classmethod
+    def create(cls, users_group, repository, permission):
+        n = cls()
+        n.users_group = users_group
+        n.repository = repository
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<UserGroupRepoToPerm:%s => %s >' % (self.users_group, self.repository)
+
+
+class UserGroupUserGroupToPerm(Base, BaseModel):
+    __tablename__ = 'user_group_user_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('target_user_group_id', 'user_group_id', 'permission_id'),
+        CheckConstraint('target_user_group_id != user_group_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_group_user_group_to_perm_id = Column("user_group_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    target_user_group_id = Column("target_user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+
+    target_user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.target_user_group_id==UserGroup.users_group_id')
+    user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.user_group_id==UserGroup.users_group_id')
+    permission = relationship('Permission')
+
+    @classmethod
+    def create(cls, target_user_group, user_group, permission):
+        n = cls()
+        n.target_user_group = target_user_group
+        n.user_group = user_group
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<UserGroupUserGroup:%s => %s >' % (self.target_user_group, self.user_group)
+
+
+class UserGroupToPerm(Base, BaseModel):
+    __tablename__ = 'users_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('users_group_id', 'permission_id',),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+
+    users_group = relationship('UserGroup')
+    permission = relationship('Permission')
+
+
+class UserRepoGroupToPerm(Base, BaseModel):
+    __tablename__ = 'user_repo_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'group_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+
+    group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User')
+    group = relationship('RepoGroup')
+    permission = relationship('Permission')
+
+
+class UserGroupRepoGroupToPerm(Base, BaseModel):
+    __tablename__ = 'users_group_repo_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('users_group_id', 'group_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+
+    users_group_repo_group_to_perm_id = Column("users_group_repo_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+
+    users_group = relationship('UserGroup')
+    permission = relationship('Permission')
+    group = relationship('RepoGroup')
+
+
+class Statistics(Base, BaseModel):
+    __tablename__ = 'statistics'
+    __table_args__ = (
+         UniqueConstraint('repository_id'),
+         {'extend_existing': True, 'mysql_engine': 'InnoDB',
+          'mysql_charset': 'utf8'}
+    )
+    stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
+    stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
+    commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
+    commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
+    languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
+
+    repository = relationship('Repository', single_parent=True)
+
+
+class UserFollowing(Base, BaseModel):
+    __tablename__ = 'user_followings'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'follows_repository_id'),
+        UniqueConstraint('user_id', 'follows_user_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+
+    user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
+    follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
+    follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
+
+    user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
+
+    follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
+    follows_repository = relationship('Repository', order_by='Repository.repo_name')
+
+    @classmethod
+    def get_repo_followers(cls, repo_id):
+        return cls.query().filter(cls.follows_repo_id == repo_id)
+
+
+class CacheInvalidation(Base, BaseModel):
+    __tablename__ = 'cache_invalidation'
+    __table_args__ = (
+        UniqueConstraint('cache_key'),
+        Index('key_idx', 'cache_key'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    # cache_id, not used
+    cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    # cache_key as created by _get_cache_key
+    cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    # cache_args is a repo_name
+    cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    # instance sets cache_active True when it is caching,
+    # other instances set cache_active to False to indicate that this cache is invalid
+    cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
+
+    def __init__(self, cache_key, repo_name=''):
+        self.cache_key = cache_key
+        self.cache_args = repo_name
+        self.cache_active = False
+
+    def __unicode__(self):
+        return u"<%s('%s:%s[%s]')>" % (self.__class__.__name__,
+                            self.cache_id, self.cache_key, self.cache_active)
+
+    def _cache_key_partition(self):
+        prefix, repo_name, suffix = self.cache_key.partition(self.cache_args)
+        return prefix, repo_name, suffix
+
+    def get_prefix(self):
+        """
+        get prefix that might have been used in _get_cache_key to
+        generate self.cache_key. Only used for informational purposes
+        in repo_edit.html.
+        """
+        # prefix, repo_name, suffix
+        return self._cache_key_partition()[0]
+
+    def get_suffix(self):
+        """
+        get suffix that might have been used in _get_cache_key to
+        generate self.cache_key. Only used for informational purposes
+        in repo_edit.html.
+        """
+        # prefix, repo_name, suffix
+        return self._cache_key_partition()[2]
+
+    @classmethod
+    def clear_cache(cls):
+        """
+        Delete all cache keys from database.
+        Should only be run when all instances are down and all entries thus stale.
+        """
+        cls.query().delete()
+        Session().commit()
+
+    @classmethod
+    def _get_cache_key(cls, key):
+        """
+        Wrapper for generating a unique cache key for this instance and "key".
+        key must / will start with a repo_name which will be stored in .cache_args .
+        """
+        import rhodecode
+        prefix = rhodecode.CONFIG.get('instance_id', '')
+        return "%s%s" % (prefix, key)
+
+    @classmethod
+    def set_invalidate(cls, repo_name):
+        """
+        Mark all caches of a repo as invalid in the database.
+        """
+        inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
+
+        try:
+            for inv_obj in inv_objs:
+                log.debug('marking %s key for invalidation based on repo_name=%s'
+                          % (inv_obj, safe_str(repo_name)))
+                inv_obj.cache_active = False
+                Session().add(inv_obj)
+            Session().commit()
+        except Exception:
+            log.error(traceback.format_exc())
+            Session().rollback()
+
+    @classmethod
+    def test_and_set_valid(cls, repo_name, kind, valid_cache_keys=None):
+        """
+        Mark this cache key as active and currently cached.
+        Return True if the existing cache registration still was valid.
+        Return False to indicate that it had been invalidated and caches should be refreshed.
+        """
+
+        key = (repo_name + '_' + kind) if kind else repo_name
+        cache_key = cls._get_cache_key(key)
+
+        if valid_cache_keys and cache_key in valid_cache_keys:
+            return True
+
+        try:
+            inv_obj = cls.query().filter(cls.cache_key == cache_key).scalar()
+            if not inv_obj:
+                inv_obj = CacheInvalidation(cache_key, repo_name)
+            was_valid = inv_obj.cache_active
+            inv_obj.cache_active = True
+            Session().add(inv_obj)
+            Session().commit()
+            return was_valid
+        except Exception:
+            log.error(traceback.format_exc())
+            Session().rollback()
+            return False
+
+    @classmethod
+    def get_valid_cache_keys(cls):
+        """
+        Return opaque object with information of which caches still are valid
+        and can be used without checking for invalidation.
+        """
+        return set(inv_obj.cache_key for inv_obj in cls.query().filter(cls.cache_active).all())
+
+
+class ChangesetComment(Base, BaseModel):
+    __tablename__ = 'changeset_comments'
+    __table_args__ = (
+        Index('cc_revision_idx', 'revision'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    comment_id = Column('comment_id', Integer(), nullable=False, primary_key=True)
+    repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    revision = Column('revision', String(40), nullable=True)
+    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
+    line_no = Column('line_no', Unicode(10), nullable=True)
+    hl_lines = Column('hl_lines', Unicode(512), nullable=True)
+    f_path = Column('f_path', Unicode(1000), nullable=True)
+    user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False)
+    text = Column('text', UnicodeText(25000), nullable=False)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+
+    author = relationship('User', lazy='joined')
+    repo = relationship('Repository')
+    status_change = relationship('ChangesetStatus', cascade="all, delete, delete-orphan")
+    pull_request = relationship('PullRequest', lazy='joined')
+
+    @classmethod
+    def get_users(cls, revision=None, pull_request_id=None):
+        """
+        Returns user associated with this ChangesetComment. ie those
+        who actually commented
+
+        :param cls:
+        :param revision:
+        """
+        q = Session().query(User)\
+                .join(ChangesetComment.author)
+        if revision:
+            q = q.filter(cls.revision == revision)
+        elif pull_request_id:
+            q = q.filter(cls.pull_request_id == pull_request_id)
+        return q.all()
+
+
+class ChangesetStatus(Base, BaseModel):
+    __tablename__ = 'changeset_statuses'
+    __table_args__ = (
+        Index('cs_revision_idx', 'revision'),
+        Index('cs_version_idx', 'version'),
+        UniqueConstraint('repo_id', 'revision', 'version'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    STATUS_NOT_REVIEWED = DEFAULT = 'not_reviewed'
+    STATUS_APPROVED = 'approved'
+    STATUS_REJECTED = 'rejected'
+    STATUS_UNDER_REVIEW = 'under_review'
+
+    STATUSES = [
+        (STATUS_NOT_REVIEWED, _("Not Reviewed")),  # (no icon) and default
+        (STATUS_APPROVED, _("Approved")),
+        (STATUS_REJECTED, _("Rejected")),
+        (STATUS_UNDER_REVIEW, _("Under Review")),
+    ]
+
+    changeset_status_id = Column('changeset_status_id', Integer(), nullable=False, primary_key=True)
+    repo_id = Column('repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
+    revision = Column('revision', String(40), nullable=False)
+    status = Column('status', String(128), nullable=False, default=DEFAULT)
+    changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
+    modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
+    version = Column('version', Integer(), nullable=False, default=0)
+    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=True)
+
+    author = relationship('User', lazy='joined')
+    repo = relationship('Repository')
+    comment = relationship('ChangesetComment', lazy='joined')
+    pull_request = relationship('PullRequest', lazy='joined')
+
+    def __unicode__(self):
+        return u"<%s('%s:%s')>" % (
+            self.__class__.__name__,
+            self.status, self.author
+        )
+
+    @classmethod
+    def get_status_lbl(cls, value):
+        return dict(cls.STATUSES).get(value)
+
+    @property
+    def status_lbl(self):
+        return ChangesetStatus.get_status_lbl(self.status)
+
+
+class PullRequest(Base, BaseModel):
+    __tablename__ = 'pull_requests'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    STATUS_NEW = u'new'
+    STATUS_OPEN = u'open'
+    STATUS_CLOSED = u'closed'
+
+    pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True)
+    title = Column('title', Unicode(256), nullable=True)
+    description = Column('description', UnicodeText(10240), nullable=True)
+    status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
+    _revisions = Column('revisions', UnicodeText(20500))  # 500 revisions max
+    org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    org_ref = Column('org_ref', Unicode(256), nullable=False)
+    other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False)
+    other_ref = Column('other_ref', Unicode(256), nullable=False)
+
+    @hybrid_property
+    def revisions(self):
+        return self._revisions.split(':')
+
+    @revisions.setter
+    def revisions(self, val):
+        self._revisions = ':'.join(val)
+
+    @property
+    def org_ref_parts(self):
+        return self.org_ref.split(':')
+
+    @property
+    def other_ref_parts(self):
+        return self.other_ref.split(':')
+
+    author = relationship('User', lazy='joined')
+    reviewers = relationship('PullRequestReviewers',
+                             cascade="all, delete, delete-orphan")
+    org_repo = relationship('Repository', primaryjoin='PullRequest.org_repo_id==Repository.repo_id')
+    other_repo = relationship('Repository', primaryjoin='PullRequest.other_repo_id==Repository.repo_id')
+    statuses = relationship('ChangesetStatus')
+    comments = relationship('ChangesetComment',
+                             cascade="all, delete, delete-orphan")
+
+    def is_closed(self):
+        return self.status == self.STATUS_CLOSED
+
+    @property
+    def last_review_status(self):
+        return self.statuses[-1].status if self.statuses else ''
+
+    def __json__(self):
+        return dict(
+          revisions=self.revisions
+        )
+
+
+class PullRequestReviewers(Base, BaseModel):
+    __tablename__ = 'pull_request_reviewers'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    def __init__(self, user=None, pull_request=None):
+        self.user = user
+        self.pull_request = pull_request
+
+    pull_requests_reviewers_id = Column('pull_requests_reviewers_id', Integer(), nullable=False, primary_key=True)
+    pull_request_id = Column("pull_request_id", Integer(), ForeignKey('pull_requests.pull_request_id'), nullable=False)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True)
+
+    user = relationship('User')
+    pull_request = relationship('PullRequest')
+
+
+class Notification(Base, BaseModel):
+    __tablename__ = 'notifications'
+    __table_args__ = (
+        Index('notification_type_idx', 'type'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+
+    TYPE_CHANGESET_COMMENT = u'cs_comment'
+    TYPE_MESSAGE = u'message'
+    TYPE_MENTION = u'mention'
+    TYPE_REGISTRATION = u'registration'
+    TYPE_PULL_REQUEST = u'pull_request'
+    TYPE_PULL_REQUEST_COMMENT = u'pull_request_comment'
+
+    notification_id = Column('notification_id', Integer(), nullable=False, primary_key=True)
+    subject = Column('subject', Unicode(512), nullable=True)
+    body = Column('body', UnicodeText(50000), nullable=True)
+    created_by = Column("created_by", Integer(), ForeignKey('users.user_id'), nullable=True)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    type_ = Column('type', Unicode(256))
+
+    created_by_user = relationship('User')
+    notifications_to_users = relationship('UserNotification', lazy='joined',
+                                          cascade="all, delete, delete-orphan")
+
+    @property
+    def recipients(self):
+        return [x.user for x in UserNotification.query()\
+                .filter(UserNotification.notification == self)\
+                .order_by(UserNotification.user_id.asc()).all()]
+
+    @classmethod
+    def create(cls, created_by, subject, body, recipients, type_=None):
+        if type_ is None:
+            type_ = Notification.TYPE_MESSAGE
+
+        notification = cls()
+        notification.created_by_user = created_by
+        notification.subject = subject
+        notification.body = body
+        notification.type_ = type_
+        notification.created_on = datetime.datetime.now()
+
+        for u in recipients:
+            assoc = UserNotification()
+            assoc.notification = notification
+            u.notifications.append(assoc)
+        Session().add(notification)
+        return notification
+
+    @property
+    def description(self):
+        from rhodecode.model.notification import NotificationModel
+        return NotificationModel().make_description(self)
+
+
+class UserNotification(Base, BaseModel):
+    __tablename__ = 'user_to_notification'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'notification_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), primary_key=True)
+    notification_id = Column("notification_id", Integer(), ForeignKey('notifications.notification_id'), primary_key=True)
+    read = Column('read', Boolean, default=False)
+    sent_on = Column('sent_on', DateTime(timezone=False), nullable=True, unique=None)
+
+    user = relationship('User', lazy="joined")
+    notification = relationship('Notification', lazy="joined",
+                                order_by=lambda: Notification.created_on.desc(),)
+
+    def mark_as_read(self):
+        self.read = True
+        Session().add(self)
+
+
+class Gist(Base, BaseModel):
+    __tablename__ = 'gists'
+    __table_args__ = (
+        Index('g_gist_access_id_idx', 'gist_access_id'),
+        Index('g_created_on_idx', 'created_on'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    GIST_PUBLIC = u'public'
+    GIST_PRIVATE = u'private'
+
+    gist_id = Column('gist_id', Integer(), primary_key=True)
+    gist_access_id = Column('gist_access_id', Unicode(250))
+    gist_description = Column('gist_description', UnicodeText(1024))
+    gist_owner = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=True)
+    gist_expires = Column('gist_expires', Float(), nullable=False)
+    gist_type = Column('gist_type', Unicode(128), nullable=False)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+
+    owner = relationship('User')
+
+    @classmethod
+    def get_or_404(cls, id_):
+        res = cls.query().filter(cls.gist_access_id == id_).scalar()
+        if not res:
+            raise HTTPNotFound
+        return res
+
+    @classmethod
+    def get_by_access_id(cls, gist_access_id):
+        return cls.query().filter(cls.gist_access_id == gist_access_id).scalar()
+
+    def gist_url(self):
+        import rhodecode
+        alias_url = rhodecode.CONFIG.get('gist_alias_url')
+        if alias_url:
+            return alias_url.replace('{gistid}', self.gist_access_id)
+
+        from pylons import url
+        return url('gist', gist_id=self.gist_access_id, qualified=True)
+
+    @classmethod
+    def base_path(cls):
+        """
+        Returns base path when all gists are stored
+
+        :param cls:
+        """
+        from rhodecode.model.gist import GIST_STORE_LOC
+        q = Session().query(RhodeCodeUi)\
+            .filter(RhodeCodeUi.ui_key == URL_SEP)
+        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
+        return os.path.join(q.one().ui_value, GIST_STORE_LOC)
+
+    def get_api_data(self):
+        """
+        Common function for generating gist related data for API
+        """
+        gist = self
+        data = dict(
+            gist_id=gist.gist_id,
+            type=gist.gist_type,
+            access_id=gist.gist_access_id,
+            description=gist.gist_description,
+            url=gist.gist_url(),
+            expires=gist.gist_expires,
+            created_on=gist.created_on,
+        )
+        return data
+
+    def __json__(self):
+        data = dict(
+        )
+        data.update(self.get_api_data())
+        return data
+    ## SCM functions
+
+    @property
+    def scm_instance(self):
+        from rhodecode.lib.vcs import get_repo
+        base_path = self.base_path()
+        return get_repo(os.path.join(*map(safe_str,
+                                          [base_path, self.gist_access_id])))
+
+
+class DbMigrateVersion(Base, BaseModel):
+    __tablename__ = 'db_migrate_version'
+    __table_args__ = (
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'},
+    )
+    repository_id = Column('repository_id', String(250), primary_key=True)
+    repository_path = Column('repository_path', Text)
+    version = Column('version', Integer)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,68 @@
+import logging
+import datetime
+
+from sqlalchemy import *
+from sqlalchemy.exc import DatabaseError
+from sqlalchemy.orm import relation, backref, class_mapper, joinedload
+from sqlalchemy.orm.session import Session
+from sqlalchemy.ext.declarative import declarative_base
+
+from rhodecode.lib.dbmigrate.migrate import *
+from rhodecode.lib.dbmigrate.migrate.changeset import *
+
+from rhodecode.model.meta import Base
+from rhodecode.model import meta
+from rhodecode.lib.dbmigrate.versions import _reset_base
+
+log = logging.getLogger(__name__)
+
+
+def upgrade(migrate_engine):
+    """
+    Upgrade operations go here.
+    Don't create your own engine; bind migrate_engine to your metadata
+    """
+    _reset_base(migrate_engine)
+
+    #==========================================================================
+    # UserUserGroupToPerm
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import UserUserGroupToPerm
+    tbl = UserUserGroupToPerm.__table__
+    tbl.create()
+
+    #==========================================================================
+    # UserGroupUserGroupToPerm
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import UserGroupUserGroupToPerm
+    tbl = UserGroupUserGroupToPerm.__table__
+    tbl.create()
+
+    #==========================================================================
+    # Gist
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import Gist
+    tbl = Gist.__table__
+    tbl.create()
+
+    #==========================================================================
+    # UserGroup
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import UserGroup
+    tbl = UserGroup.__table__
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=False, default=None)
+    # create username column
+    user_id.create(table=tbl)
+
+    #==========================================================================
+    # RepoGroup
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import RepoGroup
+    tbl = RepoGroup.__table__
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=False, default=None)
+    # create username column
+    user_id.create(table=tbl)
+
+def downgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/dbmigrate/versions/013_version_1_7_0.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,47 @@
+import logging
+import datetime
+
+from sqlalchemy import *
+from sqlalchemy.exc import DatabaseError
+from sqlalchemy.orm import relation, backref, class_mapper, joinedload
+from sqlalchemy.orm.session import Session
+from sqlalchemy.ext.declarative import declarative_base
+
+from rhodecode.lib.dbmigrate.migrate import *
+from rhodecode.lib.dbmigrate.migrate.changeset import *
+
+from rhodecode.model.meta import Base
+from rhodecode.model import meta
+from rhodecode.lib.dbmigrate.versions import _reset_base
+
+log = logging.getLogger(__name__)
+
+
+def upgrade(migrate_engine):
+    """
+    Upgrade operations go here.
+    Don't create your own engine; bind migrate_engine to your metadata
+    """
+    _reset_base(migrate_engine)
+
+
+    #==========================================================================
+    # UserGroup
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import UserGroup
+    tbl = UserGroup.__table__
+    user_id = tbl.columns.user_id
+    user_id.alter(nullable=False)
+
+    #==========================================================================
+    # RepoGroup
+    #==========================================================================
+    from rhodecode.lib.dbmigrate.schema.db_1_7_0 import RepoGroup
+    tbl = RepoGroup.__table__
+    user_id = tbl.columns.user_id
+    user_id.alter(nullable=False)
+
+
+def downgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
--- a/rhodecode/lib/diffs.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/diffs.py	Fri Jun 07 00:31:11 2013 +0200
@@ -128,6 +128,7 @@
 MOD_FILENODE = 3
 RENAMED_FILENODE = 4
 CHMOD_FILENODE = 5
+BIN_FILENODE = 6
 
 
 class DiffLimitExceeded(Exception):
@@ -166,21 +167,23 @@
         (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
         (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
             \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
+        (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
         (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
         (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
     """, re.VERBOSE | re.MULTILINE)
     _hg_header_re = re.compile(r"""
         #^diff[ ]--git
             [ ]a/(?P<a_path>.+?)[ ]b/(?P<b_path>.+?)\n
+        (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
+           ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
         (?:^similarity[ ]index[ ](?P<similarity_index>\d+)%(?:\n|$))?
         (?:^rename[ ]from[ ](?P<rename_from>\S+)\n
            ^rename[ ]to[ ](?P<rename_to>\S+)(?:\n|$))?
-        (?:^old[ ]mode[ ](?P<old_mode>\d+)\n
-           ^new[ ]mode[ ](?P<new_mode>\d+)(?:\n|$))?
         (?:^new[ ]file[ ]mode[ ](?P<new_file_mode>.+)(?:\n|$))?
         (?:^deleted[ ]file[ ]mode[ ](?P<deleted_file_mode>.+)(?:\n|$))?
         (?:^index[ ](?P<a_blob_id>[0-9A-Fa-f]+)
             \.\.(?P<b_blob_id>[0-9A-Fa-f]+)[ ]?(?P<b_mode>.+)?(?:\n|$))?
+        (?:^(?P<bin_patch>GIT[ ]binary[ ]patch)(?:\n|$))?
         (?:^---[ ](a/(?P<a_file>.+)|/dev/null)(?:\n|$))?
         (?:^\+\+\+[ ](b/(?P<b_file>.+)|/dev/null)(?:\n|$))?
     """, re.VERBOSE | re.MULTILINE)
@@ -233,7 +236,6 @@
         Escaper for diff escapes special chars and checks the diff limit
 
         :param string:
-        :type string:
         """
 
         self.cur_diff_size += len(string)
@@ -328,7 +330,6 @@
             a_blob_id, b_blob_id, b_mode, a_file, b_file
 
         :param diff_chunk:
-        :type diff_chunk:
         """
 
         if self.vcs == 'git':
@@ -354,61 +355,87 @@
 
         ##split the diff in chunks of separate --git a/file b/file chunks
         for raw_diff in ('\n' + self._diff).split('\ndiff --git')[1:]:
-            binary = False
-            binary_msg = 'unknown binary'
             head, diff = self._get_header(raw_diff)
 
-            if not head['a_file'] and head['b_file']:
-                op = 'A'
-            elif head['a_file'] and head['b_file']:
-                op = 'M'
-            elif head['a_file'] and not head['b_file']:
+            op = None
+            stats = {
+                'added': 0,
+                'deleted': 0,
+                'binary': False,
+                'ops': {},
+            }
+
+            if head['deleted_file_mode']:
                 op = 'D'
-            else:
-                #probably we're dealing with a binary file 1
-                binary = True
-                if head['deleted_file_mode']:
-                    op = 'D'
-                    stats = ['b', DEL_FILENODE]
-                    binary_msg = 'deleted binary file'
-                elif head['new_file_mode']:
-                    op = 'A'
-                    stats = ['b', NEW_FILENODE]
-                    binary_msg = 'new binary file %s' % head['new_file_mode']
-                else:
-                    if head['new_mode'] and head['old_mode']:
-                        stats = ['b', CHMOD_FILENODE]
-                        op = 'M'
-                        binary_msg = ('modified binary file chmod %s => %s'
-                                      % (head['old_mode'], head['new_mode']))
-                    elif (head['rename_from'] and head['rename_to']
-                          and head['rename_from'] != head['rename_to']):
-                        stats = ['b', RENAMED_FILENODE]
-                        op = 'M'
-                        binary_msg = ('file renamed from %s to %s'
-                                      % (head['rename_from'], head['rename_to']))
-                    else:
-                        stats = ['b', MOD_FILENODE]
-                        op = 'M'
-                        binary_msg = 'modified binary file'
+                stats['binary'] = True
+                stats['ops'][DEL_FILENODE] = 'deleted file'
+
+            elif head['new_file_mode']:
+                op = 'A'
+                stats['binary'] = True
+                stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
+            else:  # modify operation, can be cp, rename, chmod
+                # CHMOD
+                if head['new_mode'] and head['old_mode']:
+                    op = 'M'
+                    stats['binary'] = True
+                    stats['ops'][CHMOD_FILENODE] = ('modified file chmod %s => %s'
+                                        % (head['old_mode'], head['new_mode']))
+                # RENAME
+                if (head['rename_from'] and head['rename_to']
+                      and head['rename_from'] != head['rename_to']):
+                    op = 'M'
+                    stats['binary'] = True
+                    stats['ops'][RENAMED_FILENODE] = ('file renamed from %s to %s'
+                                    % (head['rename_from'], head['rename_to']))
+
+                # FALL BACK: detect missed old style add or remove
+                if op is None:
+                    if not head['a_file'] and head['b_file']:
+                        op = 'A'
+                        stats['binary'] = True
+                        stats['ops'][NEW_FILENODE] = 'new file'
+
+                    elif head['a_file'] and not head['b_file']:
+                        op = 'D'
+                        stats['binary'] = True
+                        stats['ops'][DEL_FILENODE] = 'deleted file'
 
-            if not binary:
+                # it's not ADD not DELETE
+                if op is None:
+                    op = 'M'
+                    stats['binary'] = True
+                    stats['ops'][MOD_FILENODE] = 'modified file'
+
+            # a real non-binary diff
+            if head['a_file'] or head['b_file']:
                 try:
-                    chunks, stats = self._parse_lines(diff)
+                    chunks, _stats = self._parse_lines(diff)
+                    stats['binary'] = False
+                    stats['added'] = _stats[0]
+                    stats['deleted'] = _stats[1]
+                    # explicit mark that it's a modified file
+                    if op == 'M':
+                        stats['ops'][MOD_FILENODE] = 'modified file'
+
                 except DiffLimitExceeded:
-                    diff_container = lambda _diff: LimitedDiffContainer(
-                                                self.diff_limit,
-                                                self.cur_diff_size,
-                                                _diff)
+                    diff_container = lambda _diff: \
+                        LimitedDiffContainer(self.diff_limit,
+                                            self.cur_diff_size, _diff)
                     break
-            else:
+            else:  # GIT binary patch (or empty diff)
+                # GIT Binary patch
+                if head['bin_patch']:
+                    stats['ops'][BIN_FILENODE] = 'binary diff not shown'
                 chunks = []
-                chunks.append([{
-                    'old_lineno': '',
-                    'new_lineno': '',
-                    'action':     'binary',
-                    'line':       binary_msg,
-                }])
+
+            chunks.insert(0, [{
+                'old_lineno': '',
+                'new_lineno': '',
+                'action':     'context',
+                'line':       msg,
+                } for _op, msg in stats['ops'].iteritems()
+                  if _op not in [MOD_FILENODE]])
 
             _files.append({
                 'filename':         head['b_path'],
@@ -682,36 +709,3 @@
         Returns tuple of added, and removed lines for this instance
         """
         return self.adds, self.removes
-
-
-def differ(org_repo, org_ref, other_repo, other_ref,
-           context=3, ignore_whitespace=False):
-    """
-    General differ between branches, bookmarks, revisions of two remote or
-    local but related repositories
-
-    :param org_repo:
-    :param org_ref:
-    :param other_repo:
-    :type other_repo:
-    :type other_ref:
-    """
-
-    org_repo_scm = org_repo.scm_instance
-    other_repo_scm = other_repo.scm_instance
-
-    org_repo = org_repo_scm._repo
-    other_repo = other_repo_scm._repo
-
-    org_ref = safe_str(org_ref[1])
-    other_ref = safe_str(other_ref[1])
-
-    if org_repo_scm == other_repo_scm:
-        log.debug('running diff between %s@%s and %s@%s'
-                  % (org_repo.path, org_ref,
-                     other_repo.path, other_ref))
-        _diff = org_repo_scm.get_diff(rev1=org_ref, rev2=other_ref,
-            ignore_whitespace=ignore_whitespace, context=context)
-        return _diff
-
-    return '' # FIXME: when is it ever relevant to return nothing?
--- a/rhodecode/lib/exceptions.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/exceptions.py	Fri Jun 07 00:31:11 2013 +0200
@@ -62,6 +62,14 @@
     pass
 
 
+class RepoGroupAssignmentError(Exception):
+    pass
+
+
+class NonRelativePathError(Exception):
+    pass
+
+
 class HTTPLockedRC(HTTPClientError):
     """
     Special Exception For locked Repos in RhodeCode, the return code can
--- a/rhodecode/lib/helpers.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/helpers.py	Fri Jun 07 00:31:11 2013 +0200
@@ -16,7 +16,7 @@
 from datetime import datetime
 from pygments.formatters.html import HtmlFormatter
 from pygments import highlight as code_highlight
-from pylons import url, request, config
+from pylons import url
 from pylons.i18n.translation import _, ungettext
 from hashlib import md5
 
@@ -36,7 +36,7 @@
     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
+from webhelpers.paginate import Page as _Page
 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
     convert_boolean_attrs, NotGiven, _make_safe_id_component
 
@@ -355,7 +355,41 @@
     from rhodecode.model.scm import ScmModel
     return ScmModel().is_following_repo(repo_name, user_id)
 
-flash = _Flash()
+class _Message(object):
+    """A message returned by ``Flash.pop_messages()``.
+
+    Converting the message to a string returns the message text. Instances
+    also have the following attributes:
+
+    * ``message``: the message text.
+    * ``category``: the category specified when the message was created.
+    """
+
+    def __init__(self, category, message):
+        self.category=category
+        self.message=message
+
+    def __str__(self):
+        return self.message
+
+    __unicode__ = __str__
+
+    def __html__(self):
+        return escape(safe_unicode(self.message))
+
+class Flash(_Flash):
+
+    def pop_messages(self):
+        """Return all accumulated messages and delete them from the session.
+
+        The return value is a list of ``Message`` objects.
+        """
+        from pylons import session
+        messages = session.pop(self.session_key, [])
+        session.save()
+        return [_Message(*m) for m in messages]
+
+flash = Flash()
 
 #==============================================================================
 # SCM FILTERS available via h.
@@ -391,7 +425,7 @@
 
 def fmt_date(date):
     if date:
-        _fmt = _(u"%a, %d %b %Y %H:%M:%S").encode('utf8')
+        _fmt = u"%a, %d %b %Y %H:%M:%S".encode('utf8')
         return date.strftime(_fmt).decode('utf8')
 
     return ""
@@ -448,7 +482,6 @@
         user = User.get_by_email(_email, case_insensitive=True, cache=True)
         if user is not None:
             return person_getter(user)
-        return _email
 
     # Maybe it's a username?
     _author = author_name(author)
@@ -457,8 +490,8 @@
     if user is not None:
         return person_getter(user)
 
-    # Still nothing?  Just pass back the author name then
-    return _author
+    # Still nothing?  Just pass back the author name if any, else the email
+    return _author or _email
 
 
 def person_by_id(id_, show_attr="username_and_name"):
@@ -599,11 +632,9 @@
                         'ref_name': _name
                     })
                     revs.append(_rev)
-        cs_links = []
-        cs_links.append(" " + ', '.join(
+        cs_links = [" " + ', '.join(
             [lnk(rev, repo_name) for rev in revs[:revs_limit]]
-            )
-        )
+        )]
         _op1, _name1 = _get_op(revs_ids[0])
         _op2, _name2 = _get_op(revs_ids[-1])
 
@@ -685,6 +716,10 @@
                     url('pullrequest_show', repo_name=repo_name,
                     pull_request_id=pull_request_id))
 
+    def get_archive_name():
+        archive_name = action_params
+        return archive_name
+
     # action : translated str, callback(extractor), icon
     action_map = {
     'user_deleted_repo':           (_('[deleted] repository'),
@@ -697,6 +732,8 @@
                                     get_fork_name, 'arrow_divide.png'),
     'user_updated_repo':           (_('[updated] repository'),
                                     None, 'database_edit.png'),
+    'user_downloaded_archive':      (_('[downloaded] archive from repository'),
+                                    get_archive_name, 'page_white_compressed.png'),
     'admin_deleted_repo':          (_('[delete] repository'),
                                     None, 'database_delete.png'),
     'admin_created_repo':          (_('[created] repository'),
@@ -775,17 +812,20 @@
 # GRAVATAR URL
 #==============================================================================
 
-def gravatar_url(email_address, size=30):
+def gravatar_url(email_address, size=30, ssl_enabled=True):
     from pylons import url  # doh, we need to re-import url to mock it later
-    _def = 'anonymous@rhodecode.org'
-    use_gravatar = str2bool(config['app_conf'].get('use_gravatar'))
+    from rhodecode import CONFIG
+
+    _def = 'anonymous@rhodecode.org'  # default gravatar
+    use_gravatar = str2bool(CONFIG.get('use_gravatar'))
+    alternative_gravatar_url = CONFIG.get('alternative_gravatar_url', '')
     email_address = email_address or _def
-    if (not use_gravatar or not email_address or email_address == _def):
+    if not use_gravatar or not email_address or email_address == _def:
         f = lambda a, l: min(l, key=lambda x: abs(x - a))
         return url("/images/user%s.png" % f(size, [14, 16, 20, 24, 30]))
 
-    if use_gravatar and config['app_conf'].get('alternative_gravatar_url'):
-        tmpl = config['app_conf'].get('alternative_gravatar_url', '')
+    if use_gravatar and alternative_gravatar_url:
+        tmpl = alternative_gravatar_url
         parsed_url = urlparse.urlparse(url.current(qualified=True))
         tmpl = tmpl.replace('{email}', email_address)\
                    .replace('{md5email}', hashlib.md5(email_address.lower()).hexdigest()) \
@@ -794,7 +834,6 @@
                    .replace('{size}', str(size))
         return tmpl
 
-    ssl_enabled = 'https' == request.environ.get('wsgi.url_scheme')
     default = 'identicon'
     baseurl_nossl = "http://www.gravatar.com/avatar/"
     baseurl_ssl = "https://secure.gravatar.com/avatar/"
@@ -810,6 +849,145 @@
     return gravatar_url
 
 
+class Page(_Page):
+    """
+    Custom pager to match rendering style with YUI paginator
+    """
+
+    def _get_pos(self, cur_page, max_page, items):
+        edge = (items / 2) + 1
+        if (cur_page <= edge):
+            radius = max(items / 2, items - cur_page)
+        elif (max_page - cur_page) < edge:
+            radius = (items - 1) - (max_page - cur_page)
+        else:
+            radius = items / 2
+
+        left = max(1, (cur_page - (radius)))
+        right = min(max_page, cur_page + (radius))
+        return left, cur_page, right
+
+    def _range(self, regexp_match):
+        """
+        Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
+
+        Arguments:
+
+        regexp_match
+            A "re" (regular expressions) match object containing the
+            radius of linked pages around the current page in
+            regexp_match.group(1) as a string
+
+        This function is supposed to be called as a callable in
+        re.sub.
+
+        """
+        radius = int(regexp_match.group(1))
+
+        # Compute the first and last page number within the radius
+        # e.g. '1 .. 5 6 [7] 8 9 .. 12'
+        # -> leftmost_page  = 5
+        # -> rightmost_page = 9
+        leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
+                                                            self.last_page,
+                                                            (radius * 2) + 1)
+        nav_items = []
+
+        # Create a link to the first page (unless we are on the first page
+        # or there would be no need to insert '..' spacers)
+        if self.page != self.first_page and self.first_page < leftmost_page:
+            nav_items.append(self._pagerlink(self.first_page, self.first_page))
+
+        # Insert dots if there are pages between the first page
+        # and the currently displayed page range
+        if leftmost_page - self.first_page > 1:
+            # Wrap in a SPAN tag if nolink_attr is set
+            text = '..'
+            if self.dotdot_attr:
+                text = HTML.span(c=text, **self.dotdot_attr)
+            nav_items.append(text)
+
+        for thispage in xrange(leftmost_page, rightmost_page + 1):
+            # Hilight the current page number and do not use a link
+            if thispage == self.page:
+                text = '%s' % (thispage,)
+                # Wrap in a SPAN tag if nolink_attr is set
+                if self.curpage_attr:
+                    text = HTML.span(c=text, **self.curpage_attr)
+                nav_items.append(text)
+            # Otherwise create just a link to that page
+            else:
+                text = '%s' % (thispage,)
+                nav_items.append(self._pagerlink(thispage, text))
+
+        # Insert dots if there are pages between the displayed
+        # page numbers and the end of the page range
+        if self.last_page - rightmost_page > 1:
+            text = '..'
+            # Wrap in a SPAN tag if nolink_attr is set
+            if self.dotdot_attr:
+                text = HTML.span(c=text, **self.dotdot_attr)
+            nav_items.append(text)
+
+        # Create a link to the very last page (unless we are on the last
+        # page or there would be no need to insert '..' spacers)
+        if self.page != self.last_page and rightmost_page < self.last_page:
+            nav_items.append(self._pagerlink(self.last_page, self.last_page))
+
+        ## prerender links
+        nav_items.append(literal('<link rel="prerender" href="/rhodecode/changelog/1?page=%s">' % str(int(self.page)+1)))
+        return self.separator.join(nav_items)
+
+    def pager(self, format='~2~', page_param='page', partial_param='partial',
+        show_if_single_page=False, separator=' ', onclick=None,
+        symbol_first='<<', symbol_last='>>',
+        symbol_previous='<', symbol_next='>',
+        link_attr={'class': 'pager_link', 'rel': 'prerender'},
+        curpage_attr={'class': 'pager_curpage'},
+        dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
+
+        self.curpage_attr = curpage_attr
+        self.separator = separator
+        self.pager_kwargs = kwargs
+        self.page_param = page_param
+        self.partial_param = partial_param
+        self.onclick = onclick
+        self.link_attr = link_attr
+        self.dotdot_attr = dotdot_attr
+
+        # Don't show navigator if there is no more than one page
+        if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
+            return ''
+
+        from string import Template
+        # Replace ~...~ in token format by range of pages
+        result = re.sub(r'~(\d+)~', self._range, format)
+
+        # Interpolate '%' variables
+        result = Template(result).safe_substitute({
+            'first_page': self.first_page,
+            'last_page': self.last_page,
+            'page': self.page,
+            'page_count': self.page_count,
+            'items_per_page': self.items_per_page,
+            'first_item': self.first_item,
+            'last_item': self.last_item,
+            'item_count': self.item_count,
+            'link_first': self.page > self.first_page and \
+                    self._pagerlink(self.first_page, symbol_first) or '',
+            'link_last': self.page < self.last_page and \
+                    self._pagerlink(self.last_page, symbol_last) or '',
+            'link_previous': self.previous_page and \
+                    self._pagerlink(self.previous_page, symbol_previous) \
+                    or HTML.span(symbol_previous, class_="yui-pg-previous"),
+            'link_next': self.next_page and \
+                    self._pagerlink(self.next_page, symbol_next) \
+                    or HTML.span(symbol_next, class_="yui-pg-next")
+        })
+
+        return literal(result)
+
+
 #==============================================================================
 # REPO PAGER, PAGER FOR REPOSITORY
 #==============================================================================
@@ -942,6 +1120,9 @@
 
     :param stats: two element list of added/deleted lines of code
     """
+    from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
+        MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
+
     def cgen(l_type, a_v, d_v):
         mapping = {'tr': 'top-right-rounded-corner-mid',
                    'tl': 'top-left-rounded-corner-mid',
@@ -962,16 +1143,41 @@
         if l_type == 'd' and not a_v:
             return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
 
-    a, d = stats[0], stats[1]
+    a, d = stats['added'], stats['deleted']
     width = 100
 
-    if a == 'b':
+    if stats['binary']:
         #binary mode
-        b_d = '<div class="bin%s %s" style="width:100%%">%s</div>' % (d, cgen('a', a_v='', d_v=0), 'bin')
-        b_a = '<div class="bin1" style="width:0%%">%s</div>' % ('bin')
+        lbl = ''
+        bin_op = 1
+
+        if BIN_FILENODE in stats['ops']:
+            lbl = 'bin+'
+
+        if NEW_FILENODE in stats['ops']:
+            lbl += _('new file')
+            bin_op = NEW_FILENODE
+        elif MOD_FILENODE in stats['ops']:
+            lbl += _('mod')
+            bin_op = MOD_FILENODE
+        elif DEL_FILENODE in stats['ops']:
+            lbl += _('del')
+            bin_op = DEL_FILENODE
+        elif RENAMED_FILENODE in stats['ops']:
+            lbl += _('rename')
+            bin_op = RENAMED_FILENODE
+
+        #chmod can go with other operations
+        if CHMOD_FILENODE in stats['ops']:
+            _org_lbl = _('chmod')
+            lbl += _org_lbl if lbl.endswith('+') else '+%s' % _org_lbl
+
+        #import ipdb;ipdb.set_trace()
+        b_d = '<div class="bin bin%s %s" style="width:100%%">%s</div>' % (bin_op, cgen('a', a_v='', d_v=0), lbl)
+        b_a = '<div class="bin bin1" style="width:0%%"></div>'
         return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
 
-    t = stats[0] + stats[1]
+    t = stats['added'] + stats['deleted']
     unit = float(width) / (t or 1)
 
     # needs > 9% of width to be visible or 0 to be hidden
--- a/rhodecode/lib/hooks.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/hooks.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,9 +29,7 @@
 import traceback
 from inspect import isfunction
 
-from mercurial.scmutil import revrange
-from mercurial.node import nullrev
-
+from rhodecode.lib.vcs.utils.hgcompat import nullrev, revrange
 from rhodecode.lib import helpers as h
 from rhodecode.lib.utils import action_logger
 from rhodecode.lib.vcs.backends.base import EmptyChangeset
@@ -306,11 +304,8 @@
     connect to database and run the logging code. Hacky as sh*t but works.
 
     :param repo_path:
-    :type repo_path:
     :param revs:
-    :type revs:
     :param env:
-    :type env:
     """
     from paste.deploy import appconfig
     from sqlalchemy import engine_from_config
--- a/rhodecode/lib/indexers/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/indexers/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -24,32 +24,17 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 import os
 import sys
-import traceback
 import logging
 from os.path import dirname as dn, join as jn
 
 #to get the rhodecode import
 sys.path.append(dn(dn(dn(os.path.realpath(__file__)))))
 
-from string import strip
-from shutil import rmtree
-
 from whoosh.analysis import RegexTokenizer, LowercaseFilter, StopFilter
 from whoosh.fields import TEXT, ID, STORED, NUMERIC, BOOLEAN, Schema, FieldType, DATETIME
-from whoosh.index import create_in, open_dir
 from whoosh.formats import Characters
-from whoosh.highlight import highlight, HtmlFormatter, ContextFragmenter
-
-from webhelpers.html.builder import escape, literal
-from sqlalchemy import engine_from_config
-
-from rhodecode.model import init_model
-from rhodecode.model.scm import ScmModel
-from rhodecode.model.repo import RepoModel
-from rhodecode.config.environment import load_environment
+from whoosh.highlight import highlight as whoosh_highlight, HtmlFormatter, ContextFragmenter
 from rhodecode.lib.utils2 import LazyProperty
-from rhodecode.lib.utils import BasePasterCommand, Command, add_cache,\
-    load_rcextensions
 
 log = logging.getLogger(__name__)
 
@@ -99,74 +84,6 @@
 )
 
 
-class MakeIndex(BasePasterCommand):
-
-    max_args = 1
-    min_args = 1
-
-    usage = "CONFIG_FILE"
-    summary = "Creates or update full text search index"
-    group_name = "RhodeCode"
-    takes_config_file = -1
-    parser = Command.standard_parser(verbose=True)
-
-    def command(self):
-        logging.config.fileConfig(self.path_to_ini_file)
-        from pylons import config
-        add_cache(config)
-        engine = engine_from_config(config, 'sqlalchemy.db1.')
-        init_model(engine)
-        index_location = config['index_dir']
-        repo_location = self.options.repo_location \
-            if self.options.repo_location else RepoModel().repos_path
-        repo_list = map(strip, self.options.repo_list.split(',')) \
-            if self.options.repo_list else None
-        repo_update_list = map(strip, self.options.repo_update_list.split(',')) \
-            if self.options.repo_update_list else None
-        load_rcextensions(config['here'])
-        #======================================================================
-        # WHOOSH DAEMON
-        #======================================================================
-        from rhodecode.lib.pidlock import LockHeld, DaemonLock
-        from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
-        try:
-            l = DaemonLock(file_=jn(dn(dn(index_location)), 'make_index.lock'))
-            WhooshIndexingDaemon(index_location=index_location,
-                                 repo_location=repo_location,
-                                 repo_list=repo_list,
-                                 repo_update_list=repo_update_list)\
-                .run(full_index=self.options.full_index)
-            l.release()
-        except LockHeld:
-            sys.exit(1)
-
-    def update_parser(self):
-        self.parser.add_option('--repo-location',
-                          action='store',
-                          dest='repo_location',
-                          help="Specifies repositories location to index OPTIONAL",
-                          )
-        self.parser.add_option('--index-only',
-                          action='store',
-                          dest='repo_list',
-                          help="Specifies a comma separated list of repositores "
-                                "to build index on. If not given all repositories "
-                                "are scanned for indexing. OPTIONAL",
-                          )
-        self.parser.add_option('--update-only',
-                          action='store',
-                          dest='repo_update_list',
-                          help="Specifies a comma separated list of repositores "
-                                "to re-build index on. OPTIONAL",
-                          )
-        self.parser.add_option('-f',
-                          action='store_true',
-                          dest='full_index',
-                          help="Specifies that index should be made full i.e"
-                                " destroy old and build from scratch",
-                          default=False)
-
-
 class WhooshResultWrapper(object):
     def __init__(self, search_type, searcher, matcher, highlight_items,
                  repo_location):
@@ -249,9 +166,6 @@
         Smart function that implements chunking the content
         but not overlap chunks so it doesn't highlight the same
         close occurrences twice.
-
-        :param matcher:
-        :param size:
         """
         memory = [(0, 0)]
         if self.matcher.supports('positions'):
@@ -269,7 +183,7 @@
     def highlight(self, content, top=5):
         if self.search_type not in ['content', 'message']:
             return ''
-        hl = highlight(
+        hl = whoosh_highlight(
             text=content,
             terms=self.highlight_items,
             analyzer=ANALYZER,
--- a/rhodecode/lib/indexers/daemon.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/indexers/daemon.py	Fri Jun 07 00:31:11 2013 +0200
@@ -41,6 +41,7 @@
 
 from rhodecode.config.conf import INDEX_EXTENSIONS
 from rhodecode.model.scm import ScmModel
+from rhodecode.model.db import Repository
 from rhodecode.lib.utils2 import safe_unicode, safe_str
 from rhodecode.lib.indexers import SCHEMA, IDX_NAME, CHGSETS_SCHEMA, \
     CHGSET_IDX_NAME
@@ -98,17 +99,29 @@
         self.initial = True
         if not os.path.isdir(self.index_location):
             os.makedirs(self.index_location)
-            log.info('Cannot run incremental index since it does not'
-                     ' yet exist running full build')
+            log.info('Cannot run incremental index since it does not '
+                     'yet exist running full build')
         elif not exists_in(self.index_location, IDX_NAME):
-            log.info('Running full index build as the file content'
-                     ' index does not exist')
+            log.info('Running full index build as the file content '
+                     'index does not exist')
         elif not exists_in(self.index_location, CHGSET_IDX_NAME):
-            log.info('Running full index build as the changeset'
-                     ' index does not exist')
+            log.info('Running full index build as the changeset '
+                     'index does not exist')
         else:
             self.initial = False
 
+    def _get_index_revision(self, repo):
+        db_repo = Repository.get_by_repo_name(repo.name)
+        landing_rev = 'tip'
+        if db_repo:
+            landing_rev = db_repo.landing_rev
+        return landing_rev
+
+    def _get_index_changeset(self, repo):
+        index_rev = self._get_index_revision(repo)
+        cs = repo.get_changeset(index_rev)
+        return cs
+
     def get_paths(self, repo):
         """
         recursive walk in root dir and return a set of all path in that dir
@@ -116,8 +129,8 @@
         """
         index_paths_ = set()
         try:
-            tip = repo.get_changeset('tip')
-            for _topnode, _dirs, files in tip.walk('/'):
+            cs = self._get_index_changeset(repo)
+            for _topnode, _dirs, files in cs.walk('/'):
                 for f in files:
                     index_paths_.add(jn(safe_str(repo.path), safe_str(f.path)))
 
@@ -127,8 +140,18 @@
         return index_paths_
 
     def get_node(self, repo, path):
-        n_path = path[len(repo.path) + 1:]
-        node = repo.get_changeset().get_node(n_path)
+        """
+        gets a filenode based on given full path.It operates on string for
+        hg git compatability.
+
+        :param repo: scm repo instance
+        :param path: full path including root location
+        :return: FileNode
+        """
+        root_path = safe_str(repo.path)+'/'
+        parts = safe_str(path).partition(root_path)
+        cs = self._get_index_changeset(repo)
+        node = cs.get_node(parts[-1])
         return node
 
     def get_node_mtime(self, node):
@@ -193,8 +216,10 @@
                   (repo_name, start_rev))
 
         indexed = 0
-        for cs in repo.get_changesets(start=start_rev):
-            log.debug('    >> %s' % cs)
+        cs_iter = repo.get_changesets(start=start_rev)
+        total = len(cs_iter)
+        for cs in cs_iter:
+            log.debug('    >> %s/%s' % (cs, total))
             writer.add_document(
                 raw_id=unicode(cs.raw_id),
                 owner=unicode(repo.contact),
@@ -222,7 +247,8 @@
         :param repo: instance of vcs repo
         """
         i_cnt = iwc_cnt = 0
-        log.debug('building index for [%s]' % repo.path)
+        log.debug('building index for %s @revision:%s' % (repo.path,
+                                                self._get_index_revision(repo)))
         for idx_path in self.get_paths(repo):
             i, iwc = self.add_doc(file_idx_writer, idx_path, repo, repo_name)
             i_cnt += i
@@ -276,7 +302,7 @@
                                                 repo_name, repo, start_id)
                         writer_is_dirty = True
                 log.debug('indexed %s changesets for repo %s' % (
-                             indexed_total, repo_name)
+                          indexed_total, repo_name)
                 )
             finally:
                 if writer_is_dirty:
@@ -284,7 +310,6 @@
                     writer.commit(merge=True)
                     log.debug('>>> FINISHED REBUILDING CHANGESET INDEX <<<')
                 else:
-                    writer.cancel
                     log.debug('>> NOTHING TO COMMIT TO CHANGESET INDEX<<')
 
     def update_file_index(self):
--- a/rhodecode/lib/middleware/pygrack.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/middleware/pygrack.py	Fri Jun 07 00:31:11 2013 +0200
@@ -7,7 +7,7 @@
 from webob import Request, Response, exc
 
 import rhodecode
-from rhodecode.lib import subprocessio
+from rhodecode.lib.vcs import subprocessio
 
 log = logging.getLogger(__name__)
 
@@ -59,7 +59,6 @@
         Small fix for repo_path
 
         :param path:
-        :type path:
         """
         return path.split(self.repo_name, 1)[-1].strip('/')
 
--- a/rhodecode/lib/middleware/simplegit.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/middleware/simplegit.py	Fri Jun 07 00:31:11 2013 +0200
@@ -55,8 +55,7 @@
         self.progress("counting objects: %d, done.\n" % len(objects_iter))
         dulserver.write_pack_objects(dulserver.ProtocolFile(None, write),
                                      objects_iter)
-        messages = []
-        messages.append('thank you for using rhodecode')
+        messages = ['thank you for using rhodecode']
 
         for msg in messages:
             self.progress(msg + "\n")
@@ -97,7 +96,7 @@
     path_info = environ['PATH_INFO']
     isgit_path = GIT_PROTO_PAT.match(path_info)
     log.debug('pathinfo: %s detected as GIT %s' % (
-        path_info, isgit_path != None)
+        path_info, isgit_path is not None)
     )
     return isgit_path
 
@@ -222,8 +221,7 @@
             # store the make_lock for later evaluation in hooks
             extras.update({'make_lock': make_lock,
                            'locked_by': locked_by})
-        # set the environ variables for this request
-        os.environ['RC_SCM_DATA'] = json.dumps(extras)
+
         fix_PATH()
         log.debug('HOOKS extras is %s' % extras)
         baseui = make_ui('db')
--- a/rhodecode/lib/middleware/simplehg.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/middleware/simplehg.py	Fri Jun 07 00:31:11 2013 +0200
@@ -28,8 +28,6 @@
 import logging
 import traceback
 
-from mercurial.error import RepoError
-from mercurial.hgweb import hgweb_mod
 
 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \
@@ -41,6 +39,7 @@
 from rhodecode.lib.auth import get_container_username
 from rhodecode.lib.utils import make_ui, is_valid_repo, ui_sections
 from rhodecode.lib.compat import json
+from rhodecode.lib.vcs.utils.hgcompat import RepoError, hgweb_mod
 from rhodecode.model.db import User
 from rhodecode.lib.exceptions import HTTPLockedRC
 
@@ -185,8 +184,6 @@
             extras.update({'make_lock': make_lock,
                            'locked_by': locked_by})
 
-        # set the environ variables for this request
-        os.environ['RC_SCM_DATA'] = json.dumps(extras)
         fix_PATH()
         log.debug('HOOKS extras is %s' % extras)
         baseui = make_ui('db')
--- a/rhodecode/lib/paster_commands/cache_keys.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/cache_keys.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,15 +29,14 @@
 import sys
 import logging
 
-from os.path import dirname as dn, join as jn
 from rhodecode.model.meta import Session
-#to get the rhodecode import
+from rhodecode.lib.utils import BasePasterCommand
+from rhodecode.model.db import CacheInvalidation
+
+# fix rhodecode import
+from os.path import dirname as dn
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
-from rhodecode.lib.utils import BasePasterCommand
-
-from rhodecode.model.db import CacheInvalidation
-
 
 log = logging.getLogger(__name__)
 
--- a/rhodecode/lib/paster_commands/cleanup.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/cleanup.py	Fri Jun 07 00:31:11 2013 +0200
@@ -32,15 +32,14 @@
 import logging
 import datetime
 
-from os.path import dirname as dn, join as jn
-#to get the rhodecode import
-rc_path = dn(dn(dn(os.path.realpath(__file__))))
-sys.path.append(rc_path)
 from rhodecode.lib.utils import BasePasterCommand, ask_ok, REMOVED_REPO_PAT
-
 from rhodecode.lib.utils2 import safe_str
 from rhodecode.model.db import RhodeCodeUi
 
+# fix rhodecode import
+from os.path import dirname as dn
+rc_path = dn(dn(dn(os.path.realpath(__file__))))
+sys.path.append(rc_path)
 
 log = logging.getLogger(__name__)
 
--- a/rhodecode/lib/paster_commands/ishell.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/ishell.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,12 +29,12 @@
 import sys
 import logging
 
-from os.path import dirname as dn, join as jn
-#to get the rhodecode import
+from rhodecode.lib.utils import BasePasterCommand
+
+# fix rhodecode import
+from os.path import dirname as dn
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
-from rhodecode.lib.utils import BasePasterCommand
-
 
 log = logging.getLogger(__name__)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/paster_commands/make_index.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.lib.paster_commands.make_index
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    make-index paster command for RhodeCode
+
+    :created_on: Aug 17, 2010
+    :author: marcink
+    :copyright: (C) 2010-2013 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from __future__ import with_statement
+
+import os
+import sys
+import logging
+
+from rhodecode.lib.utils import BasePasterCommand
+from string import strip
+from shutil import rmtree
+from rhodecode.model.repo import RepoModel
+from rhodecode.lib.utils import BasePasterCommand, load_rcextensions
+
+# fix rhodecode import
+from os.path import dirname as dn
+rc_path = dn(dn(dn(os.path.realpath(__file__))))
+sys.path.append(rc_path)
+
+
+class Command(BasePasterCommand):
+
+    max_args = 1
+    min_args = 1
+
+    usage = "CONFIG_FILE"
+    group_name = "RhodeCode"
+    takes_config_file = -1
+    parser = BasePasterCommand.standard_parser(verbose=True)
+    summary = "Creates or updates full text search index"
+
+    def command(self):
+        logging.config.fileConfig(self.path_to_ini_file)
+        #get SqlAlchemy session
+        self._init_session()
+        from pylons import config
+        index_location = config['index_dir']
+        load_rcextensions(config['here'])
+
+        repo_location = self.options.repo_location \
+            if self.options.repo_location else RepoModel().repos_path
+        repo_list = map(strip, self.options.repo_list.split(',')) \
+            if self.options.repo_list else None
+
+        repo_update_list = map(strip, self.options.repo_update_list.split(',')) \
+            if self.options.repo_update_list else None
+
+        #======================================================================
+        # WHOOSH DAEMON
+        #======================================================================
+        from rhodecode.lib.pidlock import LockHeld, DaemonLock
+        from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
+        try:
+            l = DaemonLock(file_=os.path.join(dn(dn(index_location)),
+                                              'make_index.lock'))
+            WhooshIndexingDaemon(index_location=index_location,
+                                 repo_location=repo_location,
+                                 repo_list=repo_list,
+                                 repo_update_list=repo_update_list)\
+                .run(full_index=self.options.full_index)
+            l.release()
+        except LockHeld:
+            sys.exit(1)
+
+    def update_parser(self):
+        self.parser.add_option('--repo-location',
+                          action='store',
+                          dest='repo_location',
+                          help="Specifies repositories location to index OPTIONAL",
+                          )
+        self.parser.add_option('--index-only',
+                          action='store',
+                          dest='repo_list',
+                          help="Specifies a comma separated list of repositores "
+                                "to build index on. If not given all repositories "
+                                "are scanned for indexing. OPTIONAL",
+                          )
+        self.parser.add_option('--update-only',
+                          action='store',
+                          dest='repo_update_list',
+                          help="Specifies a comma separated list of repositores "
+                                "to re-build index on. OPTIONAL",
+                          )
+        self.parser.add_option('-f',
+                          action='store_true',
+                          dest='full_index',
+                          help="Specifies that index should be made full i.e"
+                                " destroy old and build from scratch",
+                          default=False)
--- a/rhodecode/lib/paster_commands/make_rcextensions.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/make_rcextensions.py	Fri Jun 07 00:31:11 2013 +0200
@@ -26,17 +26,16 @@
 
 import os
 import sys
+import logging
 import pkg_resources
-import traceback
-import logging
+
+from rhodecode.lib.utils import BasePasterCommand, ask_ok
 
-from os.path import dirname as dn, join as jn
-#to get the rhodecode import
+# fix rhodecode import
+from os.path import dirname as dn
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
 
-from rhodecode.lib.utils import BasePasterCommand, ask_ok
-
 log = logging.getLogger(__name__)
 
 
@@ -65,9 +64,9 @@
 
         here = config['here']
         tmpl = pkg_resources.resource_string(
-            'rhodecode', jn('config', 'rcextensions', '__init__.py')
+            'rhodecode', os.path.join('config', 'rcextensions', '__init__.py')
         )
-        ext_file = jn(here, 'rcextensions', '__init__.py')
+        ext_file = os.path.join(here, 'rcextensions', '__init__.py')
         if os.path.exists(ext_file):
             msg = ('Extension file already exists, do you want '
                    'to overwrite it ? [y/n]')
--- a/rhodecode/lib/paster_commands/repo_scan.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/repo_scan.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,17 +29,13 @@
 import sys
 import logging
 
-from os.path import dirname as dn, join as jn
 from rhodecode.model.scm import ScmModel
-#to get the rhodecode import
+from rhodecode.lib.utils import BasePasterCommand, repo2db_mapper
+
+# fix rhodecode import
+from os.path import dirname as dn
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
-from rhodecode.lib.utils import BasePasterCommand, repo2db_mapper
-
-from rhodecode.model.db import Repository
-from rhodecode.model.repo import RepoModel
-from rhodecode.model.meta import Session
-
 
 log = logging.getLogger(__name__)
 
--- a/rhodecode/lib/paster_commands/setup_rhodecode.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/setup_rhodecode.py	Fri Jun 07 00:31:11 2013 +0200
@@ -4,8 +4,8 @@
 from paste.script.command import BadCommand
 from paste.deploy import appconfig
 
-from os.path import dirname as dn, join as jn
-#to get the rhodecode import
+# fix rhodecode import
+from os.path import dirname as dn
 rc_path = dn(dn(dn(os.path.realpath(__file__))))
 sys.path.append(rc_path)
 
--- a/rhodecode/lib/paster_commands/update_repoinfo.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/paster_commands/update_repoinfo.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,16 +29,16 @@
 import logging
 import string
 
-from os.path import dirname as dn, join as jn
-#to get the rhodecode import
-rc_path = dn(dn(dn(os.path.realpath(__file__))))
-sys.path.append(rc_path)
 from rhodecode.lib.utils import BasePasterCommand
-
 from rhodecode.model.db import Repository
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.meta import Session
 
+# fix rhodecode import
+from os.path import dirname as dn
+rc_path = dn(dn(dn(os.path.realpath(__file__))))
+sys.path.append(rc_path)
+
 log = logging.getLogger(__name__)
 
 
--- a/rhodecode/lib/rcmail/response.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/rcmail/response.py	Fri Jun 07 00:31:11 2013 +0200
@@ -87,7 +87,7 @@
         del self.headers[normalize_header(key)]
 
     def __nonzero__(self):
-        return self.body != None or len(self.headers) > 0 or len(self.parts) > 0
+        return self.body is not None or len(self.headers) > 0 or len(self.parts) > 0
 
     def keys(self):
         """Returns the sorted keys."""
@@ -388,7 +388,7 @@
         self.set_payload(encoded, charset=charset)
 
     def extract_payload(self, mail):
-        if mail.body == None:
+        if mail.body is None:
             return  # only None, '' is still ok
 
         ctype, ctype_params = mail.content_encoding['Content-Type']
--- a/rhodecode/lib/subprocessio.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,415 +0,0 @@
-'''
-Module provides a class allowing to wrap communication over subprocess.Popen
-input, output, error streams into a meaningfull, non-blocking, concurrent
-stream processor exposing the output data as an iterator fitting to be a
-return value passed by a WSGI applicaiton to a WSGI server per PEP 3333.
-
-Copyright (c) 2011  Daniel Dotsenko <dotsa@hotmail.com>
-
-This file is part of git_http_backend.py Project.
-
-git_http_backend.py Project is free software: you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public License as
-published by the Free Software Foundation, either version 2.1 of the License,
-or (at your option) any later version.
-
-git_http_backend.py Project is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with git_http_backend.py Project.
-If not, see <http://www.gnu.org/licenses/>.
-'''
-import os
-import subprocess
-from rhodecode.lib.compat import deque, Event, Thread, _bytes, _bytearray
-
-
-class StreamFeeder(Thread):
-    """
-    Normal writing into pipe-like is blocking once the buffer is filled.
-    This thread allows a thread to seep data from a file-like into a pipe
-    without blocking the main thread.
-    We close inpipe once the end of the source stream is reached.
-    """
-    def __init__(self, source):
-        super(StreamFeeder, self).__init__()
-        self.daemon = True
-        filelike = False
-        self.bytes = _bytes()
-        if type(source) in (type(''), _bytes, _bytearray):  # string-like
-            self.bytes = _bytes(source)
-        else:  # can be either file pointer or file-like
-            if type(source) in (int, long):  # file pointer it is
-                ## converting file descriptor (int) stdin into file-like
-                try:
-                    source = os.fdopen(source, 'rb', 16384)
-                except Exception:
-                    pass
-            # let's see if source is file-like by now
-            try:
-                filelike = source.read
-            except Exception:
-                pass
-        if not filelike and not self.bytes:
-            raise TypeError("StreamFeeder's source object must be a readable "
-                            "file-like, a file descriptor, or a string-like.")
-        self.source = source
-        self.readiface, self.writeiface = os.pipe()
-
-    def run(self):
-        t = self.writeiface
-        if self.bytes:
-            os.write(t, self.bytes)
-        else:
-            s = self.source
-            b = s.read(4096)
-            while b:
-                os.write(t, b)
-                b = s.read(4096)
-        os.close(t)
-
-    @property
-    def output(self):
-        return self.readiface
-
-
-class InputStreamChunker(Thread):
-    def __init__(self, source, target, buffer_size, chunk_size):
-
-        super(InputStreamChunker, self).__init__()
-
-        self.daemon = True  # die die die.
-
-        self.source = source
-        self.target = target
-        self.chunk_count_max = int(buffer_size / chunk_size) + 1
-        self.chunk_size = chunk_size
-
-        self.data_added = Event()
-        self.data_added.clear()
-
-        self.keep_reading = Event()
-        self.keep_reading.set()
-
-        self.EOF = Event()
-        self.EOF.clear()
-
-        self.go = Event()
-        self.go.set()
-
-    def stop(self):
-        self.go.clear()
-        self.EOF.set()
-        try:
-            # this is not proper, but is done to force the reader thread let
-            # go of the input because, if successful, .close() will send EOF
-            # down the pipe.
-            self.source.close()
-        except:
-            pass
-
-    def run(self):
-        s = self.source
-        t = self.target
-        cs = self.chunk_size
-        ccm = self.chunk_count_max
-        kr = self.keep_reading
-        da = self.data_added
-        go = self.go
-
-        try:
-            b = s.read(cs)
-        except ValueError:
-            b = ''
-
-        while b and go.is_set():
-            if len(t) > ccm:
-                kr.clear()
-                kr.wait(2)
-#                # this only works on 2.7.x and up
-#                if not kr.wait(10):
-#                    raise Exception("Timed out while waiting for input to be read.")
-                # instead we'll use this
-                if len(t) > ccm + 3:
-                    raise IOError("Timed out while waiting for input from subprocess.")
-            t.append(b)
-            da.set()
-            b = s.read(cs)
-        self.EOF.set()
-        da.set()  # for cases when done but there was no input.
-
-
-class BufferedGenerator():
-    '''
-    Class behaves as a non-blocking, buffered pipe reader.
-    Reads chunks of data (through a thread)
-    from a blocking pipe, and attaches these to an array (Deque) of chunks.
-    Reading is halted in the thread when max chunks is internally buffered.
-    The .next() may operate in blocking or non-blocking fashion by yielding
-    '' if no data is ready
-    to be sent or by not returning until there is some data to send
-    When we get EOF from underlying source pipe we raise the marker to raise
-    StopIteration after the last chunk of data is yielded.
-    '''
-
-    def __init__(self, source, buffer_size=65536, chunk_size=4096,
-                 starting_values=[], bottomless=False):
-
-        if bottomless:
-            maxlen = int(buffer_size / chunk_size)
-        else:
-            maxlen = None
-
-        self.data = deque(starting_values, maxlen)
-
-        self.worker = InputStreamChunker(source, self.data, buffer_size,
-                                         chunk_size)
-        if starting_values:
-            self.worker.data_added.set()
-        self.worker.start()
-
-    ####################
-    # Generator's methods
-    ####################
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        while not len(self.data) and not self.worker.EOF.is_set():
-            self.worker.data_added.clear()
-            self.worker.data_added.wait(0.2)
-        if len(self.data):
-            self.worker.keep_reading.set()
-            return _bytes(self.data.popleft())
-        elif self.worker.EOF.is_set():
-            raise StopIteration
-
-    def throw(self, type, value=None, traceback=None):
-        if not self.worker.EOF.is_set():
-            raise type(value)
-
-    def start(self):
-        self.worker.start()
-
-    def stop(self):
-        self.worker.stop()
-
-    def close(self):
-        try:
-            self.worker.stop()
-            self.throw(GeneratorExit)
-        except (GeneratorExit, StopIteration):
-            pass
-
-    def __del__(self):
-        self.close()
-
-    ####################
-    # Threaded reader's infrastructure.
-    ####################
-    @property
-    def input(self):
-        return self.worker.w
-
-    @property
-    def data_added_event(self):
-        return self.worker.data_added
-
-    @property
-    def data_added(self):
-        return self.worker.data_added.is_set()
-
-    @property
-    def reading_paused(self):
-        return not self.worker.keep_reading.is_set()
-
-    @property
-    def done_reading_event(self):
-        '''
-        Done_reding does not mean that the iterator's buffer is empty.
-        Iterator might have done reading from underlying source, but the read
-        chunks might still be available for serving through .next() method.
-
-        @return An Event class instance.
-        '''
-        return self.worker.EOF
-
-    @property
-    def done_reading(self):
-        '''
-        Done_reding does not mean that the iterator's buffer is empty.
-        Iterator might have done reading from underlying source, but the read
-        chunks might still be available for serving through .next() method.
-
-        @return An Bool value.
-        '''
-        return self.worker.EOF.is_set()
-
-    @property
-    def length(self):
-        '''
-        returns int.
-
-        This is the lenght of the que of chunks, not the length of
-        the combined contents in those chunks.
-
-        __len__() cannot be meaningfully implemented because this
-        reader is just flying throuh a bottomless pit content and
-        can only know the lenght of what it already saw.
-
-        If __len__() on WSGI server per PEP 3333 returns a value,
-        the responce's length will be set to that. In order not to
-        confuse WSGI PEP3333 servers, we will not implement __len__
-        at all.
-        '''
-        return len(self.data)
-
-    def prepend(self, x):
-        self.data.appendleft(x)
-
-    def append(self, x):
-        self.data.append(x)
-
-    def extend(self, o):
-        self.data.extend(o)
-
-    def __getitem__(self, i):
-        return self.data[i]
-
-
-class SubprocessIOChunker(object):
-    '''
-    Processor class wrapping handling of subprocess IO.
-
-    In a way, this is a "communicate()" replacement with a twist.
-
-    - We are multithreaded. Writing in and reading out, err are all sep threads.
-    - We support concurrent (in and out) stream processing.
-    - The output is not a stream. It's a queue of read string (bytes, not unicode)
-      chunks. The object behaves as an iterable. You can "for chunk in obj:" us.
-    - We are non-blocking in more respects than communicate()
-      (reading from subprocess out pauses when internal buffer is full, but
-       does not block the parent calling code. On the flip side, reading from
-       slow-yielding subprocess may block the iteration until data shows up. This
-       does not block the parallel inpipe reading occurring parallel thread.)
-
-    The purpose of the object is to allow us to wrap subprocess interactions into
-    and interable that can be passed to a WSGI server as the application's return
-    value. Because of stream-processing-ability, WSGI does not have to read ALL
-    of the subprocess's output and buffer it, before handing it to WSGI server for
-    HTTP response. Instead, the class initializer reads just a bit of the stream
-    to figure out if error ocurred or likely to occur and if not, just hands the
-    further iteration over subprocess output to the server for completion of HTTP
-    response.
-
-    The real or perceived subprocess error is trapped and raised as one of
-    EnvironmentError family of exceptions
-
-    Example usage:
-    #    try:
-    #        answer = SubprocessIOChunker(
-    #            cmd,
-    #            input,
-    #            buffer_size = 65536,
-    #            chunk_size = 4096
-    #            )
-    #    except (EnvironmentError) as e:
-    #        print str(e)
-    #        raise e
-    #
-    #    return answer
-
-
-    '''
-    def __init__(self, cmd, inputstream=None, buffer_size=65536,
-                 chunk_size=4096, starting_values=[], **kwargs):
-        '''
-        Initializes SubprocessIOChunker
-
-        :param cmd: A Subprocess.Popen style "cmd". Can be string or array of strings
-        :param inputstream: (Default: None) A file-like, string, or file pointer.
-        :param buffer_size: (Default: 65536) A size of total buffer per stream in bytes.
-        :param chunk_size: (Default: 4096) A max size of a chunk. Actual chunk may be smaller.
-        :param starting_values: (Default: []) An array of strings to put in front of output que.
-        '''
-
-        if inputstream:
-            input_streamer = StreamFeeder(inputstream)
-            input_streamer.start()
-            inputstream = input_streamer.output
-
-        if isinstance(cmd, (list, tuple)):
-            cmd = ' '.join(cmd)
-
-        _shell = kwargs.get('shell') or True
-        kwargs['shell'] = _shell
-        _p = subprocess.Popen(cmd,
-            bufsize=-1,
-            stdin=inputstream,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE,
-            **kwargs
-            )
-
-        bg_out = BufferedGenerator(_p.stdout, buffer_size, chunk_size, starting_values)
-        bg_err = BufferedGenerator(_p.stderr, 16000, 1, bottomless=True)
-
-        while not bg_out.done_reading and not bg_out.reading_paused and not bg_err.length:
-            # doing this until we reach either end of file, or end of buffer.
-            bg_out.data_added_event.wait(1)
-            bg_out.data_added_event.clear()
-
-        # at this point it's still ambiguous if we are done reading or just full buffer.
-        # Either way, if error (returned by ended process, or implied based on
-        # presence of stuff in stderr output) we error out.
-        # Else, we are happy.
-        _returncode = _p.poll()
-        if _returncode or (_returncode == None and bg_err.length):
-            try:
-                _p.terminate()
-            except:
-                pass
-            bg_out.stop()
-            bg_err.stop()
-            err = '%s' % ''.join(bg_err)
-            if err:
-                raise EnvironmentError("Subprocess exited due to an error:\n" + err)
-            raise EnvironmentError("Subprocess exited with non 0 ret code:%s" % _returncode)
-
-        self.process = _p
-        self.output = bg_out
-        self.error = bg_err
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        if self.process.poll():
-            err = '%s' % ''.join(self.error)
-            raise EnvironmentError("Subprocess exited due to an error:\n" + err)
-        return self.output.next()
-
-    def throw(self, type, value=None, traceback=None):
-        if self.output.length or not self.output.done_reading:
-            raise type(value)
-
-    def close(self):
-        try:
-            self.process.terminate()
-        except:
-            pass
-        try:
-            self.output.close()
-        except:
-            pass
-        try:
-            self.error.close()
-        except:
-            pass
-
-    def __del__(self):
-        self.close()
--- a/rhodecode/lib/utils.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/utils.py	Fri Jun 07 00:31:11 2013 +0200
@@ -39,13 +39,12 @@
 
 from paste.script.command import Command, BadCommand
 
-from mercurial import ui, config
-
 from webhelpers.text import collapse, remove_formatting, strip_tags
 
 from rhodecode.lib.vcs import get_backend
 from rhodecode.lib.vcs.backends.base import BaseChangeset
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
+from rhodecode.lib.vcs.utils.hgcompat import ui, config
 from rhodecode.lib.vcs.utils.helpers import get_scm
 from rhodecode.lib.vcs.exceptions import VCSError
 
@@ -53,11 +52,12 @@
 
 from rhodecode.model import meta
 from rhodecode.model.db import Repository, User, RhodeCodeUi, \
-    UserLog, RepoGroup, RhodeCodeSetting, CacheInvalidation
+    UserLog, RepoGroup, RhodeCodeSetting, CacheInvalidation, UserGroup
 from rhodecode.model.meta import Session
 from rhodecode.model.repos_group import ReposGroupModel
 from rhodecode.lib.utils2 import safe_str, safe_unicode
 from rhodecode.lib.vcs.utils.fakemod import create_module
+from rhodecode.model.users_group import UserGroupModel
 
 log = logging.getLogger(__name__)
 
@@ -100,6 +100,9 @@
     return slug
 
 
+#==============================================================================
+# PERM DECORATOR HELPERS FOR EXTRACTING NAMES FOR PERM CHECKS
+#==============================================================================
 def get_repo_slug(request):
     _repo = request.environ['pylons.routes_dict'].get('repo_name')
     if _repo:
@@ -114,6 +117,20 @@
     return _group
 
 
+def get_user_group_slug(request):
+    _group = request.environ['pylons.routes_dict'].get('id')
+    try:
+        _group = UserGroup.get(_group)
+        if _group:
+            _group = _group.users_group_name
+    except Exception:
+        log.debug(traceback.format_exc())
+        #catch all failures here
+        pass
+
+    return _group
+
+
 def action_logger(user, action, repo, ipaddr='', sa=None, commit=False):
     """
     Action logger for various actions made by users
@@ -356,17 +373,24 @@
         config[k] = v
 
 
-def invalidate_cache(cache_key, *args):
+def set_vcs_config(config):
     """
-    Puts cache invalidation task into db for
-    further global cache invalidation
-    """
+    Patch VCS config with some RhodeCode specific stuff
 
-    from rhodecode.model.scm import ScmModel
+    :param config: rhodecode.CONFIG
+    """
+    import rhodecode
+    from rhodecode.lib.vcs import conf
+    from rhodecode.lib.utils2 import aslist
+    conf.settings.BACKENDS = {
+        'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
+        'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
+    }
 
-    if cache_key.startswith('get_repo_cached_'):
-        name = cache_key.split('get_repo_cached_')[-1]
-        ScmModel().mark_for_invalidation(name)
+    conf.settings.GIT_EXECUTABLE_PATH = config.get('git_path', 'git')
+    conf.settings.GIT_REV_FILTER = config.get('git_rev_filter', '--all').strip()
+    conf.settings.DEFAULT_ENCODINGS = aslist(config.get('default_encoding',
+                                                        'utf8'), sep=',')
 
 
 def map_groups(path):
@@ -385,6 +409,7 @@
     # last element is repo in nested groups structure
     groups = groups[:-1]
     rgm = ReposGroupModel(sa)
+    owner = User.get_first_admin()
     for lvl, group_name in enumerate(groups):
         group_name = '/'.join(groups[:lvl] + [group_name])
         group = RepoGroup.get_by_group_name(group_name)
@@ -395,13 +420,16 @@
             break
 
         if group is None:
-            log.debug('creating group level: %s group_name: %s' % (lvl,
-                                                                   group_name))
+            log.debug('creating group level: %s group_name: %s'
+                      % (lvl, group_name))
             group = RepoGroup(group_name, parent)
             group.group_description = desc
+            group.user = owner
             sa.add(group)
-            rgm._create_default_perms(group)
+            perm_obj = rgm._create_default_perms(group)
+            sa.add(perm_obj)
             sa.flush()
+
         parent = group
     return group
 
@@ -422,9 +450,7 @@
     from rhodecode.model.scm import ScmModel
     sa = meta.Session()
     rm = RepoModel()
-    user = sa.query(User).filter(User.admin == True).first()
-    if user is None:
-        raise Exception('Missing administrative account!')
+    user = User.get_first_admin()
     added = []
 
     ##creation defaults
@@ -465,11 +491,6 @@
         elif install_git_hook:
             if db_repo.repo_type == 'git':
                 ScmModel().install_git_hook(db_repo.scm_instance)
-        # during starting install all cache keys for all repositories in the
-        # system, this will register all repos and multiple instances
-        cache_key = CacheInvalidation._get_cache_key(name)
-        log.debug("Creating invalidation cache key for %s: %s", name, cache_key)
-        CacheInvalidation.invalidate(name)
 
     sa.commit()
     removed = []
@@ -480,9 +501,9 @@
                 log.debug("Removing non-existing repository found in db `%s`" %
                           repo.repo_name)
                 try:
-                    sa.delete(repo)
+                    removed.append(repo.repo_name)
+                    RepoModel(sa).delete(repo, forks='detach', fs_remove=False)
                     sa.commit()
-                    removed.append(repo.repo_name)
                 except Exception:
                     #don't hold further removals on error
                     log.error(traceback.format_exc())
@@ -533,7 +554,7 @@
 
         #OVERRIDE OUR EXTENSIONS FROM RC-EXTENSIONS (if present)
 
-        if getattr(EXT, 'INDEX_EXTENSIONS', []) != []:
+        if getattr(EXT, 'INDEX_EXTENSIONS', []):
             log.debug('settings custom INDEX_EXTENSIONS')
             conf.INDEX_EXTENSIONS = getattr(EXT, 'INDEX_EXTENSIONS', [])
 
@@ -635,12 +656,12 @@
 
     #CREATE DEFAULT TEST REPOS
     cur_dir = dn(dn(abspath(__file__)))
-    tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test_hg.tar.gz"))
+    tar = tarfile.open(jn(cur_dir, 'tests', 'fixtures', "vcs_test_hg.tar.gz"))
     tar.extractall(jn(TESTS_TMP_PATH, HG_REPO))
     tar.close()
 
     cur_dir = dn(dn(abspath(__file__)))
-    tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test_git.tar.gz"))
+    tar = tarfile.open(jn(cur_dir, 'tests', 'fixtures', "vcs_test_git.tar.gz"))
     tar.extractall(jn(TESTS_TMP_PATH, GIT_REPO))
     tar.close()
 
@@ -737,6 +758,7 @@
     """
     from rhodecode import BACKENDS
     from rhodecode.lib.vcs.backends.git.repository import GitRepository
+    from rhodecode.lib.vcs.conf import settings
     from distutils.version import StrictVersion
 
     stdout, stderr = GitRepository._run_git_command('--version', _bare=True,
@@ -758,7 +780,8 @@
         to_old_git = True
 
     if 'git' in BACKENDS:
-        log.debug('GIT version detected: %s' % stdout)
+        log.debug('GIT executable: "%s" version detected: %s'
+                  % (settings.GIT_EXECUTABLE_PATH, stdout))
         if stderr:
             log.warning('Unable to detect git version, org error was: %r' % stderr)
         elif to_old_git:
@@ -778,7 +801,7 @@
 
     """
     from pylons.decorators.util import get_pylons
-    from rhodecode.lib.ext_json import json
+    from rhodecode.lib.compat import json
     pylons = get_pylons(args)
     pylons.response.headers['Content-Type'] = 'application/json; charset=utf-8'
     data = func(*args, **kwargs)
--- a/rhodecode/lib/utils2.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/utils2.py	Fri Jun 07 00:31:11 2013 +0200
@@ -27,6 +27,7 @@
 import re
 import sys
 import time
+import uuid
 import datetime
 import traceback
 import webob
@@ -280,8 +281,6 @@
     except (ImportError, UnicodeEncodeError):
         return unicode_.encode(to_encoding[0], 'replace')
 
-    return safe_str
-
 
 def remove_suffix(s, suffix):
     if s.endswith(suffix):
@@ -607,3 +606,39 @@
 
 def _set_extras(extras):
     os.environ['RC_SCM_DATA'] = json.dumps(extras)
+
+
+def unique_id(hexlen=32):
+    alphabet = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz"
+    return suuid(truncate_to=hexlen, alphabet=alphabet)
+
+
+def suuid(url=None, truncate_to=22, alphabet=None):
+    """
+    Generate and return a short URL safe UUID.
+
+    If the url parameter is provided, set the namespace to the provided
+    URL and generate a UUID.
+
+    :param url to get the uuid for
+    :truncate_to: truncate the basic 22 UUID to shorter version
+
+    The IDs won't be universally unique any longer, but the probability of
+    a collision will still be very low.
+    """
+    # Define our alphabet.
+    _ALPHABET = alphabet or "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"
+
+    # If no URL is given, generate a random UUID.
+    if url is None:
+        unique_id = uuid.uuid4().int
+    else:
+        unique_id = uuid.uuid3(uuid.NAMESPACE_URL, url).int
+
+    alphabet_length = len(_ALPHABET)
+    output = []
+    while unique_id > 0:
+        digit = unique_id % alphabet_length
+        output.append(_ALPHABET[digit])
+        unique_id = int(unique_id / alphabet_length)
+    return "".join(output)[:truncate_to]
--- a/rhodecode/lib/vcs/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -10,13 +10,14 @@
     :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak.
 """
 
-VERSION = (0, 3, 0, 'dev')
+VERSION = (0, 5, 0, 'dev')
 
 __version__ = '.'.join((str(each) for each in VERSION[:4]))
 
 __all__ = [
     'get_version', 'get_repo', 'get_backend',
-    'VCSError', 'RepositoryError', 'ChangesetError']
+    'VCSError', 'RepositoryError', 'ChangesetError'
+]
 
 import sys
 from rhodecode.lib.vcs.backends import get_repo, get_backend
@@ -29,6 +30,7 @@
     """
     return '.'.join((str(each) for each in VERSION[:3]))
 
+
 def main(argv=None):
     if argv is None:
         argv = sys.argv
--- a/rhodecode/lib/vcs/backends/base.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/base.py	Fri Jun 07 00:31:11 2013 +0200
@@ -10,16 +10,18 @@
 """
 
 import datetime
-from itertools import chain
+import itertools
+
 from rhodecode.lib.vcs.utils import author_name, author_email
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
 from rhodecode.lib.vcs.utils.helpers import get_dict_for_attrs
 from rhodecode.lib.vcs.conf import settings
 
-from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \
-    NodeAlreadyAddedError, NodeAlreadyChangedError, NodeAlreadyExistsError, \
-    NodeAlreadyRemovedError, NodeDoesNotExistError, NodeNotChangedError, \
-    RepositoryError
+from rhodecode.lib.vcs.exceptions import (
+    ChangesetError, EmptyRepositoryError, NodeAlreadyAddedError,
+    NodeAlreadyChangedError, NodeAlreadyExistsError, NodeAlreadyRemovedError,
+    NodeDoesNotExistError, NodeNotChangedError, RepositoryError
+)
 
 
 class BaseRepository(object):
@@ -80,6 +82,13 @@
     def __len__(self):
         return self.count()
 
+    def __eq__(self, other):
+        same_instance = isinstance(other, self.__class__)
+        return same_instance and getattr(other, 'path', None) == self.path
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
     @LazyProperty
     def alias(self):
         for k, v in settings.BACKENDS.items():
@@ -844,7 +853,7 @@
         Returns generator of paths from nodes marked as added, changed or
         removed.
         """
-        for node in chain(self.added, self.changed, self.removed):
+        for node in itertools.chain(self.added, self.changed, self.removed):
             yield node.path
 
     def get_paths(self):
@@ -995,3 +1004,27 @@
 
     def get_file_size(self, path):
         return 0
+
+
+class CollectionGenerator(object):
+
+    def __init__(self, repo, revs):
+        self.repo = repo
+        self.revs = revs
+
+    def __len__(self):
+        return len(self.revs)
+
+    def __iter__(self):
+        for rev in self.revs:
+            yield self.repo.get_changeset(rev)
+
+    def __getslice__(self, i, j):
+        """
+        Returns a iterator of sliced repository
+        """
+        sliced_revs = self.revs[i:j]
+        return CollectionGenerator(self.repo, sliced_revs)
+
+    def __repr__(self):
+        return 'CollectionGenerator<%s>' % (len(self))
--- a/rhodecode/lib/vcs/backends/git/changeset.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/changeset.py	Fri Jun 07 00:31:11 2013 +0200
@@ -2,22 +2,21 @@
 from itertools import chain
 from dulwich import objects
 from subprocess import Popen, PIPE
-import rhodecode
+
 from rhodecode.lib.vcs.conf import settings
-from rhodecode.lib.vcs.exceptions import RepositoryError
-from rhodecode.lib.vcs.exceptions import ChangesetError
-from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError
-from rhodecode.lib.vcs.exceptions import VCSError
-from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
-from rhodecode.lib.vcs.exceptions import ImproperArchiveTypeError
 from rhodecode.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
-from rhodecode.lib.vcs.nodes import FileNode, DirNode, NodeKind, RootNode, \
-    RemovedFileNode, SubModuleNode, ChangedFileNodesGenerator,\
-    AddedFileNodesGenerator, RemovedFileNodesGenerator
-from rhodecode.lib.vcs.utils import safe_unicode
-from rhodecode.lib.vcs.utils import date_fromtimestamp
+from rhodecode.lib.vcs.exceptions import (
+    RepositoryError, ChangesetError, NodeDoesNotExistError, VCSError,
+    ChangesetDoesNotExistError, ImproperArchiveTypeError
+)
+from rhodecode.lib.vcs.nodes import (
+    FileNode, DirNode, NodeKind, RootNode, RemovedFileNode, SubModuleNode,
+    ChangedFileNodesGenerator, AddedFileNodesGenerator, RemovedFileNodesGenerator
+)
+from rhodecode.lib.vcs.utils import (
+    safe_unicode, safe_str, safe_int, date_fromtimestamp
+)
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
-from rhodecode.lib.utils2 import safe_int, safe_str
 
 
 class GitChangeset(BaseChangeset):
@@ -30,7 +29,7 @@
         self.repository = repository
 
         try:
-            commit = self.repository._repo.get_object(revision)
+            commit = self.repository._repo[revision]
             if isinstance(commit, objects.Tag):
                 revision = commit.object[1]
                 commit = self.repository._repo.get_object(commit.object[1])
@@ -40,7 +39,6 @@
         self.id = self.raw_id
         self.short_id = self.raw_id[:12]
         self._commit = commit
-
         self._tree_id = commit.tree
         self._committer_property = 'committer'
         self._author_property = 'author'
@@ -48,12 +46,14 @@
         self._date_tz_property = 'commit_timezone'
         self.revision = repository.revisions.index(revision)
 
-        self.message = safe_unicode(commit.message)
-
         self.nodes = {}
         self._paths = {}
 
     @LazyProperty
+    def message(self):
+        return safe_unicode(self._commit.message)
+
+    @LazyProperty
     def committer(self):
         return safe_unicode(getattr(self._commit, self._committer_property))
 
@@ -104,7 +104,7 @@
         return path
 
     def _get_id_for_path(self, path):
-
+        path = safe_str(path)
         # FIXME: Please, spare a couple of minutes and make those codes cleaner;
         if not path in self._paths:
             path = path.strip('/')
@@ -154,7 +154,7 @@
             if not path in self._paths:
                 raise NodeDoesNotExistError("There is no file nor directory "
                     "at the given path '%s' at revision %s"
-                    % (path, self.short_id))
+                    % (path, safe_str(self.short_id)))
         return self._paths[path]
 
     def _get_kind(self, path):
@@ -187,8 +187,7 @@
         """
         Returns list of children changesets.
         """
-        rev_filter = _git_path = rhodecode.CONFIG.get('git_rev_filter',
-                                              '--all').strip()
+        rev_filter = _git_path = settings.GIT_REV_FILTER
         so, se = self.repository.run_git_command(
             "rev-list %s --children | grep '^%s'" % (rev_filter, self.raw_id)
         )
@@ -255,6 +254,7 @@
         Returns stat mode of the file at the given ``path``.
         """
         # ensure path is traversed
+        path = safe_str(path)
         self._get_id_for_path(path)
         return self._stat_modes[path]
 
@@ -373,7 +373,7 @@
             frmt = 'zip'
         else:
             frmt = 'tar'
-        _git_path = rhodecode.CONFIG.get('git_path', 'git')
+        _git_path = settings.GIT_EXECUTABLE_PATH
         cmd = '%s archive --format=%s --prefix=%s/ %s' % (_git_path,
                                                 frmt, prefix, self.raw_id)
         if kind == 'tgz':
@@ -472,8 +472,8 @@
         """
         Get's a fast accessible file changes for given changeset
         """
-        a, m, d = self._changes_cache
-        return list(a.union(m).union(d))
+        added, modified, deleted = self._changes_cache
+        return list(added.union(modified).union(deleted))
 
     @LazyProperty
     def _diff_name_status(self):
@@ -516,11 +516,11 @@
 
         :param status: one of: *added*, *modified* or *deleted*
         """
-        a, m, d = self._changes_cache
+        added, modified, deleted = self._changes_cache
         return sorted({
-            'added': list(a),
-            'modified': list(m),
-            'deleted': list(d)}[status]
+            'added': list(added),
+            'modified': list(modified),
+            'deleted': list(deleted)}[status]
         )
 
     @LazyProperty
--- a/rhodecode/lib/vcs/backends/git/config.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/config.py	Fri Jun 07 00:31:11 2013 +0200
@@ -318,9 +318,7 @@
         specified), the users' home directory and the system
         configuration.
         """
-        paths = []
-        paths.append(os.path.expanduser("~/.gitconfig"))
-        paths.append("/etc/gitconfig")
+        paths = [os.path.expanduser("~/.gitconfig"), "/etc/gitconfig"]
         backends = []
         for path in paths:
             try:
--- a/rhodecode/lib/vcs/backends/git/inmemory.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/inmemory.py	Fri Jun 07 00:31:11 2013 +0200
@@ -46,7 +46,7 @@
         for node in self.added + self.changed:
             # Compute subdirs if needed
             dirpath, nodename = posixpath.split(node.path)
-            dirnames = dirpath and dirpath.split('/') or []
+            dirnames = map(safe_str, dirpath and dirpath.split('/') or [])
             parent = commit_tree
             ancestors = [('', parent)]
 
@@ -150,7 +150,6 @@
 
         ref = 'refs/heads/%s' % branch
         repo.refs[ref] = commit.id
-        repo.refs.set_symbolic_ref('HEAD', ref)
 
         # Update vcs repository object & recreate dulwich repo
         self.repository.revisions.append(commit.id)
--- a/rhodecode/lib/vcs/backends/git/repository.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/repository.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,9 +1,9 @@
 # -*- coding: utf-8 -*-
 """
-    vcs.backends.git
-    ~~~~~~~~~~~~~~~~
+    vcs.backends.git.repository
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    Git backend implementation.
+    Git repository implementation.
 
     :created_on: Apr 8, 2010
     :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak.
@@ -12,34 +12,38 @@
 import os
 import re
 import time
-import posixpath
-import logging
-import traceback
 import urllib
 import urllib2
-from dulwich.repo import Repo, NotGitRepository
+import logging
+import posixpath
+import string
+
 from dulwich.objects import Tag
-from string import Template
+from dulwich.repo import Repo, NotGitRepository
+
+from rhodecode.lib.vcs import subprocessio
+from rhodecode.lib.vcs.backends.base import BaseRepository, CollectionGenerator
+from rhodecode.lib.vcs.conf import settings
 
-import rhodecode
-from rhodecode.lib.vcs.backends.base import BaseRepository
-from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError
-from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
-from rhodecode.lib.vcs.exceptions import EmptyRepositoryError
-from rhodecode.lib.vcs.exceptions import RepositoryError
-from rhodecode.lib.vcs.exceptions import TagAlreadyExistError
-from rhodecode.lib.vcs.exceptions import TagDoesNotExistError
+from rhodecode.lib.vcs.exceptions import (
+    BranchDoesNotExistError, ChangesetDoesNotExistError, EmptyRepositoryError,
+    RepositoryError, TagAlreadyExistError, TagDoesNotExistError
+)
 from rhodecode.lib.vcs.utils import safe_unicode, makedate, date_fromtimestamp
-from rhodecode.lib.vcs.utils.lazy import LazyProperty, ThreadLocalLazyProperty
+from rhodecode.lib.vcs.utils.lazy import LazyProperty
 from rhodecode.lib.vcs.utils.ordered_dict import OrderedDict
-from rhodecode.lib.vcs.utils.paths import abspath
-from rhodecode.lib.vcs.utils.paths import get_user_home
+from rhodecode.lib.vcs.utils.paths import abspath, get_user_home
+
+from rhodecode.lib.vcs.utils.hgcompat import (
+    hg_url, httpbasicauthhandler, httpdigestauthhandler
+)
+
+from .changeset import GitChangeset
+from .config import ConfigFile
+from .inmemory import GitInMemoryChangeset
 from .workdir import GitWorkdir
-from .changeset import GitChangeset
-from .inmemory import GitInMemoryChangeset
-from .config import ConfigFile
-from rhodecode.lib import subprocessio
 
+SHA_PATTERN = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$')
 
 log = logging.getLogger(__name__)
 
@@ -58,11 +62,13 @@
         repo = self._get_repo(create, src_url, update_after_clone, bare)
         self.bare = repo.bare
 
-        self._config_files = [
-            bare and abspath(self.path, 'config')
-                     or abspath(self.path, '.git', 'config'),
-            abspath(get_user_home(), '.gitconfig'),
-        ]
+    @property
+    def _config_files(self):
+        return [
+            self.bare and abspath(self.path, 'config')
+                      or abspath(self.path, '.git', 'config'),
+             abspath(get_user_home(), '.gitconfig'),
+         ]
 
     @property
     def _repo(self):
@@ -75,6 +81,18 @@
         except KeyError:
             return None
 
+    @property
+    def _empty(self):
+        """
+        Checks if repository is empty ie. without any changesets
+        """
+
+        try:
+            self.revisions[0]
+        except (KeyError, IndexError):
+            return True
+        return False
+
     @LazyProperty
     def revisions(self):
         """
@@ -115,14 +133,15 @@
             del gitenv['GIT_DIR']
         gitenv['GIT_CONFIG_NOGLOBAL'] = '1'
 
-        _git_path = rhodecode.CONFIG.get('git_path', 'git')
+        _git_path = settings.GIT_EXECUTABLE_PATH
         cmd = [_git_path] + _copts + cmd
         if _str_cmd:
             cmd = ' '.join(cmd)
+
         try:
             _opts = dict(
                 env=gitenv,
-                shell=False,
+                shell=True,
             )
             _opts.update(opts)
             p = subprocessio.SubprocessIOChunker(cmd, **_opts)
@@ -153,11 +172,6 @@
 
         On failures it'll raise urllib2.HTTPError
         """
-        from mercurial.util import url as Url
-
-        # those authnadlers are patched for python 2.6.5 bug an
-        # infinit looping when given invalid resources
-        from mercurial.url import httpbasicauthhandler, httpdigestauthhandler
 
         # check first if it's not an local url
         if os.path.isdir(url) or url.startswith('file:'):
@@ -167,7 +181,7 @@
             url = url[url.find('+') + 1:]
 
         handlers = []
-        test_uri, authinfo = Url(url).authinfo()
+        test_uri, authinfo = hg_url(url).authinfo()
         if not test_uri.endswith('info/refs'):
             test_uri = test_uri.rstrip('/') + '/info/refs'
         if authinfo:
@@ -224,8 +238,8 @@
             self._repo.head()
         except KeyError:
             return []
-        rev_filter = _git_path = rhodecode.CONFIG.get('git_rev_filter',
-                                                      '--all').strip()
+
+        rev_filter = _git_path = settings.GIT_REV_FILTER
         cmd = 'rev-list %s --reverse --date-order' % (rev_filter)
         try:
             so, se = self.run_git_command(cmd)
@@ -245,17 +259,17 @@
         For git backend we always return integer here. This way we ensure
         that changset's revision attribute would become integer.
         """
-        pattern = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$')
-        is_bstr = lambda o: isinstance(o, (str, unicode))
+
         is_null = lambda o: len(o) == revision.count('0')
 
-        if len(self.revisions) == 0:
+        if self._empty:
             raise EmptyRepositoryError("There are no changesets yet")
 
         if revision in (None, '', 'tip', 'HEAD', 'head', -1):
-            revision = self.revisions[-1]
+            return self.revisions[-1]
 
-        if ((is_bstr(revision) and revision.isdigit() and len(revision) < 12)
+        is_bstr = isinstance(revision, (str, unicode))
+        if ((is_bstr and revision.isdigit() and len(revision) < 12)
             or isinstance(revision, int) or is_null(revision)):
             try:
                 revision = self.revisions[int(revision)]
@@ -263,23 +277,23 @@
                 raise ChangesetDoesNotExistError("Revision %s does not exist "
                     "for this repository" % (revision))
 
-        elif is_bstr(revision):
+        elif is_bstr:
             # get by branch/tag name
             _ref_revision = self._parsed_refs.get(revision)
-            _tags_shas = self.tags.values()
             if _ref_revision:  # and _ref_revision[1] in ['H', 'RH', 'T']:
                 return _ref_revision[0]
 
+            _tags_shas = self.tags.values()
             # maybe it's a tag ? we don't have them in self.revisions
-            elif revision in _tags_shas:
+            if revision in _tags_shas:
                 return _tags_shas[_tags_shas.index(revision)]
 
-            elif not pattern.match(revision) or revision not in self.revisions:
+            elif not SHA_PATTERN.match(revision) or revision not in self.revisions:
                 raise ChangesetDoesNotExistError("Revision %s does not exist "
                     "for this repository" % (revision))
 
         # Ensure we return full id
-        if not pattern.match(str(revision)):
+        if not SHA_PATTERN.match(str(revision)):
             raise ChangesetDoesNotExistError("Given revision %s not recognized"
                 % revision)
         return revision
@@ -488,6 +502,11 @@
         if branch_name and branch_name not in self.branches:
             raise BranchDoesNotExistError("Branch '%s' not found" \
                                           % branch_name)
+        # actually we should check now if it's not an empty repo to not spaw
+        # subprocess commands
+        if self._empty:
+            raise EmptyRepositoryError("There are no changesets yet")
+
         # %H at format means (full) commit hash, initial hashes are retrieved
         # in ascending date order
         cmd_template = 'log --date-order --reverse --pretty=format:"%H"'
@@ -502,11 +521,10 @@
             cmd_template += ' $branch_name'
             cmd_params['branch_name'] = branch_name
         else:
-            rev_filter = _git_path = rhodecode.CONFIG.get('git_rev_filter',
-                                                          '--all').strip()
+            rev_filter = _git_path = settings.GIT_REV_FILTER
             cmd_template += ' %s' % (rev_filter)
 
-        cmd = Template(cmd_template).safe_substitute(**cmd_params)
+        cmd = string.Template(cmd_template).safe_substitute(**cmd_params)
         revs = self.run_git_command(cmd)[0].splitlines()
         start_pos = 0
         end_pos = len(revs)
@@ -533,8 +551,7 @@
         revs = revs[start_pos:end_pos]
         if reverse:
             revs = reversed(revs)
-        for rev in revs:
-            yield self.get_changeset(rev)
+        return CollectionGenerator(self, revs)
 
     def get_diff(self, rev1, rev2, path=None, ignore_whitespace=False,
                  context=3):
@@ -618,9 +635,7 @@
         Tries to pull changes from external location.
         """
         url = self._get_url(url)
-        cmd = ['pull']
-        cmd.append("--ff-only")
-        cmd.append(url)
+        cmd = ['pull', "--ff-only", url]
         cmd = ' '.join(cmd)
         # If error occurs run_git_command raises RepositoryError already
         self.run_git_command(cmd)
--- a/rhodecode/lib/vcs/backends/git/workdir.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/workdir.py	Fri Jun 07 00:31:11 2013 +0200
@@ -20,8 +20,8 @@
             raise RepositoryError("Couldn't compute workdir's branch")
 
     def get_changeset(self):
-        return self.repository.get_changeset(
-            self.repository._repo.refs.as_dict().get('HEAD'))
+        wk_dir_id = self.repository._repo.refs.as_dict().get('HEAD')
+        return self.repository.get_changeset(wk_dir_id)
 
     def checkout_branch(self, branch=None):
         if branch is None:
--- a/rhodecode/lib/vcs/backends/hg/changeset.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/hg/changeset.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,14 +1,16 @@
 import os
 import posixpath
 
+from rhodecode.lib.vcs.conf import settings
 from rhodecode.lib.vcs.backends.base import BaseChangeset
-from rhodecode.lib.vcs.conf import settings
-from rhodecode.lib.vcs.exceptions import  ChangesetDoesNotExistError, \
-    ChangesetError, ImproperArchiveTypeError, NodeDoesNotExistError, VCSError
-from rhodecode.lib.vcs.nodes import AddedFileNodesGenerator, \
-    ChangedFileNodesGenerator, DirNode, FileNode, NodeKind, \
-    RemovedFileNodesGenerator, RootNode, SubModuleNode
-
+from rhodecode.lib.vcs.exceptions import (
+    ChangesetDoesNotExistError, ChangesetError, ImproperArchiveTypeError,
+    NodeDoesNotExistError, VCSError
+)
+from rhodecode.lib.vcs.nodes import (
+    AddedFileNodesGenerator, ChangedFileNodesGenerator, DirNode, FileNode,
+    NodeKind, RemovedFileNodesGenerator, RootNode, SubModuleNode
+)
 from rhodecode.lib.vcs.utils import safe_str, safe_unicode, date_fromtimestamp
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
 from rhodecode.lib.vcs.utils.paths import get_dirs_for_path
--- a/rhodecode/lib/vcs/backends/hg/repository.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/hg/repository.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,25 +1,46 @@
+# -*- coding: utf-8 -*-
+"""
+    vcs.backends.hg.repository
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Mercurial repository implementation.
+
+    :created_on: Apr 8, 2010
+    :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak.
+"""
+
 import os
 import time
-import datetime
 import urllib
 import urllib2
+import logging
+import datetime
 
-from rhodecode.lib.vcs.backends.base import BaseRepository
-from .workdir import MercurialWorkdir
-from .changeset import MercurialChangeset
-from .inmemory import MercurialInMemoryChangeset
+
+from rhodecode.lib.vcs.backends.base import BaseRepository, CollectionGenerator
+from rhodecode.lib.vcs.conf import settings
 
-from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError, \
-    ChangesetDoesNotExistError, EmptyRepositoryError, RepositoryError, \
-    VCSError, TagAlreadyExistError, TagDoesNotExistError
-from rhodecode.lib.vcs.utils import author_email, author_name, date_fromtimestamp, \
-    makedate, safe_unicode
+from rhodecode.lib.vcs.exceptions import (
+    BranchDoesNotExistError, ChangesetDoesNotExistError, EmptyRepositoryError,
+    RepositoryError, VCSError, TagAlreadyExistError, TagDoesNotExistError
+)
+from rhodecode.lib.vcs.utils import (
+    author_email, author_name, date_fromtimestamp, makedate, safe_unicode
+)
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
 from rhodecode.lib.vcs.utils.ordered_dict import OrderedDict
 from rhodecode.lib.vcs.utils.paths import abspath
+from rhodecode.lib.vcs.utils.hgcompat import (
+    ui, nullid, match, patch, diffopts, clone, get_contact, pull,
+    localrepository, RepoLookupError, Abort, RepoError, hex, scmutil, hg_url,
+    httpbasicauthhandler, httpdigestauthhandler, peer
+)
 
-from rhodecode.lib.vcs.utils.hgcompat import ui, nullid, match, patch, diffopts, clone, \
-    get_contact, pull, localrepository, RepoLookupError, Abort, RepoError, hex
+from .changeset import MercurialChangeset
+from .inmemory import MercurialInMemoryChangeset
+from .workdir import MercurialWorkdir
+
+log = logging.getLogger(__name__)
 
 
 class MercurialRepository(BaseRepository):
@@ -57,7 +78,7 @@
     @property
     def _empty(self):
         """
-        Checks if repository is empty without any changesets
+        Checks if repository is empty ie. without any changesets
         """
         # TODO: Following raises errors when using InMemoryChangeset...
         # return len(self._repo.changelog) == 0
@@ -271,12 +292,6 @@
         is valid or True if it's a local path
         """
 
-        from mercurial.util import url as Url
-
-        # those authnadlers are patched for python 2.6.5 bug an
-        # infinit looping when given invalid resources
-        from mercurial.url import httpbasicauthhandler, httpdigestauthhandler
-
         # check first if it's not an local url
         if os.path.isdir(url) or url.startswith('file:'):
             return True
@@ -285,7 +300,7 @@
             url = url[url.find('+') + 1:]
 
         handlers = []
-        test_uri, authinfo = Url(url).authinfo()
+        test_uri, authinfo = hg_url(url).authinfo()
 
         if authinfo:
             #create a password manager
@@ -472,20 +487,27 @@
                                   ' this repository' % branch_name)
         if end_pos is not None:
             end_pos += 1
-
-        slice_ = reversed(self.revisions[start_pos:end_pos]) if reverse else \
-            self.revisions[start_pos:end_pos]
+        #filter branches
+        filter_ = []
+        if branch_name:
+            filter_.append('branch("%s")' % (branch_name))
 
-        for id_ in slice_:
-            cs = self.get_changeset(id_)
-            if branch_name and cs.branch != branch_name:
-                continue
-            if start_date and cs.date < start_date:
-                continue
-            if end_date and cs.date > end_date:
-                continue
+        if start_date and not end_date:
+            filter_.append('date(">%s")' % start_date)
+        if end_date and not start_date:
+            filter_.append('date("<%s")' % end_date)
+        if start_date and end_date:
+            filter_.append('date(">%s") and date("<%s")' % (start_date, end_date))
+        if filter_:
+            revisions = scmutil.revrange(self._repo, filter_)
+        else:
+            revisions = self.revisions
 
-            yield cs
+        revs = revisions[start_pos:end_pos]
+        if reverse:
+            revs = reversed(revs)
+
+        return CollectionGenerator(self, revs)
 
     def pull(self, url):
         """
@@ -493,7 +515,8 @@
         """
         url = self._get_url(url)
         try:
-            pull(self.baseui, self._repo, url)
+            other = peer(self._repo, {}, url)
+            self._repo.pull(other, heads=None, force=None)
         except Abort, err:
             # Propagate error but with vcs's type
             raise RepositoryError(str(err))
--- a/rhodecode/lib/vcs/backends/hg/workdir.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/backends/hg/workdir.py	Fri Jun 07 00:31:11 2013 +0200
@@ -10,7 +10,8 @@
         return self.repository._repo.dirstate.branch()
 
     def get_changeset(self):
-        return self.repository.get_changeset()
+        wk_dir_id = self.repository._repo[None].parents()[0].hex()
+        return self.repository.get_changeset(wk_dir_id)
 
     def checkout_branch(self, branch=None):
         if branch is None:
--- a/rhodecode/lib/vcs/conf/settings.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/conf/settings.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,6 @@
 import os
 import tempfile
+from rhodecode.lib.vcs.utils import aslist
 from rhodecode.lib.vcs.utils.paths import get_user_home
 
 abspath = lambda * p: os.path.abspath(os.path.join(*p))
@@ -15,9 +16,17 @@
 if os.path.isdir(VCSRC_PATH):
     VCSRC_PATH = os.path.join(VCSRC_PATH, '__init__.py')
 
+# list of default encoding used in safe_unicode/safe_str methods
+DEFAULT_ENCODINGS = aslist('utf8')
+
+# path to git executable runned by run_git_command function
+GIT_EXECUTABLE_PATH = 'git'
+# can be also --branches --tags
+GIT_REV_FILTER = '--all'
+
 BACKENDS = {
-    'hg': 'vcs.backends.hg.MercurialRepository',
-    'git': 'vcs.backends.git.GitRepository',
+    'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
+    'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
 }
 
 ARCHIVE_SPECS = {
@@ -26,8 +35,3 @@
     'tgz': ('application/x-gzip', '.tar.gz'),
     'zip': ('application/zip', '.zip'),
 }
-
-BACKENDS = {
-    'hg': 'rhodecode.lib.vcs.backends.hg.MercurialRepository',
-    'git': 'rhodecode.lib.vcs.backends.git.GitRepository',
-}
--- a/rhodecode/lib/vcs/exceptions.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/exceptions.py	Fri Jun 07 00:31:11 2013 +0200
@@ -89,5 +89,6 @@
 class ImproperArchiveTypeError(VCSError):
     pass
 
+
 class CommandError(VCSError):
     pass
--- a/rhodecode/lib/vcs/nodes.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/nodes.py	Fri Jun 07 00:31:11 2013 +0200
@@ -13,13 +13,10 @@
 import posixpath
 import mimetypes
 
-from pygments import lexers
-
+from rhodecode.lib.vcs.backends.base import EmptyChangeset
+from rhodecode.lib.vcs.exceptions import NodeError, RemovedFileNodeError
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
-from rhodecode.lib.vcs.utils import safe_unicode
-from rhodecode.lib.vcs.exceptions import NodeError
-from rhodecode.lib.vcs.exceptions import RemovedFileNodeError
-from rhodecode.lib.vcs.backends.base import EmptyChangeset
+from rhodecode.lib.vcs.utils import safe_unicode, safe_str
 
 
 class NodeKind:
@@ -103,8 +100,8 @@
     def __init__(self, path, kind):
         if path.startswith('/'):
             raise NodeError("Cannot initialize Node objects with slash at "
-                "the beginning as only relative paths are supported")
-        self.path = path.rstrip('/')
+                            "the beginning as only relative paths are supported")
+        self.path = safe_str(path.rstrip('/'))  # we store paths as str
         if path == '' and kind != NodeKind.DIR:
             raise NodeError("Only DirNode and its subclasses may be "
                             "initialized with empty path")
@@ -353,7 +350,6 @@
 
     @LazyProperty
     def mimetype_main(self):
-        return ['', '']
         return self.mimetype.split('/')[0]
 
     @LazyProperty
@@ -362,7 +358,7 @@
         Returns pygment's lexer class. Would try to guess lexer taking file's
         content, name and mimetype.
         """
-
+        from pygments import lexers
         try:
             lexer = lexers.guess_lexer_for_filename(self.name, self.content, stripnl=False)
         except lexers.ClassNotFound:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/vcs/subprocessio.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,415 @@
+"""
+Module provides a class allowing to wrap communication over subprocess.Popen
+input, output, error streams into a meaningfull, non-blocking, concurrent
+stream processor exposing the output data as an iterator fitting to be a
+return value passed by a WSGI applicaiton to a WSGI server per PEP 3333.
+
+Copyright (c) 2011  Daniel Dotsenko <dotsa@hotmail.com>
+
+This file is part of git_http_backend.py Project.
+
+git_http_backend.py Project is free software: you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 2.1 of the License,
+or (at your option) any later version.
+
+git_http_backend.py Project is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with git_http_backend.py Project.
+If not, see <http://www.gnu.org/licenses/>.
+"""
+import os
+import subprocess
+from rhodecode.lib.vcs.utils.compat import deque, Event, Thread, _bytes, _bytearray
+
+
+class StreamFeeder(Thread):
+    """
+    Normal writing into pipe-like is blocking once the buffer is filled.
+    This thread allows a thread to seep data from a file-like into a pipe
+    without blocking the main thread.
+    We close inpipe once the end of the source stream is reached.
+    """
+    def __init__(self, source):
+        super(StreamFeeder, self).__init__()
+        self.daemon = True
+        filelike = False
+        self.bytes = _bytes()
+        if type(source) in (type(''), _bytes, _bytearray):  # string-like
+            self.bytes = _bytes(source)
+        else:  # can be either file pointer or file-like
+            if type(source) in (int, long):  # file pointer it is
+                ## converting file descriptor (int) stdin into file-like
+                try:
+                    source = os.fdopen(source, 'rb', 16384)
+                except Exception:
+                    pass
+            # let's see if source is file-like by now
+            try:
+                filelike = source.read
+            except Exception:
+                pass
+        if not filelike and not self.bytes:
+            raise TypeError("StreamFeeder's source object must be a readable "
+                            "file-like, a file descriptor, or a string-like.")
+        self.source = source
+        self.readiface, self.writeiface = os.pipe()
+
+    def run(self):
+        t = self.writeiface
+        if self.bytes:
+            os.write(t, self.bytes)
+        else:
+            s = self.source
+            b = s.read(4096)
+            while b:
+                os.write(t, b)
+                b = s.read(4096)
+        os.close(t)
+
+    @property
+    def output(self):
+        return self.readiface
+
+
+class InputStreamChunker(Thread):
+    def __init__(self, source, target, buffer_size, chunk_size):
+
+        super(InputStreamChunker, self).__init__()
+
+        self.daemon = True  # die die die.
+
+        self.source = source
+        self.target = target
+        self.chunk_count_max = int(buffer_size / chunk_size) + 1
+        self.chunk_size = chunk_size
+
+        self.data_added = Event()
+        self.data_added.clear()
+
+        self.keep_reading = Event()
+        self.keep_reading.set()
+
+        self.EOF = Event()
+        self.EOF.clear()
+
+        self.go = Event()
+        self.go.set()
+
+    def stop(self):
+        self.go.clear()
+        self.EOF.set()
+        try:
+            # this is not proper, but is done to force the reader thread let
+            # go of the input because, if successful, .close() will send EOF
+            # down the pipe.
+            self.source.close()
+        except:
+            pass
+
+    def run(self):
+        s = self.source
+        t = self.target
+        cs = self.chunk_size
+        ccm = self.chunk_count_max
+        kr = self.keep_reading
+        da = self.data_added
+        go = self.go
+
+        try:
+            b = s.read(cs)
+        except ValueError:
+            b = ''
+
+        while b and go.is_set():
+            if len(t) > ccm:
+                kr.clear()
+                kr.wait(2)
+#                # this only works on 2.7.x and up
+#                if not kr.wait(10):
+#                    raise Exception("Timed out while waiting for input to be read.")
+                # instead we'll use this
+                if len(t) > ccm + 3:
+                    raise IOError("Timed out while waiting for input from subprocess.")
+            t.append(b)
+            da.set()
+            b = s.read(cs)
+        self.EOF.set()
+        da.set()  # for cases when done but there was no input.
+
+
+class BufferedGenerator():
+    """
+    Class behaves as a non-blocking, buffered pipe reader.
+    Reads chunks of data (through a thread)
+    from a blocking pipe, and attaches these to an array (Deque) of chunks.
+    Reading is halted in the thread when max chunks is internally buffered.
+    The .next() may operate in blocking or non-blocking fashion by yielding
+    '' if no data is ready
+    to be sent or by not returning until there is some data to send
+    When we get EOF from underlying source pipe we raise the marker to raise
+    StopIteration after the last chunk of data is yielded.
+    """
+
+    def __init__(self, source, buffer_size=65536, chunk_size=4096,
+                 starting_values=[], bottomless=False):
+
+        if bottomless:
+            maxlen = int(buffer_size / chunk_size)
+        else:
+            maxlen = None
+
+        self.data = deque(starting_values, maxlen)
+
+        self.worker = InputStreamChunker(source, self.data, buffer_size,
+                                         chunk_size)
+        if starting_values:
+            self.worker.data_added.set()
+        self.worker.start()
+
+    ####################
+    # Generator's methods
+    ####################
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        while not len(self.data) and not self.worker.EOF.is_set():
+            self.worker.data_added.clear()
+            self.worker.data_added.wait(0.2)
+        if len(self.data):
+            self.worker.keep_reading.set()
+            return _bytes(self.data.popleft())
+        elif self.worker.EOF.is_set():
+            raise StopIteration
+
+    def throw(self, type, value=None, traceback=None):
+        if not self.worker.EOF.is_set():
+            raise type(value)
+
+    def start(self):
+        self.worker.start()
+
+    def stop(self):
+        self.worker.stop()
+
+    def close(self):
+        try:
+            self.worker.stop()
+            self.throw(GeneratorExit)
+        except (GeneratorExit, StopIteration):
+            pass
+
+    def __del__(self):
+        self.close()
+
+    ####################
+    # Threaded reader's infrastructure.
+    ####################
+    @property
+    def input(self):
+        return self.worker.w
+
+    @property
+    def data_added_event(self):
+        return self.worker.data_added
+
+    @property
+    def data_added(self):
+        return self.worker.data_added.is_set()
+
+    @property
+    def reading_paused(self):
+        return not self.worker.keep_reading.is_set()
+
+    @property
+    def done_reading_event(self):
+        """
+        Done_reding does not mean that the iterator's buffer is empty.
+        Iterator might have done reading from underlying source, but the read
+        chunks might still be available for serving through .next() method.
+
+        :returns: An Event class instance.
+        """
+        return self.worker.EOF
+
+    @property
+    def done_reading(self):
+        """
+        Done_reding does not mean that the iterator's buffer is empty.
+        Iterator might have done reading from underlying source, but the read
+        chunks might still be available for serving through .next() method.
+
+        :returns: An Bool value.
+        """
+        return self.worker.EOF.is_set()
+
+    @property
+    def length(self):
+        """
+        returns int.
+
+        This is the lenght of the que of chunks, not the length of
+        the combined contents in those chunks.
+
+        __len__() cannot be meaningfully implemented because this
+        reader is just flying throuh a bottomless pit content and
+        can only know the lenght of what it already saw.
+
+        If __len__() on WSGI server per PEP 3333 returns a value,
+        the responce's length will be set to that. In order not to
+        confuse WSGI PEP3333 servers, we will not implement __len__
+        at all.
+        """
+        return len(self.data)
+
+    def prepend(self, x):
+        self.data.appendleft(x)
+
+    def append(self, x):
+        self.data.append(x)
+
+    def extend(self, o):
+        self.data.extend(o)
+
+    def __getitem__(self, i):
+        return self.data[i]
+
+
+class SubprocessIOChunker(object):
+    """
+    Processor class wrapping handling of subprocess IO.
+
+    In a way, this is a "communicate()" replacement with a twist.
+
+    - We are multithreaded. Writing in and reading out, err are all sep threads.
+    - We support concurrent (in and out) stream processing.
+    - The output is not a stream. It's a queue of read string (bytes, not unicode)
+      chunks. The object behaves as an iterable. You can "for chunk in obj:" us.
+    - We are non-blocking in more respects than communicate()
+      (reading from subprocess out pauses when internal buffer is full, but
+       does not block the parent calling code. On the flip side, reading from
+       slow-yielding subprocess may block the iteration until data shows up. This
+       does not block the parallel inpipe reading occurring parallel thread.)
+
+    The purpose of the object is to allow us to wrap subprocess interactions into
+    and interable that can be passed to a WSGI server as the application's return
+    value. Because of stream-processing-ability, WSGI does not have to read ALL
+    of the subprocess's output and buffer it, before handing it to WSGI server for
+    HTTP response. Instead, the class initializer reads just a bit of the stream
+    to figure out if error ocurred or likely to occur and if not, just hands the
+    further iteration over subprocess output to the server for completion of HTTP
+    response.
+
+    The real or perceived subprocess error is trapped and raised as one of
+    EnvironmentError family of exceptions
+
+    Example usage:
+    #    try:
+    #        answer = SubprocessIOChunker(
+    #            cmd,
+    #            input,
+    #            buffer_size = 65536,
+    #            chunk_size = 4096
+    #            )
+    #    except (EnvironmentError) as e:
+    #        print str(e)
+    #        raise e
+    #
+    #    return answer
+
+
+    """
+    def __init__(self, cmd, inputstream=None, buffer_size=65536,
+                 chunk_size=4096, starting_values=[], **kwargs):
+        """
+        Initializes SubprocessIOChunker
+
+        :param cmd: A Subprocess.Popen style "cmd". Can be string or array of strings
+        :param inputstream: (Default: None) A file-like, string, or file pointer.
+        :param buffer_size: (Default: 65536) A size of total buffer per stream in bytes.
+        :param chunk_size: (Default: 4096) A max size of a chunk. Actual chunk may be smaller.
+        :param starting_values: (Default: []) An array of strings to put in front of output que.
+        """
+
+        if inputstream:
+            input_streamer = StreamFeeder(inputstream)
+            input_streamer.start()
+            inputstream = input_streamer.output
+
+        _shell = kwargs.get('shell', True)
+        if isinstance(cmd, (list, tuple)):
+            cmd = ' '.join(cmd)
+
+        kwargs['shell'] = _shell
+        _p = subprocess.Popen(cmd,
+            bufsize=-1,
+            stdin=inputstream,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            **kwargs
+        )
+
+        bg_out = BufferedGenerator(_p.stdout, buffer_size, chunk_size, starting_values)
+        bg_err = BufferedGenerator(_p.stderr, 16000, 1, bottomless=True)
+
+        while not bg_out.done_reading and not bg_out.reading_paused and not bg_err.length:
+            # doing this until we reach either end of file, or end of buffer.
+            bg_out.data_added_event.wait(1)
+            bg_out.data_added_event.clear()
+
+        # at this point it's still ambiguous if we are done reading or just full buffer.
+        # Either way, if error (returned by ended process, or implied based on
+        # presence of stuff in stderr output) we error out.
+        # Else, we are happy.
+        _returncode = _p.poll()
+        if _returncode or (_returncode is None and bg_err.length):
+            try:
+                _p.terminate()
+            except:
+                pass
+            bg_out.stop()
+            bg_err.stop()
+            err = '%s' % ''.join(bg_err)
+            if err:
+                raise EnvironmentError("Subprocess exited due to an error:\n" + err)
+            raise EnvironmentError("Subprocess exited with non 0 ret code:%s" % _returncode)
+
+        self.process = _p
+        self.output = bg_out
+        self.error = bg_err
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.process.poll():
+            err = '%s' % ''.join(self.error)
+            raise EnvironmentError("Subprocess exited due to an error:\n" + err)
+        return self.output.next()
+
+    def throw(self, type, value=None, traceback=None):
+        if self.output.length or not self.output.done_reading:
+            raise type(value)
+
+    def close(self):
+        try:
+            self.process.terminate()
+        except:
+            pass
+        try:
+            self.output.close()
+        except:
+            pass
+        try:
+            self.error.close()
+        except:
+            pass
+
+    def __del__(self):
+        self.close()
--- a/rhodecode/lib/vcs/utils/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -16,6 +16,27 @@
     return time.mktime(lt), tz
 
 
+def aslist(obj, sep=None, strip=True):
+    """
+    Returns given string separated by sep as list
+
+    :param obj:
+    :param sep:
+    :param strip:
+    """
+    if isinstance(obj, (basestring)):
+        lst = obj.split(sep)
+        if strip:
+            lst = [v.strip() for v in lst]
+        return lst
+    elif isinstance(obj, (list, tuple)):
+        return obj
+    elif obj is None:
+        return []
+    else:
+        return [obj]
+
+
 def date_fromtimestamp(unixts, tzoffset=0):
     """
     Makes a local datetime object out of unix timestamp
@@ -27,6 +48,23 @@
     return datetime.datetime.fromtimestamp(float(unixts))
 
 
+def safe_int(val, default=None):
+    """
+    Returns int() of val if val is not convertable to int use default
+    instead
+
+    :param val:
+    :param default:
+    """
+
+    try:
+        val = int(val)
+    except (ValueError, TypeError):
+        val = default
+
+    return val
+
+
 def safe_unicode(str_, from_encoding=None):
     """
     safe unicode function. Does few trick to turn str_ into unicode
@@ -38,21 +76,26 @@
     :rtype: unicode
     :returns: unicode object
     """
-    from rhodecode.lib.utils2 import safe_unicode
-    return safe_unicode(str_, from_encoding)
-
     if isinstance(str_, unicode):
         return str_
 
+    if not from_encoding:
+        from rhodecode.lib.vcs.conf import settings
+        from_encoding = settings.DEFAULT_ENCODINGS
+
+    if not isinstance(from_encoding, (list, tuple)):
+        from_encoding = [from_encoding]
+
     try:
         return unicode(str_)
     except UnicodeDecodeError:
         pass
 
-    try:
-        return unicode(str_, from_encoding)
-    except UnicodeDecodeError:
-        pass
+    for enc in from_encoding:
+        try:
+            return unicode(str_, enc)
+        except UnicodeDecodeError:
+            pass
 
     try:
         import chardet
@@ -61,7 +104,7 @@
             raise Exception()
         return str_.decode(encoding)
     except (ImportError, UnicodeDecodeError, Exception):
-        return unicode(str_, from_encoding, 'replace')
+        return unicode(str_, from_encoding[0], 'replace')
 
 
 def safe_str(unicode_, to_encoding=None):
@@ -75,16 +118,26 @@
     :rtype: str
     :returns: str object
     """
-    from rhodecode.lib.utils2 import safe_str
-    return safe_str(unicode_, to_encoding)
+
+    # if it's not basestr cast to str
+    if not isinstance(unicode_, basestring):
+        return str(unicode_)
 
     if isinstance(unicode_, str):
         return unicode_
 
-    try:
-        return unicode_.encode(to_encoding)
-    except UnicodeEncodeError:
-        pass
+    if not to_encoding:
+        from rhodecode.lib.vcs.conf import settings
+        to_encoding = settings.DEFAULT_ENCODINGS
+
+    if not isinstance(to_encoding, (list, tuple)):
+        to_encoding = [to_encoding]
+
+    for enc in to_encoding:
+        try:
+            return unicode_.encode(enc)
+        except UnicodeEncodeError:
+            pass
 
     try:
         import chardet
@@ -94,9 +147,7 @@
 
         return unicode_.encode(encoding)
     except (ImportError, UnicodeEncodeError):
-        return unicode_.encode(to_encoding, 'replace')
-
-    return safe_str
+        return unicode_.encode(to_encoding[0], 'replace')
 
 
 def author_email(author):
--- a/rhodecode/lib/vcs/utils/annotate.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/annotate.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,9 +1,10 @@
-from rhodecode.lib.vcs.exceptions import VCSError
-from rhodecode.lib.vcs.nodes import FileNode
+import StringIO
+
 from pygments.formatters import HtmlFormatter
 from pygments import highlight
 
-import StringIO
+from rhodecode.lib.vcs.exceptions import VCSError
+from rhodecode.lib.vcs.nodes import FileNode
 
 
 def annotate_highlight(filenode, annotate_from_changeset_func=None,
--- a/rhodecode/lib/vcs/utils/baseui_config.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/baseui_config.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,4 +1,4 @@
-from mercurial import ui, config
+from rhodecode.lib.vcs.utils.hgcompat import ui, config
 
 
 def make_ui(self, path='hgwebdir.config'):
--- a/rhodecode/lib/vcs/utils/compat.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/compat.py	Fri Jun 07 00:31:11 2013 +0200
@@ -5,9 +5,314 @@
 versions.
 """
 import sys
-
+import array
 
 if sys.version_info >= (2, 7):
     unittest = __import__('unittest')
 else:
     unittest = __import__('unittest2')
+
+
+if sys.version_info >= (2, 6):
+    _bytes = bytes
+else:
+    # in py2.6 bytes is a synonim for str
+    _bytes = str
+
+if sys.version_info >= (2, 6):
+    _bytearray = bytearray
+else:
+    # no idea if this is correct but all integration tests are passing
+    # i think we never use bytearray anyway
+    _bytearray = array
+
+if sys.version_info >= (2, 6):
+    from collections import deque
+else:
+    #need to implement our own deque with maxlen
+    class deque(object):
+
+        def __init__(self, iterable=(), maxlen= -1):
+            if not hasattr(self, 'data'):
+                self.left = self.right = 0
+                self.data = {}
+            self.maxlen = maxlen or -1
+            self.extend(iterable)
+
+        def append(self, x):
+            self.data[self.right] = x
+            self.right += 1
+            if self.maxlen != -1 and len(self) > self.maxlen:
+                self.popleft()
+
+        def appendleft(self, x):
+            self.left -= 1
+            self.data[self.left] = x
+            if self.maxlen != -1 and len(self) > self.maxlen:
+                self.pop()
+
+        def pop(self):
+            if self.left == self.right:
+                raise IndexError('cannot pop from empty deque')
+            self.right -= 1
+            elem = self.data[self.right]
+            del self.data[self.right]
+            return elem
+
+        def popleft(self):
+            if self.left == self.right:
+                raise IndexError('cannot pop from empty deque')
+            elem = self.data[self.left]
+            del self.data[self.left]
+            self.left += 1
+            return elem
+
+        def clear(self):
+            self.data.clear()
+            self.left = self.right = 0
+
+        def extend(self, iterable):
+            for elem in iterable:
+                self.append(elem)
+
+        def extendleft(self, iterable):
+            for elem in iterable:
+                self.appendleft(elem)
+
+        def rotate(self, n=1):
+            if self:
+                n %= len(self)
+                for i in xrange(n):
+                    self.appendleft(self.pop())
+
+        def __getitem__(self, i):
+            if i < 0:
+                i += len(self)
+            try:
+                return self.data[i + self.left]
+            except KeyError:
+                raise IndexError
+
+        def __setitem__(self, i, value):
+            if i < 0:
+                i += len(self)
+            try:
+                self.data[i + self.left] = value
+            except KeyError:
+                raise IndexError
+
+        def __delitem__(self, i):
+            size = len(self)
+            if not (-size <= i < size):
+                raise IndexError
+            data = self.data
+            if i < 0:
+                i += size
+            for j in xrange(self.left + i, self.right - 1):
+                data[j] = data[j + 1]
+            self.pop()
+
+        def __len__(self):
+            return self.right - self.left
+
+        def __cmp__(self, other):
+            if type(self) != type(other):
+                return cmp(type(self), type(other))
+            return cmp(list(self), list(other))
+
+        def __repr__(self, _track=[]):
+            if id(self) in _track:
+                return '...'
+            _track.append(id(self))
+            r = 'deque(%r, maxlen=%s)' % (list(self), self.maxlen)
+            _track.remove(id(self))
+            return r
+
+        def __getstate__(self):
+            return (tuple(self),)
+
+        def __setstate__(self, s):
+            self.__init__(s[0])
+
+        def __hash__(self):
+            raise TypeError
+
+        def __copy__(self):
+            return self.__class__(self)
+
+        def __deepcopy__(self, memo={}):
+            from copy import deepcopy
+            result = self.__class__()
+            memo[id(self)] = result
+            result.__init__(deepcopy(tuple(self), memo))
+            return result
+
+
+#==============================================================================
+# threading.Event
+#==============================================================================
+
+if sys.version_info >= (2, 6):
+    from threading import Event, Thread
+else:
+    from threading import _Verbose, Lock, Thread, _time, \
+        _allocate_lock, RLock, _sleep
+
+    def Condition(*args, **kwargs):
+        return _Condition(*args, **kwargs)
+
+    class _Condition(_Verbose):
+
+        def __init__(self, lock=None, verbose=None):
+            _Verbose.__init__(self, verbose)
+            if lock is None:
+                lock = RLock()
+            self.__lock = lock
+            # Export the lock's acquire() and release() methods
+            self.acquire = lock.acquire
+            self.release = lock.release
+            # If the lock defines _release_save() and/or _acquire_restore(),
+            # these override the default implementations (which just call
+            # release() and acquire() on the lock).  Ditto for _is_owned().
+            try:
+                self._release_save = lock._release_save
+            except AttributeError:
+                pass
+            try:
+                self._acquire_restore = lock._acquire_restore
+            except AttributeError:
+                pass
+            try:
+                self._is_owned = lock._is_owned
+            except AttributeError:
+                pass
+            self.__waiters = []
+
+        def __enter__(self):
+            return self.__lock.__enter__()
+
+        def __exit__(self, *args):
+            return self.__lock.__exit__(*args)
+
+        def __repr__(self):
+            return "<Condition(%s, %d)>" % (self.__lock, len(self.__waiters))
+
+        def _release_save(self):
+            self.__lock.release()           # No state to save
+
+        def _acquire_restore(self, x):
+            self.__lock.acquire()           # Ignore saved state
+
+        def _is_owned(self):
+            # Return True if lock is owned by current_thread.
+            # This method is called only if __lock doesn't have _is_owned().
+            if self.__lock.acquire(0):
+                self.__lock.release()
+                return False
+            else:
+                return True
+
+        def wait(self, timeout=None):
+            if not self._is_owned():
+                raise RuntimeError("cannot wait on un-acquired lock")
+            waiter = _allocate_lock()
+            waiter.acquire()
+            self.__waiters.append(waiter)
+            saved_state = self._release_save()
+            try:    # restore state no matter what (e.g., KeyboardInterrupt)
+                if timeout is None:
+                    waiter.acquire()
+                    if __debug__:
+                        self._note("%s.wait(): got it", self)
+                else:
+                    # Balancing act:  We can't afford a pure busy loop, so we
+                    # have to sleep; but if we sleep the whole timeout time,
+                    # we'll be unresponsive.  The scheme here sleeps very
+                    # little at first, longer as time goes on, but never longer
+                    # than 20 times per second (or the timeout time remaining).
+                    endtime = _time() + timeout
+                    delay = 0.0005 # 500 us -> initial delay of 1 ms
+                    while True:
+                        gotit = waiter.acquire(0)
+                        if gotit:
+                            break
+                        remaining = endtime - _time()
+                        if remaining <= 0:
+                            break
+                        delay = min(delay * 2, remaining, .05)
+                        _sleep(delay)
+                    if not gotit:
+                        if __debug__:
+                            self._note("%s.wait(%s): timed out", self, timeout)
+                        try:
+                            self.__waiters.remove(waiter)
+                        except ValueError:
+                            pass
+                    else:
+                        if __debug__:
+                            self._note("%s.wait(%s): got it", self, timeout)
+            finally:
+                self._acquire_restore(saved_state)
+
+        def notify(self, n=1):
+            if not self._is_owned():
+                raise RuntimeError("cannot notify on un-acquired lock")
+            __waiters = self.__waiters
+            waiters = __waiters[:n]
+            if not waiters:
+                if __debug__:
+                    self._note("%s.notify(): no waiters", self)
+                return
+            self._note("%s.notify(): notifying %d waiter%s", self, n,
+                       n != 1 and "s" or "")
+            for waiter in waiters:
+                waiter.release()
+                try:
+                    __waiters.remove(waiter)
+                except ValueError:
+                    pass
+
+        def notifyAll(self):
+            self.notify(len(self.__waiters))
+
+        notify_all = notifyAll
+
+    def Event(*args, **kwargs):
+        return _Event(*args, **kwargs)
+
+    class _Event(_Verbose):
+
+        # After Tim Peters' event class (without is_posted())
+
+        def __init__(self, verbose=None):
+            _Verbose.__init__(self, verbose)
+            self.__cond = Condition(Lock())
+            self.__flag = False
+
+        def isSet(self):
+            return self.__flag
+
+        is_set = isSet
+
+        def set(self):
+            self.__cond.acquire()
+            try:
+                self.__flag = True
+                self.__cond.notify_all()
+            finally:
+                self.__cond.release()
+
+        def clear(self):
+            self.__cond.acquire()
+            try:
+                self.__flag = False
+            finally:
+                self.__cond.release()
+
+        def wait(self, timeout=None):
+            self.__cond.acquire()
+            try:
+                if not self.__flag:
+                    self.__cond.wait(timeout)
+            finally:
+                self.__cond.release()
--- a/rhodecode/lib/vcs/utils/diffs.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/diffs.py	Fri Jun 07 00:31:11 2013 +0200
@@ -5,11 +5,9 @@
 import re
 import difflib
 import logging
+import itertools
 
 from difflib import unified_diff
-from itertools import tee, imap
-
-from mercurial.match import match
 
 from rhodecode.lib.vcs.exceptions import VCSError
 from rhodecode.lib.vcs.nodes import FileNode, NodeError
@@ -65,7 +63,7 @@
     new_raw_id = getattr(filenode_new.changeset, 'raw_id', '0' * 40)
 
     repo = filenode_new.changeset.repository
-    vcs_gitdiff = repo._get_diff(old_raw_id, new_raw_id, filenode_new.path,
+    vcs_gitdiff = repo.get_diff(old_raw_id, new_raw_id, filenode_new.path,
                                  ignore_whitespace)
 
     return vcs_gitdiff
@@ -97,10 +95,11 @@
 
         elif self.__format == 'gitdiff':
             udiff_copy = self.copy_iterator()
-            self.lines = imap(self.escaper, self._parse_gitdiff(udiff_copy))
+            self.lines = itertools.imap(self.escaper,
+                                        self._parse_gitdiff(udiff_copy))
         else:
             udiff_copy = self.copy_iterator()
-            self.lines = imap(self.escaper, udiff_copy)
+            self.lines = itertools.imap(self.escaper, udiff_copy)
 
         # Select a differ.
         if differ == 'difflib':
@@ -117,7 +116,7 @@
         an original as it's needed for repeating operations on
         this instance of DiffProcessor
         """
-        self.__udiff, iterator_copy = tee(self.__udiff)
+        self.__udiff, iterator_copy = itertools.tee(self.__udiff)
         return iterator_copy
 
     def _extract_rev(self, line1, line2):
--- a/rhodecode/lib/vcs/utils/helpers.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/helpers.py	Fri Jun 07 00:31:11 2013 +0200
@@ -4,10 +4,11 @@
 from __future__ import division
 
 import re
+import os
 import time
 import datetime
-import os.path
 from subprocess import Popen, PIPE
+
 from rhodecode.lib.vcs.exceptions import VCSError
 from rhodecode.lib.vcs.exceptions import RepositoryError
 from rhodecode.lib.vcs.utils.paths import abspath
@@ -163,6 +164,7 @@
             return result
     raise ValueError("IDs not recognized")
 
+
 def parse_datetime(text):
     """
     Parses given text and returns ``datetime.datetime`` instance or raises
--- a/rhodecode/lib/vcs/utils/hgcompat.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/hgcompat.py	Fri Jun 07 00:31:11 2013 +0200
@@ -2,17 +2,32 @@
 Mercurial libs compatibility
 """
 
+import mercurial
+import mercurial.demandimport
+## patch demandimport, due to bug in mercurial when it allways triggers demandimport.enable()
+mercurial.demandimport.enable = lambda *args, **kwargs: 1
 from mercurial import archival, merge as hg_merge, patch, ui
+from mercurial import discovery
+from mercurial import localrepo
+from mercurial import scmutil
+from mercurial import config
 from mercurial.commands import clone, nullid, pull
 from mercurial.context import memctx, memfilectx
 from mercurial.error import RepoError, RepoLookupError, Abort
+from mercurial.hgweb import hgweb_mod
 from mercurial.hgweb.common import get_contact
 from mercurial.localrepo import localrepository
 from mercurial.match import match
 from mercurial.mdiff import diffopts
 from mercurial.node import hex
 from mercurial.encoding import tolocal
-from mercurial import discovery
-from mercurial import localrepo
-from mercurial import scmutil
 from mercurial.discovery import findcommonoutgoing
+from mercurial.hg import peer
+from mercurial.httppeer import httppeer
+from mercurial.util import url as hg_url
+from mercurial.scmutil import revrange
+from mercurial.node import nullrev
+
+# those authnadlers are patched for python 2.6.5 bug an
+# infinit looping when given invalid resources
+from mercurial.url import httpbasicauthhandler, httpdigestauthhandler
--- a/rhodecode/lib/vcs/utils/progressbar.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/lib/vcs/utils/progressbar.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,7 +1,8 @@
 # encoding: UTF-8
 import sys
 import datetime
-from string import Template
+import string
+
 from rhodecode.lib.vcs.utils.filesize import filesizeformat
 from rhodecode.lib.vcs.utils.helpers import get_total_seconds
 
@@ -63,7 +64,7 @@
     def get_template(self):
         separator = self.get_separator()
         elements = self.get_elements()
-        return Template(separator.join((('$%s' % e) for e in elements)))
+        return string.Template(separator.join((('$%s' % e) for e in elements)))
 
     def get_total_time(self, current_time=None):
         if current_time is None:
--- a/rhodecode/model/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -104,8 +104,7 @@
         """
         Helper method to get user by ID, or username fallback
 
-        :param user:
-        :type user: UserID, username, or User instance
+        :param user: UserID, username, or User instance
         """
         from rhodecode.model.db import User
         return self._get_instance(User, user,
@@ -115,8 +114,7 @@
         """
         Helper method to get repository by ID, or repository name
 
-        :param repository:
-        :type repository: RepoID, repository name or Repository Instance
+        :param repository: RepoID, repository name or Repository Instance
         """
         from rhodecode.model.db import Repository
         return self._get_instance(Repository, repository,
@@ -126,8 +124,7 @@
         """
         Helper method to get permission by ID, or permission name
 
-        :param permission:
-        :type permission: PermissionID, permission_name or Permission instance
+        :param permission: PermissionID, permission_name or Permission instance
         """
         from rhodecode.model.db import Permission
         return self._get_instance(Permission, permission,
--- a/rhodecode/model/comment.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/comment.py	Fri Jun 07 00:31:11 2013 +0200
@@ -91,7 +91,7 @@
                           {'desc': desc, 'line': line},
                           _url)
             )
-            email_subject = 'User %s commented on changeset %s' % \
+            email_subject = '%s commented on changeset %s' % \
                 (user.username, h.short_id(revision))
             # get the current participants of this changeset
             recipients = ChangesetComment.get_users(revision=revision)
@@ -127,7 +127,7 @@
                            'line': line},
                           _url)
             )
-            email_subject = 'User %s commented on pull request #%s' % \
+            email_subject = '%s commented on pull request #%s' % \
                     (user.username, comment.pull_request.pull_request_id)
             # get the current participants of this pull request
             recipients = ChangesetComment.get_users(pull_request_id=
@@ -140,6 +140,7 @@
 
             #set some variables for email notification
             email_kwargs = {
+                'pr_title': pull_request.title,
                 'pr_id': pull_request.pull_request_id,
                 'status_change': status_change,
                 'closing_pr': closing_pr,
--- a/rhodecode/model/db.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/db.py	Fri Jun 07 00:31:11 2013 +0200
@@ -24,12 +24,12 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import os
+import time
 import logging
 import datetime
 import traceback
 import hashlib
-import time
-from collections import defaultdict
+import collections
 
 from sqlalchemy import *
 from sqlalchemy.ext.hybrid import hybrid_property
@@ -131,6 +131,11 @@
 
     @classmethod
     def getAll(cls):
+        # deprecated and left for backward compatibility
+        return cls.get_all()
+
+    @classmethod
+    def get_all(cls):
         return cls.query().all()
 
     @classmethod
@@ -265,6 +270,11 @@
     ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
 
+    # def __init__(self, section='', key='', value=''):
+    #     self.ui_section = section
+    #     self.ui_key = key
+    #     self.ui_value = value
+
     @classmethod
     def get_by_key(cls, key):
         return cls.query().filter(cls.ui_key == key).scalar()
@@ -315,10 +325,7 @@
          'mysql_charset': 'utf8'}
     )
     DEFAULT_USER = 'default'
-    DEFAULT_PERMISSIONS = [
-        'hg.register.manual_activate', 'hg.create.repository',
-        'hg.fork.repository', 'repository.read', 'group.read'
-    ]
+
     user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
     username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
@@ -490,6 +497,20 @@
         Session().add(self)
         log.debug('updated user %s lastlogin' % self.username)
 
+    @classmethod
+    def get_first_admin(cls):
+        user = User.query().filter(User.admin == True).first()
+        if user is None:
+            raise Exception('Missing administrative account!')
+        return user
+
+    @classmethod
+    def get_default_user(cls, cache=False):
+        user = User.get_by_username(User.DEFAULT_USER, cache=cache)
+        if user is None:
+            raise Exception('Missing default account!')
+        return user
+
     def get_api_data(self):
         """
         Common function for generating user related data for API
@@ -597,6 +618,11 @@
     action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
 
+    def __unicode__(self):
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
+                                      self.repository_name,
+                                      self.action)
+
     @property
     def action_as_day(self):
         return datetime.date(*self.action_date.timetuple()[:3])
@@ -616,13 +642,21 @@
     users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
     users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
     inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
 
     members = relationship('UserGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
     users_group_to_perm = relationship('UserGroupToPerm', cascade='all')
     users_group_repo_to_perm = relationship('UserGroupRepoToPerm', cascade='all')
+    users_group_repo_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
+    user_user_group_to_perm = relationship('UserUserGroupToPerm ', cascade='all')
+    user_group_user_group_to_perm = relationship('UserGroupUserGroupToPerm ', primaryjoin="UserGroupUserGroupToPerm.target_user_group_id==UserGroup.users_group_id", cascade='all')
+
+    user = relationship('User')
 
     def __unicode__(self):
-        return u'<userGroup(%s)>' % (self.users_group_name)
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
+                                      self.users_group_id,
+                                      self.users_group_name)
 
     @classmethod
     def get_by_group_name(cls, group_name, cache=False,
@@ -983,8 +1017,10 @@
         return data
 
     @classmethod
-    def lock(cls, repo, user_id):
-        repo.locked = [user_id, time.time()]
+    def lock(cls, repo, user_id, lock_time=None):
+        if not lock_time:
+            lock_time = time.time()
+        repo.locked = [user_id, lock_time]
         Session().add(repo)
         Session().commit()
 
@@ -1094,7 +1130,7 @@
             .filter(ChangesetComment.repo == self)
         if revisions:
             cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
-        grouped = defaultdict(list)
+        grouped = collections.defaultdict(list)
         for cmt in cmts.all():
             grouped[cmt.revision].append(cmt)
         return grouped
@@ -1104,7 +1140,6 @@
         Returns statuses for this repository
 
         :param revisions: list of revisions to get statuses for
-        :type revisions: list
         """
 
         statuses = ChangesetStatus.query()\
@@ -1141,20 +1176,16 @@
     # SCM CACHE INSTANCE
     #==========================================================================
 
-    @property
-    def invalidate(self):
-        return CacheInvalidation.invalidate(self.repo_name)
-
     def set_invalidate(self):
         """
-        set a cache for invalidation for this instance
+        Mark caches of this repo as invalid.
         """
-        CacheInvalidation.set_invalidate(repo_name=self.repo_name)
+        CacheInvalidation.set_invalidate(self.repo_name)
 
     def scm_instance_no_cache(self):
         return self.__get_instance()
 
-    @LazyProperty
+    @property
     def scm_instance(self):
         import rhodecode
         full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
@@ -1162,27 +1193,18 @@
             return self.scm_instance_cached()
         return self.__get_instance()
 
-    def scm_instance_cached(self, cache_map=None):
+    def scm_instance_cached(self, valid_cache_keys=None):
         @cache_region('long_term')
         def _c(repo_name):
             return self.__get_instance()
         rn = self.repo_name
-        log.debug('Getting cached instance of repo')
 
-        if cache_map:
-            # get using prefilled cache_map
-            invalidate_repo = cache_map[self.repo_name]
-            if invalidate_repo:
-                invalidate_repo = (None if invalidate_repo.cache_active
-                                   else invalidate_repo)
+        valid = CacheInvalidation.test_and_set_valid(rn, None, valid_cache_keys=valid_cache_keys)
+        if not valid:
+            log.debug('Cache for %s invalidated, getting new object' % (rn))
+            region_invalidate(_c, None, rn)
         else:
-            # get from invalidate
-            invalidate_repo = self.invalidate
-
-        if invalidate_repo is not None:
-            region_invalidate(_c, None, rn)
-            # update our cache
-            CacheInvalidation.set_valid(invalidate_repo.cache_key)
+            log.debug('Getting obj for %s from cache' % (rn))
         return _c(rn)
 
     def __get_instance(self):
@@ -1227,19 +1249,20 @@
     group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
     group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
 
     repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
     users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all')
-
     parent_group = relationship('RepoGroup', remote_side=group_id)
+    user = relationship('User')
 
     def __init__(self, group_name='', parent_group=None):
         self.group_name = group_name
         self.parent_group = parent_group
 
     def __unicode__(self):
-        return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
-                                  self.group_name)
+        return u"<%s('id:%s:%s')>" % (self.__class__.__name__, self.group_id,
+                                      self.group_name)
 
     @classmethod
     def groups_choices(cls, groups=None, show_empty_group=True):
@@ -1249,7 +1272,7 @@
 
         repo_groups = []
         if show_empty_group:
-            repo_groups = [('-1', '-- %s --' % _('top level'))]
+            repo_groups = [('-1', u'-- %s --' % _('top level'))]
         sep = ' &raquo; '
         _name = lambda k: _literal(sep.join(k))
 
@@ -1385,6 +1408,8 @@
          'mysql_charset': 'utf8'},
     )
     PERMS = [
+        ('hg.admin', _('RhodeCode Administrator')),
+
         ('repository.none', _('Repository no access')),
         ('repository.read', _('Repository read access')),
         ('repository.write', _('Repository write access')),
@@ -1395,20 +1420,46 @@
         ('group.write', _('Repository group write access')),
         ('group.admin', _('Repository group admin access')),
 
-        ('hg.admin', _('RhodeCode Administrator')),
+        ('usergroup.none', _('User group no access')),
+        ('usergroup.read', _('User group read access')),
+        ('usergroup.write', _('User group write access')),
+        ('usergroup.admin', _('User group admin access')),
+
+        ('hg.repogroup.create.false', _('Repository Group creation disabled')),
+        ('hg.repogroup.create.true', _('Repository Group creation enabled')),
+
+        ('hg.usergroup.create.false', _('User Group creation disabled')),
+        ('hg.usergroup.create.true', _('User Group creation enabled')),
+
         ('hg.create.none', _('Repository creation disabled')),
         ('hg.create.repository', _('Repository creation enabled')),
+
         ('hg.fork.none', _('Repository forking disabled')),
         ('hg.fork.repository', _('Repository forking enabled')),
-        ('hg.register.none', _('Register disabled')),
-        ('hg.register.manual_activate', _('Register new user with RhodeCode '
-                                          'with manual activation')),
+
+        ('hg.register.none', _('Registration disabled')),
+        ('hg.register.manual_activate', _('User Registration with manual account activation')),
+        ('hg.register.auto_activate', _('User Registration with automatic account activation')),
+
+        ('hg.extern_activate.manual', _('Manual activation of external account')),
+        ('hg.extern_activate.auto', _('Automatic activation of external account')),
+
+    ]
 
-        ('hg.register.auto_activate', _('Register new user with RhodeCode '
-                                        'with auto activation')),
+    #definition of system default permissions for DEFAULT user
+    DEFAULT_USER_PERMISSIONS = [
+        'repository.read',
+        'group.read',
+        'usergroup.read',
+        'hg.create.repository',
+        'hg.fork.repository',
+        'hg.register.manual_activate',
+        'hg.extern_activate.auto',
     ]
 
     # defines which permissions are more important higher the more important
+    # Weight defines which permissions are more important.
+    # The higher number the more important.
     PERM_WEIGHTS = {
         'repository.none': 0,
         'repository.read': 1,
@@ -1420,10 +1471,20 @@
         'group.write': 3,
         'group.admin': 4,
 
+        'usergroup.none': 0,
+        'usergroup.read': 1,
+        'usergroup.write': 3,
+        'usergroup.admin': 4,
+        'hg.repogroup.create.false': 0,
+        'hg.repogroup.create.true': 1,
+
+        'hg.usergroup.create.false': 0,
+        'hg.usergroup.create.true': 1,
+
         'hg.fork.none': 0,
         'hg.fork.repository': 1,
         'hg.create.none': 0,
-        'hg.create.repository':1
+        'hg.create.repository': 1
     }
 
     permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
@@ -1457,6 +1518,15 @@
 
         return q.all()
 
+    @classmethod
+    def get_default_user_group_perms(cls, default_user_id):
+        q = Session().query(UserUserGroupToPerm, UserGroup, cls)\
+         .join((UserGroup, UserUserGroupToPerm.user_group_id == UserGroup.users_group_id))\
+         .join((cls, UserUserGroupToPerm.permission_id == cls.permission_id))\
+         .filter(UserUserGroupToPerm.user_id == default_user_id)
+
+        return q.all()
+
 
 class UserRepoToPerm(Base, BaseModel):
     __tablename__ = 'repo_to_perm'
@@ -1484,7 +1554,36 @@
         return n
 
     def __unicode__(self):
-        return u'<user:%s => %s >' % (self.user, self.repository)
+        return u'<%s => %s >' % (self.user, self.repository)
+
+
+class UserUserGroupToPerm(Base, BaseModel):
+    __tablename__ = 'user_user_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('user_id', 'user_group_id', 'permission_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_user_group_to_perm_id = Column("user_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+
+    user = relationship('User')
+    user_group = relationship('UserGroup')
+    permission = relationship('Permission')
+
+    @classmethod
+    def create(cls, user, user_group, permission):
+        n = cls()
+        n.user = user
+        n.user_group = user_group
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<%s => %s >' % (self.user, self.user_group)
 
 
 class UserToPerm(Base, BaseModel):
@@ -1501,6 +1600,9 @@
     user = relationship('User')
     permission = relationship('Permission', lazy='joined')
 
+    def __unicode__(self):
+        return u'<%s => %s >' % (self.user, self.permission)
+
 
 class UserGroupRepoToPerm(Base, BaseModel):
     __tablename__ = 'users_group_repo_to_perm'
@@ -1528,7 +1630,37 @@
         return n
 
     def __unicode__(self):
-        return u'<userGroup:%s => %s >' % (self.users_group, self.repository)
+        return u'<UserGroupRepoToPerm:%s => %s >' % (self.users_group, self.repository)
+
+
+class UserGroupUserGroupToPerm(Base, BaseModel):
+    __tablename__ = 'user_group_user_group_to_perm'
+    __table_args__ = (
+        UniqueConstraint('target_user_group_id', 'user_group_id', 'permission_id'),
+        CheckConstraint('target_user_group_id != user_group_id'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8'}
+    )
+    user_group_user_group_to_perm_id = Column("user_group_user_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
+    target_user_group_id = Column("target_user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
+    user_group_id = Column("user_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
+
+    target_user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.target_user_group_id==UserGroup.users_group_id')
+    user_group = relationship('UserGroup', primaryjoin='UserGroupUserGroupToPerm.user_group_id==UserGroup.users_group_id')
+    permission = relationship('Permission')
+
+    @classmethod
+    def create(cls, target_user_group, user_group, permission):
+        n = cls()
+        n.target_user_group = target_user_group
+        n.user_group = user_group
+        n.permission = permission
+        Session().add(n)
+        return n
+
+    def __unicode__(self):
+        return u'<UserGroupUserGroup:%s => %s >' % (self.target_user_group, self.user_group)
 
 
 class UserGroupToPerm(Base, BaseModel):
@@ -1636,146 +1768,115 @@
     cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
     # cache_key as created by _get_cache_key
     cache_key = Column("cache_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
-    # cache_args is usually a repo_name, possibly with _README/_RSS/_ATOM suffix
+    # cache_args is a repo_name
     cache_args = Column("cache_args", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
-    # instance sets cache_active True when it is caching, other instances set cache_active to False to invalidate
+    # instance sets cache_active True when it is caching,
+    # other instances set cache_active to False to indicate that this cache is invalid
     cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
 
-    def __init__(self, cache_key, cache_args=''):
+    def __init__(self, cache_key, repo_name=''):
         self.cache_key = cache_key
-        self.cache_args = cache_args
+        self.cache_args = repo_name
         self.cache_active = False
 
     def __unicode__(self):
-        return u"<%s('%s:%s')>" % (self.__class__.__name__,
-                                  self.cache_id, self.cache_key)
+        return u"<%s('%s:%s[%s]')>" % (self.__class__.__name__,
+                            self.cache_id, self.cache_key, self.cache_active)
+
+    def _cache_key_partition(self):
+        prefix, repo_name, suffix = self.cache_key.partition(self.cache_args)
+        return prefix, repo_name, suffix
 
     def get_prefix(self):
         """
-        Guess prefix that might have been used in _get_cache_key to generate self.cache_key .
-        Only used for informational purposes in repo_edit.html .
+        get prefix that might have been used in _get_cache_key to
+        generate self.cache_key. Only used for informational purposes
+        in repo_edit.html.
+        """
+        # prefix, repo_name, suffix
+        return self._cache_key_partition()[0]
+
+    def get_suffix(self):
         """
-        _split = self.cache_key.split(self.cache_args, 1)
-        if len(_split) == 2:
-            return _split[0]
-        return ''
+        get suffix that might have been used in _get_cache_key to
+        generate self.cache_key. Only used for informational purposes
+        in repo_edit.html.
+        """
+        # prefix, repo_name, suffix
+        return self._cache_key_partition()[2]
+
+    @classmethod
+    def clear_cache(cls):
+        """
+        Delete all cache keys from database.
+        Should only be run when all instances are down and all entries thus stale.
+        """
+        cls.query().delete()
+        Session().commit()
 
     @classmethod
     def _get_cache_key(cls, key):
         """
         Wrapper for generating a unique cache key for this instance and "key".
+        key must / will start with a repo_name which will be stored in .cache_args .
         """
         import rhodecode
         prefix = rhodecode.CONFIG.get('instance_id', '')
         return "%s%s" % (prefix, key)
 
     @classmethod
-    def _get_or_create_inv_obj(cls, key, repo_name, commit=True):
-        inv_obj = Session().query(cls).filter(cls.cache_key == key).scalar()
-        if not inv_obj:
-            try:
-                inv_obj = CacheInvalidation(key, repo_name)
-                Session().add(inv_obj)
-                if commit:
-                    Session().commit()
-            except Exception:
-                log.error(traceback.format_exc())
-                Session().rollback()
-        return inv_obj
-
-    @classmethod
-    def invalidate(cls, key):
-        """
-        Returns Invalidation object if this given key should be invalidated
-        None otherwise. `cache_active = False` means that this cache
-        state is not valid and needs to be invalidated
-
-        :param key:
+    def set_invalidate(cls, repo_name):
         """
-        repo_name = key
-        repo_name = remove_suffix(repo_name, '_README')
-        repo_name = remove_suffix(repo_name, '_RSS')
-        repo_name = remove_suffix(repo_name, '_ATOM')
-
-        cache_key = cls._get_cache_key(key)
-        inv = cls._get_or_create_inv_obj(cache_key, repo_name)
-
-        if inv and not inv.cache_active:
-            return inv
-
-    @classmethod
-    def set_invalidate(cls, key=None, repo_name=None):
+        Mark all caches of a repo as invalid in the database.
         """
-        Mark this Cache key for invalidation, either by key or whole
-        cache sets based on repo_name
-
-        :param key:
-        """
-        invalidated_keys = []
-        if key:
-            assert not repo_name
-            cache_key = cls._get_cache_key(key)
-            inv_objs = Session().query(cls).filter(cls.cache_key == cache_key).all()
-        else:
-            assert repo_name
-            inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
+        inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all()
 
         try:
             for inv_obj in inv_objs:
+                log.debug('marking %s key for invalidation based on repo_name=%s'
+                          % (inv_obj, safe_str(repo_name)))
                 inv_obj.cache_active = False
-                log.debug('marking %s key for invalidation based on key=%s,repo_name=%s'
-                  % (inv_obj, key, safe_str(repo_name)))
-                invalidated_keys.append(inv_obj.cache_key)
                 Session().add(inv_obj)
             Session().commit()
         except Exception:
             log.error(traceback.format_exc())
             Session().rollback()
-        return invalidated_keys
-
-    @classmethod
-    def set_valid(cls, key):
-        """
-        Mark this cache key as active and currently cached
-
-        :param key:
-        """
-        inv_obj = cls.query().filter(cls.cache_key == key).scalar()
-        inv_obj.cache_active = True
-        Session().add(inv_obj)
-        Session().commit()
 
     @classmethod
-    def get_cache_map(cls):
-
-        class cachemapdict(dict):
+    def test_and_set_valid(cls, repo_name, kind, valid_cache_keys=None):
+        """
+        Mark this cache key as active and currently cached.
+        Return True if the existing cache registration still was valid.
+        Return False to indicate that it had been invalidated and caches should be refreshed.
+        """
 
-            def __init__(self, *args, **kwargs):
-                self.fixkey = kwargs.pop('fixkey', False)
-                super(cachemapdict, self).__init__(*args, **kwargs)
+        key = (repo_name + '_' + kind) if kind else repo_name
+        cache_key = cls._get_cache_key(key)
+
+        if valid_cache_keys and cache_key in valid_cache_keys:
+            return True
 
-            def __getattr__(self, name):
-                cache_key = name
-                if self.fixkey:
-                    cache_key = cls._get_cache_key(name)
-                if cache_key in self.__dict__:
-                    return self.__dict__[cache_key]
-                else:
-                    return self[cache_key]
+        try:
+            inv_obj = cls.query().filter(cls.cache_key == cache_key).scalar()
+            if not inv_obj:
+                inv_obj = CacheInvalidation(cache_key, repo_name)
+            was_valid = inv_obj.cache_active
+            inv_obj.cache_active = True
+            Session().add(inv_obj)
+            Session().commit()
+            return was_valid
+        except Exception:
+            log.error(traceback.format_exc())
+            Session().rollback()
+            return False
 
-            def __getitem__(self, name):
-                cache_key = name
-                if self.fixkey:
-                    cache_key = cls._get_cache_key(name)
-                try:
-                    return super(cachemapdict, self).__getitem__(cache_key)
-                except KeyError:
-                    return None
-
-        cache_map = cachemapdict(fixkey=True)
-        for obj in cls.query().all():
-            cache_map[obj.cache_key] = cachemapdict(obj.get_dict())
-        return cache_map
+    @classmethod
+    def get_valid_cache_keys(cls):
+        """
+        Return opaque object with information of which caches still are valid
+        and can be used without checking for invalidation.
+        """
+        return set(inv_obj.cache_key for inv_obj in cls.query().filter(cls.cache_active).all())
 
 
 class ChangesetComment(Base, BaseModel):
@@ -2030,6 +2131,92 @@
         Session().add(self)
 
 
+class Gist(Base, BaseModel):
+    __tablename__ = 'gists'
+    __table_args__ = (
+        Index('g_gist_access_id_idx', 'gist_access_id'),
+        Index('g_created_on_idx', 'created_on'),
+        {'extend_existing': True, 'mysql_engine': 'InnoDB',
+         'mysql_charset': 'utf8', 'sqlite_autoincrement': True}
+    )
+    GIST_PUBLIC = u'public'
+    GIST_PRIVATE = u'private'
+
+    gist_id = Column('gist_id', Integer(), primary_key=True)
+    gist_access_id = Column('gist_access_id', Unicode(250))
+    gist_description = Column('gist_description', UnicodeText(1024))
+    gist_owner = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=True)
+    gist_expires = Column('gist_expires', Float(), nullable=False)
+    gist_type = Column('gist_type', Unicode(128), nullable=False)
+    created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+    modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, default=datetime.datetime.now)
+
+    owner = relationship('User')
+
+    @classmethod
+    def get_or_404(cls, id_):
+        res = cls.query().filter(cls.gist_access_id == id_).scalar()
+        if not res:
+            raise HTTPNotFound
+        return res
+
+    @classmethod
+    def get_by_access_id(cls, gist_access_id):
+        return cls.query().filter(cls.gist_access_id == gist_access_id).scalar()
+
+    def gist_url(self):
+        import rhodecode
+        alias_url = rhodecode.CONFIG.get('gist_alias_url')
+        if alias_url:
+            return alias_url.replace('{gistid}', self.gist_access_id)
+
+        from pylons import url
+        return url('gist', gist_id=self.gist_access_id, qualified=True)
+
+    @classmethod
+    def base_path(cls):
+        """
+        Returns base path when all gists are stored
+
+        :param cls:
+        """
+        from rhodecode.model.gist import GIST_STORE_LOC
+        q = Session().query(RhodeCodeUi)\
+            .filter(RhodeCodeUi.ui_key == URL_SEP)
+        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
+        return os.path.join(q.one().ui_value, GIST_STORE_LOC)
+
+    def get_api_data(self):
+        """
+        Common function for generating gist related data for API
+        """
+        gist = self
+        data = dict(
+            gist_id=gist.gist_id,
+            type=gist.gist_type,
+            access_id=gist.gist_access_id,
+            description=gist.gist_description,
+            url=gist.gist_url(),
+            expires=gist.gist_expires,
+            created_on=gist.created_on,
+        )
+        return data
+
+    def __json__(self):
+        data = dict(
+        )
+        data.update(self.get_api_data())
+        return data
+    ## SCM functions
+
+    @property
+    def scm_instance(self):
+        from rhodecode.lib.vcs import get_repo
+        base_path = self.base_path()
+        return get_repo(os.path.join(*map(safe_str,
+                                          [base_path, self.gist_access_id])))
+
+
 class DbMigrateVersion(Base, BaseModel):
     __tablename__ = 'db_migrate_version'
     __table_args__ = (
--- a/rhodecode/model/forms.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/forms.py	Fri Jun 07 00:31:11 2013 +0200
@@ -134,9 +134,7 @@
                                       testValueList=True,
                                       if_missing=None, not_empty=True))
         enable_locking = v.StringBoolean(if_missing=False)
-        recursive = v.StringBoolean(if_missing=False)
-        chained_validators = [v.ValidReposGroup(edit, old_data),
-                              v.ValidPerms('group')]
+        chained_validators = [v.ValidReposGroup(edit, old_data)]
 
     return _ReposGroupForm
 
@@ -208,10 +206,27 @@
     class _RepoPermsForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = False
-        chained_validators = [v.ValidPerms()]
+        chained_validators = [v.ValidPerms(type_='repo')]
     return _RepoPermsForm
 
 
+def RepoGroupPermsForm():
+    class _RepoGroupPermsForm(formencode.Schema):
+        allow_extra_fields = True
+        filter_extra_fields = False
+        recursive = v.StringBoolean(if_missing=False)
+        chained_validators = [v.ValidPerms(type_='repo_group')]
+    return _RepoGroupPermsForm
+
+
+def UserGroupPermsForm():
+    class _UserPermsForm(formencode.Schema):
+        allow_extra_fields = True
+        filter_extra_fields = False
+        chained_validators = [v.ValidPerms(type_='user_group')]
+    return _UserPermsForm
+
+
 def RepoFieldForm():
     class _RepoFieldForm(formencode.Schema):
         filter_extra_fields = True
@@ -268,9 +283,10 @@
         rhodecode_show_private_icon = v.StringBoolean(if_missing=False)
         rhodecode_stylify_metatags = v.StringBoolean(if_missing=False)
 
-        rhodecode_lightweight_dashboard = v.StringBoolean(if_missing=False)
         rhodecode_repository_fields = v.StringBoolean(if_missing=False)
         rhodecode_lightweight_journal = v.StringBoolean(if_missing=False)
+        rhodecode_dashboard_items = v.Int(min=5, not_empty=True)
+        rhodecode_show_version = v.StringBoolean(if_missing=False)
 
     return _ApplicationVisualisationForm
 
@@ -297,22 +313,45 @@
 
 
 def DefaultPermissionsForm(repo_perms_choices, group_perms_choices,
-                           register_choices, create_choices, fork_choices):
+                           user_group_perms_choices, create_choices,
+                           repo_group_create_choices, user_group_create_choices,
+                           fork_choices, register_choices, extern_activate_choices):
     class _DefaultPermissionsForm(formencode.Schema):
         allow_extra_fields = True
         filter_extra_fields = True
         overwrite_default_repo = v.StringBoolean(if_missing=False)
         overwrite_default_group = v.StringBoolean(if_missing=False)
+        overwrite_default_user_group = v.StringBoolean(if_missing=False)
         anonymous = v.StringBoolean(if_missing=False)
         default_repo_perm = v.OneOf(repo_perms_choices)
         default_group_perm = v.OneOf(group_perms_choices)
-        default_register = v.OneOf(register_choices)
-        default_create = v.OneOf(create_choices)
+        default_user_group_perm = v.OneOf(user_group_perms_choices)
+
+        default_repo_create = v.OneOf(create_choices)
+        default_user_group_create = v.OneOf(user_group_create_choices)
+        #default_repo_group_create = v.OneOf(repo_group_create_choices) #not impl. yet
         default_fork = v.OneOf(fork_choices)
 
+        default_register = v.OneOf(register_choices)
+        default_extern_activate = v.OneOf(extern_activate_choices)
     return _DefaultPermissionsForm
 
 
+def CustomDefaultPermissionsForm():
+    class _CustomDefaultPermissionsForm(formencode.Schema):
+        filter_extra_fields = True
+        allow_extra_fields = True
+        inherit_default_permissions = v.StringBoolean(if_missing=False)
+
+        create_repo_perm = v.StringBoolean(if_missing=False)
+        create_user_group_perm = v.StringBoolean(if_missing=False)
+        #create_repo_group_perm Impl. later
+
+        fork_repo_perm = v.StringBoolean(if_missing=False)
+
+    return _CustomDefaultPermissionsForm
+
+
 def DefaultsForm(edit=False, old_data={}, supported_backends=BACKENDS.keys()):
     class _DefaultsForm(formencode.Schema):
         allow_extra_fields = True
@@ -383,3 +422,17 @@
         merge_rev = v.UnicodeString(strip=True, required=True)
 
     return _PullRequestForm
+
+
+def GistForm(lifetime_options):
+    class _GistForm(formencode.Schema):
+
+        filename = All(v.BasePath()(),
+                       v.UnicodeString(strip=True, required=False))
+        description = v.UnicodeString(required=False, if_missing='')
+        lifetime = v.OneOf(lifetime_options)
+        content = v.UnicodeString(required=True, not_empty=True)
+        public = v.UnicodeString(required=False, if_missing='')
+        private = v.UnicodeString(required=False, if_missing='')
+
+    return _GistForm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/model/gist.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.model.gist
+    ~~~~~~~~~~~~~~~~~~~~
+
+    gist model for RhodeCode
+
+    :created_on: May 9, 2013
+    :author: marcink
+    :copyright: (C) 2011-2013 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from __future__ import with_statement
+import os
+import time
+import logging
+import traceback
+import shutil
+
+from pylons.i18n.translation import _
+from rhodecode.lib.utils2 import safe_unicode, unique_id, safe_int, \
+    time_to_datetime, safe_str, AttributeDict
+from rhodecode.lib.compat import json
+from rhodecode.lib import helpers as h
+from rhodecode.model import BaseModel
+from rhodecode.model.db import Gist
+from rhodecode.model.repo import RepoModel
+from rhodecode.model.scm import ScmModel
+
+log = logging.getLogger(__name__)
+
+GIST_STORE_LOC = '.rc_gist_store'
+GIST_METADATA_FILE = '.rc_gist_metadata'
+
+
+class GistModel(BaseModel):
+
+    def _get_gist(self, gist):
+        """
+        Helper method to get gist by ID, or gist_access_id as a fallback
+
+        :param gist: GistID, gist_access_id, or Gist instance
+        """
+        return self._get_instance(Gist, gist,
+                                  callback=Gist.get_by_access_id)
+
+    def __delete_gist(self, gist):
+        """
+        removes gist from filesystem
+
+        :param gist: gist object
+        """
+        root_path = RepoModel().repos_path
+        rm_path = os.path.join(root_path, GIST_STORE_LOC, gist.gist_access_id)
+        log.info("Removing %s" % (rm_path))
+        shutil.rmtree(rm_path)
+
+    def get_gist(self, gist):
+        return self._get_gist(gist)
+
+    def get_gist_files(self, gist_access_id):
+        """
+        Get files for given gist
+
+        :param gist_access_id:
+        """
+        repo = Gist.get_by_access_id(gist_access_id)
+        cs = repo.scm_instance.get_changeset()
+        return (
+         cs, [n for n in cs.get_node('/')]
+        )
+
+    def create(self, description, owner, gist_mapping,
+               gist_type=Gist.GIST_PUBLIC, lifetime=-1):
+        """
+
+        :param description: description of the gist
+        :param owner: user who created this gist
+        :param gist_mapping: mapping {filename:{'content':content},...}
+        :param gist_type: type of gist private/public
+        :param lifetime: in minutes, -1 == forever
+        """
+        gist_id = safe_unicode(unique_id(20))
+        lifetime = safe_int(lifetime, -1)
+        gist_expires = time.time() + (lifetime * 60) if lifetime != -1 else -1
+        log.debug('set GIST expiration date to: %s'
+                  % (time_to_datetime(gist_expires)
+                   if gist_expires != -1 else 'forever'))
+        #create the Database version
+        gist = Gist()
+        gist.gist_description = description
+        gist.gist_access_id = gist_id
+        gist.gist_owner = owner.user_id
+        gist.gist_expires = gist_expires
+        gist.gist_type = safe_unicode(gist_type)
+        self.sa.add(gist)
+        self.sa.flush()
+        if gist_type == Gist.GIST_PUBLIC:
+            # use DB ID for easy to use GIST ID
+            gist_id = safe_unicode(gist.gist_id)
+            gist.gist_access_id = gist_id
+            self.sa.add(gist)
+
+        gist_repo_path = os.path.join(GIST_STORE_LOC, gist_id)
+        log.debug('Creating new %s GIST repo in %s' % (gist_type, gist_repo_path))
+        repo = RepoModel()._create_repo(repo_name=gist_repo_path, alias='hg',
+                                        parent=None)
+
+        processed_mapping = {}
+        for filename in gist_mapping:
+            if filename != os.path.basename(filename):
+                raise Exception('Filename cannot be inside a directory')
+
+            content = gist_mapping[filename]['content']
+            #TODO: expand support for setting explicit lexers
+#             if lexer is None:
+#                 try:
+#                     lexer = pygments.lexers.guess_lexer_for_filename(filename,content)
+#                 except pygments.util.ClassNotFound:
+#                     lexer = 'text'
+            processed_mapping[filename] = {'content': content}
+
+        # now create single multifile commit
+        message = 'added file'
+        message += 's: ' if len(processed_mapping) > 1 else ': '
+        message += ', '.join([x for x in processed_mapping])
+
+        #fake RhodeCode Repository object
+        fake_repo = AttributeDict(dict(
+            repo_name=gist_repo_path,
+            scm_instance_no_cache=lambda: repo,
+        ))
+        ScmModel().create_nodes(
+            user=owner.user_id, repo=fake_repo,
+            message=message,
+            nodes=processed_mapping,
+            trigger_push_hook=False
+        )
+        # store metadata inside the gist, this can be later used for imports
+        # or gist identification
+        metadata = {
+            'gist_db_id': gist.gist_id,
+            'gist_access_id': gist.gist_access_id,
+            'gist_owner_id': owner.user_id,
+            'gist_type': gist.gist_type,
+            'gist_exipres': gist.gist_expires
+        }
+        with open(os.path.join(repo.path, '.hg', GIST_METADATA_FILE), 'wb') as f:
+            f.write(json.dumps(metadata))
+        return gist
+
+    def delete(self, gist, fs_remove=True):
+        gist = self._get_gist(gist)
+
+        try:
+            self.sa.delete(gist)
+            if fs_remove:
+                self.__delete_gist(gist)
+            else:
+                log.debug('skipping removal from filesystem')
+
+        except Exception:
+            log.error(traceback.format_exc())
+            raise
--- a/rhodecode/model/notification.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/notification.py	Fri Jun 07 00:31:11 2013 +0200
@@ -85,6 +85,9 @@
                 obj = self._get_user(u)
                 if obj:
                     recipients_objs.append(obj)
+                else:
+                    # TODO: inform user that requested operation couldn't be completed
+                    log.error('cannot email unknown user %r', u)
             recipients_objs = set(recipients_objs)
             log.debug('sending notifications %s to %s' % (
                 type_, recipients_objs)
@@ -95,6 +98,7 @@
             log.debug('sending notifications %s to admins: %s' % (
                 type_, recipients_objs)
             )
+        # TODO: inform user who are notified
         notif = Notification.create(
             created_by=created_by_obj, subject=subject,
             body=body, recipients=recipients_objs, type_=type_
--- a/rhodecode/model/permission.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/permission.py	Fri Jun 07 00:31:11 2013 +0200
@@ -30,7 +30,7 @@
 
 from rhodecode.model import BaseModel
 from rhodecode.model.db import User, Permission, UserToPerm, UserRepoToPerm,\
-    UserRepoGroupToPerm
+    UserRepoGroupToPerm, UserUserGroupToPerm
 from rhodecode.lib.utils2 import str2bool
 
 log = logging.getLogger(__name__)
@@ -43,12 +43,62 @@
 
     cls = Permission
 
+    def create_permissions(self):
+        """
+        Create permissions for whole system
+        """
+        for p in Permission.PERMS:
+            if not Permission.get_by_key(p[0]):
+                new_perm = Permission()
+                new_perm.permission_name = p[0]
+                new_perm.permission_longname = p[0]  #translation err with p[1]
+                self.sa.add(new_perm)
+
+    def create_default_permissions(self, user):
+        """
+        Creates only missing default permissions for user
+
+        :param user:
+        """
+        user = self._get_user(user)
+
+        def _make_perm(perm):
+            new_perm = UserToPerm()
+            new_perm.user = user
+            new_perm.permission = Permission.get_by_key(perm)
+            return new_perm
+
+        def _get_group(perm_name):
+            return '.'.join(perm_name.split('.')[:1])
+
+        perms = UserToPerm.query().filter(UserToPerm.user == user).all()
+        defined_perms_groups = map(_get_group,
+                                (x.permission.permission_name for x in perms))
+        log.debug('GOT ALREADY DEFINED:%s' % perms)
+        DEFAULT_PERMS = Permission.DEFAULT_USER_PERMISSIONS
+
+        # for every default permission that needs to be created, we check if
+        # it's group is already defined, if it's not we create default perm
+        for perm_name in DEFAULT_PERMS:
+            gr = _get_group(perm_name)
+            if gr not in defined_perms_groups:
+                log.debug('GR:%s not found, creating permission %s'
+                          % (gr, perm_name))
+                new_perm = _make_perm(perm_name)
+                self.sa.add(new_perm)
+
     def update(self, form_result):
         perm_user = User.get_by_username(username=form_result['perm_user_name'])
-        u2p = self.sa.query(UserToPerm).filter(UserToPerm.user == perm_user).all()
 
         try:
+            # stage 1 set anonymous access
+            if perm_user.username == 'default':
+                perm_user.active = str2bool(form_result['anonymous'])
+                self.sa.add(perm_user)
+
+            # stage 2 reset defaults and set them from form data
             def _make_new(usr, perm_name):
+                log.debug('Creating new permission:%s' % (perm_name))
                 new = UserToPerm()
                 new.user = usr
                 new.permission = Permission.get_by_key(perm_name)
@@ -56,17 +106,24 @@
             # clear current entries, to make this function idempotent
             # it will fix even if we define more permissions or permissions
             # are somehow missing
+            u2p = self.sa.query(UserToPerm)\
+                .filter(UserToPerm.user == perm_user)\
+                .all()
             for p in u2p:
                 self.sa.delete(p)
             #create fresh set of permissions
             for def_perm_key in ['default_repo_perm', 'default_group_perm',
-                                 'default_register', 'default_create',
-                                 'default_fork']:
+                                 'default_user_group_perm',
+                                 'default_repo_create',
+                                 #'default_repo_group_create', #not implemented yet
+                                 'default_user_group_create',
+                                 'default_fork', 'default_register',
+                                 'default_extern_activate']:
                 p = _make_new(perm_user, form_result[def_perm_key])
                 self.sa.add(p)
 
-            #stage 2 update all default permissions for repos if checked
-            if form_result['overwrite_default_repo'] == True:
+            #stage 3 update all default permissions for repos if checked
+            if form_result['overwrite_default_repo']:
                 _def_name = form_result['default_repo_perm'].split('repository.')[-1]
                 _def = Permission.get_by_key('repository.' + _def_name)
                 # repos
@@ -79,7 +136,7 @@
                         r2p.permission = _def
                         self.sa.add(r2p)
 
-            if form_result['overwrite_default_group'] == True:
+            if form_result['overwrite_default_group']:
                 _def_name = form_result['default_group_perm'].split('group.')[-1]
                 # groups
                 _def = Permission.get_by_key('group.' + _def_name)
@@ -89,10 +146,15 @@
                     g2p.permission = _def
                     self.sa.add(g2p)
 
-            # stage 3 set anonymous access
-            if perm_user.username == 'default':
-                perm_user.active = str2bool(form_result['anonymous'])
-                self.sa.add(perm_user)
+            if form_result['overwrite_default_user_group']:
+                _def_name = form_result['default_user_group_perm'].split('usergroup.')[-1]
+                # groups
+                _def = Permission.get_by_key('usergroup.' + _def_name)
+                for g2p in self.sa.query(UserUserGroupToPerm)\
+                               .filter(UserUserGroupToPerm.user == perm_user)\
+                               .all():
+                    g2p.permission = _def
+                    self.sa.add(g2p)
 
             self.sa.commit()
         except (DatabaseError,):
--- a/rhodecode/model/pull_request.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/pull_request.py	Fri Jun 07 00:31:11 2013 +0200
@@ -25,21 +25,17 @@
 
 import logging
 import datetime
-import re
 
 from pylons.i18n.translation import _
 
 from rhodecode.model.meta import Session
-from rhodecode.lib import helpers as h, unionrepo
+from rhodecode.lib import helpers as h
 from rhodecode.model import BaseModel
 from rhodecode.model.db import PullRequest, PullRequestReviewers, Notification,\
     ChangesetStatus
 from rhodecode.model.notification import NotificationModel
 from rhodecode.lib.utils2 import safe_unicode
 
-from rhodecode.lib.vcs.utils.hgcompat import scmutil
-from rhodecode.lib.vcs.utils import safe_str
-from rhodecode.lib.vcs.backends.base import EmptyChangeset
 
 log = logging.getLogger(__name__)
 
@@ -93,8 +89,6 @@
         revision_data = [(x.raw_id, x.message)
                          for x in map(org_repo.get_changeset, revisions)]
         #notification to reviewers
-        notif = NotificationModel()
-
         pr_url = h.url('pullrequest_show', repo_name=other_repo.repo_name,
                        pull_request_id=new.pull_request_id,
                        qualified=True,
@@ -118,9 +112,9 @@
             'pr_revisions': revision_data
         }
 
-        notif.create(created_by=created_by_user, subject=subject, body=body,
-                     recipients=reviewers,
-                     type_=Notification.TYPE_PULL_REQUEST, email_kwargs=kwargs)
+        NotificationModel().create(created_by=created_by_user, subject=subject, body=body,
+                                   recipients=reviewers,
+                                   type_=Notification.TYPE_PULL_REQUEST, email_kwargs=kwargs)
         return new
 
     def update_reviewers(self, pull_request, reviewers_ids):
@@ -160,102 +154,3 @@
         pull_request.status = PullRequest.STATUS_CLOSED
         pull_request.updated_on = datetime.datetime.now()
         Session().add(pull_request)
-
-    def _get_changesets(self, alias, org_repo, org_ref, other_repo, other_ref, merge):
-        """
-        Returns a list of changesets that can be merged from org_repo@org_ref
-        to other_repo@other_ref ... and the ancestor that would be used for merge
-
-        :param org_repo:
-        :param org_ref:
-        :param other_repo:
-        :param other_ref:
-        :param tmp:
-        """
-
-        ancestor = None
-
-        if alias == 'hg':
-            # lookup up the exact node id
-            _revset_predicates = {
-                    'branch': 'branch',
-                    'book': 'bookmark',
-                    'tag': 'tag',
-                    'rev': 'id',
-                }
-
-            org_rev_spec = "%s('%s')" % (_revset_predicates[org_ref[0]],
-                                         safe_str(org_ref[1]))
-            if org_ref[1] == EmptyChangeset().raw_id:
-                org_rev = org_ref[1]
-            else:
-                org_rev = org_repo._repo[scmutil.revrange(org_repo._repo,
-                                                          [org_rev_spec])[-1]]
-            other_rev_spec = "%s('%s')" % (_revset_predicates[other_ref[0]],
-                                           safe_str(other_ref[1]))
-            if other_ref[1] == EmptyChangeset().raw_id:
-                other_rev = other_ref[1]
-            else:
-                other_rev = other_repo._repo[scmutil.revrange(other_repo._repo,
-                                                        [other_rev_spec])[-1]]
-
-            #case two independent repos
-            if org_repo != other_repo:
-                hgrepo = unionrepo.unionrepository(other_repo.baseui,
-                                                   other_repo.path,
-                                                   org_repo.path)
-                # all the changesets we are looking for will be in other_repo,
-                # so rev numbers from hgrepo can be used in other_repo
-
-            #no remote compare do it on the same repository
-            else:
-                hgrepo = other_repo._repo
-
-            if merge:
-                revs = ["ancestors(id('%s')) and not ancestors(id('%s')) and not id('%s')" %
-                        (other_rev, org_rev, org_rev)]
-
-                ancestors = scmutil.revrange(hgrepo,
-                     ["ancestor(id('%s'), id('%s'))" % (org_rev, other_rev)])
-                if len(ancestors) == 1:
-                    ancestor = hgrepo[ancestors[0]].hex()
-            else:
-                # TODO: have both + and - changesets
-                revs = ["id('%s') :: id('%s') - id('%s')" %
-                        (org_rev, other_rev, org_rev)]
-
-            changesets = [other_repo.get_changeset(cs)
-                          for cs in scmutil.revrange(hgrepo, revs)]
-
-        elif alias == 'git':
-            assert org_repo == other_repo, (org_repo, other_repo) # no git support for different repos
-            so, se = org_repo.run_git_command(
-                'log --reverse --pretty="format: %%H" -s -p %s..%s' % (org_ref[1],
-                                                                       other_ref[1])
-            )
-            changesets = [org_repo.get_changeset(cs)
-                          for cs in re.findall(r'[0-9a-fA-F]{40}', so)]
-
-        return changesets, ancestor
-
-    def get_compare_data(self, org_repo, org_ref, other_repo, other_ref, merge):
-        """
-        Returns incoming changesets for mercurial repositories
-
-        :param org_repo:
-        :param org_ref:
-        :param other_repo:
-        :param other_ref:
-        """
-
-        if len(org_ref) != 2 or not isinstance(org_ref, (list, tuple)):
-            raise Exception('org_ref must be a two element list/tuple')
-
-        if len(other_ref) != 2 or not isinstance(org_ref, (list, tuple)):
-            raise Exception('other_ref must be a two element list/tuple')
-
-        cs_ranges, ancestor = self._get_changesets(org_repo.scm_instance.alias,
-                                                   org_repo.scm_instance, org_ref,
-                                                   other_repo.scm_instance, other_ref,
-                                                   merge)
-        return cs_ranges, ancestor
--- a/rhodecode/model/repo.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/repo.py	Fri Jun 07 00:31:11 2013 +0200
@@ -41,8 +41,9 @@
     Statistics, UserGroup, UserGroupRepoToPerm, RhodeCodeUi, RepoGroup,\
     RhodeCodeSetting, RepositoryField
 from rhodecode.lib import helpers as h
-from rhodecode.lib.auth import HasRepoPermissionAny
+from rhodecode.lib.auth import HasRepoPermissionAny, HasUserGroupPermissionAny
 from rhodecode.lib.exceptions import AttachedForksError
+from rhodecode.model.scm import UserGroupList
 
 log = logging.getLogger(__name__)
 
@@ -52,14 +53,33 @@
     cls = Repository
     URL_SEPARATOR = Repository.url_sep()
 
-    def __get_users_group(self, users_group):
+    def _get_user_group(self, users_group):
         return self._get_instance(UserGroup, users_group,
                                   callback=UserGroup.get_by_group_name)
 
-    def _get_repos_group(self, repos_group):
+    def _get_repo_group(self, repos_group):
         return self._get_instance(RepoGroup, repos_group,
                                   callback=RepoGroup.get_by_group_name)
 
+    def _create_default_perms(self, repository, private):
+        # create default permission
+        default = 'repository.read'
+        def_user = User.get_default_user()
+        for p in def_user.user_perms:
+            if p.permission.permission_name.startswith('repository.'):
+                default = p.permission.permission_name
+                break
+
+        default_perm = 'repository.none' if private else default
+
+        repo_to_perm = UserRepoToPerm()
+        repo_to_perm.permission = Permission.get_by_key(default_perm)
+
+        repo_to_perm.repository = repository
+        repo_to_perm.user_id = def_user.user_id
+
+        return repo_to_perm
+
     @LazyProperty
     def repos_path(self):
         """
@@ -95,7 +115,6 @@
         Get's all repositories that user have at least read access
 
         :param user:
-        :type user:
         """
         from rhodecode.lib.auth import AuthUser
         user = self._get_user(user)
@@ -121,7 +140,9 @@
     def get_users_groups_js(self):
         users_groups = self.sa.query(UserGroup)\
             .filter(UserGroup.users_group_active == True).all()
-
+        users_groups = UserGroupList(users_groups, perm_set=['usergroup.read',
+                                                             'usergroup.write',
+                                                             'usergroup.admin'])
         return json.dumps([
             {
              'id': gr.users_group_id,
@@ -153,6 +174,7 @@
     def get_repos_as_dict(self, repos_list=None, admin=False, perm_check=True,
                           super_user_actions=False):
         _render = self._render_datatable
+        from pylons import tmpl_context as c
 
         def quick_menu(repo_name):
             return _render('quick_menu', repo_name)
@@ -176,7 +198,6 @@
                            cs_cache.get('message'))
 
         def desc(desc):
-            from pylons import tmpl_context as c
             if c.visual.stylify_metatags:
                 return h.urlify_text(h.desc_stylize(h.truncate(desc, 60)))
             else:
@@ -336,7 +357,7 @@
 
         owner = self._get_user(owner)
         fork_of = self._get_repo(fork_of)
-        repos_group = self._get_repos_group(repos_group)
+        repos_group = self._get_repo_group(repos_group)
         try:
 
             # repo name is just a name of repository
@@ -369,26 +390,6 @@
 
             self.sa.add(new_repo)
 
-            def _create_default_perms():
-                # create default permission
-                repo_to_perm = UserRepoToPerm()
-                default = 'repository.read'
-                for p in User.get_by_username('default').user_perms:
-                    if p.permission.permission_name.startswith('repository.'):
-                        default = p.permission.permission_name
-                        break
-
-                default_perm = 'repository.none' if private else default
-
-                repo_to_perm.permission_id = self.sa.query(Permission)\
-                        .filter(Permission.permission_name == default_perm)\
-                        .one().permission_id
-
-                repo_to_perm.repository = new_repo
-                repo_to_perm.user_id = User.get_by_username('default').user_id
-
-                self.sa.add(repo_to_perm)
-
             if fork_of:
                 if copy_fork_permissions:
                     repo = fork_of
@@ -405,9 +406,11 @@
                         UserGroupRepoToPerm.create(perm.users_group, new_repo,
                                                     perm.permission)
                 else:
-                    _create_default_perms()
+                    perm_obj = self._create_default_perms(new_repo, private)
+                    self.sa.add(perm_obj)
             else:
-                _create_default_perms()
+                perm_obj = self._create_default_perms(new_repo, private)
+                self.sa.add(perm_obj)
 
             if not just_db:
                 self.__create_repo(repo_name, repo_type,
@@ -456,6 +459,41 @@
             enable_statistics, enable_locking, enable_downloads
         )
 
+    def _update_permissions(self, repo, perms_new=None, perms_updates=None,
+                            check_perms=True):
+        if not perms_new:
+            perms_new = []
+        if not perms_updates:
+            perms_updates = []
+
+        # update permissions
+        for member, perm, member_type in perms_updates:
+            if member_type == 'user':
+                # this updates existing one
+                self.grant_user_permission(
+                    repo=repo, user=member, perm=perm
+                )
+            else:
+                #check if we have permissions to alter this usergroup
+                req_perms = ('usergroup.read', 'usergroup.write', 'usergroup.admin')
+                if not check_perms or HasUserGroupPermissionAny(*req_perms)(member):
+                    self.grant_users_group_permission(
+                        repo=repo, group_name=member, perm=perm
+                    )
+        # set new permissions
+        for member, perm, member_type in perms_new:
+            if member_type == 'user':
+                self.grant_user_permission(
+                    repo=repo, user=member, perm=perm
+                )
+            else:
+                #check if we have permissions to alter this usergroup
+                req_perms = ('usergroup.read', 'usergroup.write', 'usergroup.admin')
+                if not check_perms or HasUserGroupPermissionAny(*req_perms)(member):
+                    self.grant_users_group_permission(
+                        repo=repo, group_name=member, perm=perm
+                    )
+
     def create_fork(self, form_data, cur_user):
         """
         Simple wrapper into executing celery task for fork creation
@@ -466,7 +504,7 @@
         from rhodecode.lib.celerylib import tasks, run_task
         run_task(tasks.create_repo_fork, form_data, cur_user)
 
-    def delete(self, repo, forks=None):
+    def delete(self, repo, forks=None, fs_remove=True):
         """
         Delete given repository, forks parameter defines what do do with
         attached forks. Throws AttachedForksError if deleted repo has attached
@@ -474,6 +512,7 @@
 
         :param repo:
         :param forks: str 'delete' or 'detach'
+        :param fs_remove: remove(archive) repo from filesystem
         """
         repo = self._get_repo(repo)
         if repo:
@@ -491,7 +530,10 @@
             owner = repo.user
             try:
                 self.sa.delete(repo)
-                self.__delete_repo(repo)
+                if fs_remove:
+                    self.__delete_repo(repo)
+                else:
+                    log.debug('skipping removal from filesystem')
                 log_delete_repository(old_repo_dict,
                                       deleted_by=owner.username)
             except Exception:
@@ -555,7 +597,7 @@
         :param perm: Instance of Permission, or permission_name
         """
         repo = self._get_repo(repo)
-        group_name = self.__get_users_group(group_name)
+        group_name = self._get_user_group(group_name)
         permission = self._get_perm(perm)
 
         # check if we have that permission already
@@ -583,7 +625,7 @@
             or user group name
         """
         repo = self._get_repo(repo)
-        group_name = self.__get_users_group(group_name)
+        group_name = self._get_user_group(group_name)
 
         obj = self.sa.query(UserGroupRepoToPerm)\
             .filter(UserGroupRepoToPerm.repository == repo)\
@@ -609,7 +651,13 @@
             log.error(traceback.format_exc())
             raise
 
-    def __create_repo(self, repo_name, alias, parent, clone_uri=False):
+    def _create_repo(self, repo_name, alias, parent, clone_uri=False,
+                     repo_store_location=None):
+        return self.__create_repo(repo_name, alias, parent, clone_uri,
+                                  repo_store_location)
+
+    def __create_repo(self, repo_name, alias, parent, clone_uri=False,
+                      repo_store_location=None):
         """
         makes repository on filesystem. It's group aware means it'll create
         a repository within a group, and alter the paths accordingly of
@@ -619,6 +667,7 @@
         :param alias:
         :param parent_id:
         :param clone_uri:
+        :param repo_path:
         """
         from rhodecode.lib.utils import is_valid_repo, is_valid_repos_group
         from rhodecode.model.scm import ScmModel
@@ -627,10 +676,12 @@
             new_parent_path = os.sep.join(parent.full_path_splitted)
         else:
             new_parent_path = ''
-
+        if repo_store_location:
+            _paths = [repo_store_location]
+        else:
+            _paths = [self.repos_path, new_parent_path, repo_name]
         # we need to make it str for mercurial
-        repo_path = os.path.join(*map(lambda x: safe_str(x),
-                                [self.repos_path, new_parent_path, repo_name]))
+        repo_path = os.path.join(*map(lambda x: safe_str(x), _paths))
 
         # check if this path is not a repository
         if is_valid_repo(repo_path, self.repos_path):
@@ -647,13 +698,14 @@
         )
         backend = get_backend(alias)
         if alias == 'hg':
-            backend(repo_path, create=True, src_url=clone_uri)
+            repo = backend(repo_path, create=True, src_url=clone_uri)
         elif alias == 'git':
-            r = backend(repo_path, create=True, src_url=clone_uri, bare=True)
+            repo = backend(repo_path, create=True, src_url=clone_uri, bare=True)
             # add rhodecode hook into this repo
-            ScmModel().install_git_hook(repo=r)
+            ScmModel().install_git_hook(repo=repo)
         else:
             raise Exception('Undefined alias %s' % alias)
+        return repo
 
     def __rename_repo(self, old, new):
         """
--- a/rhodecode/model/repos_group.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/repos_group.py	Fri Jun 07 00:31:11 2013 +0200
@@ -42,11 +42,11 @@
 
     cls = RepoGroup
 
-    def __get_users_group(self, users_group):
+    def _get_user_group(self, users_group):
         return self._get_instance(UserGroup, users_group,
                                   callback=UserGroup.get_by_group_name)
 
-    def _get_repos_group(self, repos_group):
+    def _get_repo_group(self, repos_group):
         return self._get_instance(RepoGroup, repos_group,
                                   callback=RepoGroup.get_by_group_name)
 
@@ -61,21 +61,19 @@
 
     def _create_default_perms(self, new_group):
         # create default permission
-        repo_group_to_perm = UserRepoGroupToPerm()
         default_perm = 'group.read'
-        for p in User.get_by_username('default').user_perms:
+        def_user = User.get_default_user()
+        for p in def_user.user_perms:
             if p.permission.permission_name.startswith('group.'):
                 default_perm = p.permission.permission_name
                 break
 
-        repo_group_to_perm.permission_id = self.sa.query(Permission)\
-                .filter(Permission.permission_name == default_perm)\
-                .one().permission_id
+        repo_group_to_perm = UserRepoGroupToPerm()
+        repo_group_to_perm.permission = Permission.get_by_key(default_perm)
 
         repo_group_to_perm.group = new_group
-        repo_group_to_perm.user_id = User.get_by_username('default').user_id
-
-        self.sa.add(repo_group_to_perm)
+        repo_group_to_perm.user_id = def_user.user_id
+        return repo_group_to_perm
 
     def __create_group(self, group_name):
         """
@@ -142,18 +140,22 @@
 
     def create(self, group_name, group_description, owner, parent=None, just_db=False):
         try:
+            user = self._get_user(owner)
             new_repos_group = RepoGroup()
+            new_repos_group.user = user
             new_repos_group.group_description = group_description or group_name
-            new_repos_group.parent_group = self._get_repos_group(parent)
+            new_repos_group.parent_group = self._get_repo_group(parent)
             new_repos_group.group_name = new_repos_group.get_new_name(group_name)
 
             self.sa.add(new_repos_group)
-            self._create_default_perms(new_repos_group)
+            perm_obj = self._create_default_perms(new_repos_group)
+            self.sa.add(perm_obj)
 
-            #create an ADMIN permission for owner, later owner should go into
-            #the owner field of groups
-            self.grant_user_permission(repos_group=new_repos_group,
-                                       user=owner, perm='group.admin')
+            #create an ADMIN permission for owner except if we're super admin,
+            #later owner should go into the owner field of groups
+            if not user.is_admin:
+                self.grant_user_permission(repos_group=new_repos_group,
+                                           user=owner, perm='group.admin')
 
             if not just_db:
                 # we need to flush here, in order to check if database won't
@@ -167,8 +169,11 @@
             raise
 
     def _update_permissions(self, repos_group, perms_new=None,
-                            perms_updates=None, recursive=False):
+                            perms_updates=None, recursive=False,
+                            check_perms=True):
         from rhodecode.model.repo import RepoModel
+        from rhodecode.lib.auth import HasUserGroupPermissionAny
+
         if not perms_new:
             perms_new = []
         if not perms_updates:
@@ -176,7 +181,7 @@
 
         def _set_perm_user(obj, user, perm):
             if isinstance(obj, RepoGroup):
-                ReposGroupModel().grant_user_permission(
+                self.grant_user_permission(
                     repos_group=obj, user=user, perm=perm
                 )
             elif isinstance(obj, Repository):
@@ -193,7 +198,7 @@
 
         def _set_perm_group(obj, users_group, perm):
             if isinstance(obj, RepoGroup):
-                ReposGroupModel().grant_users_group_permission(
+                self.grant_users_group_permission(
                     repos_group=obj, group_name=users_group, perm=perm
                 )
             elif isinstance(obj, Repository):
@@ -220,13 +225,19 @@
                     _set_perm_user(obj, user=member, perm=perm)
                 ## set for user group
                 else:
-                    _set_perm_group(obj, users_group=member, perm=perm)
+                    #check if we have permissions to alter this usergroup
+                    req_perms = ('usergroup.read', 'usergroup.write', 'usergroup.admin')
+                    if not check_perms or HasUserGroupPermissionAny(*req_perms)(member):
+                        _set_perm_group(obj, users_group=member, perm=perm)
             # set new permissions
             for member, perm, member_type in perms_new:
                 if member_type == 'user':
                     _set_perm_user(obj, user=member, perm=perm)
                 else:
-                    _set_perm_group(obj, users_group=member, perm=perm)
+                    #check if we have permissions to alter this usergroup
+                    req_perms = ('usergroup.read', 'usergroup.write', 'usergroup.admin')
+                    if not check_perms or HasUserGroupPermissionAny(*req_perms)(member):
+                        _set_perm_group(obj, users_group=member, perm=perm)
             updates.append(obj)
             #if it's not recursive call
             # break the loop and don't proceed with other changes
@@ -237,14 +248,7 @@
     def update(self, repos_group, form_data):
 
         try:
-            repos_group = self._get_repos_group(repos_group)
-            recursive = form_data['recursive']
-            # iterate over all members(if in recursive mode) of this groups and
-            # set the permissions !
-            # this can be potentially heavy operation
-            self._update_permissions(repos_group, form_data['perms_new'],
-                                     form_data['perms_updates'], recursive)
-
+            repos_group = self._get_repo_group(repos_group)
             old_path = repos_group.full_path
 
             # change properties
@@ -288,7 +292,7 @@
             raise
 
     def delete(self, repos_group, force_delete=False):
-        repos_group = self._get_repos_group(repos_group)
+        repos_group = self._get_repo_group(repos_group)
         try:
             self.sa.delete(repos_group)
             self.__delete_group(repos_group, force_delete)
@@ -307,7 +311,7 @@
         :param recursive: recurse to all children of group
         """
         from rhodecode.model.repo import RepoModel
-        repos_group = self._get_repos_group(repos_group)
+        repos_group = self._get_repo_group(repos_group)
 
         for el in repos_group.recursive_groups_and_repos():
             if not recursive:
@@ -346,7 +350,7 @@
         :param perm: Instance of Permission, or permission_name
         """
 
-        repos_group = self._get_repos_group(repos_group)
+        repos_group = self._get_repo_group(repos_group)
         user = self._get_user(user)
         permission = self._get_perm(perm)
 
@@ -373,7 +377,7 @@
         :param user: Instance of User, user_id or username
         """
 
-        repos_group = self._get_repos_group(repos_group)
+        repos_group = self._get_repo_group(repos_group)
         user = self._get_user(user)
 
         obj = self.sa.query(UserRepoGroupToPerm)\
@@ -395,8 +399,8 @@
             or user group name
         :param perm: Instance of Permission, or permission_name
         """
-        repos_group = self._get_repos_group(repos_group)
-        group_name = self.__get_users_group(group_name)
+        repos_group = self._get_repo_group(repos_group)
+        group_name = self._get_user_group(group_name)
         permission = self._get_perm(perm)
 
         # check if we have that permission already
@@ -424,8 +428,8 @@
         :param group_name: Instance of UserGroup, users_group_id,
             or user group name
         """
-        repos_group = self._get_repos_group(repos_group)
-        group_name = self.__get_users_group(group_name)
+        repos_group = self._get_repo_group(repos_group)
+        group_name = self._get_user_group(group_name)
 
         obj = self.sa.query(UserGroupRepoGroupToPerm)\
             .filter(UserGroupRepoGroupToPerm.group == repos_group)\
--- a/rhodecode/model/scm.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/scm.py	Fri Jun 07 00:31:11 2013 +0200
@@ -30,7 +30,7 @@
 import logging
 import cStringIO
 import pkg_resources
-from os.path import dirname as dn, join as jn
+from os.path import join as jn
 
 from sqlalchemy import func
 from pylons.i18n.translation import _
@@ -46,13 +46,15 @@
 from rhodecode.lib import helpers as h
 from rhodecode.lib.utils2 import safe_str, safe_unicode, get_server_url,\
     _set_extras
-from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny
+from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny,\
+    HasUserGroupPermissionAny
 from rhodecode.lib.utils import get_filesystem_repos, make_ui, \
-    action_logger, REMOVED_REPO_PAT
+    action_logger
 from rhodecode.model import BaseModel
 from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \
     UserFollowing, UserLog, User, RepoGroup, PullRequest
 from rhodecode.lib.hooks import log_push_action
+from rhodecode.lib.exceptions import NonRelativePathError
 
 log = logging.getLogger(__name__)
 
@@ -96,16 +98,15 @@
         return '<%s (%s)>' % (self.__class__.__name__, self.__len__())
 
     def __iter__(self):
-        # pre-propagated cache_map to save executing select statements
+        # pre-propagated valid_cache_keys to save executing select statements
         # for each repo
-        cache_map = CacheInvalidation.get_cache_map()
+        valid_cache_keys = CacheInvalidation.get_valid_cache_keys()
 
         for dbr in self.db_repo_list:
-            scmr = dbr.scm_instance_cached(cache_map)
+            scmr = dbr.scm_instance_cached(valid_cache_keys)
             # check permission at this level
             if not HasRepoPermissionAny(
-                *self.perm_set
-            )(dbr.repo_name, 'get repo check'):
+                *self.perm_set)(dbr.repo_name, 'get repo check'):
                 continue
 
             try:
@@ -150,8 +151,7 @@
         for dbr in self.db_repo_list:
             # check permission at this level
             if not HasRepoPermissionAny(
-                *self.perm_set
-            )(dbr.repo_name, 'get repo check'):
+                *self.perm_set)(dbr.repo_name, 'get repo check'):
                 continue
 
             tmp_d = {}
@@ -165,36 +165,69 @@
             yield tmp_d
 
 
-class GroupList(object):
-
-    def __init__(self, db_repo_group_list, perm_set=None):
+class _PermCheckIterator(object):
+    def __init__(self, obj_list, obj_attr, perm_set, perm_checker):
         """
-        Creates iterator from given list of group objects, additionally
+        Creates iterator from given list of objects, additionally
         checking permission for them from perm_set var
 
-        :param db_repo_group_list:
-        :param perm_set: list of permissons to check
+        :param obj_list: list of db objects
+        :param obj_attr: attribute of object to pass into perm_checker
+        :param perm_set: list of permissions to check
+        :param perm_checker: callable to check permissions against
         """
-        self.db_repo_group_list = db_repo_group_list
-        if not perm_set:
-            perm_set = ['group.read', 'group.write', 'group.admin']
+        self.obj_list = obj_list
+        self.obj_attr = obj_attr
         self.perm_set = perm_set
+        self.perm_checker = perm_checker
 
     def __len__(self):
-        return len(self.db_repo_group_list)
+        return len(self.obj_list)
 
     def __repr__(self):
         return '<%s (%s)>' % (self.__class__.__name__, self.__len__())
 
     def __iter__(self):
-        for dbgr in self.db_repo_group_list:
+        for db_obj in self.obj_list:
             # check permission at this level
-            if not HasReposGroupPermissionAny(
-                *self.perm_set
-            )(dbgr.group_name, 'get group repo check'):
+            name = getattr(db_obj, self.obj_attr, None)
+            if not self.perm_checker(*self.perm_set)(name, self.__class__.__name__):
                 continue
 
-            yield dbgr
+            yield db_obj
+
+
+class RepoList(_PermCheckIterator):
+
+    def __init__(self, db_repo_list, perm_set=None):
+        if not perm_set:
+            perm_set = ['repository.read', 'repository.write', 'repository.admin']
+
+        super(RepoList, self).__init__(obj_list=db_repo_list,
+                    obj_attr='repo_name', perm_set=perm_set,
+                    perm_checker=HasRepoPermissionAny)
+
+
+class RepoGroupList(_PermCheckIterator):
+
+    def __init__(self, db_repo_group_list, perm_set=None):
+        if not perm_set:
+            perm_set = ['group.read', 'group.write', 'group.admin']
+
+        super(RepoGroupList, self).__init__(obj_list=db_repo_group_list,
+                    obj_attr='group_name', perm_set=perm_set,
+                    perm_checker=HasReposGroupPermissionAny)
+
+
+class UserGroupList(_PermCheckIterator):
+
+    def __init__(self, db_user_group_list, perm_set=None):
+        if not perm_set:
+            perm_set = ['usergroup.read', 'usergroup.write', 'usergroup.admin']
+
+        super(UserGroupList, self).__init__(obj_list=db_user_group_list,
+                    obj_attr='users_group_name', perm_set=perm_set,
+                    perm_checker=HasUserGroupPermissionAny)
 
 
 class ScmModel(BaseModel):
@@ -293,20 +326,18 @@
         if all_groups is None:
             all_groups = RepoGroup.query()\
                 .filter(RepoGroup.group_parent_id == None).all()
-        return [x for x in GroupList(all_groups)]
+        return [x for x in RepoGroupList(all_groups)]
 
     def mark_for_invalidation(self, repo_name):
         """
-        Puts cache invalidation task into db for
-        further global cache invalidation
+        Mark caches of this repo invalid in the database.
 
-        :param repo_name: this repo that should invalidation take place
+        :param repo_name: the repo for which caches should be marked invalid
         """
-        invalidated_keys = CacheInvalidation.set_invalidate(repo_name=repo_name)
+        CacheInvalidation.set_invalidate(repo_name)
         repo = Repository.get_by_repo_name(repo_name)
         if repo:
             repo.update_changeset_cache()
-        return invalidated_keys
 
     def toggle_following_repo(self, follow_repo_id, user_id):
 
@@ -455,12 +486,15 @@
         :param scm_type:
         """
         if scm_type == 'hg':
-            from rhodecode.lib.vcs.backends.hg import \
-                MercurialInMemoryChangeset as IMC
-        elif scm_type == 'git':
-            from rhodecode.lib.vcs.backends.git import \
-                GitInMemoryChangeset as IMC
-        return IMC
+            from rhodecode.lib.vcs.backends.hg import MercurialInMemoryChangeset
+            return MercurialInMemoryChangeset
+
+        if scm_type == 'git':
+            from rhodecode.lib.vcs.backends.git import GitInMemoryChangeset
+            return GitInMemoryChangeset
+
+        raise Exception('Invalid scm_type, must be one of hg,git got %s'
+                        % (scm_type,))
 
     def pull_changes(self, repo, username):
         dbrepo = self.__get_repo(repo)
@@ -473,6 +507,14 @@
         try:
             if repo.alias == 'git':
                 repo.fetch(clone_uri)
+                # git doesn't really have something like post-fetch action
+                # we fake that now. #TODO: extract fetched revisions somehow
+                # here
+                self._handle_push(repo,
+                                  username=username,
+                                  action='push_remote',
+                                  repo_name=repo_name,
+                                  revisions=[])
             else:
                 self._handle_rc_scm_extras(username, dbrepo.repo_name,
                                            repo.alias, action='push_remote')
@@ -516,44 +558,76 @@
                           revisions=[tip.raw_id])
         return tip
 
-    def create_node(self, repo, repo_name, cs, user, author, message, content,
-                      f_path):
+    def create_nodes(self, user, repo, message, nodes, parent_cs=None,
+                     author=None, trigger_push_hook=True):
+        """
+        Commits given multiple nodes into repo
+
+        :param user: RhodeCode User object or user_id, the commiter
+        :param repo: RhodeCode Repository object
+        :param message: commit message
+        :param nodes: mapping {filename:{'content':content},...}
+        :param parent_cs: parent changeset, can be empty than it's initial commit
+        :param author: author of commit, cna be different that commiter only for git
+        :param trigger_push_hook: trigger push hooks
+
+        :returns: new commited changeset
+        """
+
         user = self._get_user(user)
-        IMC = self._get_IMC_module(repo.alias)
+        scm_instance = repo.scm_instance_no_cache()
 
-        # decoding here will force that we have proper encoded values
-        # in any other case this will throw exceptions and deny commit
-        if isinstance(content, (basestring,)):
-            content = safe_str(content)
-        elif isinstance(content, (file, cStringIO.OutputType,)):
-            content = content.read()
-        else:
-            raise Exception('Content is of unrecognized type %s' % (
-                type(content)
-            ))
+        processed_nodes = []
+        for f_path in nodes:
+            if f_path.startswith('/') or f_path.startswith('.') or '../' in f_path:
+                raise NonRelativePathError('%s is not an relative path' % f_path)
+            if f_path:
+                f_path = os.path.normpath(f_path)
+            content = nodes[f_path]['content']
+            f_path = safe_str(f_path)
+            # decoding here will force that we have proper encoded values
+            # in any other case this will throw exceptions and deny commit
+            if isinstance(content, (basestring,)):
+                content = safe_str(content)
+            elif isinstance(content, (file, cStringIO.OutputType,)):
+                content = content.read()
+            else:
+                raise Exception('Content is of unrecognized type %s' % (
+                    type(content)
+                ))
+            processed_nodes.append((f_path, content))
 
         message = safe_unicode(message)
-        author = safe_unicode(author)
-        path = safe_str(f_path)
-        m = IMC(repo)
+        commiter = user.full_contact
+        author = safe_unicode(author) if author else commiter
 
-        if isinstance(cs, EmptyChangeset):
+        IMC = self._get_IMC_module(scm_instance.alias)
+        imc = IMC(scm_instance)
+
+        if not parent_cs:
+            parent_cs = EmptyChangeset(alias=scm_instance.alias)
+
+        if isinstance(parent_cs, EmptyChangeset):
             # EmptyChangeset means we we're editing empty repository
             parents = None
         else:
-            parents = [cs]
-
-        m.add(FileNode(path, content=content))
-        tip = m.commit(message=message,
-                       author=author,
-                       parents=parents, branch=cs.branch)
+            parents = [parent_cs]
+        # add multiple nodes
+        for path, content in processed_nodes:
+            imc.add(FileNode(path, content=content))
 
-        self.mark_for_invalidation(repo_name)
-        self._handle_push(repo,
-                          username=user.username,
-                          action='push_local',
-                          repo_name=repo_name,
-                          revisions=[tip.raw_id])
+        tip = imc.commit(message=message,
+                         author=author,
+                         parents=parents,
+                         branch=parent_cs.branch)
+
+        self.mark_for_invalidation(repo.repo_name)
+        if trigger_push_hook:
+            self._handle_push(scm_instance,
+                              username=user.username,
+                              action='push_local',
+                              repo_name=repo.repo_name,
+                              revisions=[tip.raw_id])
         return tip
 
     def get_nodes(self, repo_name, revision, root_path='/', flat=True):
@@ -595,7 +669,6 @@
         grouped by type
 
         :param repo:
-        :type repo:
         """
 
         hist_l = []
@@ -654,7 +727,6 @@
             if os.path.exists(_hook_file):
                 # let's take a look at this hook, maybe it's rhodecode ?
                 log.debug('hook exists, checking if it is from rhodecode')
-                _HOOK_VER_PAT = re.compile(r'^RC_HOOK_VER')
                 with open(_hook_file, 'rb') as f:
                     data = f.read()
                     matches = re.compile(r'(?:%s)\s*=\s*(.*)'
@@ -671,7 +743,7 @@
                 _rhodecode_hook = True
 
             if _rhodecode_hook or force_create:
-                log.debug('writing %s hook file !' % h_type)
+                log.debug('writing %s hook file !' % (h_type,))
                 with open(_hook_file, 'wb') as f:
                     tmpl = tmpl.replace('_TMPL_', rhodecode.__version__)
                     f.write(tmpl)
--- a/rhodecode/model/user.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/user.py	Fri Jun 07 00:31:11 2013 +0200
@@ -39,7 +39,7 @@
 from rhodecode.model.db import User, UserRepoToPerm, Repository, Permission, \
     UserToPerm, UserGroupRepoToPerm, UserGroupToPerm, UserGroupMember, \
     Notification, RepoGroup, UserRepoGroupToPerm, UserGroupRepoGroupToPerm, \
-    UserEmailMap, UserIpMap
+    UserEmailMap, UserIpMap, UserGroupUserGroupToPerm, UserGroup
 from rhodecode.lib.exceptions import DefaultUserException, \
     UserOwnsReposException
 from rhodecode.model.meta import Session
@@ -133,7 +133,7 @@
             new_user.admin = admin
             # set password only if creating an user or password is changed
             if not edit or user.password != password:
-                new_user.password = get_crypt_password(password)
+                new_user.password = get_crypt_password(password) if password else None
                 new_user.api_key = generate_api_key(username)
             new_user.email = email
             new_user.active = active
@@ -425,9 +425,11 @@
         """
         RK = 'repositories'
         GK = 'repositories_groups'
+        UK = 'user_groups'
         GLOBAL = 'global'
         user.permissions[RK] = {}
         user.permissions[GK] = {}
+        user.permissions[UK] = {}
         user.permissions[GLOBAL] = set()
 
         def _choose_perm(new_perm, cur_perm):
@@ -450,6 +452,7 @@
 
         default_repo_perms = Permission.get_default_perms(default_user_id)
         default_repo_groups_perms = Permission.get_default_group_perms(default_user_id)
+        default_user_group_perms = Permission.get_default_user_group_perms(default_user_id)
 
         if user.is_admin:
             #==================================================================
@@ -469,6 +472,12 @@
                 rg_k = perm.UserRepoGroupToPerm.group.group_name
                 p = 'group.admin'
                 user.permissions[GK][rg_k] = p
+
+            # user groups
+            for perm in default_user_group_perms:
+                u_k = perm.UserUserGroupToPerm.user_group.users_group_name
+                p = 'usergroup.admin'
+                user.permissions[UK][u_k] = p
             return user
 
         #==================================================================
@@ -504,12 +513,22 @@
             p = perm.Permission.permission_name
             user.permissions[GK][rg_k] = p
 
+        # defaults for user groups taken from default user permission
+        # on given user group
+        for perm in default_user_group_perms:
+            u_k = perm.UserUserGroupToPerm.user_group.users_group_name
+            p = perm.Permission.permission_name
+            user.permissions[UK][u_k] = p
+
         #======================================================================
         # !! OVERRIDE GLOBALS !! with user permissions if any found
         #======================================================================
         # those can be configured from groups or users explicitly
-        _configurable = set(['hg.fork.none', 'hg.fork.repository',
-                             'hg.create.none', 'hg.create.repository'])
+        _configurable = set([
+            'hg.fork.none', 'hg.fork.repository',
+            'hg.create.none', 'hg.create.repository',
+            'hg.usergroup.create.false', 'hg.usergroup.create.true'
+        ])
 
         # USER GROUPS comes first
         # user group global permissions
@@ -549,6 +568,7 @@
 
             for perm in user_perms:
                 user.permissions[GLOBAL].add(perm.permission.permission_name)
+        ## END GLOBAL PERMISSIONS
 
         #======================================================================
         # !! PERMISSIONS FOR REPOSITORIES !!
@@ -588,15 +608,7 @@
 
         # user explicit permissions for repositories, overrides any specified
         # by the group permission
-        user_repo_perms = \
-         self.sa.query(UserRepoToPerm, Permission, Repository)\
-            .join((Repository, UserRepoToPerm.repository_id ==
-                   Repository.repo_id))\
-            .join((Permission, UserRepoToPerm.permission_id ==
-                   Permission.permission_id))\
-            .filter(UserRepoToPerm.user_id == uid)\
-            .all()
-
+        user_repo_perms = Permission.get_default_perms(uid)
         for perm in user_repo_perms:
             r_k = perm.UserRepoToPerm.repository.repo_name
             cur_perm = user.permissions[RK][r_k]
@@ -639,14 +651,7 @@
             user.permissions[GK][g_k] = p
 
         # user explicit permissions for repository groups
-        user_repo_groups_perms = \
-         self.sa.query(UserRepoGroupToPerm, Permission, RepoGroup)\
-         .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
-         .join((Permission, UserRepoGroupToPerm.permission_id
-                == Permission.permission_id))\
-         .filter(UserRepoGroupToPerm.user_id == uid)\
-         .all()
-
+        user_repo_groups_perms = Permission.get_default_group_perms(uid)
         for perm in user_repo_groups_perms:
             rg_k = perm.UserRepoGroupToPerm.group.group_name
             p = perm.Permission.permission_name
@@ -655,6 +660,41 @@
                 p = _choose_perm(p, cur_perm)
             user.permissions[GK][rg_k] = p
 
+        #======================================================================
+        # !! PERMISSIONS FOR USER GROUPS !!
+        #======================================================================
+        # user group for user group permissions
+        user_group_user_groups_perms = \
+         self.sa.query(UserGroupUserGroupToPerm, Permission, UserGroup)\
+         .join((UserGroup, UserGroupUserGroupToPerm.target_user_group_id
+                == UserGroup.users_group_id))\
+         .join((Permission, UserGroupUserGroupToPerm.permission_id
+                == Permission.permission_id))\
+         .join((UserGroupMember, UserGroupUserGroupToPerm.user_group_id
+                == UserGroupMember.users_group_id))\
+         .filter(UserGroupMember.user_id == uid)\
+         .all()
+
+        multiple_counter = collections.defaultdict(int)
+        for perm in user_group_user_groups_perms:
+            g_k = perm.UserGroupUserGroupToPerm.target_user_group.users_group_name
+            multiple_counter[g_k] += 1
+            p = perm.Permission.permission_name
+            cur_perm = user.permissions[UK][g_k]
+            if multiple_counter[g_k] > 1:
+                p = _choose_perm(p, cur_perm)
+            user.permissions[UK][g_k] = p
+
+        #user explicit permission for user groups
+        user_user_groups_perms = Permission.get_default_user_group_perms(uid)
+        for perm in user_user_groups_perms:
+            u_k = perm.UserUserGroupToPerm.user_group.users_group_name
+            p = perm.Permission.permission_name
+            cur_perm = user.permissions[UK][u_k]
+            if not explicit:
+                p = _choose_perm(p, cur_perm)
+            user.permissions[UK][u_k] = p
+
         return user
 
     def has_perm(self, user, perm):
--- a/rhodecode/model/users_group.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/users_group.py	Fri Jun 07 00:31:11 2013 +0200
@@ -29,8 +29,10 @@
 
 from rhodecode.model import BaseModel
 from rhodecode.model.db import UserGroupMember, UserGroup,\
-    UserGroupRepoToPerm, Permission, UserGroupToPerm, User
-from rhodecode.lib.exceptions import UserGroupsAssignedException
+    UserGroupRepoToPerm, Permission, UserGroupToPerm, User, UserUserGroupToPerm,\
+    UserGroupUserGroupToPerm
+from rhodecode.lib.exceptions import UserGroupsAssignedException,\
+    RepoGroupAssignmentError
 
 log = logging.getLogger(__name__)
 
@@ -39,26 +41,85 @@
 
     cls = UserGroup
 
-    def __get_users_group(self, users_group):
+    def _get_user_group(self, users_group):
         return self._get_instance(UserGroup, users_group,
                                   callback=UserGroup.get_by_group_name)
 
+    def _create_default_perms(self, user_group):
+        # create default permission
+        default_perm = 'usergroup.read'
+        def_user = User.get_default_user()
+        for p in def_user.user_perms:
+            if p.permission.permission_name.startswith('usergroup.'):
+                default_perm = p.permission.permission_name
+                break
+
+        user_group_to_perm = UserUserGroupToPerm()
+        user_group_to_perm.permission = Permission.get_by_key(default_perm)
+
+        user_group_to_perm.user_group = user_group
+        user_group_to_perm.user_id = def_user.user_id
+        return user_group_to_perm
+
+    def _update_permissions(self, user_group, perms_new=None,
+                            perms_updates=None):
+        from rhodecode.lib.auth import HasUserGroupPermissionAny
+        if not perms_new:
+            perms_new = []
+        if not perms_updates:
+            perms_updates = []
+
+        # update permissions
+        for member, perm, member_type in perms_updates:
+            if member_type == 'user':
+                # this updates existing one
+                self.grant_user_permission(
+                    user_group=user_group, user=member, perm=perm
+                )
+            else:
+                #check if we have permissions to alter this usergroup
+                if HasUserGroupPermissionAny('usergroup.read', 'usergroup.write',
+                                             'usergroup.admin')(member):
+                    self.grant_users_group_permission(
+                        target_user_group=user_group, user_group=member, perm=perm
+                    )
+        # set new permissions
+        for member, perm, member_type in perms_new:
+            if member_type == 'user':
+                self.grant_user_permission(
+                    user_group=user_group, user=member, perm=perm
+                )
+            else:
+                #check if we have permissions to alter this usergroup
+                if HasUserGroupPermissionAny('usergroup.read', 'usergroup.write',
+                                             'usergroup.admin')(member):
+                    self.grant_users_group_permission(
+                        target_user_group=user_group, user_group=member, perm=perm
+                    )
+
     def get(self, users_group_id, cache=False):
         return UserGroup.get(users_group_id)
 
     def get_group(self, users_group):
-        return self.__get_users_group(users_group)
+        return self._get_user_group(users_group)
 
     def get_by_name(self, name, cache=False, case_insensitive=False):
         return UserGroup.get_by_group_name(name, cache, case_insensitive)
 
-    def create(self, name, active=True):
+    def create(self, name, owner, active=True):
         try:
-            new = UserGroup()
-            new.users_group_name = name
-            new.users_group_active = active
-            self.sa.add(new)
-            return new
+            new_user_group = UserGroup()
+            new_user_group.user = self._get_user(owner)
+            new_user_group.users_group_name = name
+            new_user_group.users_group_active = active
+            self.sa.add(new_user_group)
+            perm_obj = self._create_default_perms(new_user_group)
+            self.sa.add(perm_obj)
+
+            self.grant_user_permission(user_group=new_user_group,
+                                       user=owner, perm='usergroup.admin')
+
+            return new_user_group
         except Exception:
             log.error(traceback.format_exc())
             raise
@@ -66,7 +127,7 @@
     def update(self, users_group, form_data):
 
         try:
-            users_group = self.__get_users_group(users_group)
+            users_group = self._get_user_group(users_group)
 
             for k, v in form_data.items():
                 if k == 'users_group_members':
@@ -96,7 +157,7 @@
         :param force:
         """
         try:
-            users_group = self.__get_users_group(users_group)
+            users_group = self._get_user_group(users_group)
 
             # check if this group is not assigned to repo
             assigned_groups = UserGroupRepoToPerm.query()\
@@ -112,7 +173,7 @@
             raise
 
     def add_user_to_group(self, users_group, user):
-        users_group = self.__get_users_group(users_group)
+        users_group = self._get_user_group(users_group)
         user = self._get_user(user)
 
         for m in users_group.members:
@@ -135,7 +196,7 @@
             raise
 
     def remove_user_from_group(self, users_group, user):
-        users_group = self.__get_users_group(users_group)
+        users_group = self._get_user_group(users_group)
         user = self._get_user(user)
 
         users_group_member = None
@@ -157,7 +218,7 @@
             return False
 
     def has_perm(self, users_group, perm):
-        users_group = self.__get_users_group(users_group)
+        users_group = self._get_user_group(users_group)
         perm = self._get_perm(perm)
 
         return UserGroupToPerm.query()\
@@ -165,7 +226,7 @@
             .filter(UserGroupToPerm.permission == perm).scalar() is not None
 
     def grant_perm(self, users_group, perm):
-        users_group = self.__get_users_group(users_group)
+        users_group = self._get_user_group(users_group)
         perm = self._get_perm(perm)
 
         # if this permission is already granted skip it
@@ -182,7 +243,7 @@
         self.sa.add(new)
 
     def revoke_perm(self, users_group, perm):
-        users_group = self.__get_users_group(users_group)
+        users_group = self._get_user_group(users_group)
         perm = self._get_perm(perm)
 
         obj = UserGroupToPerm.query()\
@@ -190,3 +251,100 @@
             .filter(UserGroupToPerm.permission == perm).scalar()
         if obj:
             self.sa.delete(obj)
+
+    def grant_user_permission(self, user_group, user, perm):
+        """
+        Grant permission for user on given user group, or update
+        existing one if found
+
+        :param user_group: Instance of UserGroup, users_group_id,
+            or users_group_name
+        :param user: Instance of User, user_id or username
+        :param perm: Instance of Permission, or permission_name
+        """
+
+        user_group = self._get_user_group(user_group)
+        user = self._get_user(user)
+        permission = self._get_perm(perm)
+
+        # check if we have that permission already
+        obj = self.sa.query(UserUserGroupToPerm)\
+            .filter(UserUserGroupToPerm.user == user)\
+            .filter(UserUserGroupToPerm.user_group == user_group)\
+            .scalar()
+        if obj is None:
+            # create new !
+            obj = UserUserGroupToPerm()
+        obj.user_group = user_group
+        obj.user = user
+        obj.permission = permission
+        self.sa.add(obj)
+        log.debug('Granted perm %s to %s on %s' % (perm, user, user_group))
+
+    def revoke_user_permission(self, user_group, user):
+        """
+        Revoke permission for user on given repository group
+
+        :param user_group: Instance of ReposGroup, repositories_group_id,
+            or repositories_group name
+        :param user: Instance of User, user_id or username
+        """
+
+        user_group = self._get_user_group(user_group)
+        user = self._get_user(user)
+
+        obj = self.sa.query(UserUserGroupToPerm)\
+            .filter(UserUserGroupToPerm.user == user)\
+            .filter(UserUserGroupToPerm.user_group == user_group)\
+            .scalar()
+        if obj:
+            self.sa.delete(obj)
+            log.debug('Revoked perm on %s on %s' % (user_group, user))
+
+    def grant_users_group_permission(self, target_user_group, user_group, perm):
+        """
+        Grant user group permission for given target_user_group
+
+        :param target_user_group:
+        :param user_group:
+        :param perm:
+        """
+        target_user_group = self._get_user_group(target_user_group)
+        user_group = self._get_user_group(user_group)
+        permission = self._get_perm(perm)
+        # forbid assigning same user group to itself
+        if target_user_group == user_group:
+            raise RepoGroupAssignmentError('target repo:%s cannot be '
+                                           'assigned to itself' % target_user_group)
+
+        # check if we have that permission already
+        obj = self.sa.query(UserGroupUserGroupToPerm)\
+            .filter(UserGroupUserGroupToPerm.target_user_group == target_user_group)\
+            .filter(UserGroupUserGroupToPerm.user_group == user_group)\
+            .scalar()
+        if obj is None:
+            # create new !
+            obj = UserGroupUserGroupToPerm()
+        obj.user_group = user_group
+        obj.target_user_group = target_user_group
+        obj.permission = permission
+        self.sa.add(obj)
+        log.debug('Granted perm %s to %s on %s' % (perm, target_user_group, user_group))
+
+    def revoke_users_group_permission(self, target_user_group, user_group):
+        """
+        Revoke user group permission for given target_user_group
+
+        :param target_user_group:
+        :param user_group:
+        """
+        target_user_group = self._get_user_group(target_user_group)
+        user_group = self._get_user_group(user_group)
+
+        obj = self.sa.query(UserGroupUserGroupToPerm)\
+            .filter(UserGroupUserGroupToPerm.target_user_group == target_user_group)\
+            .filter(UserGroupUserGroupToPerm.user_group == user_group)\
+            .scalar()
+        if obj:
+            self.sa.delete(obj)
+            log.debug('Revoked perm on %s on %s' % (target_user_group, user_group))
--- a/rhodecode/model/validators.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/model/validators.py	Fri Jun 07 00:31:11 2013 +0200
@@ -11,7 +11,7 @@
 
 from formencode.validators import (
     UnicodeString, OneOf, Int, Number, Regex, Email, Bool, StringBoolean, Set,
-    NotEmpty, IPAddress, CIDR
+    NotEmpty, IPAddress, CIDR, String, FancyValidator
 )
 from rhodecode.lib.compat import OrderedSet
 from rhodecode.lib import ipaddr
@@ -25,7 +25,7 @@
 
 # silence warnings and pylint
 UnicodeString, OneOf, Int, Number, Regex, Email, Bool, StringBoolean, Set, \
-    NotEmpty, IPAddress, CIDR
+    NotEmpty, IPAddress, CIDR, String, FancyValidator
 
 log = logging.getLogger(__name__)
 
@@ -87,8 +87,8 @@
                 _(u'Username "%(username)s" is forbidden'),
             'invalid_username':
                 _(u'Username may only contain alphanumeric characters '
-                  'underscores, periods or dashes and must begin with '
-                  'alphanumeric character')
+                    'underscores, periods or dashes and must begin with '
+                    'alphanumeric character or underscore')
         }
 
         def validate_python(self, value, state):
@@ -105,7 +105,7 @@
                     msg = M(self, 'username_exists', state, username=value)
                     raise formencode.Invalid(msg, value, state)
 
-            if re.match(r'^[a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]*$', value) is None:
+            if re.match(r'^[a-zA-Z0-9\_]{1}[a-zA-Z0-9\-\_\.]*$', value) is None:
                 msg = M(self, 'invalid_username', state)
                 raise formencode.Invalid(msg, value, state)
     return _validator
@@ -406,7 +406,7 @@
     def url_handler(repo_type, url, ui=None):
         if repo_type == 'hg':
             from rhodecode.lib.vcs.backends.hg.repository import MercurialRepository
-            from mercurial.httppeer import httppeer
+            from rhodecode.lib.vcs.utils.hgcompat import httppeer
             if url.startswith('http'):
                 ## initially check if it's at least the proper URL
                 ## or does it pass basic auth
@@ -418,7 +418,7 @@
             elif url.startswith('git+http'):
                 raise NotImplementedError()
             else:
-                raise Exception('clone from URI %s not allowed' % (url))
+                raise Exception('clone from URI %s not allowed' % (url,))
 
         elif repo_type == 'git':
             from rhodecode.lib.vcs.backends.git.repository import GitRepository
@@ -546,10 +546,12 @@
 
 
 def ValidPerms(type_='repo'):
-    if type_ == 'group':
+    if type_ == 'repo_group':
         EMPTY_PERM = 'group.none'
     elif type_ == 'repo':
         EMPTY_PERM = 'repository.none'
+    elif type_ == 'user_group':
+        EMPTY_PERM = 'usergroup.none'
 
     class _validator(formencode.validators.FancyValidator):
         messages = {
@@ -766,7 +768,8 @@
         messages = dict(
             badFormat=_('Please enter a valid IPv4 or IpV6 address'),
             illegalBits=_('The network size (bits) must be within the range'
-                ' of 0-32 (not %(bits)r)'))
+                ' of 0-32 (not %(bits)r)')
+        )
 
         def to_python(self, value, state):
             v = super(_validator, self).to_python(value, state)
@@ -798,10 +801,27 @@
     class _validator(formencode.validators.FancyValidator):
         messages = dict(
             badFormat=_('Key name can only consist of letters, '
-                        'underscore, dash or numbers'),)
+                        'underscore, dash or numbers')
+        )
 
         def validate_python(self, value, state):
             if not re.match('[a-zA-Z0-9_-]+$', value):
                 raise formencode.Invalid(self.message('badFormat', state),
                                          value, state)
     return _validator
+
+
+def BasePath():
+    class _validator(formencode.validators.FancyValidator):
+        messages = dict(
+            badPath=_('Filename cannot be inside a directory')
+        )
+
+        def _to_python(self, value, state):
+            return value
+
+        def validate_python(self, value, state):
+            if value != os.path.basename(value):
+                raise formencode.Invalid(self.message('badPath', state),
+                                         value, state)
+    return _validator
--- a/rhodecode/public/css/contextbar.css	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/public/css/contextbar.css	Fri Jun 07 00:31:11 2013 +0200
@@ -4,6 +4,9 @@
 
 #quick .repo_switcher { background-image: url("../images/icons/database.png"); }
 #quick .journal { background-image: url("../images/icons/book.png"); }
+#quick .gists { background-image: url("../images/icons/note.png"); }
+#quick .gists-private { background-image: url("../images/icons/note_error.png"); }
+#quick .gists-new { background-image: url("../images/icons/note_add.png"); }
 #quick .search { background-image: url("../images/icons/search_16.png"); }
 #quick .admin { background-image: url("../images/icons/cog_edit.png"); }
 
@@ -21,11 +24,13 @@
 #context-bar a.tags { background-image: url("../images/icons/tag_blue.png"); }
 #context-bar a.bookmarks { background-image: url("../images/icons/tag_green.png"); }
 #context-bar a.settings { background-image: url("../images/icons/cog.png"); }
-#context-bar a.shortlog { background-image: url("../images/icons/time.png"); }
 #context-bar a.search { background-image: url("../images/icons/search_16.png"); }
 #context-bar a.admin { background-image: url("../images/icons/cog_edit.png"); }
 
 #context-bar a.journal { background-image: url("../images/icons/book.png"); }
+#context-bar a.gists { background-image: url("../images/icons/note.png"); }
+#context-bar a.gists-private { background-image: url("../images/icons/note_error.png"); }
+#context-bar a.gists-new { background-image: url("../images/icons/note_add.png"); }
 #context-bar a.repos { background-image: url("../images/icons/database_edit.png"); }
 #context-bar a.repos_groups { background-image: url("../images/icons/database_link.png"); }
 #context-bar a.users { background-image: url("../images/icons/user_edit.png"); }
@@ -247,6 +252,7 @@
     border-left: 1px solid rgba(255,255,255,0.1);
     padding: 0;
 }
+
 #header #header-inner #quick li:last-child,
 #content #context-pages li:last-child {
     border-right: none;
--- a/rhodecode/public/css/pygments.css	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/public/css/pygments.css	Fri Jun 07 00:31:11 2013 +0200
@@ -14,12 +14,12 @@
 div.codeblock .code-header {
     border-bottom: 1px solid #CCCCCC;
     background: #EEEEEE;
-    padding: 10px 0 10px 0;
+    padding: 10px 0 5px 0;
 }
 
 div.codeblock .code-header .stats {
     clear: both;
-    padding: 6px 8px 6px 10px;
+    padding: 2px 8px 2px 14px;
     border-bottom: 1px solid rgb(204, 204, 204);
     height: 23px;
     margin-bottom: 6px;
@@ -47,7 +47,7 @@
 }
 
 div.codeblock .code-header .author {
-    margin-left: 25px;
+    margin-left: 15px;
     font-weight: bold;
     height: 25px;
 }
@@ -55,18 +55,22 @@
     padding-top: 3px;
 }
 div.codeblock .code-header .commit {
-    margin-left: 25px;
+    margin-left: 15px;
     font-weight: normal;
     white-space: pre;
 }
 
+.code-highlighttable,
 div.codeblock .code-body table {
     width: 0 !important;
     border: 0px !important;
 }
+
+.code-highlighttable,
 div.codeblock .code-body table td {
     border: 0px !important;
 }
+
 div.code-body {
     background-color: #FFFFFF;
 }
@@ -97,19 +101,19 @@
     padding: 0px;
     margin-top: 5px;
     margin-bottom: 5px;
-    border-left: 2px solid #ccc;
+    border-left: 1px solid #ccc;
 }
 .code-highlight pre, .linenodiv pre {
-    padding: 5px;
+    padding: 5px 2px 0px 5px;
     margin: 0;
 }
 .code-highlight pre div:target {
     background-color: #FFFFBE !important;
 }
-
+.linenos { padding: 0px !important; border:0px !important;}
 .linenos a { text-decoration: none; }
 
-.code { display: block; }
+.code { display: block; border:0px !important; }
 .code-highlight .hll, .codehilite .hll { background-color: #ffffcc }
 .code-highlight .c, .codehilite .c { color: #408080; font-style: italic } /* Comment */
 .code-highlight .err, .codehilite .err { border: 1px solid #FF0000 } /* Error */
--- a/rhodecode/public/css/style.css	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/public/css/style.css	Fri Jun 07 00:31:11 2013 +0200
@@ -218,6 +218,8 @@
 
 a.permalink {
     visibility: hidden;
+    position: absolute;
+    margin: 3px 4px;
 }
 
 a.permalink:hover {
@@ -365,7 +367,6 @@
     height: 40px;
     width: 46px;
     display: block;
-    background: url("../images/button_home.png");
     background-position: 0 0;
     margin: 0;
     padding: 0;
@@ -542,10 +543,6 @@
     background-image: url("../images/icons/search_16.png");
 }
 
-#header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
-    background-image: url("../images/icons/clock_16.png");
-}
-
 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
     background-image: url("../images/icons/delete.png");
 }
@@ -1567,7 +1564,8 @@
     padding: 6px;
 }
 
-#content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
+#content div.box div.pagination ul.pager li a:hover,
+#content div.box div.pagination ul.pager li a:active {
     background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
     border-top: 1px solid #ccc;
     border-left: 1px solid #bebebe;
@@ -1576,17 +1574,25 @@
     margin: -1px;
 }
 
+#content div.box div.pagination-right {
+    float: right;
+}
+
 #content div.box div.pagination-wh {
     height: 1%;
-    clear: both;
     overflow: hidden;
     text-align: right;
     margin: 10px 0 0;
     padding: 0;
 }
 
-#content div.box div.pagination-right {
-    float: right;
+#content div.box div.pagination-wh > :first-child {
+    border-radius: 4px 0px 0px 4px;
+}
+
+#content div.box div.pagination-wh > :last-child {
+    border-radius: 0px 4px 4px 0px;
+    border-right: 1px solid #cfcfcf;
 }
 
 #content div.box div.pagination-wh a,
@@ -1600,11 +1606,9 @@
     background: #ebebeb url("../images/pager.png") repeat-x;
     border-top: 1px solid #dedede;
     border-left: 1px solid #cfcfcf;
-    border-right: 1px solid #c4c4c4;
     border-bottom: 1px solid #c4c4c4;
     color: #4A4A4A;
     font-weight: 700;
-    margin: 0 0 0 4px;
     padding: 6px;
 }
 
@@ -1614,11 +1618,9 @@
     background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
     border-top: 1px solid #ccc;
     border-left: 1px solid #bebebe;
-    border-right: 1px solid #b1b1b1;
     border-bottom: 1px solid #afafaf;
     color: #515151;
     font-weight: 700;
-    margin: 0 0 0 4px;
     padding: 6px;
 }
 
@@ -1626,7 +1628,6 @@
     background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
     border-top: 1px solid #ccc;
     border-left: 1px solid #bebebe;
-    border-right: 1px solid #b1b1b1;
     border-bottom: 1px solid #afafaf;
     text-decoration: none;
 }
@@ -1736,7 +1737,7 @@
 
 #summary-menu-stats a span {
     background-color: #DEDEDE;
-    color: 888 !important;
+    color: #888 !important;
     border-radius: 4px;
     padding: 2px 4px;
     font-size: 10px;
@@ -2304,6 +2305,11 @@
     padding: 5px !important;
 }
 
+#files_data .codeblock #editor_container .error-message {
+    color: red;
+    padding: 10px 10px 10px 26px
+}
+
 .file_history {
     padding-top: 10px;
     font-size: 16px;
@@ -2402,42 +2408,49 @@
     font-size: 9px;
     padding: 2px 0px 2px 0px;
 }
-/*new binary*/
-.cs_files .changes .bin1 {
+/*new binary
+NEW_FILENODE = 1
+DEL_FILENODE = 2
+MOD_FILENODE = 3
+RENAMED_FILENODE = 4
+CHMOD_FILENODE = 5
+BIN_FILENODE = 6
+*/
+.cs_files .changes .bin {
     background-color: #BBFFBB;
     float: left;
     text-align: center;
     font-size: 9px;
     padding: 2px 0px 2px 0px;
 }
+.cs_files .changes .bin.bin1 {
+    background-color: #BBFFBB;
+}
 
 /*deleted binary*/
-.cs_files .changes .bin2 {
+.cs_files .changes .bin.bin2 {
     background-color: #FF8888;
-    float: left;
-    text-align: center;
-    font-size: 9px;
-    padding: 2px 0px 2px 0px;
 }
 
 /*mod binary*/
-.cs_files .changes .bin3 {
+.cs_files .changes .bin.bin3 {
     background-color: #DDDDDD;
-    float: left;
-    text-align: center;
-    font-size: 9px;
-    padding: 2px 0px 2px 0px;
 }
 
 /*rename file*/
-.cs_files .changes .bin4 {
+.cs_files .changes .bin.bin4 {
+    background-color: #6D99FF;
+}
+
+/*rename file*/
+.cs_files .changes .bin.bin4 {
     background-color: #6D99FF;
-    float: left;
-    text-align: center;
-    font-size: 9px;
-    padding: 2px 0px 2px 0px;
-}
-
+}
+
+/*chmod file*/
+.cs_files .changes .bin.bin5 {
+    background-color: #6D99FF;
+}
 
 .cs_files .cs_added, .cs_files .cs_A {
     background: url("../images/icons/page_white_add.png") no-repeat scroll
@@ -2592,6 +2605,7 @@
 }
 
 #graph_content .comments-container,
+#shortlog_data .comments-container,
 #graph_content .logtags {
     display: block;
     float: left;
@@ -2635,7 +2649,7 @@
     left: initial;
 }
 
-#graph_content .logtags .bookbook,
+#graph_content .logtags .booktag,
 #graph_content .logtags .tagtag {
     float: left;
     line-height: 1em;
@@ -2690,7 +2704,13 @@
     padding: 5px 0;
 }
 
-#graph_content .comments-cnt a {
+#shortlog_data .comments-cnt {
+    color: rgb(136, 136, 136);
+    padding: 3px 0;
+}
+
+#graph_content .comments-cnt a,
+#shortlog_data .comments-cnt a {
     background-image: url('../images/icons/comments.png');
     background-repeat: no-repeat;
     background-position: 100% 50%;
@@ -2761,7 +2781,7 @@
 
 .branchtag,
 .tagtag,
-.bookbook,
+.booktag,
 .spantag {
     padding: 1px 3px 1px 3px;
     font-size: 10px;
@@ -2775,14 +2795,14 @@
 
 #graph_content .branchtag,
 #graph_content .tagtag,
-#graph_content .bookbook {
+#graph_content .booktag {
     margin: 1.1em 0;
     margin-right: 0.5em;
 }
 
 .branchtag,
 .tagtag,
-.bookbook {
+.booktag {
     float: left;
 }
 
@@ -2796,7 +2816,7 @@
     display: block;
 }
 
-.bookbook {
+.booktag {
     border-color: #46A546;
     color: #46A546;
 }
@@ -2830,7 +2850,7 @@
     text-decoration: none;
     color: inherit;
 }
-.logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
+.logbooks .booktag, .logbooks .booktag, .logtags .booktag, .logtags .booktag {
     padding: 1px 3px 1px 3px;
     background-color: #46A546;
     font-size: 10px;
@@ -2839,14 +2859,14 @@
     -webkit-border-radius: 3px;
     border-radius: 3px;
 }
-.logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
+.logbooks .booktag, .logbooks .booktag a, .right .logtags .booktag, .logtags .booktag a {
     color: #ffffff;
 }
 
-.logbooks .bookbook, .logbooks .bookbook a:hover,
-.logtags .bookbook, .logtags .bookbook a:hover,
-.bookbook a,
-.bookbook a:hover {
+.logbooks .booktag, .logbooks .booktag a:hover,
+.logtags .booktag, .logtags .booktag a:hover,
+.booktag a,
+.booktag a:hover {
     text-decoration: none;
     color: inherit;
 }
@@ -3452,7 +3472,7 @@
 }
 
 #msg_close {
-    background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
+    background: transparent url("../images/cross_grey_small.png") no-repeat scroll 0 0;
     cursor: pointer;
     height: 16px;
     position: absolute;
@@ -3550,8 +3570,12 @@
     border-radius: 4px 4px 4px 4px !important;
     cursor: pointer !important;
     padding: 3px 3px 3px 3px;
-    background-position: 0 -15px;
-
+    background-position: 0 -100px;
+
+}
+
+.ui-btn.badge {
+    cursor: default !important;
 }
 
 .ui-btn.disabled {
@@ -3582,12 +3606,14 @@
     outline: none;
 }
 .ui-btn:hover {
-    background-position: 0 -15px;
+    background-position: 0 -100px;
     text-decoration: none;
     color: #515151;
     box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
 }
-
+.ui-btn.badge:hover {
+    box-shadow: none !important;
+}
 .ui-btn.disabled:hover {
     background-position: 0;
     color: #999;
@@ -3629,6 +3655,7 @@
 }
 
 .ui-btn.green {
+    color: #fff;
     background-color: #57a957;
     background-repeat: repeat-x;
     background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
@@ -3643,6 +3670,22 @@
     border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
 }
 
+.ui-btn.yellow {
+    color: #fff;
+    background-color: #faa732;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
+    background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+    background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
+    background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+    background-image: -o-linear-gradient(top, #fbb450, #f89406);
+    background-image: linear-gradient(to bottom, #fbb450, #f89406);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+    border-color: #f89406 #f89406 #ad6704;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
 .ui-btn.blue.hidden {
     display: none;
 }
@@ -4298,12 +4341,6 @@
     clear: both
 }
 
-.comment-form .clearfix {
-    background: #EEE;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    padding: 10px;
-}
 
 div.comment-form {
     margin-top: 20px;
@@ -4325,6 +4362,13 @@
     margin-left: 10px;
 }
 
+.comment-inline-form .comment-block-ta,
+.comment-form .comment-block-ta {
+    border: 1px solid #ccc;
+    border-radius: 3px;
+    box-sizing: border-box;
+}
+
 .comment-form-submit {
     margin-top: 5px;
     margin-left: 525px;
@@ -4339,9 +4383,22 @@
 }
 
 .comment-form .comment-help {
-    padding: 0px 0px 5px 0px;
+    padding: 5px 5px 5px 5px;
     color: #666;
 }
+.comment-form .comment-help .preview-btn,
+.comment-form .comment-help .edit-btn {
+    float: right;
+    margin: -6px 0px 0px 0px;
+}
+
+.comment-form .preview-box.unloaded,
+.comment-inline-form .preview-box.unloaded {
+    height: 50px;
+    text-align: center;
+    padding: 20px;
+    background-color: #fafafa;
+}
 
 .comment-form .comment-button {
     padding-top: 5px;
@@ -4355,7 +4412,7 @@
 
 .comment .buttons {
     float: right;
-    padding: 2px 2px 0px 0px;
+    margin: -1px 0px 0px 0px;
 }
 
 
@@ -4365,6 +4422,9 @@
 }
 
 /** comment inline form **/
+.comment-inline-form {
+    margin: 4px;
+}
 .comment-inline-form .overlay {
     display: none;
 }
@@ -4383,11 +4443,13 @@
     margin-top: 5%;
 }
 
-.comment-inline-form .clearfix {
+.comment-inline-form .clearfix,
+.comment-form .clearfix {
     background: #EEE;
     -webkit-border-radius: 4px;
     border-radius: 4px;
     padding: 5px;
+    margin: 0px;
 }
 
 div.comment-inline-form {
@@ -4424,9 +4486,14 @@
 }
 
 .comment-inline-form .comment-help {
-    padding: 0px 0px 2px 0px;
-    color: #666666;
-    font-size: 10px;
+    padding: 5px 5px 5px 5px;
+    color: #666;
+}
+
+.comment-inline-form .comment-help .preview-btn,
+.comment-inline-form .comment-help .edit-btn {
+    float: right;
+    margin: -6px 0px 0px 0px;
 }
 
 .comment-inline-form .comment-button {
Binary file rhodecode/public/images/favicon.ico has changed
--- a/rhodecode/public/js/rhodecode.js	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/public/js/rhodecode.js	Fri Jun 07 00:31:11 2013 +0200
@@ -3,13 +3,13 @@
 **/
 
 if (typeof console == "undefined" || typeof console.log == "undefined"){
-	console = { log: function() {} }
+    console = { log: function() {} }
 }
 
 
 var str_repeat = function(i, m) {
-	for (var o = []; m > 0; o[--m] = i);
-	return o.join('');
+    for (var o = []; m > 0; o[--m] = i);
+    return o.join('');
 };
 
 /**
@@ -19,48 +19,48 @@
  * Inspired by https://gist.github.com/1049426
  */
 String.prototype.format = function() {
-	  
-	  function format() {
-	    var str = this;
-	    var len = arguments.length+1;
-	    var safe = undefined;
-	    var arg = undefined;
-	    
-	    // For each {0} {1} {n...} replace with the argument in that position.  If 
-	    // the argument is an object or an array it will be stringified to JSON.
-	    for (var i=0; i < len; arg = arguments[i++]) {
-	      safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
-	      str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
-	    }
-	    return str;
-	  }
+
+      function format() {
+        var str = this;
+        var len = arguments.length+1;
+        var safe = undefined;
+        var arg = undefined;
 
-	  // Save a reference of what may already exist under the property native.  
-	  // Allows for doing something like: if("".format.native) { /* use native */ }
-	  format.native = String.prototype.format;
+        // For each {0} {1} {n...} replace with the argument in that position.  If
+        // the argument is an object or an array it will be stringified to JSON.
+        for (var i=0; i < len; arg = arguments[i++]) {
+          safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
+          str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
+        }
+        return str;
+      }
 
-	  // Replace the prototype property
-	  return format;
+      // Save a reference of what may already exist under the property native.
+      // Allows for doing something like: if("".format.native) { /* use native */ }
+      format.native = String.prototype.format;
+
+      // Replace the prototype property
+      return format;
 
 }();
 
 String.prototype.strip = function(char) {
-	if(char === undefined){
-	    char = '\\s';
-	}
-	return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
+    if(char === undefined){
+        char = '\\s';
+    }
+    return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
 }
 String.prototype.lstrip = function(char) {
-	if(char === undefined){
-	    char = '\\s';
-	}
-	return this.replace(new RegExp('^'+char+'+'),'');
+    if(char === undefined){
+        char = '\\s';
+    }
+    return this.replace(new RegExp('^'+char+'+'),'');
 }
 String.prototype.rstrip = function(char) {
-	if(char === undefined){
-	    char = '\\s';
-	}
-	return this.replace(new RegExp(''+char+'+$'),'');
+    if(char === undefined){
+        char = '\\s';
+    }
+    return this.replace(new RegExp(''+char+'+$'),'');
 }
 
 
@@ -90,30 +90,30 @@
  * SmartColorGenerator
  *
  *usage::
- *	var CG = new ColorGenerator();
+ *  var CG = new ColorGenerator();
  *  var col = CG.getColor(key); //returns array of RGB
  *  'rgb({0})'.format(col.join(',')
- * 
+ *
  * @returns {ColorGenerator}
  */
 var ColorGenerator = function(){
-	this.GOLDEN_RATIO = 0.618033988749895;
-	this.CURRENT_RATIO = 0.22717784590367374 // this can be random
-	this.HSV_1 = 0.75;//saturation
-	this.HSV_2 = 0.95;
-	this.color;
-	this.cacheColorMap = {};
+    this.GOLDEN_RATIO = 0.618033988749895;
+    this.CURRENT_RATIO = 0.22717784590367374 // this can be random
+    this.HSV_1 = 0.75;//saturation
+    this.HSV_2 = 0.95;
+    this.color;
+    this.cacheColorMap = {};
 };
 
 ColorGenerator.prototype = {
     getColor:function(key){
-    	if(this.cacheColorMap[key] !== undefined){
-    		return this.cacheColorMap[key];
-    	}
-    	else{
-    		this.cacheColorMap[key] = this.generateColor();
-    		return this.cacheColorMap[key];
-    	}
+        if(this.cacheColorMap[key] !== undefined){
+            return this.cacheColorMap[key];
+        }
+        else{
+            this.cacheColorMap[key] = this.generateColor();
+            return this.cacheColorMap[key];
+        }
     },
     _hsvToRgb:function(h,s,v){
         if (s == 0.0)
@@ -124,18 +124,18 @@
         q = v * (1.0 - s * f)
         t = v * (1.0 - s * (1.0 - f))
         i = i % 6
-        if (i == 0) 
+        if (i == 0)
             return [v, t, p]
-        if (i == 1) 
+        if (i == 1)
             return [q, v, p]
-        if (i == 2) 
+        if (i == 2)
             return [p, v, t]
         if (i == 3)
             return [p, q, v]
-        if (i == 4) 
+        if (i == 4)
             return [t, p, v]
         if (i == 5)
-            return [v, p, q]            	
+            return [v, p, q]
     },
     generateColor:function(){
         this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
@@ -143,20 +143,20 @@
         HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
         RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
         function toRgb(v){
-        	return ""+parseInt(v*256)
+            return ""+parseInt(v*256)
         }
         return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
-        
+
     }
 }
 
 /**
  * PyRoutesJS
- * 
+ *
  * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
  */
 var pyroutes = (function() {
-	// access global map defined in special file pyroutes
+    // access global map defined in special file pyroutes
     var matchlist = PROUTES_MAP;
     var sprintf = (function() {
         function get_type(variable) {
@@ -285,7 +285,7 @@
         'url': function(route_name, params) {
             var result = route_name;
             if (typeof(params) != 'object'){
-            	params = {};
+                params = {};
             }
             if (matchlist.hasOwnProperty(route_name)) {
                 var route = matchlist[route_name];
@@ -296,40 +296,40 @@
                         throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
                 }
                 result = sprintf(route[0], params);
-                
+
                 var ret = [];
                 //extra params => GET
                 for(param in params){
-                	if (route[1].indexOf(param) == -1){
-                		ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));	
-                	}
+                    if (route[1].indexOf(param) == -1){
+                        ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
+                    }
                 }
                 var _parts = ret.join("&");
                 if(_parts){
-                	result = result +'?'+ _parts
+                    result = result +'?'+ _parts
                 }
             }
 
             return result;
         },
-    	'register': function(route_name, route_tmpl, req_params) {
-    		if (typeof(req_params) != 'object') {
-    			req_params = [];
-    		}
-    		//fix escape
-    		route_tmpl = unescape(route_tmpl);
-    		keys = [];
-    		for (o in req_params){
-    			keys.push(req_params[o])
-    		}
-    		matchlist[route_name] = [
-    		    route_tmpl,
-    		    keys
-    		]
-    	},
-    	'_routes': function(){
-    		return matchlist;
-    	}
+        'register': function(route_name, route_tmpl, req_params) {
+            if (typeof(req_params) != 'object') {
+                req_params = [];
+            }
+            //fix escape
+            route_tmpl = unescape(route_tmpl);
+            keys = [];
+            for (o in req_params){
+                keys.push(req_params[o])
+            }
+            matchlist[route_name] = [
+                route_tmpl,
+                keys
+            ]
+        },
+        '_routes': function(){
+            return matchlist;
+        }
     }
 })();
 
@@ -345,31 +345,45 @@
 
 // defines if push state is enabled for this browser ?
 var push_state_enabled = Boolean(
-		window.history && window.history.pushState && window.history.replaceState
-		&& !(   /* disable for versions of iOS before version 4.3 (8F190) */
-				(/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
-				/* disable for the mercury iOS browser, or at least older versions of the webkit engine */
-				|| (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
-		)
+        window.history && window.history.pushState && window.history.replaceState
+        && !(   /* disable for versions of iOS before version 4.3 (8F190) */
+                (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
+                /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
+                || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
+        )
 );
 
 var _run_callbacks = function(callbacks){
-	if (callbacks !== undefined){
-		var _l = callbacks.length;
-	    for (var i=0;i<_l;i++){
-	    	var func = callbacks[i];
-	    	if(typeof(func)=='function'){
-	            try{
-	          	    func();
-	            }catch (err){};            		
-	    	}
-	    }
-	}		
+    if (callbacks !== undefined){
+        var _l = callbacks.length;
+        for (var i=0;i<_l;i++){
+            var func = callbacks[i];
+            if(typeof(func)=='function'){
+                try{
+                    func();
+                }catch (err){};
+            }
+        }
+    }
 }
 
 /**
+ * turns objects into GET query string
+ */
+var toQueryString = function(o) {
+    if(typeof o !== 'object') {
+        return false;
+    }
+    var _p, _qs = [];
+    for(_p in o) {
+        _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
+    }
+    return _qs.join('&');
+};
+
+/**
  * Partial Ajax Implementation
- * 
+ *
  * @param url: defines url to make partial request
  * @param container: defines id of container to input partial result
  * @param s_call: success callback function that takes o as arg
@@ -382,44 +396,44 @@
  *  o.responseXML
  *  o.argument
  * @param f_call: failure callback
- * @param args arguments 
+ * @param args arguments
  */
 function ypjax(url,container,s_call,f_call,args){
-	var method='GET';
-	if(args===undefined){
-		args=null;
-	}
-	
-	// Set special header for partial ajax == HTTP_X_PARTIAL_XHR
-	YUC.initHeader('X-PARTIAL-XHR',true);
-	
-	// wrapper of passed callback
-	var s_wrapper = (function(o){
-		return function(o){
-			YUD.get(container).innerHTML=o.responseText;
-			YUD.setStyle(container,'opacity','1.0');
-    		//execute the given original callback
-    		if (s_call !== undefined){
-    			s_call(o);
-    		}
-		}
-	})()	
-	YUD.setStyle(container,'opacity','0.3');
-	YUC.asyncRequest(method,url,{
-		success:s_wrapper,
-		failure:function(o){
-			console.log(o);
-			YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
-			YUD.setStyle(container,'opacity','1.0');
-		},
-		cache:false
-	},args);
-	
+    var method='GET';
+    if(args===undefined){
+        args=null;
+    }
+
+    // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
+    YUC.initHeader('X-PARTIAL-XHR',true);
+
+    // wrapper of passed callback
+    var s_wrapper = (function(o){
+        return function(o){
+            YUD.get(container).innerHTML=o.responseText;
+            YUD.setStyle(container,'opacity','1.0');
+            //execute the given original callback
+            if (s_call !== undefined){
+                s_call(o);
+            }
+        }
+    })()
+    YUD.setStyle(container,'opacity','0.3');
+    YUC.asyncRequest(method,url,{
+        success:s_wrapper,
+        failure:function(o){
+            console.log(o);
+            YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
+            YUD.setStyle(container,'opacity','1.0');
+        },
+        cache:false
+    },args);
+
 };
 
 var ajaxGET = function(url,success) {
-	// Set special header for ajax == HTTP_X_PARTIAL_XHR
-	YUC.initHeader('X-PARTIAL-XHR',true);
+    // Set special header for ajax == HTTP_X_PARTIAL_XHR
+    YUC.initHeader('X-PARTIAL-XHR',true);
 
     var sUrl = url;
     var callback = {
@@ -438,20 +452,9 @@
 
 
 var ajaxPOST = function(url,postData,success) {
-	// Set special header for ajax == HTTP_X_PARTIAL_XHR
-	YUC.initHeader('X-PARTIAL-XHR',true);
-	
-	var toQueryString = function(o) {
-	    if(typeof o !== 'object') {
-	        return false;
-	    }
-	    var _p, _qs = [];
-	    for(_p in o) {
-	        _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
-	    }
-	    return _qs.join('&');
-	};
-	
+    // Set special header for ajax == HTTP_X_PARTIAL_XHR
+    YUC.initHeader('X-PARTIAL-XHR',true);
+
     var sUrl = url;
     var callback = {
         success: success,
@@ -469,8 +472,8 @@
  * tooltip activate
  */
 var tooltip_activate = function(){
-	yt = YAHOO.yuitip.main;
-	YUE.onDOMReady(yt.init);
+    yt = YAHOO.yuitip.main;
+    YUE.onDOMReady(yt.init);
 };
 
 /**
@@ -488,26 +491,26 @@
  * show changeset tooltip
  */
 var show_changeset_tooltip = function(){
-	YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
-		var target = e.currentTarget;
-		var rid = YUD.getAttribute(target,'raw_id');
-		var repo_name = YUD.getAttribute(target,'repo_name');
-		var ttid = 'tt-'+rid;
-		var success = function(o){
-			var json = JSON.parse(o.responseText);
-			YUD.addClass(target,'tooltip')
-			YUD.setAttribute(target, 'title',json['message']);
-			YAHOO.yuitip.main.show_yuitip(e, target);
-		}
-		if(rid && !YUD.hasClass(target, 'tooltip')){
-			YUD.setAttribute(target,'id',ttid);
-			YUD.setAttribute(target, 'title',_TM['loading...']);
-			YAHOO.yuitip.main.set_listeners(target);
-			YAHOO.yuitip.main.show_yuitip(e, target);
-			var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
-			ajaxGET(url, success)
-		}
-	});
+    YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
+        var target = e.currentTarget;
+        var rid = YUD.getAttribute(target,'raw_id');
+        var repo_name = YUD.getAttribute(target,'repo_name');
+        var ttid = 'tt-'+rid;
+        var success = function(o){
+            var json = JSON.parse(o.responseText);
+            YUD.addClass(target,'tooltip')
+            YUD.setAttribute(target, 'title',json['message']);
+            YAHOO.yuitip.main.show_yuitip(e, target);
+        }
+        if(rid && !YUD.hasClass(target, 'tooltip')){
+            YUD.setAttribute(target,'id',ttid);
+            YUD.setAttribute(target, 'title',_TM['loading...']);
+            YAHOO.yuitip.main.set_listeners(target);
+            YAHOO.yuitip.main.show_yuitip(e, target);
+            var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
+            ajaxGET(url, success)
+        }
+    });
 };
 
 var onSuccessFollow = function(target){
@@ -541,7 +544,7 @@
     }
     YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
         success:function(o){
-        	onSuccessFollow(target);
+            onSuccessFollow(target);
         }
     },args);
     return false;
@@ -556,7 +559,7 @@
     }
     YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
         success:function(o){
-        	onSuccessFollow(target);
+            onSuccessFollow(target);
         }
     },args);
     return false;
@@ -564,18 +567,18 @@
 
 var showRepoSize = function(target, repo_name, token){
     var args= 'auth_token='+token;
-    
+
     if(!YUD.hasClass(target, 'loaded')){
         YUD.get(target).innerHTML = _TM['Loading ...'];
         var url = pyroutes.url('repo_size', {"repo_name":repo_name});
         YUC.asyncRequest('POST',url,{
             success:function(o){
-            	YUD.get(target).innerHTML = JSON.parse(o.responseText);
-            	YUD.addClass(target, 'loaded');
+                YUD.get(target).innerHTML = JSON.parse(o.responseText);
+                YUD.addClass(target, 'loaded');
             }
-        },args);    	
+        },args);
     }
-    return false;	
+    return false;
 }
 
 /**
@@ -584,207 +587,207 @@
 YAHOO.namespace('yuitip');
 YAHOO.yuitip.main = {
 
-	$:			YAHOO.util.Dom.get,
+    $:          YAHOO.util.Dom.get,
 
-	bgColor:	'#000',
-	speed:		0.3,
-	opacity:	0.9,
-	offset:		[15,15],
-	useAnim:	false,
-	maxWidth:	600,
-	add_links:	false,
-	yuitips:    [],
+    bgColor:    '#000',
+    speed:      0.3,
+    opacity:    0.9,
+    offset:     [15,15],
+    useAnim:    false,
+    maxWidth:   600,
+    add_links:  false,
+    yuitips:    [],
 
-	set_listeners: function(tt){
-		YUE.on(tt, 'mouseover', yt.show_yuitip,  tt);
-		YUE.on(tt, 'mousemove', yt.move_yuitip,  tt);
-		YUE.on(tt, 'mouseout',  yt.close_yuitip, tt);		
-	},
+    set_listeners: function(tt){
+        YUE.on(tt, 'mouseover', yt.show_yuitip,  tt);
+        YUE.on(tt, 'mousemove', yt.move_yuitip,  tt);
+        YUE.on(tt, 'mouseout',  yt.close_yuitip, tt);
+    },
 
-	init: function(){
-		yt.tipBox = yt.$('tip-box');
-		if(!yt.tipBox){
-			yt.tipBox = document.createElement('div');
-			document.body.appendChild(yt.tipBox);
-			yt.tipBox.id = 'tip-box';
-		}
+    init: function(){
+        yt.tipBox = yt.$('tip-box');
+        if(!yt.tipBox){
+            yt.tipBox = document.createElement('div');
+            document.body.appendChild(yt.tipBox);
+            yt.tipBox.id = 'tip-box';
+        }
 
-		YUD.setStyle(yt.tipBox, 'display', 'none');
-		YUD.setStyle(yt.tipBox, 'position', 'absolute');
-		if(yt.maxWidth !== null){
-			YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
-		}
+        YUD.setStyle(yt.tipBox, 'display', 'none');
+        YUD.setStyle(yt.tipBox, 'position', 'absolute');
+        if(yt.maxWidth !== null){
+            YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
+        }
 
-		var yuitips = YUD.getElementsByClassName('tooltip');
+        var yuitips = YUD.getElementsByClassName('tooltip');
 
-		if(yt.add_links === true){
-			var links = document.getElementsByTagName('a');
-			var linkLen = links.length;
-			for(i=0;i<linkLen;i++){
-				yuitips.push(links[i]);
-			}
-		}
+        if(yt.add_links === true){
+            var links = document.getElementsByTagName('a');
+            var linkLen = links.length;
+            for(i=0;i<linkLen;i++){
+                yuitips.push(links[i]);
+            }
+        }
 
-		var yuiLen = yuitips.length;
+        var yuiLen = yuitips.length;
 
-		for(i=0;i<yuiLen;i++){
-			yt.set_listeners(yuitips[i]);
-		}
-	},
+        for(i=0;i<yuiLen;i++){
+            yt.set_listeners(yuitips[i]);
+        }
+    },
 
-	show_yuitip: function(e, el){
-		YUE.stopEvent(e);
-		if(el.tagName.toLowerCase() === 'img'){
-			yt.tipText = el.alt ? el.alt : '';
-		} else {
-			yt.tipText = el.title ? el.title : '';
-		}
+    show_yuitip: function(e, el){
+        YUE.stopEvent(e);
+        if(el.tagName.toLowerCase() === 'img'){
+            yt.tipText = el.alt ? el.alt : '';
+        } else {
+            yt.tipText = el.title ? el.title : '';
+        }
 
-		if(yt.tipText !== ''){
-			// save org title
-			YUD.setAttribute(el, 'tt_title', yt.tipText);
-			// reset title to not show org tooltips
-			YUD.setAttribute(el, 'title', '');
+        if(yt.tipText !== ''){
+            // save org title
+            YUD.setAttribute(el, 'tt_title', yt.tipText);
+            // reset title to not show org tooltips
+            YUD.setAttribute(el, 'title', '');
 
-			yt.tipBox.innerHTML = yt.tipText;
-			YUD.setStyle(yt.tipBox, 'display', 'block');
-			if(yt.useAnim === true){
-				YUD.setStyle(yt.tipBox, 'opacity', '0');
-				var newAnim = new YAHOO.util.Anim(yt.tipBox,
-					{
-						opacity: { to: yt.opacity }
-					}, yt.speed, YAHOO.util.Easing.easeOut
-				);
-				newAnim.animate();
-			}
-		}
-	},
+            yt.tipBox.innerHTML = yt.tipText;
+            YUD.setStyle(yt.tipBox, 'display', 'block');
+            if(yt.useAnim === true){
+                YUD.setStyle(yt.tipBox, 'opacity', '0');
+                var newAnim = new YAHOO.util.Anim(yt.tipBox,
+                    {
+                        opacity: { to: yt.opacity }
+                    }, yt.speed, YAHOO.util.Easing.easeOut
+                );
+                newAnim.animate();
+            }
+        }
+    },
 
-	move_yuitip: function(e, el){
-		YUE.stopEvent(e);
-		var movePos = YUE.getXY(e);
-		YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
-		YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
-	},
+    move_yuitip: function(e, el){
+        YUE.stopEvent(e);
+        var movePos = YUE.getXY(e);
+        YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
+        YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
+    },
+
+    close_yuitip: function(e, el){
+        YUE.stopEvent(e);
 
-	close_yuitip: function(e, el){
-		YUE.stopEvent(e);
-	
-		if(yt.useAnim === true){
-			var newAnim = new YAHOO.util.Anim(yt.tipBox,
-				{
-					opacity: { to: 0 }
-				}, yt.speed, YAHOO.util.Easing.easeOut
-			);
-			newAnim.animate();
-		} else {
-			YUD.setStyle(yt.tipBox, 'display', 'none');
-		}
-		YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
-	}
+        if(yt.useAnim === true){
+            var newAnim = new YAHOO.util.Anim(yt.tipBox,
+                {
+                    opacity: { to: 0 }
+                }, yt.speed, YAHOO.util.Easing.easeOut
+            );
+            newAnim.animate();
+        } else {
+            YUD.setStyle(yt.tipBox, 'display', 'none');
+        }
+        YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
+    }
 }
 
 /**
  * Quick filter widget
- * 
+ *
  * @param target: filter input target
  * @param nodes: list of nodes in html we want to filter.
  * @param display_element function that takes current node from nodes and
  *    does hide or show based on the node
- * 
+ *
  */
 var q_filter = function(target,nodes,display_element){
-	
-	var nodes = nodes;
-	var q_filter_field = YUD.get(target);
-	var F = YAHOO.namespace(target);
+
+    var nodes = nodes;
+    var q_filter_field = YUD.get(target);
+    var F = YAHOO.namespace(target);
+
+    YUE.on(q_filter_field,'keyup',function(e){
+        clearTimeout(F.filterTimeout);
+        F.filterTimeout = setTimeout(F.updateFilter,600);
+    });
+
+    F.filterTimeout = null;
 
-	YUE.on(q_filter_field,'keyup',function(e){
-	    clearTimeout(F.filterTimeout); 
-	    F.filterTimeout = setTimeout(F.updateFilter,600); 
-	});
+    var show_node = function(node){
+        YUD.setStyle(node,'display','')
+    }
+    var hide_node = function(node){
+        YUD.setStyle(node,'display','none');
+    }
 
-	F.filterTimeout = null;
+    F.updateFilter  = function() {
+       // Reset timeout
+       F.filterTimeout = null;
+
+       var obsolete = [];
 
-	var show_node = function(node){
-		YUD.setStyle(node,'display','')
-	}
-	var hide_node = function(node){
-		YUD.setStyle(node,'display','none');
-	}
-	
-	F.updateFilter  = function() { 
-	   // Reset timeout 
-	   F.filterTimeout = null;
-	   
-	   var obsolete = [];
-	   
-	   var req = q_filter_field.value.toLowerCase();
-	   
-	   var l = nodes.length;
-	   var i;
-	   var showing = 0;
-	   
+       var req = q_filter_field.value.toLowerCase();
+
+       var l = nodes.length;
+       var i;
+       var showing = 0;
+
        for (i=0;i<l;i++ ){
-    	   var n = nodes[i];
-    	   var target_element = display_element(n)
-    	   if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
-    		   hide_node(target_element);
-    	   }
-    	   else{
-    		   show_node(target_element);
-    		   showing+=1;
-    	   }
-       }	  	   
+           var n = nodes[i];
+           var target_element = display_element(n)
+           if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
+               hide_node(target_element);
+           }
+           else{
+               show_node(target_element);
+               showing+=1;
+           }
+       }
 
-	   // if repo_count is set update the number
-	   var cnt = YUD.get('repo_count');
-	   if(cnt){
-		   YUD.get('repo_count').innerHTML = showing;
-	   }       
-       
-	}	
+       // if repo_count is set update the number
+       var cnt = YUD.get('repo_count');
+       if(cnt){
+           YUD.get('repo_count').innerHTML = showing;
+       }
+
+    }
 };
 
 var tableTr = function(cls, body){
-	var _el = document.createElement('div');
-	var cont = new YAHOO.util.Element(body);
-	var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
-	var id = 'comment-tr-{0}'.format(comment_id);
-	var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
-	              '<td class="lineno-inline new-inline"></td>'+
-    			  '<td class="lineno-inline old-inline"></td>'+ 
+    var _el = document.createElement('div');
+    var cont = new YAHOO.util.Element(body);
+    var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
+    var id = 'comment-tr-{0}'.format(comment_id);
+    var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
+                  '<td class="lineno-inline new-inline"></td>'+
+                  '<td class="lineno-inline old-inline"></td>'+
                   '<td>{2}</td>'+
                  '</tr></tbody></table>').format(id, cls, body);
-	_el.innerHTML = _html;
-	return _el.children[0].children[0].children[0];
+    _el.innerHTML = _html;
+    return _el.children[0].children[0].children[0];
 };
 
 /** comments **/
 var removeInlineForm = function(form) {
-	form.parentNode.removeChild(form);
+    form.parentNode.removeChild(form);
 };
 
 var createInlineForm = function(parent_tr, f_path, line) {
-	var tmpl = YUD.get('comment-inline-form-template').innerHTML;
-	tmpl = tmpl.format(f_path, line);
-	var form = tableTr('comment-form-inline',tmpl)
+    var tmpl = YUD.get('comment-inline-form-template').innerHTML;
+    tmpl = tmpl.format(f_path, line);
+    var form = tableTr('comment-form-inline',tmpl)
 
-	// create event for hide button
-	form = new YAHOO.util.Element(form);
-	var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
-	form_hide_button.on('click', function(e) {
-		var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
-		if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
-			YUD.setStyle(newtr.nextElementSibling,'display','');
-		}
-		removeInlineForm(newtr);
-		YUD.removeClass(parent_tr, 'form-open');
-		YUD.removeClass(parent_tr, 'hl-comment');
-		
-	});
-	
-	return form
+    // create event for hide button
+    form = new YAHOO.util.Element(form);
+    var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
+    form_hide_button.on('click', function(e) {
+        var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
+        if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
+            YUD.setStyle(newtr.nextElementSibling,'display','');
+        }
+        removeInlineForm(newtr);
+        YUD.removeClass(parent_tr, 'form-open');
+        YUD.removeClass(parent_tr, 'hl-comment');
+
+    });
+
+    return form
 };
 
 /**
@@ -793,192 +796,218 @@
  * block at the very bottom
  */
 var injectInlineForm = function(tr){
-	  if(!YUD.hasClass(tr, 'line')){
-		  return
-	  }
-	  var submit_url = AJAX_COMMENT_URL;
-	  var _td = YUD.getElementsByClassName('code',null,tr)[0];
-	  if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
-		  return
-	  }	
-	  YUD.addClass(tr,'form-open');
-	  YUD.addClass(tr,'hl-comment');
-	  var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
-	  var f_path = YUD.getAttribute(node,'path');
-	  var lineno = getLineNo(tr);
-	  var form = createInlineForm(tr, f_path, lineno, submit_url);
-	  
-	  var parent = tr;
-	  while (1){
-		  var n = parent.nextElementSibling;
-		  // next element are comments !
-		  if(YUD.hasClass(n,'inline-comments')){
-			  parent = n;
-		  }
-		  else{
-			  break;
-		  }
-	  }	  
-	  YUD.insertAfter(form,parent);
-	  var f = YUD.get(form);
-	  var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
-	  var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
-	  
-	  YUE.on(YUD.get(_form), 'submit',function(e){
-		  YUE.preventDefault(e);
-		  
-		  //ajax submit
-		  var text = YUD.get('text_'+lineno).value;
-		  var postData = {
-	            'text':text,
-	            'f_path':f_path,
-	            'line':lineno
-		  };
-		  
-		  if(lineno === undefined){
-			  alert('missing line !');
-			  return
-		  }
-		  if(f_path === undefined){
-			  alert('missing file path !');
-			  return
-		  }
-		  
-		  if(text == ""){
-			  return
-		  }
-		  
-		  var success = function(o){
-			  YUD.removeClass(tr, 'form-open');
-			  removeInlineForm(f);			  
-			  var json_data = JSON.parse(o.responseText);
-	          renderInlineComment(json_data);
-		  };
+      if(!YUD.hasClass(tr, 'line')){
+          return
+      }
+      var submit_url = AJAX_COMMENT_URL;
+      var _td = YUD.getElementsByClassName('code',null,tr)[0];
+      if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
+          return
+      }
+      YUD.addClass(tr,'form-open');
+      YUD.addClass(tr,'hl-comment');
+      var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
+      var f_path = YUD.getAttribute(node,'path');
+      var lineno = getLineNo(tr);
+      var form = createInlineForm(tr, f_path, lineno, submit_url);
+
+      var parent = tr;
+      while (1){
+          var n = parent.nextElementSibling;
+          // next element are comments !
+          if(YUD.hasClass(n,'inline-comments')){
+              parent = n;
+          }
+          else{
+              break;
+          }
+      }
+      YUD.insertAfter(form,parent);
+      var f = YUD.get(form);
+      var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
+      var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
+
+      YUE.on(YUD.get(_form), 'submit',function(e){
+          YUE.preventDefault(e);
+
+          //ajax submit
+          var text = YUD.get('text_'+lineno).value;
+          var postData = {
+                'text':text,
+                'f_path':f_path,
+                'line':lineno
+          };
+
+          if(lineno === undefined){
+              alert('missing line !');
+              return
+          }
+          if(f_path === undefined){
+              alert('missing file path !');
+              return
+          }
 
-		  if (YUD.hasClass(overlay,'overlay')){
-			  var w = _form.offsetWidth;
-			  var h = _form.offsetHeight;
-			  YUD.setStyle(overlay,'width',w+'px');
-			  YUD.setStyle(overlay,'height',h+'px');
-		  }		  
-		  YUD.addClass(overlay, 'submitting');		  
-		  
-		  ajaxPOST(submit_url, postData, success);
-	  });
-	  
-	  setTimeout(function(){
-		  // callbacks
-		  tooltip_activate();
-		  MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno, 
-	                         _USERS_AC_DATA, _GROUPS_AC_DATA);
-		  var _e = YUD.get('text_'+lineno);
-		  if(_e){
-			  _e.focus();
-		  }
-	  },10)
+          if(text == ""){
+              return
+          }
+
+          var success = function(o){
+              YUD.removeClass(tr, 'form-open');
+              removeInlineForm(f);
+              var json_data = JSON.parse(o.responseText);
+              renderInlineComment(json_data);
+          };
+
+          if (YUD.hasClass(overlay,'overlay')){
+              var w = _form.offsetWidth;
+              var h = _form.offsetHeight;
+              YUD.setStyle(overlay,'width',w+'px');
+              YUD.setStyle(overlay,'height',h+'px');
+          }
+          YUD.addClass(overlay, 'submitting');
+
+          ajaxPOST(submit_url, postData, success);
+      });
+
+      YUE.on('preview-btn_'+lineno, 'click', function(e){
+           var _text = YUD.get('text_'+lineno).value;
+           if(!_text){
+               return
+           }
+           var post_data = {'text': _text};
+           YUD.addClass('preview-box_'+lineno, 'unloaded');
+           YUD.get('preview-box_'+lineno).innerHTML = _TM['Loading ...'];
+           YUD.setStyle('edit-container_'+lineno, 'display', 'none');
+           YUD.setStyle('preview-container_'+lineno, 'display', '');
+
+           var url = pyroutes.url('changeset_comment_preview', {'repo_name': REPO_NAME});
+           ajaxPOST(url,post_data,function(o){
+               YUD.get('preview-box_'+lineno).innerHTML = o.responseText;
+               YUD.removeClass('preview-box_'+lineno, 'unloaded');
+           })
+       })
+       YUE.on('edit-btn_'+lineno, 'click', function(e){
+           YUD.setStyle('edit-container_'+lineno, 'display', '');
+           YUD.setStyle('preview-container_'+lineno, 'display', 'none');
+       })
+
+
+      setTimeout(function(){
+          // callbacks
+          tooltip_activate();
+          MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
+                             _USERS_AC_DATA, _GROUPS_AC_DATA);
+          var _e = YUD.get('text_'+lineno);
+          if(_e){
+              _e.focus();
+          }
+      },10)
 };
 
 var deleteComment = function(comment_id){
-	var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
+    var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
     var postData = {'_method':'delete'};
     var success = function(o){
         var n = YUD.get('comment-tr-'+comment_id);
         var root = prevElementSibling(prevElementSibling(n));
         n.parentNode.removeChild(n);
 
-        // scann nodes, and attach add button to last one
-        placeAddButton(root);
+        // scann nodes, and attach add button to last one only for TR
+        // which are the inline comments
+        if(root && root.tagName == 'TR'){
+            placeAddButton(root);
+        }
     }
     ajaxPOST(url,postData,success);
 }
 
 var createInlineAddButton = function(tr){
 
-	var label = TRANSLATION_MAP['Add another comment'];
-	
-	var html_el = document.createElement('div');
-	YUD.addClass(html_el, 'add-comment');
-	html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
-	
-	var add = new YAHOO.util.Element(html_el);
-	add.on('click', function(e) {
-		injectInlineForm(tr);
-	});
-	return add;
+    var label = TRANSLATION_MAP['Add another comment'];
+
+    var html_el = document.createElement('div');
+    YUD.addClass(html_el, 'add-comment');
+    html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
+
+    var add = new YAHOO.util.Element(html_el);
+    add.on('click', function(e) {
+        injectInlineForm(tr);
+    });
+    return add;
 };
 
 var getLineNo = function(tr) {
-	var line;
-	var o = tr.children[0].id.split('_');
-	var n = tr.children[1].id.split('_');
+    var line;
+    var o = tr.children[0].id.split('_');
+    var n = tr.children[1].id.split('_');
 
-	if (n.length >= 2) {
-		line = n[n.length-1];
-	} else if (o.length >= 2) {
-		line = o[o.length-1];
-	}
+    if (n.length >= 2) {
+        line = n[n.length-1];
+    } else if (o.length >= 2) {
+        line = o[o.length-1];
+    }
 
-	return line
+    return line
 };
 
 var placeAddButton = function(target_tr){
-	if(!target_tr){
-		return
-	}
-	var last_node = target_tr;
-    //scann	
-	  while (1){
-		  var n = last_node.nextElementSibling;
-		  // next element are comments !
-		  if(YUD.hasClass(n,'inline-comments')){
-			  last_node = n;
-			  //also remove the comment button from previous
-			  var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
-			  for(var i=0;i<comment_add_buttons.length;i++){
-				  var b = comment_add_buttons[i];
-				  b.parentNode.removeChild(b);
-			  }
-		  }
-		  else{
-			  break;
-		  }
-	  }
-	  
+    if(!target_tr){
+        return
+    }
+    var last_node = target_tr;
+    //scann
+      while (1){
+          var n = last_node.nextElementSibling;
+          // next element are comments !
+          if(YUD.hasClass(n,'inline-comments')){
+              last_node = n;
+              //also remove the comment button from previous
+              var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
+              for(var i=0;i<comment_add_buttons.length;i++){
+                  var b = comment_add_buttons[i];
+                  b.parentNode.removeChild(b);
+              }
+          }
+          else{
+              break;
+          }
+      }
+
     var add = createInlineAddButton(target_tr);
     // get the comment div
     var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
     // attach add button
-    YUD.insertAfter(add,comment_block);	
+    YUD.insertAfter(add,comment_block);
 }
 
 /**
  * Places the inline comment into the changeset block in proper line position
  */
 var placeInline = function(target_container,lineno,html){
-	  var lineid = "{0}_{1}".format(target_container,lineno);
-	  var target_line = YUD.get(lineid);
-	  var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
-	  
-	  // check if there are comments already !
-	  var parent = target_line.parentNode;
-	  var root_parent = parent;
-	  while (1){
-		  var n = parent.nextElementSibling;
-		  // next element are comments !
-		  if(YUD.hasClass(n,'inline-comments')){
-			  parent = n;
-		  }
-		  else{
-			  break;
-		  }
-	  }
-	  // put in the comment at the bottom
-	  YUD.insertAfter(comment,parent);
-	  
-	  // scann nodes, and attach add button to last one
+      var lineid = "{0}_{1}".format(target_container,lineno);
+      var target_line = YUD.get(lineid);
+      var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
+
+      // check if there are comments already !
+      var parent = target_line.parentNode;
+      var root_parent = parent;
+      while (1){
+          var n = parent.nextElementSibling;
+          // next element are comments !
+          if(YUD.hasClass(n,'inline-comments')){
+              parent = n;
+          }
+          else{
+              break;
+          }
+      }
+      // put in the comment at the bottom
+      YUD.insertAfter(comment,parent);
+
+      // scann nodes, and attach add button to last one
       placeAddButton(root_parent);
 
-	  return target_line;
+      return target_line;
 }
 
 /**
@@ -986,13 +1015,13 @@
  */
 var renderInlineComment = function(json_data){
     try{
-	  var html =  json_data['rendered_text'];
-	  var lineno = json_data['line_no'];
-	  var target_id = json_data['target_id'];
-	  placeInline(target_id, lineno, html);
+      var html =  json_data['rendered_text'];
+      var lineno = json_data['line_no'];
+      var target_id = json_data['target_id'];
+      placeInline(target_id, lineno, html);
 
     }catch(e){
-  	  console.log(e);
+      console.log(e);
     }
 }
 
@@ -1000,135 +1029,135 @@
  * Iterates over all the inlines, and places them inside proper blocks of data
  */
 var renderInlineComments = function(file_comments){
-	for (f in file_comments){
+    for (f in file_comments){
         // holding all comments for a FILE
-		var box = file_comments[f];
+        var box = file_comments[f];
 
-		var target_id = YUD.getAttribute(box,'target_id');
-		// actually comments with line numbers
+        var target_id = YUD.getAttribute(box,'target_id');
+        // actually comments with line numbers
         var comments = box.children;
         for(var i=0; i<comments.length; i++){
-        	var data = {
-        		'rendered_text': comments[i].outerHTML,
-        		'line_no': YUD.getAttribute(comments[i],'line'),
-        		'target_id': target_id
-        	}
-        	renderInlineComment(data);
+            var data = {
+                'rendered_text': comments[i].outerHTML,
+                'line_no': YUD.getAttribute(comments[i],'line'),
+                'target_id': target_id
+            }
+            renderInlineComment(data);
         }
-    }	
+    }
 }
 
 var fileBrowserListeners = function(current_url, node_list_url, url_base){
-	var current_url_branch = +"?branch=__BRANCH__";
+    var current_url_branch = +"?branch=__BRANCH__";
 
-	YUE.on('stay_at_branch','click',function(e){
-	    if(e.target.checked){
-	        var uri = current_url_branch;
-	        uri = uri.replace('__BRANCH__',e.target.value);
-	        window.location = uri;
-	    }
-	    else{
-	        window.location = current_url;
-	    }
-	})            
+    YUE.on('stay_at_branch','click',function(e){
+        if(e.target.checked){
+            var uri = current_url_branch;
+            uri = uri.replace('__BRANCH__',e.target.value);
+            window.location = uri;
+        }
+        else{
+            window.location = current_url;
+        }
+    })
 
-	var n_filter = YUD.get('node_filter');
-	var F = YAHOO.namespace('node_filter');
-	
-	F.filterTimeout = null;
-	var nodes = null;
+    var n_filter = YUD.get('node_filter');
+    var F = YAHOO.namespace('node_filter');
+
+    F.filterTimeout = null;
+    var nodes = null;
 
-	F.initFilter = function(){
-	  YUD.setStyle('node_filter_box_loading','display','');
-	  YUD.setStyle('search_activate_id','display','none');
-	  YUD.setStyle('add_node_id','display','none');
-	  YUC.initHeader('X-PARTIAL-XHR',true);
-	  YUC.asyncRequest('GET', node_list_url, {
-	      success:function(o){
-	        nodes = JSON.parse(o.responseText).nodes;
-	        YUD.setStyle('node_filter_box_loading','display','none');
-	        YUD.setStyle('node_filter_box','display','');
-	        n_filter.focus();
-			if(YUD.hasClass(n_filter,'init')){
-				n_filter.value = '';
-				YUD.removeClass(n_filter,'init');
-			}   
-	      },
-	      failure:function(o){
-	          console.log('failed to load');
-	      }
-	  },null);            
-	}
+    F.initFilter = function(){
+      YUD.setStyle('node_filter_box_loading','display','');
+      YUD.setStyle('search_activate_id','display','none');
+      YUD.setStyle('add_node_id','display','none');
+      YUC.initHeader('X-PARTIAL-XHR',true);
+      YUC.asyncRequest('GET', node_list_url, {
+          success:function(o){
+            nodes = JSON.parse(o.responseText).nodes;
+            YUD.setStyle('node_filter_box_loading','display','none');
+            YUD.setStyle('node_filter_box','display','');
+            n_filter.focus();
+            if(YUD.hasClass(n_filter,'init')){
+                n_filter.value = '';
+                YUD.removeClass(n_filter,'init');
+            }
+          },
+          failure:function(o){
+              console.log('failed to load');
+          }
+      },null);
+    }
+
+    F.updateFilter  = function(e) {
+
+        return function(){
+            // Reset timeout
+            F.filterTimeout = null;
+            var query = e.target.value.toLowerCase();
+            var match = [];
+            var matches = 0;
+            var matches_max = 20;
+            if (query != ""){
+                for(var i=0;i<nodes.length;i++){
 
-	F.updateFilter  = function(e) {
-	    
-	    return function(){
-	        // Reset timeout 
-	        F.filterTimeout = null;
-	        var query = e.target.value.toLowerCase();
-	        var match = [];
-	        var matches = 0;
-	        var matches_max = 20;
-	        if (query != ""){
-	            for(var i=0;i<nodes.length;i++){
-	            	
-	                var pos = nodes[i].name.toLowerCase().indexOf(query)
-	                if(query && pos != -1){
-	                    
-	                    matches++
-	                    //show only certain amount to not kill browser 
-	                    if (matches > matches_max){
-	                        break;
-	                    }
-	                    
-	                    var n = nodes[i].name;
-	                    var t = nodes[i].type;
-	                    var n_hl = n.substring(0,pos)
-	                      +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
-	                      +n.substring(pos+query.length)
-	                    var new_url = url_base.replace('__FPATH__',n);
-	                    match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
-	                }
-	                if(match.length >= matches_max){
-	                    match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
-	                }
-	            }                       
-	        }
-	        if(query != ""){
-	            YUD.setStyle('tbody','display','none');
-	            YUD.setStyle('tbody_filtered','display','');
-	            
-	            if (match.length==0){
-	              match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
-	            }                           
-	            
-	            YUD.get('tbody_filtered').innerHTML = match.join("");   
-	        }
-	        else{
-	            YUD.setStyle('tbody','display','');
-	            YUD.setStyle('tbody_filtered','display','none');
-	        }
-	        
-	    }
-	};
+                    var pos = nodes[i].name.toLowerCase().indexOf(query)
+                    if(query && pos != -1){
+
+                        matches++
+                        //show only certain amount to not kill browser
+                        if (matches > matches_max){
+                            break;
+                        }
+
+                        var n = nodes[i].name;
+                        var t = nodes[i].type;
+                        var n_hl = n.substring(0,pos)
+                          +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
+                          +n.substring(pos+query.length)
+                        var new_url = url_base.replace('__FPATH__',n);
+                        match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
+                    }
+                    if(match.length >= matches_max){
+                        match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
+                    }
+                }
+            }
+            if(query != ""){
+                YUD.setStyle('tbody','display','none');
+                YUD.setStyle('tbody_filtered','display','');
 
-	YUE.on(YUD.get('filter_activate'),'click',function(){
-	    F.initFilter();
-	})
-	YUE.on(n_filter,'click',function(){
-		if(YUD.hasClass(n_filter,'init')){
-			n_filter.value = '';
-			YUD.removeClass(n_filter,'init');
-		}
-	 });
-	YUE.on(n_filter,'keyup',function(e){
-	    clearTimeout(F.filterTimeout); 
-	    F.filterTimeout = setTimeout(F.updateFilter(e),600);
-	});
+                if (match.length==0){
+                  match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
+                }
+
+                YUD.get('tbody_filtered').innerHTML = match.join("");
+            }
+            else{
+                YUD.setStyle('tbody','display','');
+                YUD.setStyle('tbody_filtered','display','none');
+            }
+
+        }
+    };
+
+    YUE.on(YUD.get('filter_activate'),'click',function(){
+        F.initFilter();
+    })
+    YUE.on(n_filter,'click',function(){
+        if(YUD.hasClass(n_filter,'init')){
+            n_filter.value = '';
+            YUD.removeClass(n_filter,'init');
+        }
+     });
+    YUE.on(n_filter,'keyup',function(e){
+        clearTimeout(F.filterTimeout);
+        F.filterTimeout = setTimeout(F.updateFilter(e),600);
+    });
 };
 
 
-var initCodeMirror = function(textAreadId,resetUrl){  
+var initCodeMirror = function(textAreadId,resetUrl){
     var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
            mode:  "null",
            lineNumbers:true
@@ -1136,129 +1165,129 @@
     YUE.on('reset','click',function(e){
         window.location=resetUrl
     });
-    
+
     YUE.on('file_enable','click',function(){
         YUD.setStyle('editor_container','display','');
         YUD.setStyle('upload_file_container','display','none');
         YUD.setStyle('filename_container','display','');
     });
-    
+
     YUE.on('upload_file_enable','click',function(){
         YUD.setStyle('editor_container','display','none');
         YUD.setStyle('upload_file_container','display','');
         YUD.setStyle('filename_container','display','none');
-    });	
+    });
 };
 
 
 
 var getIdentNode = function(n){
-	//iterate thru nodes untill matched interesting node !
-	
-	if (typeof n == 'undefined'){
-		return -1
-	}
-	
-	if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
-			return n
-		}
-	else{
-		return getIdentNode(n.parentNode);
-	}
+    //iterate thru nodes untill matched interesting node !
+
+    if (typeof n == 'undefined'){
+        return -1
+    }
+
+    if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
+            return n
+        }
+    else{
+        return getIdentNode(n.parentNode);
+    }
 };
 
 var  getSelectionLink = function(e) {
 
-	//get selection from start/to nodes    	
-	if (typeof window.getSelection != "undefined") {
-		s = window.getSelection();
-	
-	   	from = getIdentNode(s.anchorNode);
-	   	till = getIdentNode(s.focusNode);
-	   	
-	    f_int = parseInt(from.id.replace('L',''));
-	    t_int = parseInt(till.id.replace('L',''));
-	    
-	    if (f_int > t_int){
-	    	//highlight from bottom 
-	    	offset = -35;
-	    	ranges = [t_int,f_int];
-	    	
-	    }
-	    else{
-	    	//highligth from top 
-	    	offset = 35;
-	    	ranges = [f_int,t_int];
-	    }
-	    // if we select more than 2 lines
-	    if (ranges[0] != ranges[1]){
-	        if(YUD.get('linktt') == null){
-	            hl_div = document.createElement('div');
-	            hl_div.id = 'linktt';
-	        }
-	        hl_div.innerHTML = '';
+    //get selection from start/to nodes
+    if (typeof window.getSelection != "undefined") {
+        s = window.getSelection();
+
+        from = getIdentNode(s.anchorNode);
+        till = getIdentNode(s.focusNode);
+
+        f_int = parseInt(from.id.replace('L',''));
+        t_int = parseInt(till.id.replace('L',''));
+
+        if (f_int > t_int){
+            //highlight from bottom
+            offset = -35;
+            ranges = [t_int,f_int];
 
-	        anchor = '#L'+ranges[0]+'-'+ranges[1];
-	        var link = document.createElement('a');
-	        link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
-	        link.innerHTML = _TM['Selection link'];
-	        hl_div.appendChild(link);
-	        YUD.get('body').appendChild(hl_div);
-	        
-	        xy = YUD.getXY(till.id);
+        }
+        else{
+            //highligth from top
+            offset = 35;
+            ranges = [f_int,t_int];
+        }
+        // if we select more than 2 lines
+        if (ranges[0] != ranges[1]){
+            if(YUD.get('linktt') == null){
+                hl_div = document.createElement('div');
+                hl_div.id = 'linktt';
+            }
+            hl_div.innerHTML = '';
 
-	        YUD.addClass('linktt', 'hl-tip-box');
-	        YUD.setStyle('linktt','top',xy[1]+offset+'px');
-	        YUD.setStyle('linktt','left',xy[0]+'px');
-	        YUD.setStyle('linktt','visibility','visible');
+            anchor = '#L'+ranges[0]+'-'+ranges[1];
+            var link = document.createElement('a');
+            link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
+            link.innerHTML = _TM['Selection link'];
+            hl_div.appendChild(link);
+            YUD.get('body').appendChild(hl_div);
+
+            xy = YUD.getXY(till.id);
 
-	    }
-	    else{
-	    	YUD.setStyle('linktt','visibility','hidden');
-	    }
-	}
+            YUD.addClass('linktt', 'hl-tip-box');
+            YUD.setStyle('linktt','top',xy[1]+offset+'px');
+            YUD.setStyle('linktt','left',xy[0]+'px');
+            YUD.setStyle('linktt','visibility','visible');
+
+        }
+        else{
+            YUD.setStyle('linktt','visibility','hidden');
+        }
+    }
 };
 
 var deleteNotification = function(url, notification_id,callbacks){
-    var callback = { 
-		success:function(o){
-		    var obj = YUD.get(String("notification_"+notification_id));
-		    if(obj.parentNode !== undefined){
-				obj.parentNode.removeChild(obj);
-			}
-			_run_callbacks(callbacks);
-		},
-	    failure:function(o){
-	        alert("error");
-	    },
-	};
+    var callback = {
+        success:function(o){
+            var obj = YUD.get(String("notification_"+notification_id));
+            if(obj.parentNode !== undefined){
+                obj.parentNode.removeChild(obj);
+            }
+            _run_callbacks(callbacks);
+        },
+        failure:function(o){
+            alert("error");
+        },
+    };
     var postData = '_method=delete';
     var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, 
-    											  callback, postData);
-};	
+    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
+                                                  callback, postData);
+};
 
 var readNotification = function(url, notification_id,callbacks){
-    var callback = { 
-		success:function(o){
-		    var obj = YUD.get(String("notification_"+notification_id));
-		    YUD.removeClass(obj, 'unread');
-		    var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
-		    
-		    if(r_button.parentNode !== undefined){
-		    	r_button.parentNode.removeChild(r_button);
-			}		    
-			_run_callbacks(callbacks);
-		},
-	    failure:function(o){
-	        alert("error");
-	    },
-	};
+    var callback = {
+        success:function(o){
+            var obj = YUD.get(String("notification_"+notification_id));
+            YUD.removeClass(obj, 'unread');
+            var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
+
+            if(r_button.parentNode !== undefined){
+                r_button.parentNode.removeChild(r_button);
+            }
+            _run_callbacks(callbacks);
+        },
+        failure:function(o){
+            alert("error");
+        },
+    };
     var postData = '_method=put';
     var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, 
-    											  callback, postData);
-};	
+    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
+                                                  callback, postData);
+};
 
 /** MEMBERS AUTOCOMPLETE WIDGET **/
 
@@ -1277,9 +1306,9 @@
             // Match against each name of each contact
             for (; i < l; i++) {
                 contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) || 
-                   	 ((contact.lname+"").toLowerCase().indexOf(query) > -1) || 
-                   	 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
+                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
                        matches[matches.length] = contact;
                    }
             }
@@ -1328,7 +1357,7 @@
     membersAC.useShadow = false;
     membersAC.resultTypeList = false;
     membersAC.animVert = false;
-    membersAC.animHoriz = false;    
+    membersAC.animHoriz = false;
     membersAC.animSpeed = 0.1;
 
     // Instantiate AutoComplete for owner
@@ -1341,9 +1370,9 @@
 
     // Helper highlight function for the formatter
     var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex) 
-            + "<span class='match'>" 
-            + full.substr(matchindex, snippet.length) 
+            return full.substring(0, matchindex)
+            + "<span class='match'>"
+            + full.substr(matchindex, snippet.length)
             + "</span>" + full.substring(matchindex + snippet.length);
         };
 
@@ -1351,11 +1380,11 @@
     var custom_formatter = function (oResultData, sQuery, sResultMatch) {
             var query = sQuery.toLowerCase();
             var _gravatar = function(res, em, group){
-            	if (group !== undefined){
-            		em = '/images/icons/group.png'
-            	}
-            	tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
-            	return tmpl.format(em,res)
+                if (group !== undefined){
+                    em = '/images/icons/group.png'
+                }
+                tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
+                return tmpl.format(em,res)
             }
             // group
             if (oResultData.grname != undefined) {
@@ -1369,13 +1398,13 @@
                 if (grnameMatchIndex > -1) {
                     return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
                 }
-			    return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
+                return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
             // Users
             } else if (oResultData.nname != undefined) {
                 var fname = oResultData.fname || "";
                 var lname = oResultData.lname || "";
                 var nname = oResultData.nname;
-                
+
                 // Guard against null value
                 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
                     lnameMatchIndex = lname.toLowerCase().indexOf(query),
@@ -1409,7 +1438,7 @@
     ownerAC.formatResult = custom_formatter;
 
     var myHandler = function (sType, aArgs) {
-    		var nextId = divid.split('perm_new_member_name_')[1];
+            var nextId = divid.split('perm_new_member_name_')[1];
             var myAC = aArgs[0]; // reference back to the AC instance
             var elLI = aArgs[1]; // reference to the selected LI element
             var oData = aArgs[2]; // object literal of selected item's result data
@@ -1427,7 +1456,7 @@
 
     membersAC.itemSelectEvent.subscribe(myHandler);
     if(ownerAC.itemSelectEvent){
-    	ownerAC.itemSelectEvent.subscribe(myHandler);
+        ownerAC.itemSelectEvent.subscribe(myHandler);
     }
 
     return {
@@ -1445,11 +1474,11 @@
 
     // Define a custom search function for the DataSource of users
     var matchUsers = function (sQuery) {
-    	    var org_sQuery = sQuery;
-    	    if(this.mentionQuery == null){
-    	    	return []    	    	
-    	    }
-    	    sQuery = this.mentionQuery;
+            var org_sQuery = sQuery;
+            if(this.mentionQuery == null){
+                return []
+            }
+            sQuery = this.mentionQuery;
             // Case insensitive matching
             var query = sQuery.toLowerCase();
             var i = 0;
@@ -1459,9 +1488,9 @@
             // Match against each name of each contact
             for (; i < l; i++) {
                 contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) || 
-                	 ((contact.lname+"").toLowerCase().indexOf(query) > -1) || 
-                	 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
+                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
                     matches[matches.length] = contact;
                 }
             }
@@ -1487,37 +1516,37 @@
     ownerAC.resultTypeList = false;
     ownerAC.suppressInputUpdate = true;
     ownerAC.animVert = false;
-    ownerAC.animHoriz = false;    
+    ownerAC.animHoriz = false;
     ownerAC.animSpeed = 0.1;
-    
+
     // Helper highlight function for the formatter
     var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex) 
-            + "<span class='match'>" 
-            + full.substr(matchindex, snippet.length) 
+            return full.substring(0, matchindex)
+            + "<span class='match'>"
+            + full.substr(matchindex, snippet.length)
             + "</span>" + full.substring(matchindex + snippet.length);
         };
 
     // Custom formatter to highlight the matching letters
     ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
-		    var org_sQuery = sQuery;
-		    if(this.dataSource.mentionQuery != null){
-		    	sQuery = this.dataSource.mentionQuery;		    	
-		    }
+            var org_sQuery = sQuery;
+            if(this.dataSource.mentionQuery != null){
+                sQuery = this.dataSource.mentionQuery;
+            }
 
             var query = sQuery.toLowerCase();
             var _gravatar = function(res, em, group){
-            	if (group !== undefined){
-            		em = '/images/icons/group.png'
-            	}
-            	tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
-            	return tmpl.format(em,res)
+                if (group !== undefined){
+                    em = '/images/icons/group.png'
+                }
+                tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
+                return tmpl.format(em,res)
             }
             if (oResultData.nname != undefined) {
                 var fname = oResultData.fname || "";
                 var lname = oResultData.lname || "";
                 var nname = oResultData.nname;
-                
+
                 // Guard against null value
                 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
                     lnameMatchIndex = lname.toLowerCase().indexOf(query),
@@ -1549,7 +1578,7 @@
         };
 
     if(ownerAC.itemSelectEvent){
-    	ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
+        ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
 
             var myAC = aArgs[0]; // reference back to the AC instance
             var elLI = aArgs[1]; // reference to the selected LI element
@@ -1557,13 +1586,13 @@
             //fill the autocomplete with value
             if (oData.nname != undefined) {
                 //users
-            	//Replace the mention name with replaced
-            	var re = new RegExp();
-            	var org = myAC.getInputEl().value;
-            	var chunks = myAC.dataSource.chunks
-            	// replace middle chunk(the search term) with actuall  match
-            	chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
-            								  '@'+oData.nname+' ');
+                //Replace the mention name with replaced
+                var re = new RegExp();
+                var org = myAC.getInputEl().value;
+                var chunks = myAC.dataSource.chunks
+                // replace middle chunk(the search term) with actuall  match
+                chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
+                                              '@'+oData.nname+' ');
                 myAC.getInputEl().value = chunks.join('')
                 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
             } else {
@@ -1581,48 +1610,48 @@
     ownerAC.dataSource.mentionQuery = null;
 
     ownerAC.get_mention = function(msg, max_pos) {
-    	var org = msg;
-    	var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
-    	var chunks  = [];
+        var org = msg;
+        var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
+        var chunks  = [];
+
 
-		
-    	// cut first chunk until curret pos
-		var to_max = msg.substr(0, max_pos);		
-		var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
-		var msg2 = to_max.substr(at_pos);
+        // cut first chunk until curret pos
+        var to_max = msg.substr(0, max_pos);
+        var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
+        var msg2 = to_max.substr(at_pos);
 
-		chunks.push(org.substr(0,at_pos))// prefix chunk
-		chunks.push(msg2)                // search chunk
-		chunks.push(org.substr(max_pos)) // postfix chunk
+        chunks.push(org.substr(0,at_pos))// prefix chunk
+        chunks.push(msg2)                // search chunk
+        chunks.push(org.substr(max_pos)) // postfix chunk
 
-		// clean up msg2 for filtering and regex match
-		var msg2 = msg2.lstrip(' ').lstrip('\n');
+        // clean up msg2 for filtering and regex match
+        var msg2 = msg2.lstrip(' ').lstrip('\n');
 
-		if(re.test(msg2)){
-			var unam = re.exec(msg2)[1];
-			return [unam, chunks];
-		}
-		return [null, null];
+        if(re.test(msg2)){
+            var unam = re.exec(msg2)[1];
+            return [unam, chunks];
+        }
+        return [null, null];
     };
-    
+
     if (ownerAC.textboxKeyUpEvent){
-		ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
-			
-			var ac_obj = args[0];
-			var currentMessage = args[1];
-			var currentCaretPosition = args[0]._elTextbox.selectionStart;
-	
-			var unam = ownerAC.get_mention(currentMessage, currentCaretPosition); 
-			var curr_search = null;
-			if(unam[0]){
-				curr_search = unam[0];
-			}
-			
-			ownerAC.dataSource.chunks = unam[1];
-			ownerAC.dataSource.mentionQuery = curr_search;
-	
-		})
-	}	
+        ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
+
+            var ac_obj = args[0];
+            var currentMessage = args[1];
+            var currentCaretPosition = args[0]._elTextbox.selectionStart;
+
+            var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
+            var curr_search = null;
+            if(unam[0]){
+                curr_search = unam[0];
+            }
+
+            ownerAC.dataSource.chunks = unam[1];
+            ownerAC.dataSource.mentionQuery = curr_search;
+
+        })
+    }
     return {
         ownerDS: ownerDS,
         ownerAC: ownerAC,
@@ -1630,54 +1659,54 @@
 }
 
 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
-	var members  = YUD.get('review_members');
-	var tmpl = '<li id="reviewer_{2}">'+
+    var members  = YUD.get('review_members');
+    var tmpl = '<li id="reviewer_{2}">'+
     '<div class="reviewers_member">'+
       '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
       '<div style="float:left">{1}</div>'+
       '<input type="hidden" value="{2}" name="review_members" />'+
       '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
     '</div>'+
-    '</li>'	;
+    '</li>' ;
     var displayname = "{0} {1} ({2})".format(fname,lname,nname);
-	var element = tmpl.format(gravatar_link,displayname,id);
-	// check if we don't have this ID already in
-	var ids = [];
-	var _els = YUQ('#review_members li');
-	for (el in _els){
-		ids.push(_els[el].id)
-	}
-	if(ids.indexOf('reviewer_'+id) == -1){
-		//only add if it's not there
-		members.innerHTML += element;
-	}
-	    
+    var element = tmpl.format(gravatar_link,displayname,id);
+    // check if we don't have this ID already in
+    var ids = [];
+    var _els = YUQ('#review_members li');
+    for (el in _els){
+        ids.push(_els[el].id)
+    }
+    if(ids.indexOf('reviewer_'+id) == -1){
+        //only add if it's not there
+        members.innerHTML += element;
+    }
+
 }
 
 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
-	var el = YUD.get('reviewer_{0}'.format(reviewer_id));
-	if (el.parentNode !== undefined){
-		el.parentNode.removeChild(el);
-	}
+    var el = YUD.get('reviewer_{0}'.format(reviewer_id));
+    if (el.parentNode !== undefined){
+        el.parentNode.removeChild(el);
+    }
 }
 
 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
-	if (reviewers_ids === undefined){
-  	  var reviewers_ids = [];
-	  var ids = YUQ('#review_members input');
-	  for(var i=0; i<ids.length;i++){
-		  var id = ids[i].value
-		  reviewers_ids.push(id);
-	  }		
-	}
-	var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
-												  "pull_request_id": pull_request_id});
-	var postData = {'_method':'put',
-			        'reviewers_ids': reviewers_ids};
-	var success = function(o){
-		window.location.reload();
-	}
-	ajaxPOST(url,postData,success);
+    if (reviewers_ids === undefined){
+      var reviewers_ids = [];
+      var ids = YUQ('#review_members input');
+      for(var i=0; i<ids.length;i++){
+          var id = ids[i].value
+          reviewers_ids.push(id);
+      }
+    }
+    var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
+                                                  "pull_request_id": pull_request_id});
+    var postData = {'_method':'put',
+                    'reviewers_ids': reviewers_ids};
+    var success = function(o){
+        window.location.reload();
+    }
+    ajaxPOST(url,postData,success);
 }
 
 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
@@ -1695,9 +1724,9 @@
             // Match against each name of each contact
             for (; i < l; i++) {
                 contact = myUsers[i];
-                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) || 
-                   	 ((contact.lname+"").toLowerCase().indexOf(query) > -1) || 
-                   	 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
+                if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
+                     ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
                        matches[matches.length] = contact;
                    }
             }
@@ -1741,37 +1770,37 @@
     reviewerAC.resultTypeList = false;
     reviewerAC.suppressInputUpdate = true;
     reviewerAC.animVert = false;
-    reviewerAC.animHoriz = false;    
+    reviewerAC.animHoriz = false;
     reviewerAC.animSpeed = 0.1;
-    
+
     // Helper highlight function for the formatter
     var highlightMatch = function (full, snippet, matchindex) {
-            return full.substring(0, matchindex) 
-            + "<span class='match'>" 
-            + full.substr(matchindex, snippet.length) 
+            return full.substring(0, matchindex)
+            + "<span class='match'>"
+            + full.substr(matchindex, snippet.length)
             + "</span>" + full.substring(matchindex + snippet.length);
         };
 
     // Custom formatter to highlight the matching letters
     reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
-		    var org_sQuery = sQuery;
-		    if(this.dataSource.mentionQuery != null){
-		    	sQuery = this.dataSource.mentionQuery;		    	
-		    }
+            var org_sQuery = sQuery;
+            if(this.dataSource.mentionQuery != null){
+                sQuery = this.dataSource.mentionQuery;
+            }
 
             var query = sQuery.toLowerCase();
             var _gravatar = function(res, em, group){
-            	if (group !== undefined){
-            		em = '/images/icons/group.png'
-            	}
-            	tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
-            	return tmpl.format(em,res)
+                if (group !== undefined){
+                    em = '/images/icons/group.png'
+                }
+                tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
+                return tmpl.format(em,res)
             }
             if (oResultData.nname != undefined) {
                 var fname = oResultData.fname || "";
                 var lname = oResultData.lname || "";
                 var nname = oResultData.nname;
-                
+
                 // Guard against null value
                 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
                     lnameMatchIndex = lname.toLowerCase().indexOf(query),
@@ -1801,26 +1830,26 @@
                 return '';
             }
         };
-        
+
     //members cache to catch duplicates
     reviewerAC.dataSource.cache = [];
     // hack into select event
     if(reviewerAC.itemSelectEvent){
-    	reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
+        reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
 
             var myAC = aArgs[0]; // reference back to the AC instance
             var elLI = aArgs[1]; // reference to the selected LI element
             var oData = aArgs[2]; // object literal of selected item's result data
-            
+
             //fill the autocomplete with value
 
             if (oData.nname != undefined) {
-            	addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
-            					oData.gravatar_lnk);
-            	myAC.dataSource.cache.push(oData.id);
-            	YUD.get('user').value = '' 
+                addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
+                                oData.gravatar_lnk);
+                myAC.dataSource.cache.push(oData.id);
+                YUD.get('user').value = ''
             }
-    	});        
+        });
     }
     return {
         ownerDS: ownerDS,
@@ -1855,13 +1884,13 @@
 
 // returns a node from given html;
 var fromHTML = function(html){
-	  var _html = document.createElement('element');
-	  _html.innerHTML = html;
-	  return _html;
+      var _html = document.createElement('element');
+      _html.innerHTML = html;
+      return _html;
 }
 var get_rev = function(node){
     var n = node.firstElementChild.firstElementChild;
-    
+
     if (n===null){
         return -1
     }
@@ -1872,56 +1901,56 @@
 }
 
 var get_name = function(node){
-	 var name = node.firstElementChild.children[2].innerHTML; 
-	 return name
+     var name = node.firstElementChild.children[2].innerHTML;
+     return name
 }
 var get_group_name = function(node){
-	var name = node.firstElementChild.children[1].innerHTML;
-	return name
+    var name = node.firstElementChild.children[1].innerHTML;
+    return name
 }
 var get_date = function(node){
-	var date_ = YUD.getAttribute(node.firstElementChild,'date');
-	return date_
+    var date_ = YUD.getAttribute(node.firstElementChild,'date');
+    return date_
 }
 
 var get_age = function(node){
-	return node
+    return node
 }
 
 var get_link = function(node){
-	return node.firstElementChild.text;
+    return node.firstElementChild.text;
 }
 
 var revisionSort = function(a, b, desc, field) {
-	  
-	  var a_ = fromHTML(a.getData(field));
-	  var b_ = fromHTML(b.getData(field));
-	  
-	  // extract revisions from string nodes 
-	  a_ = get_rev(a_)
-	  b_ = get_rev(b_)
-	      	  
-	  var comp = YAHOO.util.Sort.compare;
-	  var compState = comp(a_, b_, desc);
-	  return compState;
+
+      var a_ = fromHTML(a.getData(field));
+      var b_ = fromHTML(b.getData(field));
+
+      // extract revisions from string nodes
+      a_ = get_rev(a_)
+      b_ = get_rev(b_)
+
+      var comp = YAHOO.util.Sort.compare;
+      var compState = comp(a_, b_, desc);
+      return compState;
 };
 var ageSort = function(a, b, desc, field) {
     var a_ = fromHTML(a.getData(field));
     var b_ = fromHTML(b.getData(field));
-    
+
     // extract name from table
     a_ = get_date(a_)
-    b_ = get_date(b_)          
-    
+    b_ = get_date(b_)
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
 };
 
 var lastLoginSort = function(a, b, desc, field) {
-	var a_ = a.getData('last_login_raw') || 0;
+    var a_ = a.getData('last_login_raw') || 0;
     var b_ = b.getData('last_login_raw') || 0;
-    
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
@@ -1933,8 +1962,8 @@
 
     // extract name from table
     a_ = get_name(a_)
-    b_ = get_name(b_)          
-    
+    b_ = get_name(b_)
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
@@ -1946,8 +1975,8 @@
     // extract name from table
 
     a_ = a_.children[0].innerHTML;
-    b_ = b_.children[0].innerHTML;      
-    
+    b_ = b_.children[0].innerHTML;
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
@@ -1956,11 +1985,11 @@
 var groupNameSort = function(a, b, desc, field) {
     var a_ = fromHTML(a.getData(field));
     var b_ = fromHTML(b.getData(field));
-    
+
     // extract name from table
     a_ = get_group_name(a_)
-    b_ = get_group_name(b_)          
-    
+    b_ = get_group_name(b_)
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
@@ -1968,26 +1997,26 @@
 var dateSort = function(a, b, desc, field) {
     var a_ = fromHTML(a.getData(field));
     var b_ = fromHTML(b.getData(field));
-    
+
     // extract name from table
     a_ = get_date(a_)
-    b_ = get_date(b_)          
-    
+    b_ = get_date(b_)
+
     var comp = YAHOO.util.Sort.compare;
     var compState = comp(a_, b_, desc);
     return compState;
 };
 
 var usernamelinkSort = function(a, b, desc, field) {
-	  var a_ = fromHTML(a.getData(field));
-	  var b_ = fromHTML(b.getData(field));
-	  
-	  // extract url text from string nodes 
-	  a_ = get_link(a_)
-	  b_ = get_link(b_)
-	  var comp = YAHOO.util.Sort.compare;
-	  var compState = comp(a_, b_, desc);
-	  return compState;
+      var a_ = fromHTML(a.getData(field));
+      var b_ = fromHTML(b.getData(field));
+
+      // extract url text from string nodes
+      a_ = get_link(a_)
+      b_ = get_link(b_)
+      var comp = YAHOO.util.Sort.compare;
+      var compState = comp(a_, b_, desc);
+      return compState;
 }
 
 var addPermAction = function(_html, users_list, groups_list){
@@ -1999,172 +2028,486 @@
        last_node.innerHTML = _html;
        YUD.setStyle(last_node, 'display', '');
        YUD.removeClass(last_node, 'last_new_member');
-       MembersAutoComplete("perm_new_member_name_"+next_id, 
-               "perm_container_"+next_id, users_list, groups_list);          
+       MembersAutoComplete("perm_new_member_name_"+next_id,
+               "perm_container_"+next_id, users_list, groups_list);
        //create new last NODE
        var el = document.createElement('tr');
        el.id = 'add_perm_input';
        YUD.addClass(el,'last_new_member');
        YUD.addClass(el,'new_members');
        YUD.insertAfter(el, last_node);
-    }	
+    }
 }
+function ajaxActionRevokePermission(url, obj_id, obj_type, field_id, extra_data) {
+    var callback = {
+        success: function (o) {
+            var tr = YUD.get(String(field_id));
+            tr.parentNode.removeChild(tr);
+        },
+        failure: function (o) {
+            alert(_TM['Failed to remoke permission'] + ": " + o.status);
+        },
+    };
+    query_params = {
+        '_method': 'delete'
+    }
+    // put extra data into POST
+    if (extra_data !== undefined && (typeof extra_data === 'object')){
+        for(k in extra_data){
+            query_params[k] = extra_data[k];
+        }
+    }
 
+    if (obj_type=='user'){
+        query_params['user_id'] = obj_id;
+        query_params['obj_type'] = 'user';
+    }
+    else if (obj_type=='user_group'){
+        query_params['user_group_id'] = obj_id;
+        query_params['obj_type'] = 'user_group';
+    }
+
+    var request = YAHOO.util.Connect.asyncRequest('POST', url, callback,
+            toQueryString(query_params));
+};
 /* Multi selectors */
 
 var MultiSelectWidget = function(selected_id, available_id, form_id){
 
 
-	//definition of containers ID's
-	var selected_container = selected_id;
-	var available_container = available_id;
-	
-	//temp container for selected storage.
-	var cache = new Array();
-	var av_cache = new Array();
-	var c =  YUD.get(selected_container);
-	var ac = YUD.get(available_container);
-	
-	//get only selected options for further fullfilment
-	for(var i = 0;node =c.options[i];i++){
-	    if(node.selected){
-	        //push selected to my temp storage left overs :)
-	        cache.push(node);
-	    }
-	}
-	
-	//get all available options to cache
-	for(var i = 0;node =ac.options[i];i++){
-	        //push selected to my temp storage left overs :)
-	        av_cache.push(node);
-	}
-	
-	//fill available only with those not in chosen
-	ac.options.length=0;
-	tmp_cache = new Array();
-	
-	for(var i = 0;node = av_cache[i];i++){
-	    var add = true;
-	    for(var i2 = 0;node_2 = cache[i2];i2++){
-	        if(node.value == node_2.value){
-	            add=false;
-	            break;
-	        }
-	    }
-	    if(add){
-	        tmp_cache.push(new Option(node.text, node.value, false, false));
-	    }
-	}
-	
-	for(var i = 0;node = tmp_cache[i];i++){
-	    ac.options[i] = node;
-	}
-	
-	function prompts_action_callback(e){
-	
-	    var chosen = YUD.get(selected_container);
-	    var available = YUD.get(available_container);
-	
-	    //get checked and unchecked options from field
-	    function get_checked(from_field){
-	        //temp container for storage.
-	        var sel_cache = new Array();
-	        var oth_cache = new Array();
-	
-	        for(var i = 0;node = from_field.options[i];i++){
-	            if(node.selected){
-	                //push selected fields :)
-	                sel_cache.push(node);
-	            }
-	            else{
-	                oth_cache.push(node)
-	            }
-	        }
-	
-	        return [sel_cache,oth_cache]
-	    }
-	
-	    //fill the field with given options
-	    function fill_with(field,options){
-	        //clear firtst
-	        field.options.length=0;
-	        for(var i = 0;node = options[i];i++){
-	                field.options[i]=new Option(node.text, node.value,
-	                        false, false);
-	        }
-	
-	    }
-	    //adds to current field
-	    function add_to(field,options){
-	        for(var i = 0;node = options[i];i++){
-	                field.appendChild(new Option(node.text, node.value,
-	                        false, false));
-	        }
-	    }
-	
-	    // add action
-	    if (this.id=='add_element'){
-	        var c = get_checked(available);
-	        add_to(chosen,c[0]);
-	        fill_with(available,c[1]);
-	    }
-	    // remove action
-	    if (this.id=='remove_element'){
-	        var c = get_checked(chosen);
-	        add_to(available,c[0]);
-	        fill_with(chosen,c[1]);
-	    }
-	    // add all elements
-	    if(this.id=='add_all_elements'){
-	        for(var i=0; node = available.options[i];i++){
-	                chosen.appendChild(new Option(node.text,
-	                        node.value, false, false));
-	        }
-	        available.options.length = 0;
-	    }
-	    //remove all elements
-	    if(this.id=='remove_all_elements'){
-	        for(var i=0; node = chosen.options[i];i++){
-	            available.appendChild(new Option(node.text,
-	                    node.value, false, false));
-	        }
-	        chosen.options.length = 0;
-	    }
-	
-	}
-	
-	YUE.addListener(['add_element','remove_element',
-	               'add_all_elements','remove_all_elements'],'click',
-	               prompts_action_callback)
-	if (form_id !== undefined) {
-		YUE.addListener(form_id,'submit',function(){
-		    var chosen = YUD.get(selected_container);
-		    for (var i = 0; i < chosen.options.length; i++) {
-		        chosen.options[i].selected = 'selected';
-		    }
-		});
-	}
+    //definition of containers ID's
+    var selected_container = selected_id;
+    var available_container = available_id;
+
+    //temp container for selected storage.
+    var cache = new Array();
+    var av_cache = new Array();
+    var c =  YUD.get(selected_container);
+    var ac = YUD.get(available_container);
+
+    //get only selected options for further fullfilment
+    for(var i = 0;node =c.options[i];i++){
+        if(node.selected){
+            //push selected to my temp storage left overs :)
+            cache.push(node);
+        }
+    }
+
+    //get all available options to cache
+    for(var i = 0;node =ac.options[i];i++){
+            //push selected to my temp storage left overs :)
+            av_cache.push(node);
+    }
+
+    //fill available only with those not in chosen
+    ac.options.length=0;
+    tmp_cache = new Array();
+
+    for(var i = 0;node = av_cache[i];i++){
+        var add = true;
+        for(var i2 = 0;node_2 = cache[i2];i2++){
+            if(node.value == node_2.value){
+                add=false;
+                break;
+            }
+        }
+        if(add){
+            tmp_cache.push(new Option(node.text, node.value, false, false));
+        }
+    }
+
+    for(var i = 0;node = tmp_cache[i];i++){
+        ac.options[i] = node;
+    }
+
+    function prompts_action_callback(e){
+
+        var chosen = YUD.get(selected_container);
+        var available = YUD.get(available_container);
+
+        //get checked and unchecked options from field
+        function get_checked(from_field){
+            //temp container for storage.
+            var sel_cache = new Array();
+            var oth_cache = new Array();
+
+            for(var i = 0;node = from_field.options[i];i++){
+                if(node.selected){
+                    //push selected fields :)
+                    sel_cache.push(node);
+                }
+                else{
+                    oth_cache.push(node)
+                }
+            }
+
+            return [sel_cache,oth_cache]
+        }
+
+        //fill the field with given options
+        function fill_with(field,options){
+            //clear firtst
+            field.options.length=0;
+            for(var i = 0;node = options[i];i++){
+                    field.options[i]=new Option(node.text, node.value,
+                            false, false);
+            }
+
+        }
+        //adds to current field
+        function add_to(field,options){
+            for(var i = 0;node = options[i];i++){
+                    field.appendChild(new Option(node.text, node.value,
+                            false, false));
+            }
+        }
+
+        // add action
+        if (this.id=='add_element'){
+            var c = get_checked(available);
+            add_to(chosen,c[0]);
+            fill_with(available,c[1]);
+        }
+        // remove action
+        if (this.id=='remove_element'){
+            var c = get_checked(chosen);
+            add_to(available,c[0]);
+            fill_with(chosen,c[1]);
+        }
+        // add all elements
+        if(this.id=='add_all_elements'){
+            for(var i=0; node = available.options[i];i++){
+                    chosen.appendChild(new Option(node.text,
+                            node.value, false, false));
+            }
+            available.options.length = 0;
+        }
+        //remove all elements
+        if(this.id=='remove_all_elements'){
+            for(var i=0; node = chosen.options[i];i++){
+                available.appendChild(new Option(node.text,
+                        node.value, false, false));
+            }
+            chosen.options.length = 0;
+        }
+
+    }
+
+    YUE.addListener(['add_element','remove_element',
+                   'add_all_elements','remove_all_elements'],'click',
+                   prompts_action_callback)
+    if (form_id !== undefined) {
+        YUE.addListener(form_id,'submit',function(){
+            var chosen = YUD.get(selected_container);
+            for (var i = 0; i < chosen.options.length; i++) {
+                chosen.options[i].selected = 'selected';
+            }
+        });
+    }
 }
 
+// custom paginator
+var YUI_paginator = function(links_per_page, containers){
+
+    (function () {
+
+        var Paginator = YAHOO.widget.Paginator,
+            l         = YAHOO.lang,
+            setId     = YAHOO.util.Dom.generateId;
+
+        Paginator.ui.MyFirstPageLink = function (p) {
+            this.paginator = p;
+
+            p.subscribe('recordOffsetChange',this.update,this,true);
+            p.subscribe('rowsPerPageChange',this.update,this,true);
+            p.subscribe('totalRecordsChange',this.update,this,true);
+            p.subscribe('destroy',this.destroy,this,true);
+
+            // TODO: make this work
+            p.subscribe('firstPageLinkLabelChange',this.update,this,true);
+            p.subscribe('firstPageLinkClassChange',this.update,this,true);
+        };
+
+        Paginator.ui.MyFirstPageLink.init = function (p) {
+            p.setAttributeConfig('firstPageLinkLabel', {
+                value : 1,
+                validator : l.isString
+            });
+            p.setAttributeConfig('firstPageLinkClass', {
+                value : 'yui-pg-first',
+                validator : l.isString
+            });
+            p.setAttributeConfig('firstPageLinkTitle', {
+                value : 'First Page',
+                validator : l.isString
+            });
+        };
+
+        // Instance members and methods
+        Paginator.ui.MyFirstPageLink.prototype = {
+            current   : null,
+            leftmost_page: null,
+            rightmost_page: null,
+            link      : null,
+            span      : null,
+            dotdot    : null,
+            getPos    : function(cur_page, max_page, items){
+                var edge = parseInt(items / 2) + 1;
+                if (cur_page <= edge){
+                    var radius = Math.max(parseInt(items / 2), items - cur_page);
+                }
+                else if ((max_page - cur_page) < edge) {
+                    var radius = (items - 1) - (max_page - cur_page);
+                }
+                else{
+                    var radius = parseInt(items / 2);
+                }
+
+                var left = Math.max(1, (cur_page - (radius)))
+                var right = Math.min(max_page, cur_page + (radius))
+                return [left, cur_page, right]
+            },
+            render : function (id_base) {
+                var p      = this.paginator,
+                    c      = p.get('firstPageLinkClass'),
+                    label  = p.get('firstPageLinkLabel'),
+                    title  = p.get('firstPageLinkTitle');
+
+                this.link     = document.createElement('a');
+                this.span     = document.createElement('span');
+                YUD.setStyle(this.span, 'display', 'none');
+
+                var _pos = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
+                this.leftmost_page = _pos[0];
+                this.rightmost_page = _pos[2];
+
+                setId(this.link, id_base + '-first-link');
+                this.link.href      = '#';
+                this.link.className = c;
+                this.link.innerHTML = label;
+                this.link.title     = title;
+                YAHOO.util.Event.on(this.link,'click',this.onClick,this,true);
+
+                setId(this.span, id_base + '-first-span');
+                this.span.className = c;
+                this.span.innerHTML = label;
+
+                this.current = p.getCurrentPage() > 1 ? this.link : this.span;
+                return this.current;
+            },
+            update : function (e) {
+                var p      = this.paginator;
+                var _pos   = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
+                this.leftmost_page = _pos[0];
+                this.rightmost_page = _pos[2];
+
+                if (e && e.prevValue === e.newValue) {
+                    return;
+                }
+
+                var par = this.current ? this.current.parentNode : null;
+                if (this.leftmost_page > 1) {
+                    if (par && this.current === this.span) {
+                        par.replaceChild(this.link,this.current);
+                        this.current = this.link;
+                    }
+                } else {
+                    if (par && this.current === this.link) {
+                        par.replaceChild(this.span,this.current);
+                        this.current = this.span;
+                    }
+                }
+            },
+            destroy : function () {
+                YAHOO.util.Event.purgeElement(this.link);
+                this.current.parentNode.removeChild(this.current);
+                this.link = this.span = null;
+            },
+            onClick : function (e) {
+                YAHOO.util.Event.stopEvent(e);
+                this.paginator.setPage(1);
+            }
+        };
+
+        })();
+    (function () {
+
+        var Paginator = YAHOO.widget.Paginator,
+            l         = YAHOO.lang,
+            setId     = YAHOO.util.Dom.generateId;
+
+        Paginator.ui.MyLastPageLink = function (p) {
+            this.paginator = p;
+
+            p.subscribe('recordOffsetChange',this.update,this,true);
+            p.subscribe('rowsPerPageChange',this.update,this,true);
+            p.subscribe('totalRecordsChange',this.update,this,true);
+            p.subscribe('destroy',this.destroy,this,true);
+
+            // TODO: make this work
+            p.subscribe('lastPageLinkLabelChange',this.update,this,true);
+            p.subscribe('lastPageLinkClassChange', this.update,this,true);
+        };
+
+        Paginator.ui.MyLastPageLink.init = function (p) {
+            p.setAttributeConfig('lastPageLinkLabel', {
+                value : -1,
+                validator : l.isString
+            });
+            p.setAttributeConfig('lastPageLinkClass', {
+                value : 'yui-pg-last',
+                validator : l.isString
+            });
+            p.setAttributeConfig('lastPageLinkTitle', {
+                value : 'Last Page',
+                validator : l.isString
+            });
+
+        };
+
+        Paginator.ui.MyLastPageLink.prototype = {
+
+            current   : null,
+            leftmost_page: null,
+            rightmost_page: null,
+            link      : null,
+            span      : null,
+            dotdot    : null,
+            na        : null,
+            getPos    : function(cur_page, max_page, items){
+                var edge = parseInt(items / 2) + 1;
+                if (cur_page <= edge){
+                    var radius = Math.max(parseInt(items / 2), items - cur_page);
+                }
+                else if ((max_page - cur_page) < edge) {
+                    var radius = (items - 1) - (max_page - cur_page);
+                }
+                else{
+                    var radius = parseInt(items / 2);
+                }
+
+                var left = Math.max(1, (cur_page - (radius)))
+                var right = Math.min(max_page, cur_page + (radius))
+                return [left, cur_page, right]
+            },
+            render : function (id_base) {
+                var p      = this.paginator,
+                    c      = p.get('lastPageLinkClass'),
+                    label  = p.get('lastPageLinkLabel'),
+                    last   = p.getTotalPages(),
+                    title  = p.get('lastPageLinkTitle');
+
+                var _pos = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
+                this.leftmost_page = _pos[0];
+                this.rightmost_page = _pos[2];
+
+                this.link = document.createElement('a');
+                this.span = document.createElement('span');
+                YUD.setStyle(this.span, 'display', 'none');
+
+                this.na   = this.span.cloneNode(false);
+
+                setId(this.link, id_base + '-last-link');
+                this.link.href      = '#';
+                this.link.className = c;
+                this.link.innerHTML = label;
+                this.link.title     = title;
+                YAHOO.util.Event.on(this.link,'click',this.onClick,this,true);
+
+                setId(this.span, id_base + '-last-span');
+                this.span.className = c;
+                this.span.innerHTML = label;
+
+                setId(this.na, id_base + '-last-na');
+
+                if (this.rightmost_page < p.getTotalPages()){
+                    this.current = this.link;
+                }
+                else{
+                    this.current = this.span;
+                }
+
+                this.current.innerHTML = p.getTotalPages();
+                return this.current;
+            },
+
+            update : function (e) {
+                var p      = this.paginator;
+
+                var _pos = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
+                this.leftmost_page = _pos[0];
+                this.rightmost_page = _pos[2];
+
+                if (e && e.prevValue === e.newValue) {
+                    return;
+                }
+
+                var par   = this.current ? this.current.parentNode : null,
+                    after = this.link;
+                if (par) {
+
+                    // only show the last page if the rightmost one is
+                    // lower, so we don't have doubled entries at the end
+                    if (!(this.rightmost_page < p.getTotalPages())){
+                        after = this.span
+                    }
+
+                    if (this.current !== after) {
+                        par.replaceChild(after,this.current);
+                        this.current = after;
+                    }
+                }
+                this.current.innerHTML = this.paginator.getTotalPages();
+
+            },
+            destroy : function () {
+                YAHOO.util.Event.purgeElement(this.link);
+                this.current.parentNode.removeChild(this.current);
+                this.link = this.span = null;
+            },
+            onClick : function (e) {
+                YAHOO.util.Event.stopEvent(e);
+                this.paginator.setPage(this.paginator.getTotalPages());
+            }
+        };
+
+        })();
+
+    var pagi = new YAHOO.widget.Paginator({
+        rowsPerPage: links_per_page,
+        alwaysVisible: false,
+        template : "{PreviousPageLink} {MyFirstPageLink} {PageLinks} {MyLastPageLink} {NextPageLink}",
+        pageLinks: 5,
+        containerClass: 'pagination-wh',
+        currentPageClass: 'pager_curpage',
+        pageLinkClass: 'pager_link',
+        nextPageLinkLabel: '&gt;',
+        previousPageLinkLabel: '&lt;',
+        containers:containers
+    })
+
+    return pagi
+}
+
+
 
 // global hooks after DOM is loaded
 
 YUE.onDOMReady(function(){
-	YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
-		var button = e.currentTarget;
-		var t = YUD.get(button).getAttribute('target');
-	    console.log(t);
-		if(YUD.hasClass(t, 'hidden')){
-			YUD.removeClass(t, 'hidden');
-			YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
-		}
-		else if(!YUD.hasClass(t, 'hidden')){
-			YUD.addClass(t, 'hidden');
-			YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
-		}
-	});
-	
-	
-	
+    YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
+        var button = e.currentTarget;
+        var t = YUD.get(button).getAttribute('target');
+        console.log(t);
+        if(YUD.hasClass(t, 'hidden')){
+            YUD.removeClass(t, 'hidden');
+            YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
+        }
+        else if(!YUD.hasClass(t, 'hidden')){
+            YUD.addClass(t, 'hidden');
+            YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
+        }
+    });
+
+
+
 });
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/gists/index.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,71 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('Gists')} &middot; ${c.rhodecode_name}
+</%def>
+
+<%def name="breadcrumbs_links()">
+    %if c.show_private:
+        ${_('Private Gists for user %s') % c.rhodecode_user.username}
+    %elif c.show_public:
+        ${_('Public Gists for user %s') % c.rhodecode_user.username}
+    %else:
+        ${_('Public Gists')}
+    %endif
+    - ${c.gists_pager.item_count}
+</%def>
+
+<%def name="page_nav()">
+    ${self.menu('gists')}
+</%def>
+
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}
+        %if c.rhodecode_user.username != 'default':
+        <ul class="links">
+          <li>
+             <span>${h.link_to(_(u'Create new gist'), h.url('new_gist'))}</span>
+          </li>
+        </ul>
+        %endif
+    </div>
+    %if c.gists_pager.item_count>0:
+        % for gist in c.gists_pager:
+          <div class="gist-item" style="padding:10px 20px 10px 15px">
+
+            <div class="gravatar">
+               <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(gist.owner.full_contact),28)}"/>
+            </div>
+            <div title="${gist.owner.full_contact}" class="user" style="font-size: 16px">
+                <b>${h.person(gist.owner.full_contact)}</b> /
+                <b><a href="${h.url('gist',gist_id=gist.gist_access_id)}">gist:${gist.gist_access_id}</a></b>
+            </div>
+            <div style="padding: 4px 0px 0px 0px">
+                ${_('Created')} ${h.age(gist.created_on)} /
+                <span style="color: #AAA">
+                  %if gist.gist_expires == -1:
+                   ${_('Expires')}: ${_('never')}
+                  %else:
+                   ${_('Expires')}: ${h.age(h.time_to_datetime(gist.gist_expires))}
+                  %endif
+                </span>
+            </div>
+
+            <div style="border:0px;padding:10px 0px 0px 40px;color:#AAA">${gist.gist_description}</div>
+          </div>
+        % endfor
+
+        <div class="notification-paginator">
+          <div class="pagination-wh pagination-left">
+          ${c.gists_pager.pager('$link_previous ~2~ $link_next')}
+          </div>
+        </div>
+    %else:
+        <div class="table">${_('There are no gists yet')}</div>
+    %endif
+</div>
+</%def>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/gists/new.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,64 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('New gist')} &middot; ${c.rhodecode_name}
+</%def>
+
+<%def name="js_extra()">
+<script type="text/javascript" src="${h.url('/js/codemirror.js')}"></script>
+</%def>
+<%def name="css_extra()">
+<link rel="stylesheet" type="text/css" href="${h.url('/css/codemirror.css')}"/>
+</%def>
+
+<%def name="breadcrumbs_links()">
+    ${_('New gist')}
+</%def>
+
+<%def name="page_nav()">
+    ${self.menu('gists')}
+</%def>
+
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}
+    </div>
+
+    <div class="table">
+        <div id="files_data">
+          ${h.form(h.url('gists'), method='post',id='eform')}
+            <div>
+                <div class="gravatar">
+                   <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(c.rhodecode_user.full_contact),32)}"/>
+                </div>
+                <textarea style="resize:vertical; width:400px;border: 1px solid #ccc;border-radius: 3px;" id="description" name="description" placeholder="${_('Gist description ...')}"></textarea>
+            </div>
+            <div id="body" class="codeblock">
+                <div style="padding: 10px 10px 10px 22px;color:#666666">
+                    ##<input type="text" value="" size="30" name="filename" id="filename" placeholder="gistfile1.txt">
+                    ${h.text('filename', size=30, placeholder='gistfile1.txt')}
+                    ##<input type="text" value="" size="30" name="filename" id="filename" placeholder="gistfile1.txt">
+                    ${h.select('lifetime', '', c.lifetime_options)}
+                </div>
+                <div id="editor_container">
+                    <pre id="editor_pre"></pre>
+                    <textarea id="editor" name="content" style="display:none"></textarea>
+                </div>
+            </div>
+            <div style="padding-top: 5px">
+            ${h.submit('private',_('Create private gist'),class_="ui-btn yellow")}
+            ${h.submit('public',_('Create public gist'),class_="ui-btn")}
+            ${h.reset('reset',_('Reset'),class_="ui-btn")}
+            </div>
+            ${h.end_form()}
+            <script type="text/javascript">
+            initCodeMirror('editor','');
+            </script>
+        </div>
+    </div>
+
+</div>
+</%def>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/gists/show.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,97 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('gist')}:${c.gist.gist_access_id} &middot; ${c.rhodecode_name}
+</%def>
+
+<%def name="breadcrumbs_links()">
+    ${_('Gist')} &middot; gist:${c.gist.gist_access_id}
+</%def>
+
+<%def name="page_nav()">
+    ${self.menu('gists')}
+</%def>
+
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}
+        %if c.rhodecode_user.username != 'default':
+        <ul class="links">
+          <li>
+             <span>${h.link_to(_(u'Create new gist'), h.url('new_gist'))}</span>
+          </li>
+        </ul>
+        %endif
+    </div>
+    <div class="table">
+        <div id="files_data">
+            <div id="body" class="codeblock">
+                <div class="code-header">
+                    <div class="stats">
+                        <div class="left" style="margin: -4px 0px 0px 0px">
+                          %if c.gist.gist_type == 'public':
+                            <div class="ui-btn green badge">${_('Public gist')}</div>
+                          %else:
+                            <div class="ui-btn yellow badge">${_('Private gist')}</div>
+                          %endif
+                        </div>
+                        <div class="left item ${'' if c.gist.gist_description else 'last'}" style="color: #AAA">
+                         %if c.gist.gist_expires == -1:
+                          ${_('Expires')}: ${_('never')}
+                         %else:
+                          ${_('Expires')}: ${h.age(h.time_to_datetime(c.gist.gist_expires))}
+                         %endif
+                       </div>
+                       <div class="left item last">
+                            ${c.gist.gist_description}
+                       </div>
+                       %if h.HasPermissionAny('hg.admin')() or c.gist.gist_owner == c.rhodecode_user.user_id:
+                        <div style="float:right;margin:-4px 0px 0px 0px">
+                            ${h.form(url('gist', gist_id=c.gist.gist_id),method='delete')}
+                                ${h.submit('remove_gist', _('Delete'),class_="ui-btn red",onclick="return confirm('"+_('Confirm to delete this gist')+"');")}
+                            ${h.end_form()}
+                        </div>
+                       %endif
+                        <div class="buttons">
+                          ## only owner should see that
+                          ##%if h.HasPermissionAny('hg.admin')() or c.gist.gist_owner == c.rhodecode_user.user_id:
+                            ##${h.link_to(_('Edit'),h.url(''),class_="ui-btn")}
+                          ##%endif
+                          ${h.link_to(_('Show as raw'),h.url('formatted_gist', gist_id=c.gist.gist_id, format='raw'),class_="ui-btn")}
+                        </div>
+                    </div>
+
+                    <div class="author">
+                        <div class="gravatar">
+                            <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(c.file_changeset.author),16)}"/>
+                        </div>
+                        <div title="${c.file_changeset.author}" class="user">${h.person(c.file_changeset.author)} - ${_('created')} ${h.age(c.file_changeset.date)}</div>
+                    </div>
+                    <div class="commit">${h.urlify_commit(c.file_changeset.message,c.repo_name)}</div>
+                </div>
+            </div>
+
+               ## iterate over the files
+               % for file in c.files:
+               <div style="border: 1px solid #EEE;margin-top:20px">
+                <div id="${h.FID('G', file.path)}" class="stats" style="border-bottom: 1px solid #DDD;padding: 8px 14px;">
+                    <a href="${c.gist.gist_url()}">¶</a>
+                    <b style="margin:0px 0px 0px 4px">${file.path}</b>
+                    <div style="float:right">
+                       ${h.link_to(_('Show as raw'),h.url('formatted_gist_file', gist_id=c.gist.gist_id, format='raw', revision=file.changeset.raw_id, f_path=file.path),class_="ui-btn")}
+                    </div>
+                </div>
+                <div class="code-body">
+                    ${h.pygmentize(file,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")}
+                </div>
+              </div>
+               %endfor
+        </div>
+    </div>
+
+
+</div>
+</%def>
--- a/rhodecode/templates/admin/permissions/permissions.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/permissions/permissions.html	Fri Jun 07 00:31:11 2013 +0200
@@ -66,18 +66,32 @@
             </div>
             <div class="field">
                 <div class="label">
-                    <label for="default_register">${_('Registration')}:</label>
+                    <label for="default_group_perm">${_('User group')}:</label>
                 </div>
                 <div class="select">
-                    ${h.select('default_register','',c.register_choices)}
+                    ${h.select('default_user_group_perm','',c.user_group_perms_choices)}
+                    ${h.checkbox('overwrite_default_user_group','true')}
+                    <label for="overwrite_default_user_group">
+                    <span class="tooltip"
+                    title="${h.tooltip(_('All default permissions on each user group will be reset to chosen permission, note that all custom default permission on repository groups will be lost'))}">
+                    ${_('Overwrite existing settings')}</span> </label>
+
                 </div>
             </div>
              <div class="field">
                 <div class="label">
-                    <label for="default_create">${_('Repository creation')}:</label>
+                    <label for="default_repo_create">${_('Repository creation')}:</label>
                 </div>
                 <div class="select">
-                    ${h.select('default_create','',c.create_choices)}
+                    ${h.select('default_repo_create','',c.repo_create_choices)}
+                </div>
+             </div>
+             <div class="field">
+                <div class="label">
+                    <label for="default_user_group_create">${_('User group creation')}:</label>
+                </div>
+                <div class="select">
+                    ${h.select('default_user_group_create','',c.user_group_create_choices)}
                 </div>
              </div>
              <div class="field">
@@ -88,6 +102,22 @@
                     ${h.select('default_fork','',c.fork_choices)}
                 </div>
              </div>
+             <div class="field">
+                <div class="label">
+                    <label for="default_register">${_('Registration')}:</label>
+                </div>
+                <div class="select">
+                    ${h.select('default_register','',c.register_choices)}
+                </div>
+             </div>
+             <div class="field">
+                <div class="label">
+                    <label for="default_extern_activate">${_('External auth account activation')}:</label>
+                </div>
+                <div class="select">
+                    ${h.select('default_extern_activate','',c.extern_activate_choices)}
+                </div>
+             </div>
             <div class="buttons">
               ${h.submit('save',_('Save'),class_="ui-btn large")}
               ${h.reset('reset',_('Reset'),class_="ui-btn large")}
@@ -104,7 +134,8 @@
     </div>
 
     ## permissions overview
-    <%include file="/base/perms_summary.html"/>
+    <%namespace name="p" file="/base/perms_summary.html"/>
+    ${p.perms_summary(c.perm_user.permissions, show_all=True)}
 
 </div>
 <div class="box box-left" style="clear:left">
--- a/rhodecode/templates/admin/repos/repo_edit.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/repos/repo_edit.html	Fri Jun 07 00:31:11 2013 +0200
@@ -33,6 +33,7 @@
                 </div>
                 <div class="input">
                     ${h.text('repo_name',class_="medium")}
+                    <span class="help-block">${_('Non-changeable id')}: ${c.repo_info.repo_id}</span>
                 </div>
            </div>
            <div class="field">
@@ -267,7 +268,7 @@
            ${h.submit('set_unlock' ,_('Unlock locked repo'),class_="ui-btn",onclick="return confirm('"+_('Confirm to unlock repository')+"');")}
            ${'Locked by %s on %s' % (h.person_by_id(c.repo_info.locked[0]),h.fmt_date(h.time_to_datetime(c.repo_info.locked[1])))}
           %else:
-            ${h.submit('set_lock',_('lock repo'),class_="ui-btn",onclick="return confirm('"+_('Confirm to lock repository')+"');")}
+            ${h.submit('set_lock',_('Lock repo'),class_="ui-btn",onclick="return confirm('"+_('Confirm to lock repository')+"');")}
             ${_('Repository is not locked')}
           %endif
        </div>
@@ -285,7 +286,7 @@
     <div class="form">
        <div class="fields">
            ${h.select('id_fork_of','',c.repos_list,class_="medium")}
-           ${h.submit('set_as_fork_%s' % c.repo_info.repo_name,_('set'),class_="ui-btn",)}
+           ${h.submit('set_as_fork_%s' % c.repo_info.repo_name,_('Set'),class_="ui-btn",)}
        </div>
            <div class="field" style="border:none;color:#888">
            <ul>
--- a/rhodecode/templates/admin/repos/repo_edit_perms.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/repos/repo_edit_perms.html	Fri Jun 07 00:31:11 2013 +0200
@@ -29,7 +29,7 @@
             </td>
             <td>
               %if r2p.user.username !='default':
-                <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}')">
                 ${_('revoke')}
                 </span>
               %endif
@@ -54,7 +54,7 @@
                 %endif
             </td>
             <td>
-                <span class="delete_icon action_button" onclick="ajaxActionUserGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${g2p.users_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.users_group.users_group_name)}')">
                 ${_('revoke')}
                 </span>
             </td>
@@ -86,34 +86,9 @@
     </tr>
 </table>
 <script type="text/javascript">
-function ajaxActionUser(user_id, field_id) {
-    var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
-    var callback = {
-        success: function (o) {
-            var tr = YUD.get(String(field_id));
-            tr.parentNode.removeChild(tr);
-        },
-        failure: function (o) {
-            alert("${_('Failed to remove user')}");
-        },
-    };
-    var postData = '_method=delete&user_id=' + user_id;
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
-};
-
-function ajaxActionUserGroup(users_group_id,field_id){
-    var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}";
-    var callback = {
-        success:function(o){
-            var tr = YUD.get(String(field_id));
-            tr.parentNode.removeChild(tr);
-        },
-        failure:function(o){
-            alert("${_('Failed to remove user group')}");
-        },
-    };
-    var postData = '_method=delete&users_group_id='+users_group_id;
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
+function ajaxActionRevoke(obj_id, obj_type, field_id) {
+    url = "${h.url('delete_repo_perm_member',repo_name=c.repo_name)}";
+    ajaxActionRevokePermission(url, obj_id, obj_type, field_id);
 };
 
 YUE.onDOMReady(function () {
--- a/rhodecode/templates/admin/repos/repos.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/repos/repos.html	Fri Jun 07 00:31:11 2013 +0200
@@ -17,9 +17,11 @@
     <div class="title">
         ${self.breadcrumbs()}
         <ul class="links">
+         %if h.HasPermissionAny('hg.admin','hg.create.repository')():
           <li>
             <span>${h.link_to(_(u'Add repository'),h.url('new_repo'))}</span>
           </li>
+         %endif
         </ul>
     </div>
     <div class="table yui-skin-sam" id="repos_list_wrap"></div>
@@ -79,20 +81,7 @@
 
   var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
     sortedBy:{key:"name",dir:"asc"},
-    paginator: new YAHOO.widget.Paginator({
-        rowsPerPage: 25,
-        alwaysVisible: false,
-        template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-        pageLinks: 5,
-        containerClass: 'pagination-wh',
-        currentPageClass: 'pager_curpage',
-        pageLinkClass: 'pager_link',
-        nextPageLinkLabel: '&gt;',
-        previousPageLinkLabel: '&lt;',
-        firstPageLinkLabel: '&lt;&lt;',
-        lastPageLinkLabel: '&gt;&gt;',
-        containers:['user-paginator']
-    }),
+    paginator: YUI_paginator(25, ['user-paginator']),
 
     MSG_SORTASC:"${_('Click to sort ascending')}",
     MSG_SORTDESC:"${_('Click to sort descending')}",
--- a/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html	Fri Jun 07 00:31:11 2013 +0200
@@ -21,7 +21,7 @@
             </td>
             <td>
               %if r2p.user.username !='default':
-                <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}')">
                 ${_('revoke')}
                 </span>
               %endif
@@ -51,13 +51,14 @@
                 <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
             </td>
             <td>
-                <span class="delete_icon action_button" onclick="ajaxActionUserGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${g2p.users_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.users_group.users_group_name)}')">
                 ${_('revoke')}
                 </span>
             </td>
         </tr>
     %endfor
-<%
+
+    <%
     _tmpl = h.literal("""' \
         <td><input type="radio" value="group.none" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
         <td><input type="radio" value="group.read" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
@@ -89,36 +90,9 @@
     </tr>
 </table>
 <script type="text/javascript">
-function ajaxActionUser(user_id, field_id) {
-    var sUrl = "${h.url('delete_repos_group_user_perm',group_name=c.repos_group.group_name)}";
-    var callback = {
-        success: function (o) {
-            var tr = YUD.get(String(field_id));
-            tr.parentNode.removeChild(tr);
-        },
-        failure: function (o) {
-            alert("${_('Failed to remove user')}");
-        },
-    };
-    var recursive = YUD.get('recursive').checked;
-    var postData = '_method=delete&recursive={0}&user_id={1}'.format(recursive,user_id);
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
-};
-
-function ajaxActionUserGroup(users_group_id,field_id){
-    var sUrl = "${h.url('delete_repos_group_users_group_perm',group_name=c.repos_group.group_name)}";
-    var callback = {
-        success:function(o){
-            var tr = YUD.get(String(field_id));
-            tr.parentNode.removeChild(tr);
-        },
-        failure:function(o){
-            alert("${_('Failed to remove user group')}");
-        },
-    };
-    var recursive = YUD.get('recursive').checked;
-    var postData = '_method=delete&recursive={0}&users_group_id={1}'.format(recursive,users_group_id);
-    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
+function ajaxActionRevoke(obj_id, obj_type, field_id) {
+    url = "${h.url('delete_repo_group_perm_member', group_name=c.repos_group.group_name)}";
+    ajaxActionRevokePermission(url, obj_id, obj_type, field_id, {recursive:YUD.get('recursive').checked});
 };
 
 YUE.onDOMReady(function () {
--- a/rhodecode/templates/admin/repos_groups/repos_groups_edit.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/repos_groups/repos_groups_edit.html	Fri Jun 07 00:31:11 2013 +0200
@@ -18,7 +18,7 @@
 </%def>
 
 <%def name="main()">
-<div class="box">
+<div class="box box-left">
     <!-- box / title -->
     <div class="title">
         ${self.breadcrumbs()}
@@ -60,14 +60,6 @@
                 </div>
             </div>
             <div class="field">
-                <div class="label">
-                    <label for="input">${_('Permissions')}:</label>
-                </div>
-                <div class="input">
-                    <%include file="repos_group_edit_perms.html"/>
-                </div>
-            </div>
-            <div class="field">
                 <div class="label label-checkbox">
                     <label for="enable_locking">${_('Enable locking')}:</label>
                 </div>
@@ -84,4 +76,28 @@
     </div>
     ${h.end_form()}
 </div>
+<div class="box box-right">
+    <div class="title">
+        <h5>${_('Permissions')}</h5>
+    </div>
+    ${h.form(url('set_repo_group_perm_member', group_name=c.repos_group.group_name),method='post')}
+    <div class="form">
+       <div class="fields">
+            <div class="field">
+                <div class="label">
+                    <label for="input">${_('Permissions')}:</label>
+                </div>
+                <div class="input">
+                    ${h.hidden('repo_private')}
+                    <%include file="repos_group_edit_perms.html"/>
+                </div>
+            </div>
+            <div class="buttons">
+              ${h.submit('save',_('Save'),class_="ui-btn large")}
+              ${h.reset('reset',_('Reset'),class_="ui-btn large")}
+            </div>
+       </div>
+    </div>
+    ${h.end_form()}
+</div>
 </%def>
--- a/rhodecode/templates/admin/settings/settings.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/settings/settings.html	Fri Jun 07 00:31:11 2013 +0200
@@ -40,6 +40,12 @@
                         <span class="tooltip" title="${h.tooltip(_('In case a repository was deleted from filesystem and there are leftovers in the database check this option to scan obsolete data in database and remove it.'))}">
                         ${_('Destroy old data')}</span> </label>
                     </div>
+                    <div class="checkbox">
+                        ${h.checkbox('invalidate',True)}
+                        <label for="invalidate">
+                        <span class="tooltip" title="${h.tooltip(_('Invalidate cache for all repositories during scan'))}">
+                        ${_('Invalidate cache for all repositories')}</span> </label>
+                    </div>
                     <span class="help-block">${_('Rescan repositories location for new repositories. Also deletes obsolete if `destroy` flag is checked ')}</span>
                 </div>
             </div>
@@ -130,18 +136,26 @@
                 </div>
                 <div class="checkboxes">
                     <div class="checkbox">
-                        ${h.checkbox('rhodecode_lightweight_dashboard','True')}
-                        <label for="rhodecode_lightweight_dashboard">${_('Use lightweight dashboard')}</label>
-                    </div>
-                </div>
-                <div class="checkboxes">
-                    <div class="checkbox">
                         ${h.checkbox('rhodecode_repository_fields','True')}
                         <label for="rhodecode_repository_fields">${_('Use repository extra fields')}</label>
                     </div>
+                    <span class="help-block">${_('Allows storing additional customized fields per repository.')}</span>
+                    <div class="checkbox">
+                        ${h.checkbox('rhodecode_show_version','True')}
+                        <label for="rhodecode_show_version">${_('Show RhodeCode version')}</label>
+                    </div>
+                    <span class="help-block">${_('Shows or hides displayed version of RhodeCode in the footer')}</span>
                 </div>
              </div>
-
+            <div class="field">
+                <div class="label">
+                    <label for="rhodecode_realm">${_('Dashboard items')}:</label>
+                </div>
+                <div class="input">
+                    ${h.text('rhodecode_dashboard_items',size=5)}
+                    <span class="help-block">${_('Number of items displayed in lightweight dashboard before pagination is shown.')}</span>
+                </div>
+            </div>
              <div class="field">
                 <div class="label label-checkbox">
                     <label>${_('Icons')}:</label>
@@ -155,6 +169,7 @@
                         ${h.checkbox('rhodecode_show_private_icon','True')}
                         <label for="rhodecode_show_private_icon">${_('Show private repo icon on repositories')}</label>
                     </div>
+                    <span class="help-block">${_('Show public/private icons next to repositories names')}</span>
                  </div>
              </div>
 
@@ -259,20 +274,21 @@
                     ##<span class="help-block">${_('Requires hg-git library installed. Allows cloning from git remote locations')}</span>
                 </div>
             </div>
+            %if c.visual.allow_repo_location_change:
             <div class="field">
                 <div class="label">
                     <label for="paths_root_path">${_('Repositories location')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('paths_root_path',size=30,readonly="readonly")}
-                    <span id="path_unlock" class="tooltip"
-                            title="${h.tooltip(_('This a crucial application setting. If you are really sure you need to change this, you must restart application in order to make this setting take effect. Click this label to unlock.'))}">
+                    ${h.text('paths_root_path',size=30,readonly="readonly", class_="disabled")}
+                    <span id="path_unlock" class="tooltip" style="cursor: pointer"
+                            title="${h.tooltip(_('Click to unlock. You must restart RhodeCode in order to make this setting take effect.'))}">
                         ${_('Unlock')}
                     </span>
                     <span class="help-block">${_('Location where repositories are stored. After changing this value a restart, and rescan is required')}</span>
                 </div>
             </div>
-
+            %endif
             <div class="buttons">
                 ${h.submit('save',_('Save settings'),class_="ui-btn large")}
                 ${h.reset('reset',_('Reset'),class_="ui-btn large")}
@@ -283,8 +299,9 @@
 
     <script type="text/javascript">
         YAHOO.util.Event.onDOMReady(function(){
-            YAHOO.util.Event.addListener('path_unlock','click',function(){
-                YAHOO.util.Dom.get('paths_root_path').removeAttribute('readonly');
+            YUE.on('path_unlock','click',function(){
+                YUD.get('paths_root_path').removeAttribute('readonly');
+                YUD.removeClass('paths_root_path', 'disabled')
             });
         });
     </script>
--- a/rhodecode/templates/admin/users/user_edit.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/users/user_edit.html	Fri Jun 07 00:31:11 2013 +0200
@@ -149,49 +149,12 @@
     <div class="title">
         <h5>${_('Permissions')}</h5>
     </div>
-    ${h.form(url('user_perm', id=c.user.user_id),method='put')}
-    <div class="form">
-        <!-- fields -->
-        <div class="fields">
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="inherit_permissions">${_('Inherit default permissions')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('inherit_default_permissions',value=True)}
-                </div>
-                <span class="help-block">${h.literal(_('Select to inherit permissions from %s settings. '
-                                             'With this selected below options does not have any action') % h.link_to('default', url('edit_permission', id='default')))}</span>
-             </div>
-             <div id="inherit_overlay" style="${'opacity:0.3' if c.user.inherit_default_permissions else ''}" >
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="create_repo_perm">${_('Create repositories')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('create_repo_perm',value=True)}
-                </div>
-             </div>
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="fork_repo_perm">${_('Fork repositories')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('fork_repo_perm',value=True)}
-                </div>
-             </div>
-             </div>
-            <div class="buttons">
-              ${h.submit('save',_('Save'),class_="ui-btn large")}
-              ${h.reset('reset',_('Reset'),class_="ui-btn large")}
-            </div>
-        </div>
-    </div>
-    ${h.end_form()}
+    <%namespace name="dpb" file="/base/default_perms_box.html"/>
+    ${dpb.default_perms_box(url('user_perm', id=c.user.user_id))}
 
     ## permissions overview
     <%namespace name="p" file="/base/perms_summary.html"/>
-    ${p.perms_summary(c.perm_user.permissions)}
+    ${p.perms_summary(c.perm_user.permissions, show_all=True)}
 
 </div>
 <div class="box box-left" style="clear:left">
--- a/rhodecode/templates/admin/users/user_edit_my_account.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/users/user_edit_my_account.html	Fri Jun 07 00:31:11 2013 +0200
@@ -178,20 +178,7 @@
 
       var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
         sortedBy:{key:"name",dir:"asc"},
-        paginator: new YAHOO.widget.Paginator({
-            rowsPerPage: 50,
-            alwaysVisible: false,
-            template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-            pageLinks: 5,
-            containerClass: 'pagination-wh',
-            currentPageClass: 'pager_curpage',
-            pageLinkClass: 'pager_link',
-            nextPageLinkLabel: '&gt;',
-            previousPageLinkLabel: '&lt;',
-            firstPageLinkLabel: '&lt;&lt;',
-            lastPageLinkLabel: '&gt;&gt;',
-            containers:['user-paginator']
-        }),
+        paginator: YUI_paginator(50, ['user-paginator']),
 
         MSG_SORTASC:"${_('Click to sort ascending')}",
         MSG_SORTDESC:"${_('Click to sort descending')}",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/users_groups/user_group_edit_perms.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,101 @@
+<table id="permissions_manage" class="noborder">
+    <tr>
+        <td>${_('none')}</td>
+        <td>${_('read')}</td>
+        <td>${_('write')}</td>
+        <td>${_('admin')}</td>
+        <td>${_('member')}</td>
+        <td></td>
+    </tr>
+    ## USERS
+    %for r2p in c.users_group.user_user_group_to_perm:
+        ##forbid revoking permission from yourself
+        <tr id="id${id(r2p.user.username)}">
+            %if c.rhodecode_user.user_id != r2p.user.user_id or c.rhodecode_user.is_admin:
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none')}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read')}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write')}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.admin')}</td>
+            <td style="white-space: nowrap;">
+                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username if r2p.user.username != 'default' else _('default')}
+            </td>
+            <td>
+              %if r2p.user.username !='default':
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}')">
+                ${_('revoke')}
+                </span>
+              %endif
+            </td>
+            %else:
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none', disabled="disabled")}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read', disabled="disabled")}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write', disabled="disabled")}</td>
+            <td>${h.radio('u_perm_%s' % r2p.user.username,'usergroup.admin', disabled="disabled")}</td>
+            <td style="white-space: nowrap;">
+                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username if r2p.user.username != 'default' else _('default')}
+            </td>
+            <td>
+            </td>
+            %endif
+        </tr>
+    %endfor
+
+    ## USER GROUPS
+    %for g2p in c.users_group.user_group_user_group_to_perm:
+        <tr id="id${id(g2p.user_group.users_group_name)}">
+            <td>${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.none')}</td>
+            <td>${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.read')}</td>
+            <td>${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.write')}</td>
+            <td>${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.admin')}</td>
+            <td style="white-space: nowrap;">
+                <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.user_group.users_group_name}
+            </td>
+            <td>
+                <span class="delete_icon action_button" onclick="ajaxActionRevoke(${g2p.user_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.user_group.users_group_name)}')">
+                ${_('revoke')}
+                </span>
+            </td>
+        </tr>
+    %endfor
+
+    <%
+    _tmpl = h.literal("""' \
+        <td><input type="radio" value="usergroup.none" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
+        <td><input type="radio" value="usergroup.read" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
+        <td><input type="radio" value="usergroup.write" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
+        <td><input type="radio" value="usergroup.admin" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \
+        <td class="ac"> \
+            <div class="perm_ac" id="perm_ac_{0}"> \
+                <input class="yui-ac-input" id="perm_new_member_name_{0}" name="perm_new_member_name_{0}" value="" type="text"> \
+                <input id="perm_new_member_type_{0}" name="perm_new_member_type_{0}" value="" type="hidden">  \
+                <div id="perm_container_{0}"></div> \
+            </div> \
+        </td> \
+        <td></td>'""")
+    %>
+    ## ADD HERE DYNAMICALLY NEW INPUTS FROM THE '_tmpl'
+    <tr class="new_members last_new_member" id="add_perm_input"></tr>
+    <tr>
+        <td colspan="6">
+            <span id="add_perm" class="add_icon" style="cursor: pointer;">
+            ${_('Add another member')}
+            </span>
+        </td>
+    </tr>
+</table>
+<script type="text/javascript">
+function ajaxActionRevoke(obj_id, obj_type, field_id) {
+    url = "${h.url('delete_user_group_perm_member', id=c.users_group.users_group_id)}";
+    ajaxActionRevokePermission(url, obj_id, obj_type, field_id);
+};
+
+YUE.onDOMReady(function () {
+    if (!YUD.hasClass('perm_new_member_name', 'error')) {
+        YUD.setStyle('add_perm_input', 'display', 'none');
+    }
+    YAHOO.util.Event.addListener('add_perm', 'click', function () {
+        addPermAction(${_tmpl}, ${c.users_array|n}, ${c.users_groups_array|n});
+    });
+});
+
+</script>
--- a/rhodecode/templates/admin/users_groups/users_group_edit.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/users_groups/users_group_edit.html	Fri Jun 07 00:31:11 2013 +0200
@@ -18,7 +18,7 @@
 </%def>
 
 <%def name="main()">
-<div class="box box-left">
+<div class="box box-left" style="clear:left">
     <!-- box / title -->
     <div class="title">
         ${self.breadcrumbs()}
@@ -92,64 +92,6 @@
             </div>
     </div>
 ${h.end_form()}
-</div>
-
-<div class="box box-right">
-    <!-- box / title -->
-    <div class="title">
-        <h5>${_('Permissions')}</h5>
-    </div>
-    ${h.form(url('users_group_perm', id=c.users_group.users_group_id), method='put')}
-    <div class="form">
-        <!-- fields -->
-        <div class="fields">
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="inherit_permissions">${_('Inherit default permissions')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('inherit_default_permissions',value=True)}
-                </div>
-                <span class="help-block">${h.literal(_('Select to inherit permissions from %s settings. '
-                                             'With this selected below options does not have any action') % h.link_to('default', url('edit_permission', id='default')))}</span>
-             </div>
-             <div id="inherit_overlay" style="${'opacity:0.3' if c.users_group.inherit_default_permissions else ''}" >
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="create_repo_perm">${_('Create repositories')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('create_repo_perm',value=True)}
-                </div>
-             </div>
-             <div class="field">
-                <div class="label label-checkbox">
-                    <label for="fork_repo_perm">${_('Fork repositories')}:</label>
-                </div>
-                <div class="checkboxes">
-                    ${h.checkbox('fork_repo_perm',value=True)}
-                </div>
-             </div>
-             </div>
-            <div class="buttons">
-              ${h.submit('save',_('Save'),class_="ui-btn large")}
-              ${h.reset('reset',_('Reset'),class_="ui-btn large")}
-            </div>
-        </div>
-    </div>
-    ${h.end_form()}
-
-    ## permissions overview
-    <%namespace name="p" file="/base/perms_summary.html"/>
-    ${p.perms_summary(c.users_group.permissions)}
-</div>
-
-<div class="box box-right" style="clear:right">
-    <!-- box / title -->
-    <div class="title">
-        <h5>${_('Group members')}</h5>
-    </div>
-
     <div class="group_members_wrap">
     % if c.group_members_obj:
       <ul class="group_members">
@@ -169,6 +111,43 @@
     </div>
 </div>
 
+<div class="box box-right">
+    <!-- box / title -->
+    <div class="title">
+        <h5>${_('Global Permissions')}</h5>
+    </div>
+    <%namespace name="dpb" file="/base/default_perms_box.html"/>
+    ${dpb.default_perms_box(url('users_group_perm', id=c.users_group.users_group_id))}
+
+    ## permissions overview
+    <%namespace name="p" file="/base/perms_summary.html"/>
+    ${p.perms_summary(c.permissions)}
+</div>
+
+<div class="box box-right" style="clear:right">
+    <div class="title">
+        <h5>${_('Permissions')}</h5>
+    </div>
+    ${h.form(url('set_user_group_perm_member', id=c.users_group.users_group_id),method='post')}
+    <div class="form">
+       <div class="fields">
+            <div class="field">
+                <div class="label">
+                    <label for="input">${_('Permissions')}:</label>
+                </div>
+                <div class="input">
+                    <%include file="user_group_edit_perms.html"/>
+                </div>
+            </div>
+            <div class="buttons">
+              ${h.submit('save',_('Save'),class_="ui-btn large")}
+              ${h.reset('reset',_('Reset'),class_="ui-btn large")}
+            </div>
+       </div>
+    </div>
+    ${h.end_form()}
+</div>
+
 <script type="text/javascript">
   MultiSelectWidget('users_group_members','available_members','edit_users_group');
 </script>
--- a/rhodecode/templates/admin/users_groups/users_groups.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/admin/users_groups/users_groups.html	Fri Jun 07 00:31:11 2013 +0200
@@ -21,20 +21,23 @@
     <div class="title">
         ${self.breadcrumbs()}
         <ul class="links">
+        %if h.HasPermissionAny('hg.admin', 'hg.usergroup.create.true')():
           <li>
             <span>${h.link_to(_(u'Add new user group'),h.url('new_users_group'))}</span>
           </li>
-
+        %endif
         </ul>
     </div>
     <!-- end box / title -->
+
     <div class="table">
+    %if c.users_groups_list:
         <table class="table_disp">
         <tr class="header">
             <th class="left">${_('Group name')}</th>
             <th class="left">${_('Members')}</th>
             <th class="left">${_('Active')}</th>
-            <th class="left">${_('Action')}</th>
+            <th class="left" colspan="2">${_('Action')}</th>
         </tr>
             %for cnt,u_group in enumerate(c.users_groups_list):
                 <tr class="parity${cnt%2}">
@@ -42,6 +45,11 @@
                     <td><span class="tooltip" title="${h.tooltip(', '.join(map(h.safe_unicode,[x.user.username for x in u_group.members[:50]])))}">${len(u_group.members)}</span></td>
                     <td>${h.boolicon(u_group.users_group_active)}</td>
                     <td>
+                     <a href="${h.url('edit_users_group', id=u_group.users_group_id)}" title="${_('Edit')}">
+                       ${h.submit('edit_%s' % u_group.users_group_name,_('edit'),class_="edit_icon action_button")}
+                     </a>
+                    </td>
+                    <td>
                         ${h.form(url('users_group', id=u_group.users_group_id),method='delete')}
                             ${h.submit('remove_',_('delete'),id="remove_group_%s" % u_group.users_group_id,
                             class_="delete_icon action_button",onclick="return  confirm('"+_('Confirm to delete this user group: %s') % u_group.users_group_name+"');")}
@@ -50,6 +58,9 @@
                 </tr>
             %endfor
         </table>
+    %else:
+        ${_('There are no user groups yet')}
+    %endif
     </div>
 </div>
 </%def>
--- a/rhodecode/templates/base/base.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/base/base.html	Fri Jun 07 00:31:11 2013 +0200
@@ -39,12 +39,17 @@
    <div id="footer-inner" class="title">
        <div>
            <p class="footer-link">
-                <a href="${h.url('bugtracker')}">${_('Submit a bug')}</a>
+               ${_('Server instance: %s') % c.rhodecode_instanceid if c.rhodecode_instanceid else ''}
            </p>
            <p class="footer-link-right">
-               <a href="${h.url('rhodecode_official')}">RhodeCode ${c.rhodecode_version}</a>
+               <a href="${h.url('rhodecode_official')}">
+               RhodeCode
+               %if c.visual.show_version:
+                   ${c.rhodecode_version}
+               %endif
+               </a>
                &copy; 2010-${h.datetime.today().year} by Marcin Kuzminski and others
-               ${'(%s)' % c.rhodecode_instanceid if c.rhodecode_instanceid else ''}
+               &ndash; <a href="${h.url('bugtracker')}">${_('Report a bug')}</a>
            </p>
        </div>
    </div>
@@ -77,9 +82,17 @@
   </ul>
 </%def>
 
-<%def name="admin_menu_simple()">
+<%def name="admin_menu_simple(repositories=None, repository_groups=None, user_groups=None)">
   <ul>
+   %if repositories:
+      <li>${h.link_to(_('Repositories'),h.url('repos'),class_='repos')}</li>
+   %endif
+   %if repository_groups:
       <li>${h.link_to(_('Repository groups'),h.url('repos_groups'),class_='repos_groups')}</li>
+   %endif
+   %if user_groups:
+      <li>${h.link_to(_('User groups'),h.url('users_groups'),class_='groups')}</li>
+   %endif
   </ul>
 </%def>
 
@@ -123,7 +136,6 @@
               %if c.rhodecode_db_repo.fork:
                <li>${h.link_to(_('Compare fork'),h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default', merge=1),class_='compare_request')}</li>
               %endif
-              <li>${h.link_to(_('Lightweight changelog'),h.url('shortlog_home',repo_name=c.repo_name),class_='shortlog')}</li>
               <li>${h.link_to(_('Search'),h.url('search_repo',repo_name=c.repo_name),class_='search')}</li>
 
               %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking:
@@ -282,6 +294,19 @@
               </a>
             </li>
           %endif
+            <li ${is_current('gists')}>
+              <a class="menu_link gists childs" title="${_('Show public gists')}"  href="${h.url('gists')}">
+              ${_('Gists')}
+              </a>
+                <ul class="admin_menu">
+                  <li>${h.link_to(_('Create new gist'),h.url('new_gist'),class_='gists-new ')}</li>
+                  <li>${h.link_to(_('All public gists'),h.url('gists'),class_='gists ')}</li>
+                  %if c.rhodecode_user.username != 'default':
+                    <li>${h.link_to(_('My public gists'),h.url('gists', public=1),class_='gists')}</li>
+                    <li>${h.link_to(_('My private gists'),h.url('gists', private=1),class_='gists-private ')}</li>
+                  %endif
+                </ul>
+            </li>
           <li ${is_current('search')}>
               <a class="menu_link search" title="${_('Search in repositories')}"  href="${h.url('search')}">
               ${_('Search')}
@@ -294,12 +319,14 @@
               </a>
               ${admin_menu()}
             </li>
-          % elif c.rhodecode_user.groups_admin:
+          % elif c.rhodecode_user.repositories_admin or c.rhodecode_user.repository_groups_admin or c.rhodecode_user.user_groups_admin:
           <li ${is_current('admin')}>
               <a class="menu_link admin childs" title="${_('Admin')}">
                 ${_('Admin')}
               </a>
-              ${admin_menu_simple()}
+              ${admin_menu_simple(c.rhodecode_user.repositories_admin,
+                                  c.rhodecode_user.repository_groups_admin,
+                                  c.rhodecode_user.user_groups_admin or h.HasPermissionAny('hg.usergroup.create.true')())}
           </li>
           % endif
           ${usermenu()}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/base/default_perms_box.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,86 @@
+## snippet for displaying default permission box
+## usage:
+##    <%namespace name="dpb" file="/base/default_perms_box.html"/>
+##    ${dpb.default_perms_box(<url_to_form>)}
+
+
+<%def name="default_perms_box(form_url)">
+${h.form(form_url, method='put')}
+    <div class="form">
+        <!-- fields -->
+        <div class="fields">
+             <div class="field">
+                <div class="checkboxes">
+                    <label for="inherit_default_permissions">${_('Inherit default permissions')}:</label>
+                    ${h.checkbox('inherit_default_permissions',value=True)}
+                </div>
+                <span class="help-block">
+                ${h.literal(_('Select to inherit permissions from %s settings. '
+                              'With this selected below options does not apply.')
+                              % h.link_to('default', url('edit_permission', id='default')))}
+                </span>
+             </div>
+             <div id="inherit_overlay">
+             <div class="field">
+                <div class="checkboxes">
+                    <label for="create_repo_perm">${_('Create repositories')}:</label>
+                    ${h.checkbox('create_repo_perm',value=True)}
+                </div>
+                <span class="help-block">
+                ${h.literal(_('Select this option to allow repository creation for this user'))}
+                </span>
+             </div>
+             <div class="field">
+                <div class="checkboxes">
+                    <label for="create_user_group_perm">${_('Create user groups')}:</label>
+                    ${h.checkbox('create_user_group_perm',value=True)}
+                </div>
+                <span class="help-block">
+                ${h.literal(_('Select this option to allow user group creation for this user'))}
+                </span>
+             </div>
+             <div class="field">
+                <div class="checkboxes">
+                    <label for="fork_repo_perm">${_('Fork repositories')}:</label>
+                    ${h.checkbox('fork_repo_perm',value=True)}
+                </div>
+                <span class="help-block">
+                ${h.literal(_('Select this option to allow repository forking for this user'))}
+                </span>
+             </div>
+             </div>
+            <div class="buttons">
+              ${h.submit('save',_('Save'),class_="ui-btn large")}
+              ${h.reset('reset',_('Reset'),class_="ui-btn large")}
+            </div>
+        </div>
+    </div>
+${h.end_form()}
+
+## JS
+<script>
+YUE.onDOMReady(function(e){
+
+    var show_custom_perms = function(inherit_default){
+        if(inherit_default){
+            YUD.setStyle('inherit_overlay', 'display', 'none');
+        }
+        else{
+            YUD.setStyle('inherit_overlay', 'display', '');
+        }
+    }
+
+    var defaults = YUD.get('inherit_default_permissions').checked;
+    show_custom_perms(defaults);
+    YUE.on('inherit_default_permissions', 'change', function(e){
+        if(YUD.get('inherit_default_permissions').checked){
+            show_custom_perms(true);
+        }
+        else{
+            show_custom_perms(false);
+        }
+    })
+})
+</script>
+
+</%def>
--- a/rhodecode/templates/base/perms_summary.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/base/perms_summary.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,6 +1,9 @@
 ## snippet for displaying permissions overview for users
+## usage:
+##    <%namespace name="p" file="/base/perms_summary.html"/>
+##    ${p.perms_summary(c.perm_user.permissions)}
 
-<%def name="perms_summary(permissions)">
+<%def name="perms_summary(permissions, show_all=False)">
 <div id="perms" class="table">
      %for section in sorted(permissions.keys()):
         <div class="perms_section_head">${section.replace("_"," ").capitalize()}</div>
@@ -9,35 +12,44 @@
         %else:
         <div id='tbl_list_wrap_${section}' class="yui-skin-sam">
          <table id="tbl_list_${section}">
-          <thead>
-              <tr>
-              <th class="left">${_('Name')}</th>
-              <th class="left">${_('Permission')}</th>
-              <th class="left">${_('Edit Permission')}</th>
-          </thead>
-          <tbody>
+          ## global permission box
           %if section == 'global':
-              %for k in sorted(permissions[section], key=lambda s: s.lower()):
+              <thead>
                   <tr>
-                      <td>
+                  <th colspan="2" class="left">${_('Permission')}</th>
+                  <th class="left">${_('Edit Permission')}</th>
+              </thead>
+              <tbody>
+              %for k in permissions[section]:
+                  <tr>
+                      <td colspan="2">
                           ${h.get_permission_name(k)}
                       </td>
                       <td>
-                           ${h.boolicon(k.split('.')[-1] != 'none')}
-                      </td>
-                      <td>
                            <a href="${h.url('edit_permission', id='default')}">${_('edit')}</a>
                       </td>
                   </tr>
               %endfor
+              </tbody>
           %else:
+              <thead>
+                  <tr>
+                  <th class="left">${_('Name')}</th>
+                  <th class="left">${_('Permission')}</th>
+                  <th class="left">${_('Edit Permission')}</th>
+              </thead>
+              <tbody>
               %for k, section_perm in sorted(permissions[section].items(), key=lambda s: s[1]+s[0].lower()):
+                  %if section_perm.split('.')[-1] != 'none' or show_all:
                   <tr>
                       <td>
                           %if section == 'repositories':
                               <a href="${h.url('summary_home',repo_name=k)}">${k}</a>
                           %elif section == 'repositories_groups':
                               <a href="${h.url('repos_group_home',group_name=k)}">${k}</a>
+                          %elif section == 'user_groups':
+                              ##<a href="${h.url('edit_users_group',id=k)}">${k}</a>
+                              ${k}
                           %endif
                       </td>
                       <td>
@@ -48,13 +60,15 @@
                               <a href="${h.url('edit_repo',repo_name=k,anchor='permissions_manage')}">${_('edit')}</a>
                           %elif section == 'repositories_groups':
                               <a href="${h.url('edit_repos_group',group_name=k,anchor='permissions_manage')}">${_('edit')}</a>
+                          %elif section == 'user_groups':
+                              ##<a href="${h.url('edit_users_group',id=k)}">${_('edit')}</a>
                           %endif
                       </td>
                   </tr>
+                  %endif
               %endfor
+              </tbody>
           %endif
-
-          </tbody>
          </table>
         </div>
         %endif
--- a/rhodecode/templates/base/root.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/base/root.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,11 +1,12 @@
 ## -*- coding: utf-8 -*-
 <!DOCTYPE html>
+
 <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
         <title>${self.title()}</title>
         <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
         <meta name="robots" content="index, nofollow"/>
-        <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
+        <link rel="icon" href="${h.url('/images/favicon.ico')}" type="image/png" />
 
         ## CSS ###
         <%def name="css()">
@@ -15,8 +16,8 @@
             ## EXTRA FOR CSS
             ${self.css_extra()}
         </%def>
-        <%def name="css_extra()">
-        </%def>
+
+        <%def name="css_extra()"></%def>
 
         ${self.css()}
 
@@ -54,12 +55,17 @@
                 'Show selected changeset __S': "${_('Show selected changeset __S')}",
                 'Selection link': "${_('Selection link')}",
                 'Collapse diff': "${_('Collapse diff')}",
-                'Expand diff': "${_('Expand diff')}"
+                'Expand diff': "${_('Expand diff')}",
+                'Failed to revoke permission': "${_('Failed to revoke permission')}"
             };
             var _TM = TRANSLATION_MAP;
 
             var TOGGLE_FOLLOW_URL  = "${h.url('toggle_following')}";
 
+            var REPO_NAME = "";
+            %if hasattr(c, 'repo_name'):
+                var REPO_NAME = "${c.repo_name}";
+            %endif
             </script>
             <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
             <!--[if lt IE 9]>
@@ -90,6 +96,7 @@
               pyroutes.register('toggle_following', "${h.url('toggle_following')}");
               pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
               pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
+              pyroutes.register('changeset_comment_preview', "${h.url('changeset_comment_preview', repo_name='%(repo_name)s')}", ['repo_name']);
            })
             </script>
         </%def>
--- a/rhodecode/templates/bookmarks/bookmarks.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/bookmarks/bookmarks.html	Fri Jun 07 00:31:11 2013 +0200
@@ -22,13 +22,27 @@
         ${self.breadcrumbs()}
     </div>
     <!-- end box / title -->
+    %if c.repo_bookmarks:
+    <div class="info_box" id="compare_bookmarks" style="clear: both;padding: 10px 19px;text-align: right;"><a href="#" class="ui-btn small">${_('Compare bookmarks')}</a></div>
+    %endif
     <div class="table">
         <%include file='bookmarks_data.html'/>
     </div>
 </div>
 
 <script type="text/javascript">
+YUE.on('compare_bookmarks','click',function(e){
+    YUE.preventDefault(e);
+    var org = YUQ('input[name=compare_org]:checked')[0];
+    var other = YUQ('input[name=compare_other]:checked')[0];
 
+    if(org && other){
+        var compare_url = "${h.url('compare_url',repo_name=c.repo_name,org_ref_type='book',org_ref='__ORG__',other_ref_type='book',other_ref='__OTHER__')}";
+        var u = compare_url.replace('__ORG__',org.value)
+                           .replace('__OTHER__',other.value);
+        window.location=u;
+    }
+});
 // main table sorting
 var myColumnDefs = [
     {key:"name",label:"${_('Name')}",sortable:true},
@@ -37,6 +51,7 @@
     {key:"author",label:"${_('Author')}",sortable:true},
     {key:"revision",label:"${_('Revision')}",sortable:true,
         sortOptions: { sortFunction: revisionSort }},
+    {key:"compare",label:"${_('Compare')}",sortable:false,},
 ];
 
 var myDataSource = new YAHOO.util.DataSource(YUD.get("bookmarks_data"));
@@ -49,6 +64,7 @@
         {key:"date"},
         {key:"author"},
         {key:"revision"},
+        {key:"compare"},
     ]
 };
 
@@ -67,7 +83,7 @@
     var func = function(node){
         return node.parentNode.parentNode.parentNode.parentNode.parentNode;
     }
-    q_filter('q_filter_bookmarks',YUQ('div.table tr td .logbooks .bookbook a'),func);
+    q_filter('q_filter_bookmarks',YUQ('div.table tr td .logbooks .booktag a'),func);
 });
 
 </script>
--- a/rhodecode/templates/bookmarks/bookmarks_data.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/bookmarks/bookmarks_data.html	Fri Jun 07 00:31:11 2013 +0200
@@ -7,13 +7,14 @@
             <th class="left">${_('Date')}</th>
             <th class="left">${_('Author')}</th>
             <th class="left">${_('Revision')}</th>
+            <th class="left">${_('Compare')}</th>
         </tr>
     </thead>
     %for cnt,book in enumerate(c.repo_bookmarks.items()):
         <tr class="parity${cnt%2}">
             <td>
                 <span class="logbooks">
-                    <span class="bookbook">${h.link_to(book[0],
+                    <span class="booktag">${h.link_to(book[0],
                     h.url('files_home',repo_name=c.repo_name,revision=book[1].raw_id))}</span>
                 </span>
             </td>
@@ -24,6 +25,10 @@
                   <pre><a href="${h.url('files_home',repo_name=c.repo_name,revision=book[1].raw_id)}">r${book[1].revision}:${h.short_id(book[1].raw_id)}</a></pre>
               </div>
             </td>
+            <td>
+                <input class="branch-compare" type="radio" name="compare_org" value="${book[0]}"/>
+                <input class="branch-compare" type="radio" name="compare_other" value="${book[0]}"/>
+            </td>
         </tr>
     %endfor
     </table>
--- a/rhodecode/templates/changelog/changelog.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/changelog/changelog.html	Fri Jun 07 00:31:11 2013 +0200
@@ -3,12 +3,20 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-${_('%s Changelog') % c.repo_name} &middot; ${c.rhodecode_name}
+${_('%s Changelog') % c.repo_name} &middot;
+%if c.changelog_for_path:
+  /${c.changelog_for_path} &middot;
+%endif
+${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
     <% size = c.size if c.size <= c.total_cs else c.total_cs %>
-    ${_('Changelog')} - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
+    ${_('Changelog')}
+    %if c.changelog_for_path:
+     - /${c.changelog_for_path}
+    %endif
+    - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
 </%def>
 
 <%def name="page_nav()">
@@ -25,26 +33,28 @@
     <div class="table">
         % if c.pagination:
             <div id="graph">
-                <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;">
-                    <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a>
-                    <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
+                <div style="display:${'none' if c.changelog_for_path else ''}">
+                    <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;">
+                        <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a>
+                        <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
 
-                    %if c.rhodecode_db_repo.fork:
-                        <a id="compare_fork" title="${_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name)}" href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default',merge=1)}" class="ui-btn small">${_('Compare fork with parent')}</a>
-                    %endif
-                    %if h.is_hg(c.rhodecode_repo):
-                    <a id="open_new_pr" href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="ui-btn small">${_('Open new pull request')}</a>
-                    %endif
-                </div>
-                <div class="container_header">
-                    ${h.form(h.url.current(),method='get')}
-                    <div style="float:left">
-                        ${h.submit('set',_('Show'),class_="ui-btn")}
-                        ${h.text('size',size=1,value=c.size)}
-                        ${_('revisions')}
+                        %if c.rhodecode_db_repo.fork:
+                            <a id="compare_fork" title="${_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name)}" href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default',merge=1)}" class="ui-btn small">${_('Compare fork with parent')}</a>
+                        %endif
+                        %if h.is_hg(c.rhodecode_repo):
+                        <a id="open_new_pr" href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="ui-btn small">${_('Open new pull request')}</a>
+                        %endif
                     </div>
-                    ${h.end_form()}
-                    <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
+                    <div class="container_header">
+                        ${h.form(h.url.current(),method='get')}
+                        <div style="float:left">
+                            ${h.submit('set',_('Show'),class_="ui-btn")}
+                            ${h.text('size',size=1,value=c.size)}
+                            ${_('revisions')}
+                        </div>
+                        ${h.end_form()}
+                        <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
+                    </div>
                 </div>
                 <div id="graph_nodes">
                     <canvas id="graph_canvas"></canvas>
@@ -56,7 +66,11 @@
                 %for cnt,cs in enumerate(c.pagination):
                     <tr id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
                         <td class="checkbox">
-                            ${h.checkbox(cs.raw_id,class_="changeset_range")}
+                            %if c.changelog_for_path:
+                                ${h.checkbox(cs.raw_id,class_="changeset_range", disabled="disabled")}
+                            %else:
+                                ${h.checkbox(cs.raw_id,class_="changeset_range")}
+                            %endif
                         <td class="status">
                           %if c.statuses.get(cs.raw_id):
                             <div class="changeset-status-ico">
@@ -87,7 +101,7 @@
                                 <div class="message">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
                                 <div class="expand"><span class="expandtext">&darr; ${_('Show more')} &darr;</span></div>
                                 <div class="extra-container">
-                                    %if c.comments.get(cs.raw_id,[]):
+                                    %if c.comments.get(cs.raw_id):
                                         <div class="comments-container">
                                             <div class="comments-cnt" title="${('comments')}">
                                                 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
@@ -98,7 +112,7 @@
                                     %endif
                                     %if h.is_hg(c.rhodecode_repo):
                                         %for book in cs.bookmarks:
-                                            <div class="bookbook" title="${_('Bookmark %s') % book}">
+                                            <div class="booktag" title="${_('Bookmark %s') % book}">
                                                 ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
                                             </div>
                                         %endfor
@@ -135,7 +149,6 @@
                 //ranges
                 var checkboxes = YUD.getElementsByClassName('changeset_range');
                 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
-                var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name)}";
 
                 var checkbox_checker = function(e){
                     var checked_checkboxes = [];
@@ -174,14 +187,17 @@
                         YUD.setStyle('rev_range_container','display','');
                         YUD.setStyle('rev_range_clear','display','');
 
-                        YUD.get('open_new_pr').href = pr_tmpl + '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end);
+                        var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name,rev_start='{0}',rev_end='{1}')}";
+                        YUD.get('open_new_pr').href = pr_tmpl.format(rev_start,rev_end);
                         YUD.setStyle('compare_fork','display','none');
                     }else{
                         YUD.setStyle('rev_range_container','display','none');
                         YUD.setStyle('rev_range_clear','display','none');
-                        if (checkboxes){
-                            YUD.get('open_new_pr').href = pr_tmpl + '?rev_end={0}'.format(checkboxes[0].name);
-                        }
+                        %if c.branch_name:
+                            YUD.get('open_new_pr').href = "${h.url('pullrequest_home',repo_name=c.repo_name,branch=c.branch_name)}";
+                        %else:
+                            YUD.get('open_new_pr').href = "${h.url('pullrequest_home',repo_name=c.repo_name)}";
+                        %endif
                         YUD.setStyle('compare_fork','display','');
                     }
                 };
@@ -230,7 +246,7 @@
                     var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
                     var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}";
                     var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}";
-                    var url = url.replace('__BRANCH__',selected_branch);
+                    var url = url.replace('__BRANCH__', encodeURIComponent(selected_branch));
                     if(selected_branch != ''){
                         window.location = url;
                     }else{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/changelog/changelog_summary_data.html	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,112 @@
+## -*- coding: utf-8 -*-
+%if c.repo_changesets:
+<table class="table_disp">
+    <tr>
+        <th class="left">${_('Revision')}</th>
+        <th class="left">${_('Commit message')}</th>
+        <th class="left">${_('Age')}</th>
+        <th class="left">${_('Author')}</th>
+        <th class="left">${_('Refs')}</th>
+    </tr>
+%for cnt,cs in enumerate(c.repo_changesets):
+    <tr class="parity${cnt%2}">
+        <td>
+          <div>
+            <div class="changeset-status-container">
+              %if c.comments.get(cs.raw_id,[]):
+               <div class="comments-container">
+                   <div class="comments-cnt" title="${('comments')}">
+                       <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
+                           ${len(c.comments[cs.raw_id])}
+                       </a>
+                   </div>
+               </div>
+              %endif
+              %if c.statuses.get(cs.raw_id):
+                <div class="changeset-status-ico">
+                %if c.statuses.get(cs.raw_id)[2]:
+                  <a class="tooltip" title="${_('Click to open associated pull request #%s' % c.statuses.get(cs.raw_id)[2])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
+                    <img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" />
+                  </a>
+                %else:
+                  <img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" />
+                %endif
+                </div>
+              %endif
+            </div>
+            <pre><a href="${h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id)}">${h.show_id(cs)}</a></pre>
+         </div>
+        </td>
+        <td>
+            ${h.urlify_commit(h.truncate(cs.message,50),c.repo_name, h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
+        </td>
+        <td><span class="tooltip" title="${h.tooltip(h.fmt_date(cs.date))}">
+                      ${h.age(cs.date)}</span>
+        </td>
+        <td title="${cs.author}">${h.person(cs.author)}</td>
+        <td>
+            %if h.is_hg(c.rhodecode_repo):
+                %for book in cs.bookmarks:
+                    <div class="booktag" title="${_('Bookmark %s') % book}">
+                        ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
+                    </div>
+                %endfor
+            %endif
+            %for tag in cs.tags:
+             <div class="tagtag" title="${_('Tag %s') % tag}">
+                 ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
+             </div>
+            %endfor
+            %if cs.branch:
+             <div class="branchtag" title="${_('Branch %s' % cs.branch)}">
+                 ${h.link_to(h.shorter(cs.branch),h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))}
+             </div>
+            %endif
+        </td>
+    </tr>
+%endfor
+
+</table>
+
+<script type="text/javascript">
+  YUE.onDOMReady(function(){
+    YUE.delegate("shortlog_data","click",function(e, matchedEl, container){
+        ypjax(e.target.href,"shortlog_data",function(){tooltip_activate();});
+        YUE.preventDefault(e);
+    },'.pager_link');
+  });
+</script>
+
+<div class="pagination-wh pagination-left">
+${c.repo_changesets.pager('$link_previous ~2~ $link_next')}
+</div>
+%else:
+
+%if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
+<h4>${_('Add or upload files directly via RhodeCode')}</h4>
+<div style="margin: 20px 30px;">
+  <div id="add_node_id" class="add_node">
+      <a class="ui-btn" href="${h.url('files_add_home',repo_name=c.repo_name,revision=0,f_path='')}">${_('Add new file')}</a>
+  </div>
+</div>
+%endif
+
+
+<h4>${_('Push new repo')}</h4>
+<pre>
+    ${c.rhodecode_repo.alias} clone ${c.clone_repo_url}
+    ${c.rhodecode_repo.alias} add README # add first file
+    ${c.rhodecode_repo.alias} commit -m "Initial" # commit with message
+    ${c.rhodecode_repo.alias} push ${'origin master' if h.is_git(c.rhodecode_repo) else ''} # push changes back
+</pre>
+
+<h4>${_('Existing repository?')}</h4>
+<pre>
+%if h.is_git(c.rhodecode_repo):
+    git remote add origin ${c.clone_repo_url}
+    git push -u origin master
+%else:
+    hg push ${c.clone_repo_url}
+%endif
+</pre>
+%endif
--- a/rhodecode/templates/changeset/changeset_file_comment.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/changeset/changeset_file_comment.html	Fri Jun 07 00:31:11 2013 +0200
@@ -12,7 +12,7 @@
               ${co.author.username}
           </div>
           <div class="date">
-              ${h.age(co.modified_at)} <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
+              ${h.age(co.modified_at)}
           </div>
         %if co.status_change:
            <div  style="float:left" class="changeset-status-container">
@@ -22,7 +22,7 @@
            </div>
         %endif
 
-       <div style="float:left;padding:3px 0px 0px 5px">
+       <div style="float:left;padding:4px 0px 0px 5px">
         <span class="">
          %if co.pull_request:
             <a href="${h.url('pullrequest_show',repo_name=co.pull_request.other_repo.repo_name,pull_request_id=co.pull_request.pull_request_id)}">
@@ -35,11 +35,9 @@
          %endif
         </span>
        </div>
-
+      <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
       %if h.HasPermissionAny('hg.admin', 'repository.admin')() or co.author.user_id == c.rhodecode_user.user_id:
-        <div class="buttons">
-          <span onClick="deleteComment(${co.comment_id})" class="delete-comment ui-btn">${_('Delete')}</span>
-        </div>
+          <div onClick="deleteComment(${co.comment_id})" class="buttons delete-comment ui-btn small">${_('Delete')}</div>
       %endif
       </div>
       <div class="text">
@@ -56,7 +54,7 @@
   %if c.rhodecode_user.username != 'default':
     <div class="overlay"><div class="overlay-text">${_('Submitting...')}</div></div>
       ${h.form('#', class_='inline-form')}
-      <div class="clearfix">
+      <div id="edit-container_{1}" class="clearfix">
           <div class="comment-help">${_('Commenting on line {1}.')}
           ${(_('Comments parsed using %s syntax with %s support.') % (
                  ('<a href="%s">RST</a>' % h.url('rst_help')),
@@ -64,9 +62,17 @@
                )
             )|n
            }
+          <div id="preview-btn_{1}" class="preview-btn ui-btn small">${_('Preview')}</div>
           </div>
             <div class="mentions-container" id="mentions_container_{1}"></div>
-            <textarea id="text_{1}" name="text" class="yui-ac-input"></textarea>
+            <textarea id="text_{1}" name="text" class="comment-block-ta yui-ac-input"></textarea>
+      </div>
+      <div id="preview-container_{1}" class="clearfix" style="display:none">
+         <div class="comment-help">
+              ${_('Comment preview')}
+            <div id="edit-btn_{1}" class="edit-btn ui-btn small">${_('Edit')}</div>
+          </div>
+          <div id="preview-box_{1}" class="preview-box"></div>
       </div>
       <div class="comment-button">
       <input type="hidden" name="f_path" value="{0}">
@@ -134,7 +140,7 @@
     %if c.rhodecode_user.username != 'default':
     <div class="comment-form ac">
         ${h.form(post_url)}
-        <div class="clearfix">
+        <div id="edit-container" class="clearfix">
             <div class="comment-help">
                 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
                   '<span style="color:#003367" class="tooltip" title="%s">@mention</span>' %
@@ -143,6 +149,7 @@
                 | <a id="show_changeset_link" onClick="change_status_show();"> ${_('Change status')}</a>
                   <input id="show_changeset_status_box" type="checkbox" name="change_changeset_status" style="display: none;" />
               %endif
+              <div id="preview-btn" class="preview-btn ui-btn small">${_('Preview')}</div>
             </div>
             %if change_status:
             <div id="status_block_container" class="status-block" style="display:none">
@@ -155,8 +162,17 @@
             </div>
             %endif
             <div class="mentions-container" id="mentions_container"></div>
-             ${h.textarea('text')}
+             ${h.textarea('text', class_="comment-block-ta")}
         </div>
+
+        <div id="preview-container" class="clearfix" style="display:none">
+           <div class="comment-help">
+                ${_('Comment preview')}
+              <div id="edit-btn" class="edit-btn ui-btn small">${_('Edit')}</div>
+            </div>
+            <div id="preview-box" class="preview-box"></div>
+        </div>
+
         <div class="comment-button">
         ${h.submit('save', _('Comment'), class_="ui-btn large")}
         %if close_btn and change_status:
@@ -185,6 +201,27 @@
            YUD.addClass('save_close', 'hidden');
        }
    })
+   YUE.on('preview-btn', 'click', function(e){
+       var _text = YUD.get('text').value;
+       if(!_text){
+           return
+       }
+       var post_data = {'text': _text};
+       YUD.addClass('preview-box', 'unloaded');
+       YUD.get('preview-box').innerHTML = _TM['Loading ...'];
+       YUD.setStyle('edit-container', 'display', 'none');
+       YUD.setStyle('preview-container', 'display', '');
+
+       var url = pyroutes.url('changeset_comment_preview', {'repo_name': '${c.repo_name}'});
+       ajaxPOST(url,post_data,function(o){
+           YUD.get('preview-box').innerHTML = o.responseText;
+           YUD.removeClass('preview-box', 'unloaded');
+       })
+   })
+   YUE.on('edit-btn', 'click', function(e){
+       YUD.setStyle('edit-container', 'display', '');
+       YUD.setStyle('preview-container', 'display', 'none');
+   })
 
 });
 </script>
--- a/rhodecode/templates/changeset/changeset_range.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/changeset/changeset_range.html	Fri Jun 07 00:31:11 2013 +0200
@@ -54,7 +54,12 @@
                    %for cs in c.cs_ranges:
                        <div class="cur_cs">${h.link_to('r%s:%s' % (cs.revision,h.short_id(cs.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
                       %for FID, (cs1, cs2, change, path, diff, stats) in c.changes[cs.raw_id].iteritems():
-                        <div class="cs_${change}">${h.link_to(h.safe_unicode(path),h.url.current(anchor=FID))}</div>
+                         <div class="cs_${change}">
+                               <div class="node">
+                                   ${h.link_to(h.safe_unicode(path),h.url.current(anchor=FID))}
+                               </div>
+                           <div class="changes">${h.fancy_file_stats(stats)}</div>
+                         </div>
                       %endfor
                    %endfor
             </div>
@@ -78,7 +83,7 @@
                 %endif
                 %if h.is_hg(c.rhodecode_repo):
                   %for book in cs.bookmarks:
-                  <span class="bookbook" title="${_('Bookmark %s') % book}">
+                  <span class="booktag" title="${_('Bookmark %s') % book}">
                      ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
                   </span>
                   %endfor
--- a/rhodecode/templates/changeset/diff_block.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/changeset/diff_block.html	Fri Jun 07 00:31:11 2013 +0200
@@ -9,13 +9,12 @@
 </div>
 <div class="diff-container" id="${'diff-container-%s' % (id(change))}">
 %for FID,(cs1, cs2, change, path, diff, stats) in change.iteritems():
-    ##%if op !='removed':
     <div id="${FID}_target" style="clear:both;margin-top:25px"></div>
     <div id="${FID}" class="diffblock  margined comm">
         <div class="code-header">
             <div class="changeset_header">
                 <div class="changeset_file">
-                    ${h.link_to_if(change!='removed',h.safe_unicode(path),h.url('files_home',repo_name=c.repo_name,
+                    ${h.link_to_if(change!='D',h.safe_unicode(path),h.url('files_home',repo_name=c.repo_name,
                     revision=cs2,f_path=h.safe_unicode(path)))}
                 </div>
                 <div class="diff-actions">
@@ -38,7 +37,6 @@
             ${diff|n}
         </div>
     </div>
-    ##%endif
 %endfor
 </div>
 </%def>
--- a/rhodecode/templates/data_table/_dt_elements.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/data_table/_dt_elements.html	Fri Jun 07 00:31:11 2013 +0200
@@ -126,10 +126,17 @@
 </%def>
 
 <%def name="user_actions(user_id, username)">
+ <div style="float:left">
+   <a href="${h.url('edit_user',id=user_id)}" title="${_('edit')}">
+     ${h.submit('edit_%s' % username,_('edit'),class_="edit_icon action_button")}
+   </a>
+ </div>
+ <div style="float:left">
   ${h.form(h.url('delete_user', id=user_id),method='delete')}
       ${h.submit('remove_',_('delete'),id="remove_user_%s" % user_id,
       class_="delete_icon action_button",onclick="return confirm('"+_('Confirm to delete this user: %s') % username+"');")}
   ${h.end_form()}
+ </div>
 </%def>
 
 <%def name="user_name(user_id, username)">
--- a/rhodecode/templates/email_templates/changeset_comment.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/email_templates/changeset_comment.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,17 +1,18 @@
 ## -*- coding: utf-8 -*-
 <%inherit file="main.html"/>
-##message from user goes here
-<p>
-${cs_comment_user}: <br/>
+
+<p>${_('URL')}: <a href="${cs_comment_url}">${cs_comment_url}</a></p>
+
+<h4>${_('%s commented on a %s changeset.') % (cs_comment_user,cs_target_repo) |n}</h4>
+
+<p>${_('Changeset')}: ${h.short_id(raw_id)}</p>
+<p>${_('Description')}:<br/>
+${h.shorter(message, 256)}
+</p>
+
+%if status_change:
+    <p>${_('The changeset status was changed to')}: <b>${status_change}</b></p>
+%endif
+<p>${_('Comment')}:<br/>
 ${body}
 </p>
-%if status_change:
-    <span>${_('New status')} -&gt; ${status_change}</span>
-%endif
-<div>${_('View this comment here')}: ${cs_comment_url}</div>
-
-<pre>
-${_('Repo')}: ${cs_target_repo}
-${_('Changeset')}: ${h.short_id(raw_id)}
-${_('desc')}: ${h.shorter(message, 256)}
-</pre>
--- a/rhodecode/templates/email_templates/password_reset.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/email_templates/password_reset.html	Fri Jun 07 00:31:11 2013 +0200
@@ -2,10 +2,9 @@
 <%inherit file="main.html"/>
 
 <h4>${_('Hello %s') % user}</h4>
-<div>${_('We received a request to create a new password for your account.')}</div>
-<div>${_('You can generate it by clicking following URL')}:</div>
+<p>${_('We received a request to create a new password for your account.')}</p>
+<p>${_('You can generate it by clicking following URL')}:</p>
 <pre>
 ${reset_url}
 </pre>
-<br/>
-${_("If you did not request new password please ignore this email.")}
+<p>${_("Please ignore this email if you did not request a new password .")}</p>
--- a/rhodecode/templates/email_templates/pull_request.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/email_templates/pull_request.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,18 +1,19 @@
 ## -*- coding: utf-8 -*-
 <%inherit file="main.html"/>
 
-${_('User %s opened pull request for repository %s and wants you to review changes.') % (('<b>%s</b>' % pr_user_created),pr_repo_url) |n}
-<div>${_('View this pull request here')}: ${pr_url}</div>
-<div>${_('title')}: ${pr_title}</div>
-<div>${_('description')}:</div>
-<p>
-${body}
-</p>
+<p>${_('URL')}: <a href="${pr_url}">${pr_url}</a></p>
+
+<h4>${_('%s opened a pull request for repository %s and wants you to review changes.') % (pr_user_created,pr_repo_url) |n}</h4>
 
-<div>${_('revisions for reviewing')}</div>
+<p>${_('Title')}: <b>${pr_title}</b></p>
+<p>${_('Description')}:</p>
+<p style="white-space: pre-wrap;">${body}</p>
+
+<p>${_('Changesets')}:</p>
 <p style="white-space: pre-wrap;">
 %for r,r_msg in pr_revisions:
 <b>${h.short_id(r)}</b>:
 ${h.shorter(r_msg, 256)}
+
 %endfor
 </p>
--- a/rhodecode/templates/email_templates/pull_request_comment.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/email_templates/pull_request_comment.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,18 +1,17 @@
 ## -*- coding: utf-8 -*-
 <%inherit file="main.html"/>
-${_('Pull request #%s for repository %s') % (pr_id, pr_target_repo) |n}
-##message from user goes here
-<p>
-${pr_comment_user}: <br/>
-${body}
-</p>
-<div>${_('View this comment here')}: ${pr_comment_url}</div>
+
+<p>${_('URL')}: <a href="${pr_comment_url}">${pr_comment_url}</a></p>
+
+<h4>${_('%s commented on pull request "%s"') % (pr_comment_user,pr_title) |n}</h4>
 
 %if status_change:
     %if closing_pr:
-       <span>${_('Closing pull request with status')} -&gt; ${status_change}</span>
+       <p>${_('Pull request was closed with status')}: <b>${status_change}</b></p>
     %else:
-       <span>${_('New status')} -&gt; ${status_change}</span>
+       <p>${_('Pull request changed status')}: <b>${status_change}</b></p>
     %endif
 %endif
-</p>
+
+<p>${_('Comment')}:</p>
+<p>${body}</p>
--- a/rhodecode/templates/email_templates/registration.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/email_templates/registration.html	Fri Jun 07 00:31:11 2013 +0200
@@ -1,9 +1,6 @@
 ## -*- coding: utf-8 -*-
 <%inherit file="main.html"/>
 
-${_('A new user have registered in RhodeCode')}
-
 ${body}
 
-
 ${_('View this user here')}: ${registered_user_url}
--- a/rhodecode/templates/errors/error_document.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/errors/error_document.html	Fri Jun 07 00:31:11 2013 +0200
@@ -5,7 +5,7 @@
         <title>Error - ${c.error_message}</title>
         <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
         <meta name="robots" content="index, nofollow"/>
-        <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
+        <link rel="icon" href="${h.url('/images/favicon.ico')}" type="image/png" />
 
         <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
         %if c.redirect_time:
--- a/rhodecode/templates/files/files_add.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/files/files_add.html	Fri Jun 07 00:31:11 2013 +0200
@@ -75,7 +75,7 @@
                 <div style="padding: 10px;color:#666666">${_('Commit message')}</div>
                 <textarea id="commit" name="message" style="height: 100px;width: 99%;margin-left:4px" placeholder="${c.default_message}"></textarea>
             </div>
-            <div style="text-align: l;padding-top: 5px">
+            <div style="text-align: left;padding-top: 5px">
             ${h.submit('commit',_('Commit changes'),class_="ui-btn")}
             ${h.reset('reset',_('Reset'),class_="ui-btn")}
             </div>
--- a/rhodecode/templates/files/files_history_box.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/files/files_history_box.html	Fri Jun 07 00:31:11 2013 +0200
@@ -8,7 +8,7 @@
             ${h.select('diff1',c.file_changeset.raw_id,c.file_history)}
             ${h.submit('diff',_('Diff to revision'),class_="ui-btn")}
             ${h.submit('show_rev',_('Show at revision'),class_="ui-btn")}
-            ${h.link_to(_('Show full history'),h.url('shortlog_file_home',repo_name=c.repo_name, revision=c.file_changeset.raw_id, f_path=c.f_path),class_="ui-btn")}
+            ${h.link_to(_('Show full history'),h.url('changelog_file_home',repo_name=c.repo_name, revision=c.file_changeset.raw_id, f_path=c.f_path),class_="ui-btn")}
             ${h.hidden('annotate', c.annotate)}
             ${h.end_form()}
             </div>
--- a/rhodecode/templates/index_base.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/index_base.html	Fri Jun 07 00:31:11 2013 +0200
@@ -70,160 +70,13 @@
             <div id="welcome" style="display:none;text-align:center">
                 <h1><a href="${h.url('home')}">${c.rhodecode_name} ${c.rhodecode_version}</a></h1>
             </div>
-             <%cnt=0%>
-             <%namespace name="dt" file="/data_table/_dt_elements.html"/>
-            % if not c.visual.lightweight_dashboard:
-              ## old full detailed version
-            <div id='repos_list_wrap' class="yui-skin-sam">
-            <table id="repos_list">
-            <thead>
-                <tr>
-                    <th class="left"></th>
-                    <th class="left">${_('Name')}</th>
-                    <th class="left">${_('Description')}</th>
-                    <th class="left">${_('Last change')}</th>
-                    <th class="left">${_('Tip')}</th>
-                    <th class="left">${_('Owner')}</th>
-                    <th class="left">${_('Atom')}</th>
-                </tr>
-            </thead>
-            <tbody>
-            %for cnt,repo in enumerate(c.repos_list):
-                <tr class="parity${(cnt+1)%2}">
-                    ##QUICK MENU
-                    <td class="quick_repo_menu">
-                      ${dt.quick_menu(repo['name'])}
-                    </td>
-                    ##REPO NAME AND ICONS
-                    <td class="reponame">
-                      ${dt.repo_name(repo['name'],repo['dbrepo']['repo_type'],repo['dbrepo']['private'],h.AttributeDict(repo['dbrepo_fork']),pageargs.get('short_repo_names'))}
-                    </td>
-                    ##DESCRIPTION
-                    <td><span class="tooltip" title="${h.tooltip(repo['description'])}">
-                       %if c.visual.stylify_metatags:
-                       ${h.urlify_text(h.desc_stylize(h.truncate(repo['description'],60)))}</span>
-                       %else:
-                       ${h.truncate(repo['description'],60)}</span>
-                       %endif
-                    </td>
-                    ##LAST CHANGE DATE
-                    <td>
-                      ${dt.last_change(repo['last_change'])}
-                    </td>
-                    ##LAST REVISION
-                    <td>
-                        ${dt.revision(repo['name'],repo['rev'],repo['tip'],repo['author'],repo['last_msg'])}
-                    </td>
-                    ##
-                    <td title="${repo['contact']}">${h.person(repo['contact'])}</td>
-                    <td>
-                      ${dt.atom(repo['name'])}
-                    </td>
-                </tr>
-            %endfor
-            </tbody>
-            </table>
-            </div>
-            % else:
-              ## lightweight version
-                <div class="yui-skin-sam" id="repos_list_wrap"></div>
-                <div id="user-paginator" style="padding: 0px 0px 0px 0px"></div>
-            % endif
+            <%cnt=0%>
+            <%namespace name="dt" file="/data_table/_dt_elements.html"/>
+            <div class="yui-skin-sam" id="repos_list_wrap"></div>
+            <div id="user-paginator" style="padding: 0px 0px 0px 0px"></div>
         </div>
     </div>
-    % if not c.visual.lightweight_dashboard:
-    <script>
-      YUD.get('repo_count').innerHTML = ${cnt+1 if cnt else 0};
 
-      // groups table sorting
-      var myColumnDefs = [
-          {key:"name",label:"${_('Group name')}",sortable:true,
-              sortOptions: { sortFunction: groupNameSort }},
-          {key:"desc",label:"${_('Description')}",sortable:true},
-      ];
-
-      var myDataSource = new YAHOO.util.DataSource(YUD.get("groups_list"));
-
-      myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
-      myDataSource.responseSchema = {
-          fields: [
-              {key:"name"},
-              {key:"desc"},
-          ]
-      };
-
-      var myDataTable = new YAHOO.widget.DataTable("groups_list_wrap", myColumnDefs, myDataSource,{
-          sortedBy:{key:"name",dir:"asc"},
-          paginator: new YAHOO.widget.Paginator({
-              rowsPerPage: 50,
-              alwaysVisible: false,
-              template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-              pageLinks: 5,
-              containerClass: 'pagination-wh',
-              currentPageClass: 'pager_curpage',
-              pageLinkClass: 'pager_link',
-              nextPageLinkLabel: '&gt;',
-              previousPageLinkLabel: '&lt;',
-              firstPageLinkLabel: '&lt;&lt;',
-              lastPageLinkLabel: '&gt;&gt;',
-              containers:['group-user-paginator']
-          }),
-          MSG_SORTASC:"${_('Click to sort ascending')}",
-          MSG_SORTDESC:"${_('Click to sort descending')}"
-      });
-
-      // main table sorting
-      var myColumnDefs = [
-          {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
-          {key:"name",label:"${_('Name')}",sortable:true,
-              sortOptions: { sortFunction: nameSort }},
-          {key:"desc",label:"${_('Description')}",sortable:true},
-          {key:"last_change",label:"${_('Last Change')}",sortable:true,
-              sortOptions: { sortFunction: ageSort }},
-          {key:"tip",label:"${_('Tip')}",sortable:true,
-              sortOptions: { sortFunction: revisionSort }},
-          {key:"owner",label:"${_('Owner')}",sortable:true},
-          {key:"atom",label:"",sortable:false},
-      ];
-
-      var myDataSource = new YAHOO.util.DataSource(YUD.get("repos_list"));
-
-      myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
-
-      myDataSource.responseSchema = {
-          fields: [
-              {key:"menu"},
-              //{key:"raw_name"},
-              {key:"name"},
-              {key:"desc"},
-              {key:"last_change"},
-              {key:"tip"},
-              {key:"owner"},
-              {key:"atom"},
-          ]
-      };
-
-      var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,
-              {
-               sortedBy:{key:"name",dir:"asc"},
-               MSG_SORTASC:"${_('Click to sort ascending')}",
-               MSG_SORTDESC:"${_('Click to sort descending')}",
-               MSG_EMPTY:"${_('No records found.')}",
-               MSG_ERROR:"${_('Data error.')}",
-               MSG_LOADING:"${_('Loading...')}",
-              }
-      );
-      myDataTable.subscribe('postRenderEvent',function(oArgs) {
-          tooltip_activate();
-          quick_repo_menu();
-          var func = function(node){
-              return node.parentNode.parentNode.parentNode.parentNode;
-          }
-          q_filter('q_filter',YUQ('div.table tr td a.repo_name'),func);
-      });
-
-    </script>
-    % else:
       <script>
         var data = ${c.data|n};
         var myDataSource = new YAHOO.util.DataSource(data);
@@ -278,20 +131,7 @@
 
         var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
           sortedBy:{key:"name",dir:"asc"},
-          paginator: new YAHOO.widget.Paginator({
-              rowsPerPage: ${c.visual.lightweight_dashboard_items},
-              alwaysVisible: false,
-              template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-              pageLinks: 5,
-              containerClass: 'pagination-wh',
-              currentPageClass: 'pager_curpage',
-              pageLinkClass: 'pager_link',
-              nextPageLinkLabel: '&gt;',
-              previousPageLinkLabel: '&lt;',
-              firstPageLinkLabel: '&lt;&lt;',
-              lastPageLinkLabel: '&gt;&gt;',
-              containers:['user-paginator']
-          }),
+          paginator: YUI_paginator(${c.visual.dashboard_items},['user-paginator']),
 
           MSG_SORTASC:"${_('Click to sort ascending')}",
           MSG_SORTDESC:"${_('Click to sort descending')}",
@@ -336,4 +176,3 @@
             filterTimeout = setTimeout(updateFilter,600);
         });
       </script>
-    % endif
--- a/rhodecode/templates/journal/journal.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/journal/journal.html	Fri Jun 07 00:31:11 2013 +0200
@@ -199,20 +199,7 @@
 
         var myDataTable = new YAHOO.widget.DataTable("watched_repos_list_wrap", myColumnDefs, myDataSource,{
           sortedBy:{key:"name",dir:"asc"},
-          paginator: new YAHOO.widget.Paginator({
-              rowsPerPage: 25,
-              alwaysVisible: false,
-              template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-              pageLinks: 5,
-              containerClass: 'pagination-wh',
-              currentPageClass: 'pager_curpage',
-              pageLinkClass: 'pager_link',
-              nextPageLinkLabel: '&gt;',
-              previousPageLinkLabel: '&lt;',
-              firstPageLinkLabel: '&lt;&lt;',
-              lastPageLinkLabel: '&gt;&gt;',
-              containers:['watched-user-paginator']
-          }),
+          paginator: YUI_paginator(25, ['watched-user-paginator']),
 
           MSG_SORTASC:"${_('Click to sort ascending')}",
           MSG_SORTDESC:"${_('Click to sort descending')}",
@@ -302,20 +289,7 @@
 
         var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
           sortedBy:{key:"name",dir:"asc"},
-          paginator: new YAHOO.widget.Paginator({
-              rowsPerPage: 25,
-              alwaysVisible: false,
-              template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
-              pageLinks: 5,
-              containerClass: 'pagination-wh',
-              currentPageClass: 'pager_curpage',
-              pageLinkClass: 'pager_link',
-              nextPageLinkLabel: '&gt;',
-              previousPageLinkLabel: '&lt;',
-              firstPageLinkLabel: '&lt;&lt;',
-              lastPageLinkLabel: '&gt;&gt;',
-              containers:['user-paginator']
-          }),
+          paginator: YUI_paginator(25, ['user-paginator']),
 
           MSG_SORTASC:"${_('Click to sort ascending')}",
           MSG_SORTDESC:"${_('Click to sort descending')}",
--- a/rhodecode/templates/journal/journal_data.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/journal/journal_data.html	Fri Jun 07 00:31:11 2013 +0200
@@ -2,7 +2,7 @@
 
 %if c.journal_day_aggreagate:
     %for day,items in c.journal_day_aggreagate:
-    <div class="journal_day">${day}</div>
+     <div class="journal_day">${day}</div>
         % for user,entries in items:
             <div class="journal_container">
                 <div class="gravatar">
@@ -35,7 +35,9 @@
         %endfor
     %endfor
 
-  <div class="pagination-wh pagination-left">
+  <div class="pagination-wh pagination-left" style="padding: 0px 0px 0px 10px;">
+  ${c.journal_pager.pager('$link_previous ~2~ $link_next')}
+  </div>
     <script type="text/javascript">
     YUE.onDOMReady(function(){
         YUE.delegate("journal","click",function(e, matchedEl, container){
@@ -48,8 +50,6 @@
         },'.pager_link');
     });
     </script>
-  ${c.journal_pager.pager('$link_previous ~2~ $link_next')}
-  </div>
 %else:
   <div style="padding:5px 0px 10px 10px;">
       ${_('No entries yet')}
--- a/rhodecode/templates/pullrequests/pullrequest.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/pullrequests/pullrequest.html	Fri Jun 07 00:31:11 2013 +0200
@@ -19,80 +19,22 @@
     <div class="title">
         ${self.breadcrumbs()}
     </div>
-    ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')}
-    <div style="float:left;padding:0px 30px 30px 30px">
-        ##ORG
-        <div style="float:left">
-            <div>
-                <span style="font-size: 20px">
-                ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref',c.default_org_ref,c.org_refs,class_='refs')}
-                </span>
-                 <div style="padding:5px 3px 3px 20px;">${c.rhodecode_db_repo.description}</div>
-            </div>
-            <div style="clear:both;padding-top: 10px"></div>
-        </div>
-          <div style="float:left;font-size:24px;padding:0px 20px">
-          <img height=32 width=32 src="${h.url('/images/arrow_right_64.png')}"/>
-          </div>
 
-        ##OTHER, most Probably the PARENT OF THIS FORK
-        <div style="float:left">
-            <div>
-                <span style="font-size: 20px">
-                ${h.select('other_repo',c.default_other_repo,c.other_repos,class_='refs')}:${c.default_other_repo_info['revs']}
-                </span>
-                 <div id="other_repo_desc" style="padding:5px 3px 3px 20px;"></div>
-            </div>
-            <div style="clear:both;padding-top: 10px"></div>
-        </div>
-       <div style="clear:both;padding-top: 10px"></div>
-       ## overview pulled by ajax
-       <div style="float:left" id="pull_request_overview"></div>
-       <div style="float:left;clear:both;padding:10px 10px 10px 0px;display:none">
-            <a id="pull_request_overview_url" href="#">${_('Detailed compare view')}</a>
-       </div>
-     </div>
-    <div style="float:left; border-left:1px dashed #eee">
-        <h4>${_('Pull request reviewers')}</h4>
-        <div id="reviewers" style="padding:0px 0px 0px 15px">
-          ## members goes here !
-          <div class="group_members_wrap">
-            <ul id="review_members" class="group_members">
-            %for member in [c.default_other_repo_info['user']]:
-              <li id="reviewer_${member['user_id']}">
-                <div class="reviewers_member">
-                  <div class="gravatar"><img alt="gravatar" src="${member['gravatar_link']}"/> </div>
-                  <div style="float:left">${member['firstname']} ${member['lastname']} (${_('owner')})</div>
-                  <input type="hidden" value="${member['user_id']}" name="review_members" />
-                  <span class="delete_icon action_button" onclick="removeReviewMember(${member['user_id']})"></span>
-                </div>
-              </li>
-            %endfor
-            </ul>
-          </div>
+    ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')}
 
-          <div class='ac'>
-            <div class="reviewer_ac">
-               ${h.text('user', class_='yui-ac-input')}
-               <span class="help-block">${_('Add reviewer to this pull request.')}</span>
-               <div id="reviewers_container"></div>
-            </div>
-          </div>
-        </div>
-    </div>
     <h3>${_('Create new pull request')}</h3>
 
     <div class="form">
         <!-- fields -->
 
-        <div class="fields">
+        <div class="fields" style="float:left;width:50%;padding-right:30px;">
 
              <div class="field">
                 <div class="label">
                     <label for="pullrequest_title">${_('Title')}:</label>
                 </div>
                 <div class="input">
-                    ${h.text('pullrequest_title',size=30)}
+                    ${h.text('pullrequest_title', class_="large")}
                 </div>
              </div>
 
@@ -101,16 +43,96 @@
                     <label for="pullrequest_desc">${_('Description')}:</label>
                 </div>
                 <div class="textarea text-area editor">
-                    ${h.textarea('pullrequest_desc',size=30)}
+                    ${h.textarea('pullrequest_desc',size=30, style="height:100px")}
+                    <span class="help-block">${_('Write a short description on this pull request')}</span>
+                </div>
+            </div>
+
+            <div class="field">
+                <div class="label label-textarea">
+                    <label for="pullrequest_desc">${_('Changeset flow')}:</label>
+                </div>
+                <div class="input">
+                    ##ORG
+                    <div>
+                        <div>
+                            <div style="padding:5px 3px 3px 3px;">
+                            <b>${_('Origin repository')}:</b> ${c.rhodecode_db_repo.description}
+                            </div>
+                            <span style="font-size: 20px">
+                            ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref',c.default_org_ref,c.org_refs,class_='refs')}
+                            </span>
+                        </div>
+                    </div>
+
+                    ##OTHER, most Probably the PARENT OF THIS FORK
+                    <div style="border-top: 1px solid #EEE; margin: 5px 0px 0px 0px">
+                        <div>
+                            ## filled with JS
+                            <div id="other_repo_desc" style="padding:5px 3px 3px 3px;">
+                            </div>
+                            <span style="font-size: 20px">
+                            ${h.select('other_repo',c.default_other_repo,c.other_repos,class_='refs')}:${c.default_other_repo_info['revs']}
+                            </span>
+                        </div>
+                    </div>
+                    <div style="clear:both"></div>
                 </div>
             </div>
 
-            <div class="buttons">
-                ${h.submit('save',_('Send pull request'),class_="ui-btn large")}
-                ${h.reset('reset',_('Reset'),class_="ui-btn large")}
+            <div class="field">
+                <div class="buttons">
+                    ${h.submit('save',_('Send pull request'),class_="ui-btn large")}
+                    ${h.reset('reset',_('Reset'),class_="ui-btn large")}
+               </div>
+            </div>
+
+        </div>
+
+        ## Reviewers
+        <div style="float:left; border-left:1px dashed #eee">
+            <h4>${_('Pull request reviewers')}</h4>
+            <div id="reviewers" style="padding:0px 0px 0px 15px">
+              ## members goes here !
+              <div class="group_members_wrap">
+                <ul id="review_members" class="group_members">
+                %for member in [c.default_other_repo_info['user']]:
+                  <li id="reviewer_${member['user_id']}">
+                    <div class="reviewers_member">
+                      <div class="gravatar"><img alt="gravatar" src="${member['gravatar_link']}"/> </div>
+                      <div style="float:left">${member['firstname']} ${member['lastname']} (${_('owner')})</div>
+                      <input type="hidden" value="${member['user_id']}" name="review_members" />
+                      <span class="delete_icon action_button" onclick="removeReviewMember(${member['user_id']})"></span>
+                    </div>
+                  </li>
+                %endfor
+                </ul>
+              </div>
+
+              <div class='ac'>
+                <div class="reviewer_ac">
+                   ${h.text('user', class_='yui-ac-input')}
+                   <span class="help-block">${_('Add reviewer to this pull request.')}</span>
+                   <div id="reviewers_container"></div>
+                </div>
+              </div>
+            </div>
+        </div>
+
+        <div style="clear:both;padding: 0 0 30px 0;"></div>
+
+        <h4>${_('Changesets')}</h4>
+        <div style="float:left;padding:0px 30px 30px 30px">
+           ## overview pulled by ajax
+           <div style="float:left" id="pull_request_overview"></div>
+           <div style="float:left;clear:both;padding:10px 10px 10px 0px;display:none">
+                <a id="pull_request_overview_url" href="#">${_('Detailed compare view')}</a>
            </div>
         </div>
+        <div style="clear:both;"></div>
+
     </div>
+
     ${h.end_form()}
 
 </div>
@@ -125,8 +147,8 @@
   var otherrepoChanged = function(){
       var sel_box = YUQ('#pull_request_form #other_repo')[0];
       var repo_name = sel_box.options[sel_box.selectedIndex].value;
-
-      YUD.get('other_repo_desc').innerHTML = other_repos_info[repo_name]['description'];
+      var _tmpl = "<b>${_('Destination repository')}</b>: {0}".format(other_repos_info[repo_name]['description']);
+      YUD.get('other_repo_desc').innerHTML = _tmpl
       // replace options of other_ref with the ones for the current other_repo
       var other_ref_selector = YUD.get('other_ref');
       var new_select = YUD.createElementFromMarkup(other_repos_info[repo_name]['revs']);
--- a/rhodecode/templates/pullrequests/pullrequest_data.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/pullrequests/pullrequest_data.html	Fri Jun 07 00:31:11 2013 +0200
@@ -3,36 +3,22 @@
 % for pr in c.pullrequests_pager:
   <div class="pr ${'pr-closed' if pr.is_closed() else ''}">
     <div class="pr-title">
-       %if pr.is_closed():
-         <div style="float:left;margin: -4px 0px;"><span class="pr-closed-tag">${_('Closed')}</span></div>
-       %endif
       <img src="${h.url('/images/icons/flag_status_%s.png' % str(pr.last_review_status))}" />
       <a href="${h.url('pullrequest_show',repo_name=c.repo_name,pull_request_id=pr.pull_request_id)}">
       ${_('Pull request #%s opened by %s on %s') % (pr.pull_request_id, pr.author.full_name, h.fmt_date(pr.created_on))}
       </a>
+       %if pr.is_closed():
+         <span class="pr-closed-tag">${_('Closed')}</span>
+       %endif
     </div>
     <h5 style="border:0px;padding-bottom:0px">${_('Title')}: ${pr.title}</h5>
     <div>${pr.description}</div>
   </div>
 % endfor
 
-<div class="pagination-wh pagination-left">
-<script type="text/javascript">
-YUE.onDOMReady(function(){
-    YUE.delegate("pullrequests","click",function(e, matchedEl, container){
-        ypjax(e.target.href,"pullrequests",function(){
-            show_more_event();
-            tooltip_activate();
-            show_changeset_tooltip();
-        });
-        YUE.preventDefault(e);
-    },'.pager_link');
-});
-</script>
+
 <div class="notification-paginator">
   <div class="pagination-wh pagination-left">
   ${c.pullrequests_pager.pager('$link_previous ~2~ $link_next')}
   </div>
 </div>
-
-</div>
--- a/rhodecode/templates/pullrequests/pullrequest_show.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/pullrequests/pullrequest_show.html	Fri Jun 07 00:31:11 2013 +0200
@@ -78,7 +78,7 @@
          </div>
          <div class="field">
           <div class="label-summary">
-              <label>${_('Summary')}:</label>
+              <label>${_('Description')}:</label>
           </div>
           <div class="input">
               <div style="white-space:pre-wrap">${h.literal(c.pull_request.description)}</div>
--- a/rhodecode/templates/search/search.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/search/search.html	Fri Jun 07 00:31:11 2013 +0200
@@ -54,7 +54,7 @@
                         <input type="submit" value="${_('Search')}" class="ui-button"/>
                     </div>
                 </div>
-                <div style="font-weight: bold;clear:Both;margin-left:200px">${c.runtime}</div>
+                <div style="font-weight: bold;clear:both;margin-left:200px">${c.runtime}</div>
             </div>
 
             <div class="field">
--- a/rhodecode/templates/shortlog/shortlog.html	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-## -*- coding: utf-8 -*-
-<%inherit file="/base/base.html"/>
-
-<%def name="title()">
-    ${_('%s Lightweight Changelog') % c.repo_name} &middot; ${c.rhodecode_name}
-</%def>
-
-
-<%def name="breadcrumbs_links()">
-    %if c.file_history:
-        ${h.link_to(_('Lightweight Changelog'),h.url('shortlog_home',repo_name=c.repo_name))}
-        &raquo;
-        ${c.file_history}
-    %else:
-        ${_('Lightweight Changelog')}
-    %endif
-</%def>
-
-<%def name="page_nav()">
-    ${self.menu('repositories')}
-</%def>
-
-<%def name="main()">
-${self.context_bar('options')}
-<div class="box">
-    <!-- box / title -->
-    <div class="title">
-        ${self.breadcrumbs()}
-    </div>
-    <!-- end box / title -->
-    <div class="table">
-        <div id="shortlog_data">
-            ${c.shortlog_data}
-        </div>
-    </div>
-</div>
-</%def>
--- a/rhodecode/templates/shortlog/shortlog_data.html	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-## -*- coding: utf-8 -*-
-%if c.repo_changesets:
-<table class="table_disp">
-    <tr>
-        <th class="left">${_('Revision')}</th>
-        <th class="left">${_('Commit message')}</th>
-        <th class="left">${_('Age')}</th>
-        <th class="left">${_('Author')}</th>
-        <th class="left">${_('Branch')}</th>
-        <th class="left">${_('Tags')}</th>
-    </tr>
-%for cnt,cs in enumerate(c.repo_changesets):
-    <tr class="parity${cnt%2}">
-        <td>
-          <div>
-            <div class="changeset-status-container">
-              %if c.statuses.get(cs.raw_id):
-                <div class="changeset-status-ico">
-                %if c.statuses.get(cs.raw_id)[2]:
-                  <a class="tooltip" title="${_('Click to open associated pull request #%s' % c.statuses.get(cs.raw_id)[2])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
-                    <img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" />
-                  </a>
-                %else:
-                  <img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" />
-                %endif
-                </div>
-              %endif
-            </div>
-            <pre><a href="${h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id)}">${h.show_id(cs)}</a></pre>
-         </div>
-        </td>
-        <td>
-            ${h.urlify_commit(h.truncate(cs.message,50),c.repo_name, h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
-        </td>
-        <td><span class="tooltip" title="${h.tooltip(h.fmt_date(cs.date))}">
-                      ${h.age(cs.date)}</span>
-        </td>
-        <td title="${cs.author}">${h.person(cs.author)}</td>
-        <td>
-            <span class="logtags">
-                %if cs.branch:
-                <span class="branchtag">
-                    ${cs.branch}
-                </span>
-                %endif
-            </span>
-        </td>
-        <td>
-            <span class="logtags">
-                %for tag in cs.tags:
-                    <span class="tagtag">${tag}</span>
-                %endfor
-            </span>
-        </td>
-    </tr>
-%endfor
-
-</table>
-
-<script type="text/javascript">
-  YUE.onDOMReady(function(){
-    YUE.delegate("shortlog_data","click",function(e, matchedEl, container){
-        ypjax(e.target.href,"shortlog_data",function(){tooltip_activate();});
-        YUE.preventDefault(e);
-    },'.pager_link');
-  });
-</script>
-
-<div class="pagination-wh pagination-left">
-${c.repo_changesets.pager('$link_previous ~2~ $link_next')}
-</div>
-%else:
-
-%if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
-<h4>${_('Add or upload files directly via RhodeCode')}</h4>
-<div style="margin: 20px 30px;">
-  <div id="add_node_id" class="add_node">
-      <a class="ui-btn" href="${h.url('files_add_home',repo_name=c.repo_name,revision=0,f_path='')}">${_('Add new file')}</a>
-  </div>
-</div>
-%endif
-
-
-<h4>${_('Push new repo')}</h4>
-<pre>
-    ${c.rhodecode_repo.alias} clone ${c.clone_repo_url}
-    ${c.rhodecode_repo.alias} add README # add first file
-    ${c.rhodecode_repo.alias} commit -m "Initial" # commit with message
-    ${c.rhodecode_repo.alias} push ${'origin master' if h.is_git(c.rhodecode_repo) else ''} # push changes back
-</pre>
-
-<h4>${_('Existing repository?')}</h4>
-<pre>
-%if h.is_git(c.rhodecode_repo):
-    git remote add origin ${c.clone_repo_url}
-    git push -u origin master
-%else:
-    hg push ${c.clone_repo_url}
-%endif
-</pre>
-%endif
--- a/rhodecode/templates/summary/summary.html	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/templates/summary/summary.html	Fri Jun 07 00:31:11 2013 +0200
@@ -85,17 +85,17 @@
                   ##FORK
                   %if c.dbrepo.fork:
                     <div style="margin-top:5px;clear:both">
-                    <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}"><img class="icon" alt="${_('Public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
-                        ${_('Fork of')} ${c.dbrepo.fork.repo_name}
-                    </a>
+                        <img class="icon" alt="${_('Public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
+                        ${_('Fork of')}
+                        <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}">${c.dbrepo.fork.repo_name}</a>
                     </div>
                   %endif
                   ##REMOTE
                   %if c.dbrepo.clone_uri:
                     <div style="margin-top:5px;clear:both">
-                    <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}"><img class="icon" alt="${_('Remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
-                        ${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}
-                    </a>
+                        ${_('Clone from')}
+                        <img class="icon" alt="${_('Remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
+                        <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}">${h.hide_credentials(c.dbrepo.clone_uri)}</a>
                     </div>
                   %endif
               </div>
@@ -148,7 +148,7 @@
                 %else:
                    ${_('Statistics are disabled for this repository')}
                    %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
-                        ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
+                        ${h.link_to(_('Enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
                    %endif
                 %endif
               </div>
@@ -164,14 +164,14 @@
                 %elif not c.enable_downloads:
                   ${_('Downloads are disabled for this repository')}
                     %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
-                        ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
+                        ${h.link_to(_('Enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
                     %endif
                 %else:
+                    <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
                     ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
-                         <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
                     <span style="vertical-align: bottom">
-                        <input id="archive_subrepos" type="checkbox" name="subrepos" />
-                        <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
+                      <input id="archive_subrepos" type="checkbox" name="subrepos" />
+                      <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
                     </span>
                 %endif
               </div>
@@ -261,7 +261,7 @@
     </div>
     <div class="table">
         <div id="shortlog_data">
-            <%include file='../shortlog/shortlog_data.html'/>
+            <%include file='../changelog/changelog_summary_data.html'/>
         </div>
     </div>
 </div>
@@ -269,10 +269,9 @@
 %if c.readme_data:
 <div id="readme" class="anchor">
 <div class="box" style="background-color: #FAFAFA">
-    <div class="title" title="${_("Readme file at revision '%s'" % c.rhodecode_db_repo.landing_rev)}">
+    <div class="title" title="${_('Readme file from revision %s') % c.rhodecode_db_repo.landing_rev}">
         <div class="breadcrumbs">
             <a href="${h.url('files_home',repo_name=c.repo_name,revision='tip',f_path=c.readme_file)}">${c.readme_file}</a>
-            <a class="permalink" href="#readme" title="${_('Permalink to this readme')}">&para;</a>
         </div>
     </div>
     <div class="readme">
--- a/rhodecode/tests/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -25,22 +25,26 @@
 import tempfile
 from os.path import join as jn
 
-from unittest import TestCase
 from tempfile import _RandomNameSequence
 
 from paste.deploy import loadapp
 from paste.script.appinstall import SetupCommand
+
+import pylons
+import pylons.test
 from pylons import config, url
+from pylons.i18n.translation import _get_translator
+from pylons.util import ContextObj
+
 from routes.util import URLGenerator
 from webtest import TestApp
 from nose.plugins.skip import SkipTest
 
+from rhodecode.lib.compat import unittest
 from rhodecode import is_windows
 from rhodecode.model.meta import Session
 from rhodecode.model.db import User
 from rhodecode.tests.nose_parametrized import parameterized
-
-import pylons.test
 from rhodecode.lib.utils2 import safe_unicode, safe_str
 
 
@@ -52,7 +56,7 @@
 
 __all__ = [
     'parameterized', 'environ', 'url', 'get_new_dir', 'TestController',
-    'SkipTest', 'ldap_lib_installed',
+    'SkipTest', 'ldap_lib_installed', 'BaseTestCase', 'init_stack',
     'TESTS_TMP_PATH', 'HG_REPO', 'GIT_REPO', 'NEW_HG_REPO', 'NEW_GIT_REPO',
     'HG_FORK', 'GIT_FORK', 'TEST_USER_ADMIN_LOGIN', 'TEST_USER_ADMIN_PASS',
     'TEST_USER_REGULAR_LOGIN', 'TEST_USER_REGULAR_PASS',
@@ -141,17 +145,31 @@
     return get_normalized_path(path)
 
 
-class TestController(TestCase):
+def init_stack(config=None):
+    if not config:
+        config = pylons.test.pylonsapp.config
+    url._push_object(URLGenerator(config['routes.map'], environ))
+    pylons.app_globals._push_object(config['pylons.app_globals'])
+    pylons.config._push_object(config)
+    pylons.tmpl_context._push_object(ContextObj())
+    # Initialize a translator for tests that utilize i18n
+    translator = _get_translator(pylons.config.get('lang'))
+    pylons.translator._push_object(translator)
+
+
+class BaseTestCase(unittest.TestCase):
+    def __init__(self, *args, **kwargs):
+        self.wsgiapp = pylons.test.pylonsapp
+        init_stack(self.wsgiapp.config)
+        unittest.TestCase.__init__(self, *args, **kwargs)
+
+
+class TestController(BaseTestCase):
 
     def __init__(self, *args, **kwargs):
-        wsgiapp = pylons.test.pylonsapp
-        config = wsgiapp.config
-
-        self.app = TestApp(wsgiapp)
-        url._push_object(URLGenerator(config['routes.map'], environ))
-        self.Session = Session
+        BaseTestCase.__init__(self, *args, **kwargs)
+        self.app = TestApp(self.wsgiapp)
         self.index_location = config['app_conf']['index_dir']
-        TestCase.__init__(self, *args, **kwargs)
 
     def log_user(self, username=TEST_USER_ADMIN_LOGIN,
                  password=TEST_USER_ADMIN_PASS):
--- a/rhodecode/tests/api/api_base.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/api/api_base.py	Fri Jun 07 00:31:11 2013 +0200
@@ -11,7 +11,8 @@
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.meta import Session
 from rhodecode.model.scm import ScmModel
-from rhodecode.model.db import Repository
+from rhodecode.model.db import Repository, User
+from rhodecode.lib.utils2 import  time_to_datetime
 
 
 API_URL = '/_admin/api'
@@ -25,7 +26,6 @@
     Builds API data with given random ID
 
     :param random_id:
-    :type random_id:
     """
     random_id = random.randrange(1, 9999)
     return random_id, json.dumps({
@@ -50,9 +50,9 @@
 
 ## helpers
 def make_users_group(name=TEST_USER_GROUP):
-    gr = UserGroupModel().create(name=name)
+    gr = fixture.create_user_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
     UserGroupModel().add_user_to_group(users_group=gr,
-                                        user=TEST_USER_ADMIN_LOGIN)
+                                       user=TEST_USER_ADMIN_LOGIN)
     Session().commit()
     return gr
 
@@ -67,10 +67,10 @@
     REPO_TYPE = None
 
     @classmethod
-    def setUpClass(self):
-        self.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
-        self.apikey = self.usr.api_key
-        self.test_user = UserModel().create_or_update(
+    def setUpClass(cls):
+        cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
+        cls.apikey = cls.usr.api_key
+        cls.test_user = UserModel().create_or_update(
             username='test-api',
             password='test',
             email='test@api.rhodecode.org',
@@ -78,11 +78,11 @@
             lastname='last'
         )
         Session().commit()
-        self.TEST_USER_LOGIN = self.test_user.username
-        self.apikey_regular = self.test_user.api_key
+        cls.TEST_USER_LOGIN = cls.test_user.username
+        cls.apikey_regular = cls.test_user.api_key
 
     @classmethod
-    def teardownClass(self):
+    def teardownClass(cls):
         pass
 
     def setUp(self):
@@ -164,7 +164,9 @@
         id_, params = _build_data(self.apikey, 'get_users',)
         response = api_call(self, params)
         ret_all = []
-        for usr in UserModel().get_all():
+        _users = User.query().filter(User.username != User.DEFAULT_USER)\
+                             .order_by(User.username).all()
+        for usr in _users:
             ret = usr.get_api_data()
             ret_all.append(jsonify(ret))
         expected = ret_all
@@ -264,13 +266,14 @@
         self._compare_error(id_, expected, given=response.body)
 
     def test_api_invalidate_cache(self):
+        repo = RepoModel().get_by_repo_name(self.REPO)
+        repo.scm_instance_cached() # seed cache
+
         id_, params = _build_data(self.apikey, 'invalidate_cache',
                                   repoid=self.REPO)
         response = api_call(self, params)
 
-        expected = ("Cache for repository `%s` was invalidated: "
-                    "invalidated cache keys: %s" % (self.REPO,
-                                                    [unicode(self.REPO)]))
+        expected = ("Caches of repository `%s` was invalidated" % (self.REPO))
         self._compare_ok(id_, expected, given=response.body)
 
     @mock.patch.object(ScmModel, 'mark_for_invalidation', crash)
@@ -288,8 +291,15 @@
                                   repoid=self.REPO,
                                   locked=True)
         response = api_call(self, params)
-        expected = ('User `%s` set lock state for repo `%s` to `%s`'
-                   % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
+        expected = {
+            'repo': self.REPO,
+            'locked': True,
+            'locked_since': None,
+            'locked_by': TEST_USER_ADMIN_LOGIN,
+            'msg': ('User `%s` set lock state for repo `%s` to `%s`'
+                    % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
+        }
+        expected['locked_since'] = json.loads(response.body)['result']['locked_since']
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_lock_repo_lock_aquire_by_non_admin(self):
@@ -301,8 +311,15 @@
                                       repoid=repo_name,
                                       locked=True)
             response = api_call(self, params)
-            expected = ('User `%s` set lock state for repo `%s` to `%s`'
-                       % (self.TEST_USER_LOGIN, repo_name, True))
+            expected = {
+                'repo': repo_name,
+                'locked': True,
+                'locked_since': None,
+                'locked_by': self.TEST_USER_LOGIN,
+                'msg': ('User `%s` set lock state for repo `%s` to `%s`'
+                        % (self.TEST_USER_LOGIN, repo_name, True))
+            }
+            expected['locked_since'] = json.loads(response.body)['result']['locked_since']
             self._compare_ok(id_, expected, given=response.body)
         finally:
             fixture.destroy_repo(repo_name)
@@ -336,8 +353,14 @@
                                   repoid=self.REPO,
                                   locked=False)
         response = api_call(self, params)
-        expected = ('User `%s` set lock state for repo `%s` to `%s`'
-                   % (TEST_USER_ADMIN_LOGIN, self.REPO, False))
+        expected = {
+            'repo': self.REPO,
+            'locked': False,
+            'locked_since': None,
+            'locked_by': TEST_USER_ADMIN_LOGIN,
+            'msg': ('User `%s` set lock state for repo `%s` to `%s`'
+                    % (TEST_USER_ADMIN_LOGIN, self.REPO, False))
+        }
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_lock_repo_lock_aquire_optional_userid(self):
@@ -345,19 +368,33 @@
                                   repoid=self.REPO,
                                   locked=True)
         response = api_call(self, params)
-        expected = ('User `%s` set lock state for repo `%s` to `%s`'
-                   % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
+        expected = {
+            'repo': self.REPO,
+            'locked': True,
+            'locked_since': None,
+            'locked_by': TEST_USER_ADMIN_LOGIN,
+            'msg': ('User `%s` set lock state for repo `%s` to `%s`'
+                    % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
+        }
+        expected['locked_since'] = json.loads(response.body)['result']['locked_since']
         self._compare_ok(id_, expected, given=response.body)
 
     def test_api_lock_repo_lock_optional_locked(self):
-        from rhodecode.lib.utils2 import  time_to_datetime
-        _locked_since = json.dumps(time_to_datetime(Repository\
-                                    .get_by_repo_name(self.REPO).locked[1]))
         id_, params = _build_data(self.apikey, 'lock',
                                   repoid=self.REPO)
         response = api_call(self, params)
-        expected = ('Repo `%s` locked by `%s`. Locked=`True`. Locked since: `%s`'
-                   % (self.REPO, TEST_USER_ADMIN_LOGIN, _locked_since))
+        time_ = json.loads(response.body)['result']['locked_since']
+        expected = {
+            'repo': self.REPO,
+            'locked': True,
+            'locked_since': None,
+            'locked_by': TEST_USER_ADMIN_LOGIN,
+            'msg': ('Repo `%s` locked by `%s`. '
+                            % (self.REPO,
+                               json.dumps(time_to_datetime(time_))))
+
+        }
+        expected['locked_since'] = time_
         self._compare_ok(id_, expected, given=response.body)
 
     @mock.patch.object(Repository, 'lock', crash)
@@ -439,6 +476,27 @@
         UserModel().delete(usr.user_id)
         Session().commit()
 
+    def test_api_create_user_without_password(self):
+        username = 'test_new_api_user_passwordless'
+        email = username + "@foo.com"
+
+        id_, params = _build_data(self.apikey, 'create_user',
+                                  username=username,
+                                  email=email)
+        response = api_call(self, params)
+
+        usr = UserModel().get_by_username(username)
+        ret = dict(
+            msg='created new user `%s`' % username,
+            user=jsonify(usr.get_api_data())
+        )
+
+        expected = ret
+        self._compare_ok(id_, expected, given=response.body)
+
+        UserModel().delete(usr.user_id)
+        Session().commit()
+
     @mock.patch.object(UserModel, 'create_or_update', crash)
     def test_api_create_user_when_exception_happened(self):
 
@@ -1084,8 +1142,7 @@
 
     def test_api_add_user_to_users_group(self):
         gr_name = 'test_group'
-        UserGroupModel().create(gr_name)
-        Session().commit()
+        fixture.create_user_group(gr_name)
         id_, params = _build_data(self.apikey, 'add_user_to_users_group',
                                   usersgroupid=gr_name,
                                   userid=TEST_USER_ADMIN_LOGIN)
@@ -1113,8 +1170,7 @@
     @mock.patch.object(UserGroupModel, 'add_user_to_group', crash)
     def test_api_add_user_to_users_group_exception_occurred(self):
         gr_name = 'test_group'
-        UserGroupModel().create(gr_name)
-        Session().commit()
+        fixture.create_user_group(gr_name)
         id_, params = _build_data(self.apikey, 'add_user_to_users_group',
                                   usersgroupid=gr_name,
                                   userid=TEST_USER_ADMIN_LOGIN)
@@ -1128,7 +1184,7 @@
 
     def test_api_remove_user_from_users_group(self):
         gr_name = 'test_group_3'
-        gr = UserGroupModel().create(gr_name)
+        gr = fixture.create_user_group(gr_name)
         UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
         Session().commit()
         id_, params = _build_data(self.apikey, 'remove_user_from_users_group',
@@ -1149,7 +1205,7 @@
     @mock.patch.object(UserGroupModel, 'remove_user_from_group', crash)
     def test_api_remove_user_from_users_group_exception_occurred(self):
         gr_name = 'test_group_3'
-        gr = UserGroupModel().create(gr_name)
+        gr = fixture.create_user_group(gr_name)
         UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
         Session().commit()
         id_, params = _build_data(self.apikey, 'remove_user_from_users_group',
--- a/rhodecode/tests/fixture.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/fixture.py	Fri Jun 07 00:31:11 2013 +0200
@@ -2,10 +2,11 @@
 Helpers for fixture generation
 """
 from rhodecode.tests import *
-from rhodecode.model.db import Repository, User, RepoGroup
+from rhodecode.model.db import Repository, User, RepoGroup, UserGroup
 from rhodecode.model.meta import Session
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.repos_group import ReposGroupModel
+from rhodecode.model.users_group import UserGroupModel
 
 
 class Fixture(object):
@@ -43,6 +44,15 @@
 
         return defs
 
+    def _get_user_group_create_params(self, name, **custom):
+        defs = dict(
+            users_group_name=name,
+            users_group_active=True,
+        )
+        defs.update(custom)
+
+        return defs
+
     def create_repo(self, name, **kwargs):
         if 'skip_if_exists' in kwargs:
             del kwargs['skip_if_exists']
@@ -100,3 +110,17 @@
         Session().commit()
         gr = RepoGroup.get_by_group_name(gr.group_name)
         return gr
+
+    def create_user_group(self, name, **kwargs):
+        if 'skip_if_exists' in kwargs:
+            del kwargs['skip_if_exists']
+            gr = UserGroup.get_by_group_name(group_name=name)
+            if gr:
+                return gr
+        form_data = self._get_user_group_create_params(name, **kwargs)
+        owner = kwargs.get('cur_user', TEST_USER_ADMIN_LOGIN)
+        user_group = UserGroupModel().create(name=form_data['users_group_name'],
+                        owner=owner, active=form_data['users_group_active'])
+        Session().commit()
+        user_group = UserGroup.get_by_group_name(user_group.users_group_name)
+        return user_group
--- a/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -9,7 +9,11 @@
 
 diff --git a/img/baseline-20px.png b/img/baseline-20px.png
 deleted file mode 100644
-Binary file img/baseline-20px.png has changed
+index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000
+GIT binary patch
+literal 0
+Hc$@<O00001
+
 diff --git a/index.html b/index.html
 --- a/index.html
 +++ b/index.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/fixtures/hg_diff_chmod_and_mod_single_binary_file.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,18 @@
+diff --git a/gravatar.png b/gravatar.png
+old mode 100644
+new mode 100755
+index 54d2d129e3372c45a4c68a742e269864222e99ae..0c1d65410bd51fdff935443e01931c9fc3ad7def
+GIT binary patch
+literal 740
+zc%17D@N?(olHy`uVBq!ia0vp^dx3Z#2NRHduQ>B0kYX$ja(7}_cTVOdki%Kv5n0T@
+zz%2~Ij105pNB{-dOFVsD*>AH+2@7*F&3eGWz`&H|>EaktaqI0JMZd!V5(hqpU(%ki
+zz<{N_Dc~^g1GeA{8S#b#jBU<`Ij0FINT{SO2`=WI*Kku%Kte?~QvUtk`~FuatbIH`
+zU*0#<bY2fr$(Coz4(2b|?k<qNz`M&4#A?WcvPzmkEJg29#pjiUe<s|iw%c!Ml>foD
+zHLr#RtfPb(q61ZL^D3dLy27sS9LG1ks-ApS8e$A1NIi%J(b=2_we?fTsn6Zh<#UVP
+z|9tiF%$|eaMRt7@#I6)<9go)1-`(@)=Q(p!@3vNKDKmRt(o@-7dHLx1lNY~Ad}g~_
+za{b)1``zCC$!DbBm~WE-irmOC$k!;|zwzb_^B2daEtWo!yMN=;86Y!nbQtDu5Wn34
+zbmZh?b(0@$%sb%=43(hD^~>9*yZ+6yNtdtp|J$sq{^jrc-CO$Jn%~HOWByJ0bK9TY
+zg@4_kydS*R^JDe{4Z08FKRNbQ`g%Ud?r+k+d3UblwmiT6sL83<_jKRAJ-Pr-V6<tp
+z?epIfY2R5iFZ#Ccl<T?EX78;p`&F5H??E-!-5(q%k>Y5MY!uto=R2=&d?)y?yZLYL
+zJ^SCEe$Bh{bKS3dDW9<fAX0p_*<5X%lMalj*{B8|p0JPMtzFP9%Uvy?WXj;_>gTe~
+RDWNH`I3+QqIFSoR0|1y<SJMCh
\ No newline at end of file
--- a/rhodecode/tests/fixtures/hg_diff_del_single_binary_file.diff	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/fixtures/hg_diff_del_single_binary_file.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -1,3 +1,6 @@
 diff --git a/US Warszawa.jpg b/US Warszawa.jpg
 deleted file mode 100755
-Binary file US Warszawa.jpg has changed
+index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000
+GIT binary patch
+literal 0
+Hc$@<O00001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/fixtures/hg_diff_mod_file_and_rename.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,10 @@
+diff --git a/README b/README.rst
+rename from README
+rename to README.rst
+--- a/README
++++ b/README.rst
+@@ -1,1 +1,4 @@
+ readme2
++line 1
++ line2
++
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/fixtures/hg_diff_mod_single_file_and_rename_and_chmod.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,15 @@
+diff --git a/README.rst b/README
+old mode 100755
+new mode 100644
+rename from README.rst
+rename to README
+--- a/README.rst
++++ b/README
+@@ -1,4 +1,7 @@
+ readme2
+ line 1
+  line2
+
++line 1
++ line2
++
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/fixtures/hg_diff_rename_and_chmod_file.diff	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,5 @@
+diff --git a/README.rst b/README
+old mode 100644
+new mode 100755
+rename from README.rst
+rename to README
\ No newline at end of file
Binary file rhodecode/tests/fixtures/vcs_test_git.tar.gz has changed
Binary file rhodecode/tests/fixtures/vcs_test_hg.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/functional/test_admin_gists.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,173 @@
+import datetime
+
+from rhodecode.tests import *
+from rhodecode.model.gist import GistModel
+from rhodecode.model.meta import Session
+from rhodecode.model.db import User, Gist
+
+
+def _create_gist(f_name, content='some gist', lifetime=-1,
+                 description='gist-desc', gist_type='public',
+                 owner=TEST_USER_ADMIN_LOGIN):
+    gist_mapping = {
+        f_name: {'content': content}
+    }
+    user = User.get_by_username(owner)
+    gist = GistModel().create(description, owner=user,
+                       gist_mapping=gist_mapping, gist_type=gist_type,
+                       lifetime=lifetime)
+    Session().commit()
+    return gist
+
+
+class TestGistsController(TestController):
+
+    def tearDown(self):
+        for g in Gist.get_all():
+            GistModel().delete(g)
+        Session().commit()
+
+    def test_index(self):
+        self.log_user()
+        response = self.app.get(url('gists'))
+        # Test response...
+        response.mustcontain('There are no gists yet')
+
+        g1 = _create_gist('gist1').gist_access_id
+        g2 = _create_gist('gist2', lifetime=1400).gist_access_id
+        g3 = _create_gist('gist3', description='gist3-desc').gist_access_id
+        g4 = _create_gist('gist4', gist_type='private').gist_access_id
+        response = self.app.get(url('gists'))
+        # Test response...
+        response.mustcontain('gist:%s' % g1)
+        response.mustcontain('gist:%s' % g2)
+        response.mustcontain('Expires: in 23 hours')  # we don't care about the end
+        response.mustcontain('gist:%s' % g3)
+        response.mustcontain('gist3-desc')
+        response.mustcontain(no=['gist:%s' % g4])
+
+    def test_index_private_gists(self):
+        self.log_user()
+        gist = _create_gist('gist5', gist_type='private')
+        response = self.app.get(url('gists', private=1))
+        # Test response...
+
+        #and privates
+        response.mustcontain('gist:%s' % gist.gist_access_id)
+
+    def test_create_missing_description(self):
+        self.log_user()
+        response = self.app.post(url('gists'),
+                                 params={'lifetime': -1}, status=200)
+
+        response.mustcontain('Missing value')
+
+    def test_create(self):
+        self.log_user()
+        response = self.app.post(url('gists'),
+                                 params={'lifetime': -1,
+                                         'content': 'gist test',
+                                         'filename': 'foo',
+                                         'public': 'public'},
+                                 status=302)
+        response = response.follow()
+        response.mustcontain('added file: foo')
+        response.mustcontain('gist test')
+        response.mustcontain('<div class="ui-btn green badge">Public gist</div>')
+
+    def test_create_with_path_with_dirs(self):
+        self.log_user()
+        response = self.app.post(url('gists'),
+                                 params={'lifetime': -1,
+                                         'content': 'gist test',
+                                         'filename': '/home/foo',
+                                         'public': 'public'},
+                                 status=200)
+        response.mustcontain('Filename cannot be inside a directory')
+
+    def test_access_expired_gist(self):
+        self.log_user()
+        gist = _create_gist('never-see-me')
+        gist.gist_expires = 0  # 1970
+        Session().add(gist)
+        Session().commit()
+
+        response = self.app.get(url('gist', gist_id=gist.gist_access_id), status=404)
+
+    def test_create_private(self):
+        self.log_user()
+        response = self.app.post(url('gists'),
+                                 params={'lifetime': -1,
+                                         'content': 'private gist test',
+                                         'filename': 'private-foo',
+                                         'private': 'private'},
+                                 status=302)
+        response = response.follow()
+        response.mustcontain('added file: private-foo<')
+        response.mustcontain('private gist test')
+        response.mustcontain('<div class="ui-btn yellow badge">Private gist</div>')
+
+    def test_create_with_description(self):
+        self.log_user()
+        response = self.app.post(url('gists'),
+                                 params={'lifetime': -1,
+                                         'content': 'gist test',
+                                         'filename': 'foo-desc',
+                                         'description': 'gist-desc',
+                                         'public': 'public'},
+                                 status=302)
+        response = response.follow()
+        response.mustcontain('added file: foo-desc')
+        response.mustcontain('gist test')
+        response.mustcontain('gist-desc')
+        response.mustcontain('<div class="ui-btn green badge">Public gist</div>')
+
+    def test_new(self):
+        self.log_user()
+        response = self.app.get(url('new_gist'))
+
+    def test_update(self):
+        self.skipTest('not implemented')
+        response = self.app.put(url('gist', gist_id=1))
+
+    def test_delete(self):
+        self.log_user()
+        gist = _create_gist('delete-me')
+        response = self.app.delete(url('gist', gist_id=gist.gist_id))
+        self.checkSessionFlash(response, 'Deleted gist %s' % gist.gist_id)
+
+    def test_delete_normal_user_his_gist(self):
+        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
+        gist = _create_gist('delete-me', owner=TEST_USER_REGULAR_LOGIN)
+        response = self.app.delete(url('gist', gist_id=gist.gist_id))
+        self.checkSessionFlash(response, 'Deleted gist %s' % gist.gist_id)
+
+    def test_delete_normal_user_not_his_own_gist(self):
+        self.log_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS)
+        gist = _create_gist('delete-me')
+        response = self.app.delete(url('gist', gist_id=gist.gist_id), status=403)
+
+    def test_show(self):
+        gist = _create_gist('gist-show-me')
+        response = self.app.get(url('gist', gist_id=gist.gist_access_id))
+        response.mustcontain('added file: gist-show-me<')
+        response.mustcontain('test_admin (RhodeCode Admin) - created')
+        response.mustcontain('gist-desc')
+        response.mustcontain('<div class="ui-btn green badge">Public gist</div>')
+
+    def test_show_as_raw(self):
+        gist = _create_gist('gist-show-me', content='GIST CONTENT')
+        response = self.app.get(url('formatted_gist',
+                                    gist_id=gist.gist_access_id, format='raw'))
+        self.assertEqual(response.body, 'GIST CONTENT')
+
+    def test_show_as_raw_individual_file(self):
+        gist = _create_gist('gist-show-me-raw', content='GIST BODY')
+        response = self.app.get(url('formatted_gist_file',
+                                    gist_id=gist.gist_access_id, format='raw',
+                                    revision='tip', f_path='gist-show-me-raw'))
+        self.assertEqual(response.body, 'GIST BODY')
+
+    def test_edit(self):
+        self.skipTest('not implemented')
+        response = self.app.get(url('edit_gist', gist_id=1))
--- a/rhodecode/tests/functional/test_admin_notifications.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_admin_notifications.py	Fri Jun 07 00:31:11 2013 +0200
@@ -3,6 +3,7 @@
 
 from rhodecode.model.user import UserModel
 from rhodecode.model.notification import NotificationModel
+from rhodecode.model.meta import Session
 
 
 class TestNotificationsController(TestController):
@@ -10,8 +11,8 @@
     def tearDown(self):
         for n in Notification.query().all():
             inst = Notification.get(n.notification_id)
-            self.Session().delete(inst)
-        self.Session().commit()
+            Session().delete(inst)
+        Session().commit()
 
     def test_index(self):
         self.log_user()
@@ -29,7 +30,7 @@
         NotificationModel().create(created_by=u1, subject=u'test_notification_1',
                                    body=u'notification_1',
                                    recipients=[cur_user])
-        self.Session().commit()
+        Session().commit()
         response = self.app.get(url('notifications'))
         response.mustcontain(u'test_notification_1')
 
@@ -67,7 +68,7 @@
                                                   subject=u'test',
                                                   body=u'hi there',
                                                   recipients=[cur_user, u1, u2])
-        self.Session().commit()
+        Session().commit()
         u1 = User.get(u1.user_id)
         u2 = User.get(u2.user_id)
 
--- a/rhodecode/tests/functional/test_admin_repos.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_admin_repos.py	Fri Jun 07 00:31:11 2013 +0200
@@ -47,7 +47,7 @@
                                % (repo_name, repo_name))
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -80,7 +80,7 @@
                                u'Created repository <a href="/%s">%s</a>'
                                % (urllib.quote(repo_name), repo_name_unicode))
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name_unicode).one()
 
         self.assertEqual(new_repo.repo_name, repo_name_unicode)
@@ -105,7 +105,7 @@
         gr = ReposGroupModel().create(group_name=group_name,
                                       group_description='test',
                                       owner=TEST_USER_ADMIN_LOGIN)
-        self.Session().commit()
+        Session().commit()
 
         repo_name = 'ingroup'
         repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
@@ -120,7 +120,7 @@
                                'Created repository <a href="/%s">%s</a>'
                                % (repo_name_full, repo_name))
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name_full).one()
 
         self.assertEqual(new_repo.repo_name, repo_name_full)
@@ -136,12 +136,12 @@
             vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name_full))
         except Exception:
             ReposGroupModel().delete(group_name)
-            self.Session().commit()
+            Session().commit()
             self.fail('no repo %s in filesystem' % repo_name)
 
         RepoModel().delete(repo_name_full)
         ReposGroupModel().delete(group_name)
-        self.Session().commit()
+        Session().commit()
 
     def test_create_git(self):
         self.log_user()
@@ -158,7 +158,7 @@
                                % (repo_name, repo_name))
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -194,7 +194,7 @@
                                % (urllib.quote(repo_name), repo_name_unicode))
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name_unicode).one()
 
         self.assertEqual(new_repo.repo_name, repo_name_unicode)
@@ -232,7 +232,7 @@
                                'Created repository <a href="/%s">%s</a>'
                                % (repo_name, repo_name))
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -256,7 +256,7 @@
         response.follow()
 
         #check if repo was deleted from db
-        deleted_repo = self.Session().query(Repository)\
+        deleted_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).scalar()
 
         self.assertEqual(deleted_repo, None)
@@ -279,7 +279,7 @@
                                'Created repository <a href="/%s">%s</a>'
                                % (repo_name, repo_name))
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository)\
+        new_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -303,7 +303,7 @@
         response.follow()
 
         #check if repo was deleted from db
-        deleted_repo = self.Session().query(Repository)\
+        deleted_repo = Session().query(Repository)\
             .filter(Repository.repo_name == repo_name).scalar()
 
         self.assertEqual(deleted_repo, None)
--- a/rhodecode/tests/functional/test_admin_settings.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_admin_settings.py	Fri Jun 07 00:31:11 2013 +0200
@@ -6,6 +6,7 @@
 from rhodecode.lib import helpers as h
 from rhodecode.model.user import UserModel
 from rhodecode.model.scm import ScmModel
+from rhodecode.model.meta import Session
 
 
 class TestAdminSettingsController(TestController):
@@ -135,7 +136,7 @@
         uname = 'testme'
         usr = UserModel().create_or_update(username=uname, password='qweqwe',
                                            email='testme@rhodecod.org')
-        self.Session().commit()
+        Session().commit()
         params = usr.get_api_data()
         user_id = usr.user_id
         self.log_user(username=uname, password='qweqwe')
@@ -251,7 +252,7 @@
         repo2 = Repository.get_by_repo_name(GIT_REPO)
         self.checkSessionFlash(response,
         'Marked repo %s as fork of %s' % (repo.repo_name, "Nothing"))
-        assert repo.fork == None
+        assert repo.fork is None
 
     def test_set_fork_of_same_repo(self):
         self.log_user()
--- a/rhodecode/tests/functional/test_admin_users.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_admin_users.py	Fri Jun 07 00:31:11 2013 +0200
@@ -39,7 +39,7 @@
 
         self.checkSessionFlash(response, '''Created user %s''' % (username))
 
-        new_user = self.Session.query(User).\
+        new_user = Session().query(User).\
             filter(User.username == username).one()
 
         self.assertEqual(new_user.username, username)
@@ -74,7 +74,7 @@
         response.mustcontain("""<span class="error-message">An email address must contain a single @</span>""")
 
         def get_user():
-            self.Session.query(User).filter(User.username == username).one()
+            Session().query(User).filter(User.username == username).one()
 
         self.assertRaises(NoResultFound, get_user), 'found user in database'
 
@@ -100,7 +100,7 @@
         uname = 'testme'
         usr = UserModel().create_or_update(username=uname, password='qweqwe',
                                            email='testme@rhodecod.org')
-        self.Session().commit()
+        Session().commit()
         params = usr.get_api_data()
         params.update({name: expected})
         params.update({'password_confirmation': ''})
@@ -146,7 +146,7 @@
 
         response = response.follow()
 
-        new_user = self.Session.query(User)\
+        new_user = Session().query(User)\
             .filter(User.username == username).one()
         response = self.app.delete(url('user', id=new_user.user_id))
 
--- a/rhodecode/tests/functional/test_admin_users_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_admin_users_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,6 @@
 from rhodecode.tests import *
 from rhodecode.model.db import UserGroup, UserGroupToPerm, Permission
+from rhodecode.model.meta import Session
 
 TEST_USER_GROUP = 'admins_test'
 
@@ -48,13 +49,13 @@
         self.checkSessionFlash(response,
                                'Created user group %s' % users_group_name)
 
-        gr = self.Session.query(UserGroup)\
+        gr = Session().query(UserGroup)\
                            .filter(UserGroup.users_group_name ==
                                    users_group_name).one()
 
         response = self.app.delete(url('users_group', id=gr.users_group_id))
 
-        gr = self.Session.query(UserGroup)\
+        gr = Session().query(UserGroup)\
                            .filter(UserGroup.users_group_name ==
                                    users_group_name).scalar()
 
@@ -78,16 +79,18 @@
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
         p = Permission.get_by_key('hg.create.repository')
-        p2 = Permission.get_by_key('hg.fork.none')
+        p2 = Permission.get_by_key('hg.usergroup.create.false')
+        p3 = Permission.get_by_key('hg.fork.none')
         # check if user has this perms, they should be here since
         # defaults are on
         perms = UserGroupToPerm.query()\
             .filter(UserGroupToPerm.users_group == ug).all()
 
         self.assertEqual(
-            [[x.users_group_id, x.permission_id, ] for x in perms],
-            [[ug.users_group_id, p.permission_id],
-             [ug.users_group_id, p2.permission_id]]
+            sorted([[x.users_group_id, x.permission_id, ] for x in perms]),
+            sorted([[ug.users_group_id, p.permission_id],
+                    [ug.users_group_id, p2.permission_id],
+                    [ug.users_group_id, p3.permission_id]])
         )
 
         ## DISABLE REPO CREATE ON A GROUP
@@ -97,7 +100,9 @@
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
         p = Permission.get_by_key('hg.create.none')
-        p2 = Permission.get_by_key('hg.fork.none')
+        p2 = Permission.get_by_key('hg.usergroup.create.false')
+        p3 = Permission.get_by_key('hg.fork.none')
+
         # check if user has this perms, they should be here since
         # defaults are on
         perms = UserGroupToPerm.query()\
@@ -106,7 +111,8 @@
         self.assertEqual(
             sorted([[x.users_group_id, x.permission_id, ] for x in perms]),
             sorted([[ug.users_group_id, p.permission_id],
-             [ug.users_group_id, p2.permission_id]])
+                    [ug.users_group_id, p2.permission_id],
+                    [ug.users_group_id, p3.permission_id]])
         )
 
         # DELETE !
@@ -114,7 +120,7 @@
         ugid = ug.users_group_id
         response = self.app.delete(url('users_group', id=ug.users_group_id))
         response = response.follow()
-        gr = self.Session.query(UserGroup)\
+        gr = Session().query(UserGroup)\
                            .filter(UserGroup.users_group_name ==
                                    users_group_name).scalar()
 
@@ -147,16 +153,18 @@
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
         p = Permission.get_by_key('hg.create.none')
-        p2 = Permission.get_by_key('hg.fork.repository')
+        p2 = Permission.get_by_key('hg.usergroup.create.false')
+        p3 = Permission.get_by_key('hg.fork.repository')
         # check if user has this perms, they should be here since
         # defaults are on
         perms = UserGroupToPerm.query()\
             .filter(UserGroupToPerm.users_group == ug).all()
 
         self.assertEqual(
-            [[x.users_group_id, x.permission_id, ] for x in perms],
-            [[ug.users_group_id, p.permission_id],
-             [ug.users_group_id, p2.permission_id]]
+            sorted([[x.users_group_id, x.permission_id, ] for x in perms]),
+            sorted([[ug.users_group_id, p.permission_id],
+                    [ug.users_group_id, p2.permission_id],
+                    [ug.users_group_id, p3.permission_id]])
         )
 
         ## DISABLE REPO CREATE ON A GROUP
@@ -166,16 +174,18 @@
         response.follow()
         ug = UserGroup.get_by_group_name(users_group_name)
         p = Permission.get_by_key('hg.create.none')
-        p2 = Permission.get_by_key('hg.fork.none')
+        p2 = Permission.get_by_key('hg.usergroup.create.false')
+        p3 = Permission.get_by_key('hg.fork.none')
         # check if user has this perms, they should be here since
         # defaults are on
         perms = UserGroupToPerm.query()\
             .filter(UserGroupToPerm.users_group == ug).all()
 
         self.assertEqual(
-            [[x.users_group_id, x.permission_id, ] for x in perms],
-            [[ug.users_group_id, p.permission_id],
-             [ug.users_group_id, p2.permission_id]]
+            sorted([[x.users_group_id, x.permission_id, ] for x in perms]),
+            sorted([[ug.users_group_id, p.permission_id],
+                    [ug.users_group_id, p2.permission_id],
+                    [ug.users_group_id, p3.permission_id]])
         )
 
         # DELETE !
@@ -183,7 +193,7 @@
         ugid = ug.users_group_id
         response = self.app.delete(url('users_group', id=ug.users_group_id))
         response = response.follow()
-        gr = self.Session.query(UserGroup)\
+        gr = Session().query(UserGroup)\
                            .filter(UserGroup.users_group_name ==
                                    users_group_name).scalar()
 
--- a/rhodecode/tests/functional/test_branches.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_branches.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,11 +1,20 @@
 from rhodecode.tests import *
 
+
 class TestBranchesController(TestController):
 
-    def test_index(self):
+    def test_index_hg(self):
         self.log_user()
         response = self.app.get(url(controller='branches',
                                     action='index', repo_name=HG_REPO))
-        response.mustcontain("""<a href="/%s/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/">default</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/97e8b885c04894463c51898e14387d80c30ed1ee/">git</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/2e6a2bf9356ca56df08807f4ad86d480da72a8f4/">web</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/">default</a>""" % HG_REPO)
+
+        # closed branches
+        response.mustcontain("""<a href="/%s/changeset/95ca6417ec0de6ac3bd19b336d7b608f27b88711">git [closed]</a><""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/changeset/0dd5fd7b37a4eea4dd9b662af63cee743b4ccce2">web [closed]</a>""" % HG_REPO)
+
+    def test_index_git(self):
+        self.log_user()
+        response = self.app.get(url(controller='branches',
+                                    action='index', repo_name=GIT_REPO))
+        response.mustcontain("""<a href="/%s/files/5f2c6ee195929b0be80749243c18121c9864a3b3/">master</a>""" % GIT_REPO)
--- a/rhodecode/tests/functional/test_changelog.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_changelog.py	Fri Jun 07 00:31:11 2013 +0200
@@ -11,23 +11,15 @@
         response.mustcontain('''id="chg_20" class="container tablerow1"''')
         response.mustcontain(
             """<input class="changeset_range" """
-            """id="5e204e7583b9c8e7b93a020bd036564b1e731dae" """
-            """name="5e204e7583b9c8e7b93a020bd036564b1e731dae" """
+            """id="7b22a518347bb9bc19679f6af07cd0a61bfe16e7" """
+            """name="7b22a518347bb9bc19679f6af07cd0a61bfe16e7" """
             """type="checkbox" value="1" />"""
         )
-
+        #rev 640: code garden
         response.mustcontain(
-            """<span class="changeset_hash">r154:5e204e7583b9</span>"""
+            """<span class="changeset_hash">r640:0a4e54a44604</span>"""
         )
-
-        response.mustcontain("""Small update at simplevcs app""")
-
-#        response.mustcontain(
-#            """<div id="changed_total_5e204e7583b9c8e7b93a020bd036564b1e731dae" """
-#            """style="float:right;" class="changed_total tooltip" """
-#            """title="Affected number of files, click to show """
-#            """more details">3</div>"""
-#        )
+        response.mustcontain("""code garden""")
 
     def test_index_pagination_hg(self):
         self.log_user()
@@ -48,29 +40,15 @@
         # Test response after pagination...
         response.mustcontain(
             """<input class="changeset_range" """
-            """id="46ad32a4f974e45472a898c6b0acb600320579b1" """
-            """name="46ad32a4f974e45472a898c6b0acb600320579b1" """
+            """id="22baf968d547386b9516965ce89d189665003a31" """
+            """name="22baf968d547386b9516965ce89d189665003a31" """
             """type="checkbox" value="1" />"""
         )
 
         response.mustcontain(
-            """<span class="changeset_hash">r64:46ad32a4f974</span>"""
+            """<span class="changeset_hash">r539:22baf968d547</span>"""
         )
 
-#        response.mustcontain(
-#            """<div id="changed_total_46ad32a4f974e45472a898c6b0acb600320579b1" """
-#            """style="float:right;" class="changed_total tooltip" """
-#            """title="Affected number of files, click to show """
-#            """more details">21</div>"""
-#        )
-#
-#        response.mustcontain(
-#            """<a href="/%s/changeset/"""
-#            """46ad32a4f974e45472a898c6b0acb600320579b1" """
-#            """title="Merge with 2e6a2bf9356ca56df08807f4ad86d480da72a8f4">"""
-#            """46ad32a4f974</a>""" % HG_REPO
-#        )
-
     def test_index_git(self):
         self.log_user()
         response = self.app.get(url(controller='changelog', action='index',
@@ -124,3 +102,52 @@
         response.mustcontain(
             """<span class="changeset_hash">r515:636ed213f2f1</span>"""
         )
+
+    def test_index_hg_with_filenode(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/vcs/exceptions.py',
+                                    repo_name=HG_REPO))
+        #history commits messages
+        response.mustcontain('Added exceptions module, this time for real')
+        response.mustcontain('Added not implemented hg backend test case')
+        response.mustcontain('Added BaseChangeset class')
+        # Test response...
+
+    def test_index_git_with_filenode(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/vcs/exceptions.py',
+                                    repo_name=GIT_REPO))
+        #history commits messages
+        response.mustcontain('Added exceptions module, this time for real')
+        response.mustcontain('Added not implemented hg backend test case')
+        response.mustcontain('Added BaseChangeset class')
+
+    def test_index_hg_with_filenode_that_is_dirnode(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/tests',
+                                    repo_name=HG_REPO))
+        self.assertEqual(response.status, '302 Found')
+
+    def test_index_git_with_filenode_that_is_dirnode(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/tests',
+                                    repo_name=GIT_REPO))
+        self.assertEqual(response.status, '302 Found')
+
+    def test_index_hg_with_filenode_not_existing(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/wrong_path',
+                                    repo_name=HG_REPO))
+        self.assertEqual(response.status, '302 Found')
+
+    def test_index_git_with_filenode_not_existing(self):
+        self.log_user()
+        response = self.app.get(url(controller='changelog', action='index',
+                                    revision='tip', f_path='/wrong_path',
+                                    repo_name=GIT_REPO))
+        self.assertEqual(response.status, '302 Found')
--- a/rhodecode/tests/functional/test_changeset_comments.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_changeset_comments.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,27 +1,28 @@
 from rhodecode.tests import *
 from rhodecode.model.db import ChangesetComment, Notification, User, \
     UserNotification
+from rhodecode.model.meta import Session
 
 
 class TestChangeSetCommentsController(TestController):
 
     def setUp(self):
         for x in ChangesetComment.query().all():
-            self.Session.delete(x)
-        self.Session.commit()
+            Session().delete(x)
+        Session().commit()
 
         for x in Notification.query().all():
-            self.Session.delete(x)
-        self.Session.commit()
+            Session().delete(x)
+        Session().commit()
 
     def tearDown(self):
         for x in ChangesetComment.query().all():
-            self.Session.delete(x)
-        self.Session.commit()
+            Session().delete(x)
+        Session().commit()
 
         for x in Notification.query().all():
-            self.Session.delete(x)
-        self.Session.commit()
+            Session().delete(x)
+        Session().commit()
 
     def test_create(self):
         self.log_user()
--- a/rhodecode/tests/functional/test_compare.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_compare.py	Fri Jun 07 00:31:11 2013 +0200
@@ -16,13 +16,17 @@
         _cs = EmptyChangeset(alias=vcs_type)
 
     if newfile:
-        cs = ScmModel().create_node(
-            repo=repo.scm_instance, repo_name=repo.repo_name,
-            cs=_cs, user=TEST_USER_ADMIN_LOGIN,
+        nodes = {
+            filename: {
+                'content': content
+            }
+        }
+        cs = ScmModel().create_nodes(
+            user=TEST_USER_ADMIN_LOGIN, repo=repo,
+            message=message,
+            nodes=nodes,
+            parent_cs=_cs,
             author=TEST_USER_ADMIN_LOGIN,
-            message=message,
-            content=content,
-            f_path=filename
         )
     else:
         cs = ScmModel().commit_change(
@@ -317,15 +321,9 @@
         self.r1_id = repo1.repo_id
         r1_name = repo1.repo_name
 
-        #commit something initially !
-        cs0 = ScmModel().create_node(
-            repo=repo1.scm_instance, repo_name=r1_name,
-            cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
-            author=TEST_USER_ADMIN_LOGIN,
-            message='commit1',
-            content='line1',
-            f_path='file1'
-        )
+        cs0 = _commit_change(repo=r1_name, filename='file1',
+                       content='line1', message='commit1', vcs_type='hg',
+                       newfile=True)
         Session().commit()
         self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id])
         #fork the repo1
@@ -339,32 +337,20 @@
         self.r2_id = repo2.repo_id
         r2_name = repo2.repo_name
 
-        #make 3 new commits in fork
-        cs1 = ScmModel().create_node(
-            repo=repo2.scm_instance, repo_name=r2_name,
-            cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN,
-            author=TEST_USER_ADMIN_LOGIN,
-            message='commit1-fork',
-            content='file1-line1-from-fork',
-            f_path='file1-fork'
-        )
-        cs2 = ScmModel().create_node(
-            repo=repo2.scm_instance, repo_name=r2_name,
-            cs=cs1, user=TEST_USER_ADMIN_LOGIN,
-            author=TEST_USER_ADMIN_LOGIN,
-            message='commit2-fork',
-            content='file2-line1-from-fork',
-            f_path='file2-fork'
-        )
-        cs3 = ScmModel().create_node(
-            repo=repo2.scm_instance, repo_name=r2_name,
-            cs=cs2, user=TEST_USER_ADMIN_LOGIN,
-            author=TEST_USER_ADMIN_LOGIN,
-            message='commit3-fork',
-            content='file3-line1-from-fork',
-            f_path='file3-fork'
-        )
+
+        cs1 = _commit_change(repo=r2_name, filename='file1-fork',
+                       content='file1-line1-from-fork', message='commit1-fork',
+                       vcs_type='hg', parent=repo2.scm_instance[-1],
+                       newfile=True)
 
+        cs2 = _commit_change(repo=r2_name, filename='file2-fork',
+                       content='file2-line1-from-fork', message='commit2-fork',
+                       vcs_type='hg', parent=cs1,
+                       newfile=True)
+
+        cs3 = _commit_change(repo=r2_name, filename='file3-fork',
+                       content='file3-line1-from-fork', message='commit3-fork',
+                       vcs_type='hg', parent=cs2, newfile=True)
         #compare !
         rev1 = 'default'
         rev2 = 'default'
@@ -383,14 +369,18 @@
         response.mustcontain('No changesets')
 
         #add new commit into parent !
-        cs0 = ScmModel().create_node(
-            repo=repo1.scm_instance, repo_name=r1_name,
-            cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
-            author=TEST_USER_ADMIN_LOGIN,
-            message='commit2-parent',
-            content='line1-added-after-fork',
-            f_path='file2'
-        )
+#         cs0 = ScmModel().create_node(
+#             repo=repo1.scm_instance, repo_name=r1_name,
+#             cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
+#             author=TEST_USER_ADMIN_LOGIN,
+#             message='commit2-parent',
+#             content='line1-added-after-fork',
+#             f_path='file2'
+#         )
+        cs0 = _commit_change(repo=r1_name, filename='file2',
+                    content='line1-added-after-fork', message='commit2-parent',
+                    vcs_type='hg', parent=None, newfile=True)
+
         #compare !
         rev1 = 'default'
         rev2 = 'default'
--- a/rhodecode/tests/functional/test_compare_local.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_compare_local.py	Fri Jun 07 00:31:11 2013 +0200
@@ -10,16 +10,17 @@
 
     def test_compare_tag_hg(self):
         self.log_user()
-        tag1 = '0.1.2'
-        tag2 = '0.1.3'
+        tag1 = 'v0.1.2'
+        tag2 = 'v0.1.3'
         response = self.app.get(url(controller='compare', action='index',
                                     repo_name=HG_REPO,
                                     org_ref_type="tag",
                                     org_ref=tag1,
                                     other_ref_type="tag",
                                     other_ref=tag2,
-                                    ))
+                                    ), status=200)
         response.mustcontain('%s@%s -&gt; %s@%s' % (HG_REPO, tag1, HG_REPO, tag2))
+
         ## outgoing changesets between tags
         response.mustcontain('''<a href="/%s/changeset/c5ddebc06eaaba3010c2d66ea6ec9d074eb0f678">r112:c5ddebc06eaa</a>''' % HG_REPO)
         response.mustcontain('''<a href="/%s/changeset/70d4cef8a37657ee4cf5aabb3bd9f68879769816">r115:70d4cef8a376</a>''' % HG_REPO)
@@ -54,7 +55,7 @@
                                     org_ref=tag1,
                                     other_ref_type="tag",
                                     other_ref=tag2,
-                                    ))
+                                    ), status=200)
         response.mustcontain('%s@%s -&gt; %s@%s' % (GIT_REPO, tag1, GIT_REPO, tag2))
 
         ## outgoing changesets between tags
--- a/rhodecode/tests/functional/test_files.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_files.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,6 +1,10 @@
+import os
 from rhodecode.tests import *
 from rhodecode.model.db import Repository
 from rhodecode.model.meta import Session
+from rhodecode.tests.fixture import Fixture
+
+fixture = Fixture()
 
 ARCHIVE_SPECS = {
     '.tar.bz2': ('application/x-bzip2', 'tbz2', ''),
@@ -25,11 +29,19 @@
                                     revision='tip',
                                     f_path='/'))
         # Test response...
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/docs">docs</a>')
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/tests">tests</a>')
-        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/vcs">vcs</a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/.hgignore">.hgignore</a>')
-        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/MANIFEST.in">MANIFEST.in</a>')
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/docs">docs</a>')
+        response.mustcontain('<a class="browser-dir ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/vcs">vcs</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.gitignore">.gitignore</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgignore">.hgignore</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.hgtags">.hgtags</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/.travis.yml">.travis.yml</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/MANIFEST.in">MANIFEST.in</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/README.rst">README.rst</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/run_test_and_report.sh">run_test_and_report.sh</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.cfg">setup.cfg</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/setup.py">setup.py</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/test_and_report.sh">test_and_report.sh</a>')
+        response.mustcontain('<a class="browser-file ypjax-link" href="/vcs_test_hg/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/tox.ini">tox.ini</a>')
 
     def test_index_revision(self):
         self.log_user()
@@ -79,7 +91,7 @@
         self.log_user()
         response = self.app.get(url(controller='files', action='index',
                                     repo_name=HG_REPO,
-                                    revision='27cd5cce30c96924232dffcd24178a07ffeb5dfc',
+                                    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.
@@ -100,7 +112,41 @@
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'},)
         #test or history
         response.mustcontain("""<optgroup label="Changesets">
-<option selected="selected" value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
+<option value="dbec37a0d5cab8ff39af4cfc4a4cd3996e4acfc6">r648:dbec37a0d5ca (default)</option>
+<option value="1d20ed9eda9482d46ff0a6af5812550218b3ff15">r639:1d20ed9eda94 (default)</option>
+<option value="0173395e822797f098799ed95c1a81b6a547a9ad">r547:0173395e8227 (default)</option>
+<option value="afbb45ade933a8182f1d8ec5d4d1bb2de2572043">r546:afbb45ade933 (default)</option>
+<option value="6f093e30cac34e6b4b11275a9f22f80c5d7ad1f7">r502:6f093e30cac3 (default)</option>
+<option value="c7e2212dd2ae975d1d06534a3d7e317165c06960">r476:c7e2212dd2ae (default)</option>
+<option value="45477506df79f701bf69419aac3e1f0fed3c5bcf">r472:45477506df79 (default)</option>
+<option value="5fc76cb25d11e07c60de040f78b8cd265ff10d53">r469:5fc76cb25d11 (default)</option>
+<option value="b073433cf8994969ee5cd7cce84cbe587bb880b2">r468:b073433cf899 (default)</option>
+<option value="7a74dbfcacd1dbcb58bb9c860b2f29fbb22c4c96">r467:7a74dbfcacd1 (default)</option>
+<option value="71ee52cc4d629096bdbee036325975dac2af4501">r465:71ee52cc4d62 (default)</option>
+<option value="a5b217d26c5f111e72bae4de672b084ee0fbf75c">r452:a5b217d26c5f (default)</option>
+<option value="47aedd538bf616eedcb0e7d630ea476df0e159c7">r450:47aedd538bf6 (default)</option>
+<option value="8e4915fa32d727dcbf09746f637a5f82e539511e">r432:8e4915fa32d7 (default)</option>
+<option value="25213a5fbb048dff8ba65d21e466a835536e5b70">r356:25213a5fbb04 (default)</option>
+<option value="23debcedddc1c23c14be33e713e7786d4a9de471">r351:23debcedddc1 (default)</option>
+<option value="61e25b2a90a19e7fffd75dea1e4c7e20df526bbe">r342:61e25b2a90a1 (default)</option>
+<option value="fb95b340e0d03fa51f33c56c991c08077c99303e">r318:fb95b340e0d0 (webvcs)</option>
+<option value="bda35e0e564fbbc5cd26fe0a37fb647a254c99fe">r303:bda35e0e564f (default)</option>
+<option value="97ff74896d7dbf3115a337a421d44b55154acc89">r302:97ff74896d7d (default)</option>
+<option value="cec3473c3fdb9599c98067182a075b49bde570f9">r293:cec3473c3fdb (default)</option>
+<option value="0e86c43eef866a013a587666a877c879899599bb">r289:0e86c43eef86 (default)</option>
+<option value="91a27c312808100cf20a602f78befbbff9d89bfd">r288:91a27c312808 (default)</option>
+<option value="400e36a1670a57d11e3edcb5b07bf82c30006d0b">r287:400e36a1670a (default)</option>
+<option value="014fb17dfc95b0995e838c565376bf9a993e230a">r261:014fb17dfc95 (default)</option>
+<option value="cca7aebbc4d6125798446b11e69dc8847834a982">r260:cca7aebbc4d6 (default)</option>
+<option value="14cdb2957c011a5feba36f50d960d9832ba0f0c1">r258:14cdb2957c01 (workdir)</option>
+<option value="34df20118ed74b5987d22a579e8a60e903da5bf8">r245:34df20118ed7 (default)</option>
+<option value="0375d9042a64a1ac1641528f0f0668f9a339e86d">r233:0375d9042a64 (workdir)</option>
+<option value="94aa45fc1806c04d4ba640933edf682c22478453">r222:94aa45fc1806 (workdir)</option>
+<option value="7ed99bc738818879941e3ce20243f8856a7cfc84">r188:7ed99bc73881 (default)</option>
+<option value="1e85975528bcebe853732a9e5fb8dbf4461f6bb2">r184:1e85975528bc (default)</option>
+<option value="ed30beddde7bbddb26042625be19bcd11576c1dd">r183:ed30beddde7b (default)</option>
+<option value="a6664e18181c6fc81b751a8d01474e7e1a3fe7fc">r177:a6664e18181c (default)</option>
+<option value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
 <option value="aa957ed78c35a1541f508d2ec90e501b0a9e3167">r165:aa957ed78c35 (default)</option>
 <option value="48e11b73e94c0db33e736eaeea692f990cb0b5f1">r140:48e11b73e94c (default)</option>
 <option value="adf3cbf483298563b968a6c673cd5bde5f7d5eea">r126:adf3cbf48329 (default)</option>
@@ -135,16 +181,23 @@
 <option value="3803844fdbd3b711175fc3da9bdacfcd6d29a6fb">r7:3803844fdbd3 (default)</option>
 </optgroup>
 <optgroup label="Branches">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
-<option value="97e8b885c04894463c51898e14387d80c30ed1ee">git</option>
-<option value="2e6a2bf9356ca56df08807f4ad86d480da72a8f4">web</option>
+<option value="96507bd11ecc815ebc6270fdf6db110928c09c1e">default</option>
+<option value="4f7e2131323e0749a740c0a56ab68ae9269c562a">stable</option>
 </optgroup>
 <optgroup label="Tags">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
-<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">0.1.4</option>
-<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">0.1.3</option>
-<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">0.1.2</option>
-<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">0.1.1</option>
+<option value="2c96c02def9a7c997f33047761a53943e6254396">v0.2.0</option>
+<option value="8680b1d1cee3aa3c1ab3734b76ee164bbedbc5c9">v0.1.9</option>
+<option value="ecb25ba9c96faf1e65a0bc3fd914918420a2f116">v0.1.8</option>
+<option value="f67633a2894edaf28513706d558205fa93df9209">v0.1.7</option>
+<option value="02b38c0eb6f982174750c0e309ff9faddc0c7e12">v0.1.6</option>
+<option value="a6664e18181c6fc81b751a8d01474e7e1a3fe7fc">v0.1.5</option>
+<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">v0.1.4</option>
+<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">v0.1.3</option>
+<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">v0.1.2</option>
+<option value="fef5bfe1dc17611d5fb59a7f6f95c55c3606f933">v0.1.11</option>
+<option value="92831aebf2f8dd4879e897024b89d09af214df1c">v0.1.10</option>
+<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">v0.1.1</option>
+<option value="96507bd11ecc815ebc6270fdf6db110928c09c1e">tip</option>
 </optgroup>
 """)
 
@@ -167,8 +220,42 @@
                                     annotate=True),
                                 extra_environ={'HTTP_X_PARTIAL_XHR': '1'})
 
-        response.mustcontain("""<optgroup label="Changesets">
-<option selected="selected" value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
+        response.mustcontain("""
+<option value="dbec37a0d5cab8ff39af4cfc4a4cd3996e4acfc6">r648:dbec37a0d5ca (default)</option>
+<option value="1d20ed9eda9482d46ff0a6af5812550218b3ff15">r639:1d20ed9eda94 (default)</option>
+<option value="0173395e822797f098799ed95c1a81b6a547a9ad">r547:0173395e8227 (default)</option>
+<option value="afbb45ade933a8182f1d8ec5d4d1bb2de2572043">r546:afbb45ade933 (default)</option>
+<option value="6f093e30cac34e6b4b11275a9f22f80c5d7ad1f7">r502:6f093e30cac3 (default)</option>
+<option value="c7e2212dd2ae975d1d06534a3d7e317165c06960">r476:c7e2212dd2ae (default)</option>
+<option value="45477506df79f701bf69419aac3e1f0fed3c5bcf">r472:45477506df79 (default)</option>
+<option value="5fc76cb25d11e07c60de040f78b8cd265ff10d53">r469:5fc76cb25d11 (default)</option>
+<option value="b073433cf8994969ee5cd7cce84cbe587bb880b2">r468:b073433cf899 (default)</option>
+<option value="7a74dbfcacd1dbcb58bb9c860b2f29fbb22c4c96">r467:7a74dbfcacd1 (default)</option>
+<option value="71ee52cc4d629096bdbee036325975dac2af4501">r465:71ee52cc4d62 (default)</option>
+<option value="a5b217d26c5f111e72bae4de672b084ee0fbf75c">r452:a5b217d26c5f (default)</option>
+<option value="47aedd538bf616eedcb0e7d630ea476df0e159c7">r450:47aedd538bf6 (default)</option>
+<option value="8e4915fa32d727dcbf09746f637a5f82e539511e">r432:8e4915fa32d7 (default)</option>
+<option value="25213a5fbb048dff8ba65d21e466a835536e5b70">r356:25213a5fbb04 (default)</option>
+<option value="23debcedddc1c23c14be33e713e7786d4a9de471">r351:23debcedddc1 (default)</option>
+<option value="61e25b2a90a19e7fffd75dea1e4c7e20df526bbe">r342:61e25b2a90a1 (default)</option>
+<option value="fb95b340e0d03fa51f33c56c991c08077c99303e">r318:fb95b340e0d0 (webvcs)</option>
+<option value="bda35e0e564fbbc5cd26fe0a37fb647a254c99fe">r303:bda35e0e564f (default)</option>
+<option value="97ff74896d7dbf3115a337a421d44b55154acc89">r302:97ff74896d7d (default)</option>
+<option value="cec3473c3fdb9599c98067182a075b49bde570f9">r293:cec3473c3fdb (default)</option>
+<option value="0e86c43eef866a013a587666a877c879899599bb">r289:0e86c43eef86 (default)</option>
+<option value="91a27c312808100cf20a602f78befbbff9d89bfd">r288:91a27c312808 (default)</option>
+<option value="400e36a1670a57d11e3edcb5b07bf82c30006d0b">r287:400e36a1670a (default)</option>
+<option value="014fb17dfc95b0995e838c565376bf9a993e230a">r261:014fb17dfc95 (default)</option>
+<option value="cca7aebbc4d6125798446b11e69dc8847834a982">r260:cca7aebbc4d6 (default)</option>
+<option value="14cdb2957c011a5feba36f50d960d9832ba0f0c1">r258:14cdb2957c01 (workdir)</option>
+<option value="34df20118ed74b5987d22a579e8a60e903da5bf8">r245:34df20118ed7 (default)</option>
+<option value="0375d9042a64a1ac1641528f0f0668f9a339e86d">r233:0375d9042a64 (workdir)</option>
+<option value="94aa45fc1806c04d4ba640933edf682c22478453">r222:94aa45fc1806 (workdir)</option>
+<option value="7ed99bc738818879941e3ce20243f8856a7cfc84">r188:7ed99bc73881 (default)</option>
+<option value="1e85975528bcebe853732a9e5fb8dbf4461f6bb2">r184:1e85975528bc (default)</option>
+<option value="ed30beddde7bbddb26042625be19bcd11576c1dd">r183:ed30beddde7b (default)</option>
+<option value="a6664e18181c6fc81b751a8d01474e7e1a3fe7fc">r177:a6664e18181c (default)</option>
+<option value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
 <option value="aa957ed78c35a1541f508d2ec90e501b0a9e3167">r165:aa957ed78c35 (default)</option>
 <option value="48e11b73e94c0db33e736eaeea692f990cb0b5f1">r140:48e11b73e94c (default)</option>
 <option value="adf3cbf483298563b968a6c673cd5bde5f7d5eea">r126:adf3cbf48329 (default)</option>
@@ -203,16 +290,23 @@
 <option value="3803844fdbd3b711175fc3da9bdacfcd6d29a6fb">r7:3803844fdbd3 (default)</option>
 </optgroup>
 <optgroup label="Branches">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
-<option value="97e8b885c04894463c51898e14387d80c30ed1ee">git</option>
-<option value="2e6a2bf9356ca56df08807f4ad86d480da72a8f4">web</option>
+<option value="96507bd11ecc815ebc6270fdf6db110928c09c1e">default</option>
+<option value="4f7e2131323e0749a740c0a56ab68ae9269c562a">stable</option>
 </optgroup>
 <optgroup label="Tags">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
-<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">0.1.4</option>
-<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">0.1.3</option>
-<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">0.1.2</option>
-<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">0.1.1</option>
+<option value="2c96c02def9a7c997f33047761a53943e6254396">v0.2.0</option>
+<option value="8680b1d1cee3aa3c1ab3734b76ee164bbedbc5c9">v0.1.9</option>
+<option value="ecb25ba9c96faf1e65a0bc3fd914918420a2f116">v0.1.8</option>
+<option value="f67633a2894edaf28513706d558205fa93df9209">v0.1.7</option>
+<option value="02b38c0eb6f982174750c0e309ff9faddc0c7e12">v0.1.6</option>
+<option value="a6664e18181c6fc81b751a8d01474e7e1a3fe7fc">v0.1.5</option>
+<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">v0.1.4</option>
+<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">v0.1.3</option>
+<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">v0.1.2</option>
+<option value="fef5bfe1dc17611d5fb59a7f6f95c55c3606f933">v0.1.11</option>
+<option value="92831aebf2f8dd4879e897024b89d09af214df1c">v0.1.10</option>
+<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">v0.1.1</option>
+<option value="96507bd11ecc815ebc6270fdf6db110928c09c1e">tip</option>
 </optgroup>""")
 
     def test_file_annotation_git(self):
@@ -352,26 +446,289 @@
         )
         response.mustcontain("vcs/web/simplevcs/views/repository.py")
 
+    #HG - ADD FILE
     def test_add_file_view_hg(self):
         self.log_user()
         response = self.app.get(url('files_add_home',
                                       repo_name=HG_REPO,
                                       revision='tip', f_path='/'))
 
+    def test_add_file_into_hg_missing_content(self):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=HG_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': ''
+                                 },
+                                 status=302)
+
+        self.checkSessionFlash(response, 'No content')
+
+    def test_add_file_into_hg_missing_filename(self):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=HG_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo"
+                                 },
+                                 status=302)
+
+        self.checkSessionFlash(response, 'No filename')
+
+    @parameterized.expand([
+        ('/abs', 'foo'),
+        ('../rel', 'foo'),
+        ('file/../foo', 'foo'),
+    ])
+    def test_add_file_into_hg_bad_filenames(self, location, filename):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=HG_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+
+        self.checkSessionFlash(response, 'Location must be relative path and must not contain .. in path')
+
+    @parameterized.expand([
+        (1, '', 'foo.txt'),
+        (2, 'dir', 'foo.rst'),
+        (3, 'rel/dir', 'foo.bar'),
+    ])
+    def test_add_file_into_hg(self, cnt, location, filename):
+        self.log_user()
+        repo = fixture.create_repo('commit-test-%s' % cnt, repo_type='hg')
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+        finally:
+            fixture.destroy_repo(repo.repo_name)
+
+    ##GIT - ADD FILE
     def test_add_file_view_git(self):
         self.log_user()
         response = self.app.get(url('files_add_home',
                                       repo_name=GIT_REPO,
                                       revision='tip', f_path='/'))
 
+    def test_add_file_into_git_missing_content(self):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=GIT_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                     'content': ''
+                                 },
+                                 status=302)
+        self.checkSessionFlash(response, 'No content')
+
+    def test_add_file_into_git_missing_filename(self):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=GIT_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo"
+                                 },
+                                 status=302)
+
+        self.checkSessionFlash(response, 'No filename')
+
+    @parameterized.expand([
+        ('/abs', 'foo'),
+        ('../rel', 'foo'),
+        ('file/../foo', 'foo'),
+    ])
+    def test_add_file_into_git_bad_filenames(self, location, filename):
+        self.log_user()
+        response = self.app.post(url('files_add_home',
+                                      repo_name=GIT_REPO,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+
+        self.checkSessionFlash(response, 'Location must be relative path and must not contain .. in path')
+
+    @parameterized.expand([
+        (1, '', 'foo.txt'),
+        (2, 'dir', 'foo.rst'),
+        (3, 'rel/dir', 'foo.bar'),
+    ])
+    def test_add_file_into_git(self, cnt, location, filename):
+        self.log_user()
+        repo = fixture.create_repo('commit-test-%s' % cnt, repo_type='git')
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "foo",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+        finally:
+            fixture.destroy_repo(repo.repo_name)
+
+    #HG - EDIT
     def test_edit_file_view_hg(self):
         self.log_user()
         response = self.app.get(url('files_edit_home',
                                       repo_name=HG_REPO,
                                       revision='tip', f_path='vcs/nodes.py'))
 
+    def test_edit_file_view_not_on_branch_hg(self):
+        self.log_user()
+        repo = fixture.create_repo('test-edit-repo', repo_type='hg')
+
+        ## add file
+        location = 'vcs'
+        filename = 'nodes.py'
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "def py():\n print 'hello'\n",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        response.follow()
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+            response = self.app.get(url('files_edit_home',
+                                          repo_name=repo.repo_name,
+                                          revision='tip', f_path='vcs/nodes.py'),
+                                    status=302)
+            self.checkSessionFlash(response,
+                'You can only edit files with revision being a valid branch')
+        finally:
+            fixture.destroy_repo(repo.repo_name)
+
+    def test_edit_file_view_commit_changes_hg(self):
+        self.log_user()
+        repo = fixture.create_repo('test-edit-repo', repo_type='hg')
+
+        ## add file
+        location = 'vcs'
+        filename = 'nodes.py'
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip',
+                                      f_path='/'),
+                                 params={
+                                    'content': "def py():\n print 'hello'\n",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        response.follow()
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+            response = self.app.post(url('files_edit_home',
+                                          repo_name=repo.repo_name,
+                                          revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
+                                          f_path='vcs/nodes.py'),
+                                     params={
+                                        'content': "def py():\n print 'hello world'\n",
+                                        'message': 'i commited',
+                                     },
+                                    status=302)
+            self.checkSessionFlash(response,
+                                   'Successfully committed to vcs/nodes.py')
+        finally:
+            fixture.destroy_repo(repo.repo_name)
+
+    #GIT - EDIT
     def test_edit_file_view_git(self):
         self.log_user()
         response = self.app.get(url('files_edit_home',
                                       repo_name=GIT_REPO,
                                       revision='tip', f_path='vcs/nodes.py'))
+
+    def test_edit_file_view_not_on_branch_git(self):
+        self.log_user()
+        repo = fixture.create_repo('test-edit-repo', repo_type='git')
+
+        ## add file
+        location = 'vcs'
+        filename = 'nodes.py'
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip', f_path='/'),
+                                 params={
+                                    'content': "def py():\n print 'hello'\n",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        response.follow()
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+            response = self.app.get(url('files_edit_home',
+                                          repo_name=repo.repo_name,
+                                          revision='tip', f_path='vcs/nodes.py'),
+                                    status=302)
+            self.checkSessionFlash(response,
+                'You can only edit files with revision being a valid branch')
+        finally:
+            fixture.destroy_repo(repo.repo_name)
+
+    def test_edit_file_view_commit_changes_git(self):
+        self.log_user()
+        repo = fixture.create_repo('test-edit-repo', repo_type='git')
+
+        ## add file
+        location = 'vcs'
+        filename = 'nodes.py'
+        response = self.app.post(url('files_add_home',
+                                      repo_name=repo.repo_name,
+                                      revision='tip',
+                                      f_path='/'),
+                                 params={
+                                    'content': "def py():\n print 'hello'\n",
+                                    'filename': filename,
+                                    'location': location
+                                 },
+                                 status=302)
+        response.follow()
+        try:
+            self.checkSessionFlash(response, 'Successfully committed to %s'
+                                   % os.path.join(location, filename))
+            response = self.app.post(url('files_edit_home',
+                                          repo_name=repo.repo_name,
+                                          revision=repo.scm_instance.DEFAULT_BRANCH_NAME,
+                                          f_path='vcs/nodes.py'),
+                                     params={
+                                        'content': "def py():\n print 'hello world'\n",
+                                        'message': 'i commited',
+                                     },
+                                    status=302)
+            self.checkSessionFlash(response,
+                                   'Successfully committed to vcs/nodes.py')
+        finally:
+            fixture.destroy_repo(repo.repo_name)
--- a/rhodecode/tests/functional/test_home.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_home.py	Fri Jun 07 00:31:11 2013 +0200
@@ -17,23 +17,26 @@
         response = self.app.get(url(controller='home', action='index'))
         #if global permission is set
         response.mustcontain('Add repository')
-        response.mustcontain('href="/%s"' % HG_REPO)
+        # html in javascript variable:
+        response.mustcontain("""var data = {"totalRecords": %s"""
+                             % len(Repository.getAll()))
+        response.mustcontain(r'href=\"/%s\"' % HG_REPO)
 
-        response.mustcontain("""<img class="icon" title="Mercurial repository" """
-                        """alt="Mercurial repository" src="/images/icons/hg"""
-                        """icon.png"/>""")
-        response.mustcontain("""<img class="icon" title="Public repository" """
-                        """alt="Public repository" src="/images/icons/lock_"""
-                        """open.png"/>""")
+        response.mustcontain(r"""<img class=\"icon\" title=\"Mercurial repository\" """
+                        r"""alt=\"Mercurial repository\" src=\"/images/icons/hg"""
+                        r"""icon.png\"/>""")
+        response.mustcontain(r"""<img class=\"icon\" title=\"Public repository\" """
+                        r"""alt=\"Public repository\" src=\"/images/icons/lock_"""
+                        r"""open.png\"/>""")
 
-        response.mustcontain(
-"""<a title="Marcin Kuzminski &amp;lt;marcin@python-works.com&amp;gt;:\n
-merge" class="tooltip" href="/vcs_test_hg/changeset/27cd5cce30c96924232"""
-"""dffcd24178a07ffeb5dfc">r173:27cd5cce30c9</a>"""
-)
+        response.mustcontain("""fixes issue with having custom format for git-log""")
+        response.mustcontain("""/%s/changeset/5f2c6ee195929b0be80749243c18121c9864a3b3""" % GIT_REPO)
+
+        response.mustcontain("""disable security checks on hg clone for travis""")
+        response.mustcontain("""/%s/changeset/96507bd11ecc815ebc6270fdf6db110928c09c1e""" % HG_REPO)
 
     def test_repo_summary_with_anonymous_access_disabled(self):
-        anon = User.get_by_username('default')
+        anon = User.get_default_user()
         anon.active = False
         Session().add(anon)
         Session().commit()
@@ -45,13 +48,13 @@
             assert 'login' in response.location
 
         finally:
-            anon = User.get_by_username('default')
+            anon = User.get_default_user()
             anon.active = True
             Session().add(anon)
             Session().commit()
 
     def test_index_with_anonymous_access_disabled(self):
-        anon = User.get_by_username('default')
+        anon = User.get_default_user()
         anon.active = False
         Session().add(anon)
         Session().commit()
@@ -61,27 +64,11 @@
                                     status=302)
             assert 'login' in response.location
         finally:
-            anon = User.get_by_username('default')
+            anon = User.get_default_user()
             anon.active = True
             Session().add(anon)
             Session().commit()
 
-    def _set_l_dash(self, set_to):
-        self.app.post(url('admin_setting', setting_id='visual'),
-                      params=dict(_method='put',
-                                  rhodecode_lightweight_dashboard=set_to,))
-
-    def test_index_with_lightweight_dashboard(self):
-        self.log_user()
-        self._set_l_dash(True)
-
-        try:
-            response = self.app.get(url(controller='home', action='index'))
-            response.mustcontain("""var data = {"totalRecords": %s"""
-                                 % len(Repository.getAll()))
-        finally:
-            self._set_l_dash(False)
-
     def test_index_page_on_groups(self):
         self.log_user()
         gr = fixture.create_group('gr1')
@@ -94,18 +81,3 @@
             RepoModel().delete('gr1/repo_in_group')
             ReposGroupModel().delete(repos_group='gr1', force_delete=True)
             Session().commit()
-
-    def test_index_page_on_groups_with_lightweight_dashboard(self):
-        self.log_user()
-        self._set_l_dash(True)
-        fixture.create_repo(name='gr1/repo_in_group',
-                            repos_group=fixture.create_group('gr1'))
-        response = self.app.get(url('repos_group_home', group_name='gr1'))
-
-        try:
-            response.mustcontain("""gr1/repo_in_group""")
-        finally:
-            self._set_l_dash(False)
-            RepoModel().delete('gr1/repo_in_group')
-            ReposGroupModel().delete(repos_group='gr1', force_delete=True)
-            Session().commit()
--- a/rhodecode/tests/functional/test_journal.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_journal.py	Fri Jun 07 00:31:11 2013 +0200
@@ -14,10 +14,10 @@
 
     def test_stop_following_repository(self):
         session = self.log_user()
-#        usr = self.Session.query(User).filter(User.username == 'test_admin').one()
-#        repo = self.Session.query(Repository).filter(Repository.repo_name == HG_REPO).one()
+#        usr = Session().query(User).filter(User.username == 'test_admin').one()
+#        repo = Session().query(Repository).filter(Repository.repo_name == HG_REPO).one()
 #
-#        followings = self.Session.query(UserFollowing)\
+#        followings = Session().query(UserFollowing)\
 #            .filter(UserFollowing.user == usr)\
 #            .filter(UserFollowing.follows_repository == repo).all()
 #
--- a/rhodecode/tests/functional/test_login.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_login.py	Fri Jun 07 00:31:11 2013 +0200
@@ -5,15 +5,16 @@
 from rhodecode.lib.auth import check_password
 from rhodecode.lib import helpers as h
 from rhodecode.model import validators
+from rhodecode.model.meta import Session
 
 
 class TestLoginController(TestController):
 
     def tearDown(self):
         for n in Notification.query().all():
-            self.Session().delete(n)
+            Session().delete(n)
 
-        self.Session().commit()
+        Session().commit()
         self.assertEqual(Notification.query().all(), [])
 
     def test_index(self):
@@ -216,7 +217,7 @@
         self.assertEqual(response.status, '302 Found')
         self.checkSessionFlash(response, 'You have successfully registered into RhodeCode')
 
-        ret = self.Session().query(User).filter(User.username == 'test_regular4').one()
+        ret = Session().query(User).filter(User.username == 'test_regular4').one()
         self.assertEqual(ret.username, username)
         self.assertEqual(check_password(password, ret.password), True)
         self.assertEqual(ret.email, email)
@@ -254,8 +255,8 @@
         new.name = name
         new.lastname = lastname
         new.api_key = generate_api_key(username)
-        self.Session().add(new)
-        self.Session().commit()
+        Session().add(new)
+        Session().commit()
 
         response = self.app.post(url(controller='login',
                                      action='password_reset'),
--- a/rhodecode/tests/functional/test_search.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_search.py	Fri Jun 07 00:31:11 2013 +0200
@@ -25,14 +25,14 @@
         self.log_user()
         response = self.app.get(url(controller='search', action='index'),
                                 {'q': 'def repo'})
-        response.mustcontain('39 results')
+        response.mustcontain('58 results')
 
     def test_repo_search(self):
         self.log_user()
         response = self.app.get(url(controller='search', action='index'),
                                 {'q': 'repository:%s def test' % HG_REPO})
 
-        response.mustcontain('4 results')
+        response.mustcontain('18 results')
 
     def test_search_last(self):
         self.log_user()
@@ -67,7 +67,7 @@
                                 {'q': 'changed:tests/utils.py',
                                  'type': 'commit'})
 
-        response.mustcontain('20 results')
+        response.mustcontain('29 results')
 
     def test_search_commit_changed_files_get_commit(self):
         self.log_user()
@@ -75,7 +75,7 @@
                                 {'q': 'changed:vcs/utils/lazy.py',
                                  'type': 'commit'})
 
-        response.mustcontain('7 results')
+        response.mustcontain('11 results')
         response.mustcontain('36e0fc9d2808c5022a24f49d6658330383ed8666')
         response.mustcontain('af182745859d779f17336241a0815d15166ae1ee')
         response.mustcontain('17438a11f72b93f56d0e08e7d1fa79a378578a82')
--- a/rhodecode/tests/functional/test_shortlog.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-from rhodecode.tests import *
-
-
-class TestShortlogController(TestController):
-
-    def test_index_hg(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    repo_name=HG_REPO))
-        # Test response...
-
-    def test_index_git(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    repo_name=GIT_REPO))
-        # Test response...
-
-    def test_index_hg_with_filenode(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/vcs/exceptions.py',
-                                    repo_name=HG_REPO))
-        #history commits messages
-        response.mustcontain('Added exceptions module, this time for real')
-        response.mustcontain('Added not implemented hg backend test case')
-        response.mustcontain('Added BaseChangeset class')
-        # Test response...
-
-    def test_index_git_with_filenode(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/vcs/exceptions.py',
-                                    repo_name=GIT_REPO))
-        #history commits messages
-        response.mustcontain('Added exceptions module, this time for real')
-        response.mustcontain('Added not implemented hg backend test case')
-        response.mustcontain('Added BaseChangeset class')
-
-    def test_index_hg_with_filenode_that_is_dirnode(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/tests',
-                                    repo_name=HG_REPO))
-        self.assertEqual(response.status, '302 Found')
-
-    def test_index_git_with_filenode_that_is_dirnode(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/tests',
-                                    repo_name=GIT_REPO))
-        self.assertEqual(response.status, '302 Found')
-
-    def test_index_hg_with_filenode_not_existing(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/wrong_path',
-                                    repo_name=HG_REPO))
-        self.assertEqual(response.status, '302 Found')
-
-    def test_index_git_with_filenode_not_existing(self):
-        self.log_user()
-        response = self.app.get(url(controller='shortlog', action='index',
-                                    revision='tip', f_path='/wrong_path',
-                                    repo_name=GIT_REPO))
-        self.assertEqual(response.status, '302 Found')
--- a/rhodecode/tests/functional/test_summary.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_summary.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,9 +1,9 @@
 from rhodecode.tests import *
 from rhodecode.tests.fixture import Fixture
 from rhodecode.model.db import Repository
-from rhodecode.lib.utils import invalidate_cache
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.meta import Session
+from rhodecode.model.scm import ScmModel
 
 fixture = Fixture()
 
@@ -32,17 +32,20 @@
         #codes stats
         self._enable_stats()
 
-        invalidate_cache('get_repo_cached_%s' % HG_REPO)
+        ScmModel().mark_for_invalidation(HG_REPO)
         response = self.app.get(url(controller='summary', action='index',
                                     repo_name=HG_REPO))
         response.mustcontain(
-            """var data = [["py", {"count": 42, "desc": ["Python"]}], """
-            """["rst", {"count": 11, "desc": ["Rst"]}], """
+            """var data = [["py", {"count": 68, "desc": ["Python"]}], """
+            """["rst", {"count": 16, "desc": ["Rst"]}], """
+            """["css", {"count": 2, "desc": ["Css"]}], """
             """["sh", {"count": 2, "desc": ["Bash"]}], """
-            """["makefile", {"count": 1, "desc": ["Makefile", "Makefile"]}],"""
-            """ ["cfg", {"count": 1, "desc": ["Ini"]}], """
-            """["css", {"count": 1, "desc": ["Css"]}], """
-            """["bat", {"count": 1, "desc": ["Batch"]}]];"""
+            """["yml", {"count": 1, "desc": ["Yaml"]}], """
+            """["makefile", {"count": 1, "desc": ["Makefile", "Makefile"]}], """
+            """["js", {"count": 1, "desc": ["Javascript"]}], """
+            """["cfg", {"count": 1, "desc": ["Ini"]}], """
+            """["ini", {"count": 1, "desc": ["Ini"]}], """
+            """["html", {"count": 1, "desc": ["EvoqueHtml", "Html"]}]];"""
         )
 
         # clone url...
@@ -118,5 +121,5 @@
     def _enable_stats(self):
         r = Repository.get_by_repo_name(HG_REPO)
         r.enable_statistics = True
-        self.Session.add(r)
-        self.Session.commit()
+        Session().add(r)
+        Session().commit()
--- a/rhodecode/tests/functional/test_tags.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/functional/test_tags.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,12 +1,40 @@
 from rhodecode.tests import *
 
+
 class TestTagsController(TestController):
 
-    def test_index(self):
+    def test_index_hg(self):
         self.log_user()
         response = self.app.get(url(controller='tags', action='index', repo_name=HG_REPO))
-        response.mustcontain("""<a href="/%s/files/27cd5cce30c96924232dffcd24178a07ffeb5dfc/">tip</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200/">0.1.4</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/17544fbfcd33ffb439e2b728b5d526b1ef30bfcf/">0.1.3</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720/">0.1.2</a>""" % HG_REPO)
-        response.mustcontain("""<a href="/%s/files/eb3a60fc964309c1a318b8dfe26aa2d1586c85ae/">0.1.1</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/96507bd11ecc815ebc6270fdf6db110928c09c1e/">tip</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/2c96c02def9a7c997f33047761a53943e6254396/">v0.2.0</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/fef5bfe1dc17611d5fb59a7f6f95c55c3606f933/">v0.1.11</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/92831aebf2f8dd4879e897024b89d09af214df1c/">v0.1.10</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/8680b1d1cee3aa3c1ab3734b76ee164bbedbc5c9/">v0.1.9</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/ecb25ba9c96faf1e65a0bc3fd914918420a2f116/">v0.1.8</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/f67633a2894edaf28513706d558205fa93df9209/">v0.1.7</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/02b38c0eb6f982174750c0e309ff9faddc0c7e12/">v0.1.6</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/a6664e18181c6fc81b751a8d01474e7e1a3fe7fc/">v0.1.5</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200/">v0.1.4</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/17544fbfcd33ffb439e2b728b5d526b1ef30bfcf/">v0.1.3</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720/">v0.1.2</a>""" % HG_REPO)
+        response.mustcontain("""<a href="/%s/files/eb3a60fc964309c1a318b8dfe26aa2d1586c85ae/">v0.1.1</a>""" % HG_REPO)
+
+    def test_index_git(self):
+        self.log_user()
+        response = self.app.get(url(controller='tags', action='index', repo_name=GIT_REPO))
+
+        response.mustcontain("""<a href="/%s/files/137fea89f304a42321d40488091ee2ed419a3686/">v0.2.2</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/5051d0fa344d4408a2659d9a0348eb2d41868ecf/">v0.2.1</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/599ba911aa24d2981225f3966eb659dfae9e9f30/">v0.2.0</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/c60f01b77c42dce653d6b1d3b04689862c261929/">v0.1.11</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/10cddef6b794696066fb346434014f0a56810218/">v0.1.10</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/341d28f0eec5ddf0b6b77871e13c2bbd6bec685c/">v0.1.9</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/74ebce002c088b8a5ecf40073db09375515ecd68/">v0.1.8</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/4d78bf73b5c22c82b68f902f138f7881b4fffa2c/">v0.1.7</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/0205cb3f44223fb3099d12a77a69c81b798772d9/">v0.1.6</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/6c0ce52b229aa978889e91b38777f800e85f330b/">v0.1.5</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/7d735150934cd7645ac3051903add952390324a5/">v0.1.4</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/5a3a8fb005554692b16e21dee62bf02667d8dc3e/">v0.1.3</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/0ba5f8a4660034ff25c0cac2a5baabf5d2791d63/">v0.1.2</a>""" % GIT_REPO)
+        response.mustcontain("""<a href="/%s/files/e6ea6d16e2f26250124a1f4b4fe37a912f9d86a0/">v0.1.1</a>""" % GIT_REPO)
--- a/rhodecode/tests/models/common.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/common.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,6 +1,3 @@
-import os
-import unittest
-import functools
 from rhodecode.tests import *
 from rhodecode.tests.fixture import Fixture
 
--- a/rhodecode/tests/models/test_diff_parsers.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_diff_parsers.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,86 +1,250 @@
 from __future__ import with_statement
 import os
-import unittest
 from rhodecode.tests import *
 from rhodecode.lib.diffs import DiffProcessor, NEW_FILENODE, DEL_FILENODE, \
-    MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE
+    MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
 
 dn = os.path.dirname
 FIXTURES = os.path.join(dn(dn(os.path.abspath(__file__))), 'fixtures')
 
 DIFF_FIXTURES = {
     'hg_diff_add_single_binary_file.diff': [
-        (u'US Warszawa.jpg', 'A', ['b', NEW_FILENODE]),
+        ('US Warszawa.jpg', 'A',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {NEW_FILENODE: 'new file 100755',
+                  BIN_FILENODE: 'binary diff not shown'}}),
     ],
     'hg_diff_mod_single_binary_file.diff': [
-        (u'US Warszawa.jpg', 'M', ['b', MOD_FILENODE]),
+        ('US Warszawa.jpg', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {MOD_FILENODE: 'modified file',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+    ],
+
+    'hg_diff_mod_single_file_and_rename_and_chmod.diff': [
+        ('README', 'M',
+         {'added': 3,
+          'deleted': 0,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file',
+                  RENAMED_FILENODE: 'file renamed from README.rst to README',
+                  CHMOD_FILENODE: 'modified file chmod 100755 => 100644'}}),
+    ],
+    'hg_diff_mod_file_and_rename.diff': [
+        ('README.rst', 'M',
+         {'added': 3,
+          'deleted': 0,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file',
+                  RENAMED_FILENODE: 'file renamed from README to README.rst'}}),
     ],
     'hg_diff_del_single_binary_file.diff': [
-        (u'US Warszawa.jpg', 'D', ['b', DEL_FILENODE]),
+        ('US Warszawa.jpg', 'D',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {DEL_FILENODE: 'deleted file',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+    ],
+    'hg_diff_chmod_and_mod_single_binary_file.diff': [
+        ('gravatar.png', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {CHMOD_FILENODE: 'modified file chmod 100644 => 100755',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+    ],
+    'hg_diff_chmod.diff': [
+        ('file', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {CHMOD_FILENODE: 'modified file chmod 100755 => 100644'}}),
+    ],
+    'hg_diff_rename_file.diff': [
+        ('file_renamed', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {RENAMED_FILENODE: 'file renamed from file to file_renamed'}}),
+    ],
+    'hg_diff_rename_and_chmod_file.diff': [
+        ('README', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {CHMOD_FILENODE: 'modified file chmod 100644 => 100755',
+                  RENAMED_FILENODE: 'file renamed from README.rst to README'}}),
     ],
     'hg_diff_binary_and_normal.diff': [
-        (u'img/baseline-10px.png', 'A', ['b', NEW_FILENODE]),
-        (u'js/jquery/hashgrid.js', 'A', [340, 0]),
-        (u'index.html',            'M', [3, 2]),
-        (u'less/docs.less',        'M', [34, 0]),
-        (u'less/scaffolding.less', 'M', [1, 3]),
-        (u'readme.markdown',       'M', [1, 10]),
-        (u'img/baseline-20px.png', 'D', ['b', DEL_FILENODE]),
-        (u'js/global.js',          'D', [0, 75])
-    ],
-    'hg_diff_chmod.diff': [
-        (u'file', 'M', ['b', CHMOD_FILENODE]),
-    ],
-    'hg_diff_rename_file.diff': [
-        (u'file_renamed', 'M', ['b', RENAMED_FILENODE]),
+        ('img/baseline-10px.png', 'A',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {NEW_FILENODE: 'new file 100644',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+        ('js/jquery/hashgrid.js', 'A',
+         {'added': 340,
+          'deleted': 0,
+          'binary': False,
+          'ops': {NEW_FILENODE: 'new file 100755'}}),
+        ('index.html', 'M',
+         {'added': 3,
+          'deleted': 2,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('less/docs.less', 'M',
+         {'added': 34,
+          'deleted': 0,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('less/scaffolding.less', 'M',
+         {'added': 1,
+          'deleted': 3,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('readme.markdown', 'M',
+         {'added': 1,
+          'deleted': 10,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('img/baseline-20px.png', 'D',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {DEL_FILENODE: 'deleted file',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+        ('js/global.js', 'D',
+         {'added': 0,
+          'deleted': 75,
+          'binary': False,
+          'ops': {DEL_FILENODE: 'deleted file'}})
     ],
     'git_diff_chmod.diff': [
-        (u'work-horus.xls', 'M', ['b', CHMOD_FILENODE]),
+        ('work-horus.xls', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {CHMOD_FILENODE: 'modified file chmod 100644 => 100755'}})
     ],
     'git_diff_rename_file.diff': [
-        (u'file.xls', 'M', ['b', RENAMED_FILENODE]),
+        ('file.xls', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {RENAMED_FILENODE: 'file renamed from work-horus.xls to file.xls'}})
     ],
     'git_diff_mod_single_binary_file.diff': [
-        ('US Warszawa.jpg', 'M', ['b', MOD_FILENODE])
-
+        ('US Warszawa.jpg', 'M',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {MOD_FILENODE: 'modified file',
+                  BIN_FILENODE: 'binary diff not shown'}})
     ],
     'git_diff_binary_and_normal.diff': [
-        (u'img/baseline-10px.png', 'A', ['b', NEW_FILENODE]),
-        (u'js/jquery/hashgrid.js', 'A', [340, 0]),
-        (u'index.html',            'M', [3, 2]),
-        (u'less/docs.less',        'M', [34, 0]),
-        (u'less/scaffolding.less', 'M', [1, 3]),
-        (u'readme.markdown',       'M', [1, 10]),
-        (u'img/baseline-20px.png', 'D', ['b', DEL_FILENODE]),
-        (u'js/global.js',          'D', [0, 75])
+        ('img/baseline-10px.png', 'A',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {NEW_FILENODE: 'new file 100644',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+        ('js/jquery/hashgrid.js', 'A',
+         {'added': 340,
+          'deleted': 0,
+          'binary': False,
+          'ops': {NEW_FILENODE: 'new file 100755'}}),
+        ('index.html', 'M',
+         {'added': 3,
+          'deleted': 2,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('less/docs.less', 'M',
+         {'added': 34,
+          'deleted': 0,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('less/scaffolding.less', 'M',
+         {'added': 1,
+          'deleted': 3,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('readme.markdown', 'M',
+         {'added': 1,
+          'deleted': 10,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('img/baseline-20px.png', 'D',
+         {'added': 0,
+          'deleted': 0,
+          'binary': True,
+          'ops': {DEL_FILENODE: 'deleted file',
+                  BIN_FILENODE: 'binary diff not shown'}}),
+        ('js/global.js', 'D',
+         {'added': 0,
+          'deleted': 75,
+          'binary': False,
+          'ops': {DEL_FILENODE: 'deleted file'}}),
     ],
     'diff_with_diff_data.diff': [
-        (u'vcs/backends/base.py', 'M', [18, 2]),
-        (u'vcs/backends/git/repository.py', 'M', [46, 15]),
-        (u'vcs/backends/hg.py', 'M', [22, 3]),
-        (u'vcs/tests/test_git.py', 'M', [5, 5]),
-        (u'vcs/tests/test_repository.py', 'M', [174, 2])
+        ('vcs/backends/base.py', 'M',
+         {'added': 18,
+          'deleted': 2,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('vcs/backends/git/repository.py', 'M',
+         {'added': 46,
+          'deleted': 15,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('vcs/backends/hg.py', 'M',
+         {'added': 22,
+          'deleted': 3,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('vcs/tests/test_git.py', 'M',
+         {'added': 5,
+          'deleted': 5,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
+        ('vcs/tests/test_repository.py', 'M',
+         {'added': 174,
+          'deleted': 2,
+          'binary': False,
+          'ops': {MOD_FILENODE: 'modified file'}}),
     ],
-#    'large_diff.diff': [
-#
-#    ],
-
+#     'large_diff.diff': [
+#         ('.hgignore', 'A', {'deleted': 0, 'binary': False, 'added': 3, 'ops': {1: 'new file 100644'}}),
+#         ('MANIFEST.in', 'A', {'deleted': 0, 'binary': False, 'added': 3, 'ops': {1: 'new file 100644'}}),
+#         ('README.txt', 'A', {'deleted': 0, 'binary': False, 'added': 19, 'ops': {1: 'new file 100644'}}),
+#         ('development.ini', 'A', {'deleted': 0, 'binary': False, 'added': 116, 'ops': {1: 'new file 100644'}}),
+#         ('docs/index.txt', 'A', {'deleted': 0, 'binary': False, 'added': 19, 'ops': {1: 'new file 100644'}}),
+#         ('ez_setup.py', 'A', {'deleted': 0, 'binary': False, 'added': 276, 'ops': {1: 'new file 100644'}}),
+#         ('hgapp.py', 'A', {'deleted': 0, 'binary': False, 'added': 26, 'ops': {1: 'new file 100644'}}),
+#         ('hgwebdir.config', 'A', {'deleted': 0, 'binary': False, 'added': 21, 'ops': {1: 'new file 100644'}}),
+#         ('pylons_app.egg-info/PKG-INFO', 'A', {'deleted': 0, 'binary': False, 'added': 10, 'ops': {1: 'new file 100644'}}),
+#         ('pylons_app.egg-info/SOURCES.txt', 'A', {'deleted': 0, 'binary': False, 'added': 33, 'ops': {1: 'new file 100644'}}),
+#         ('pylons_app.egg-info/dependency_links.txt', 'A', {'deleted': 0, 'binary': False, 'added': 1, 'ops': {1: 'new file 100644'}}),
+#         #TODO:
+#     ],
 
 }
 
 
-def _diff_checker(fixture):
-    with open(os.path.join(FIXTURES, fixture)) as f:
-        diff = f.read()
+class DiffLibTest(BaseTestCase):
+
+    @parameterized.expand([(x,) for x in DIFF_FIXTURES])
+    def test_diff(self, diff_fixture):
 
-    diff_proc = DiffProcessor(diff)
-    diff_proc_d = diff_proc.prepare()
-    data = [(x['filename'], x['operation'], x['stats']) for x in diff_proc_d]
-    expected_data = DIFF_FIXTURES[fixture]
+        with open(os.path.join(FIXTURES, diff_fixture)) as f:
+            diff = f.read()
 
-    assert expected_data == data
-
-
-def test_parse_diff():
-    for fixture in DIFF_FIXTURES:
-        yield _diff_checker, fixture
+        diff_proc = DiffProcessor(diff)
+        diff_proc_d = diff_proc.prepare()
+        data = [(x['filename'], x['operation'], x['stats']) for x in diff_proc_d]
+        expected_data = DIFF_FIXTURES[diff_fixture]
+        self.assertListEqual(expected_data, data)
--- a/rhodecode/tests/models/test_notifications.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_notifications.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,3 @@
-import os
-import unittest
 from rhodecode.tests import *
 
 from rhodecode.model.db import User, Notification, UserNotification
@@ -9,7 +7,7 @@
 from rhodecode.model.notification import NotificationModel
 
 
-class TestNotifications(unittest.TestCase):
+class TestNotifications(BaseTestCase):
 
     def __init__(self, methodName='runTest'):
         Session.remove()
--- a/rhodecode/tests/models/test_permissions.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_permissions.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,21 +1,21 @@
-import os
-import unittest
 from rhodecode.tests import *
 from rhodecode.tests.fixture import Fixture
 from rhodecode.model.repos_group import ReposGroupModel
 from rhodecode.model.repo import RepoModel
-from rhodecode.model.db import RepoGroup, User, UserGroupRepoGroupToPerm
+from rhodecode.model.db import RepoGroup, User, UserGroupRepoGroupToPerm,\
+    Permission, UserToPerm
 from rhodecode.model.user import UserModel
 
 from rhodecode.model.meta import Session
 from rhodecode.model.users_group import UserGroupModel
 from rhodecode.lib.auth import AuthUser
+from rhodecode.model.permission import PermissionModel
 
 
 fixture = Fixture()
 
 
-class TestPermissions(unittest.TestCase):
+class TestPermissions(BaseTestCase):
     def __init__(self, methodName='runTest'):
         super(TestPermissions, self).__init__(methodName=methodName)
 
@@ -32,7 +32,7 @@
             username=u'u3', password=u'qweqwe',
             email=u'u3@rhodecode.org', firstname=u'u3', lastname=u'u3'
         )
-        self.anon = User.get_by_username('default')
+        self.anon = User.get_default_user()
         self.a1 = UserModel().create_or_update(
             username=u'a1', password=u'qweqwe',
             email=u'a1@rhodecode.org', firstname=u'a1', lastname=u'a1', admin=True
@@ -101,13 +101,15 @@
         u1_auth = AuthUser(user_id=self.u1.user_id)
         perms = {
             'repositories_groups': {u'test1': 'group.read', u'test2': 'group.read'},
-            'global': set([u'hg.create.repository', u'repository.read', u'hg.register.manual_activate']),
+            'global': set(Permission.DEFAULT_USER_PERMISSIONS),
             'repositories': {u'vcs_test_hg': u'repository.read'}
         }
         self.assertEqual(u1_auth.permissions['repositories'][HG_REPO],
                          perms['repositories'][HG_REPO])
         self.assertEqual(u1_auth.permissions['repositories_groups'],
                          perms['repositories_groups'])
+        self.assertEqual(u1_auth.permissions['global'],
+                         perms['global'])
 
     def test_default_admin_group_perms(self):
         self.g1 = fixture.create_group('test1', skip_if_exists=True)
@@ -126,9 +128,7 @@
 
     def test_propagated_permission_from_users_group_by_explicit_perms_exist(self):
         # make group
-        self.ug1 = UserGroupModel().create('G1')
-        # add user to group
-
+        self.ug1 = fixture.create_user_group('G1')
         UserGroupModel().add_user_to_group(self.ug1, self.u1)
 
         # set permission to lower
@@ -160,9 +160,7 @@
 
     def test_propagated_permission_from_users_group(self):
         # make group
-        self.ug1 = UserGroupModel().create('G1')
-        # add user to group
-
+        self.ug1 = fixture.create_user_group('G1')
         UserGroupModel().add_user_to_group(self.ug1, self.u3)
 
         # grant perm for group this should override default permission from user
@@ -185,7 +183,7 @@
 
     def test_propagated_permission_from_users_group_lower_weight(self):
         # make group
-        self.ug1 = UserGroupModel().create('G1')
+        self.ug1 = fixture.create_user_group('G1')
         # add user to group
         UserGroupModel().add_user_to_group(self.ug1, self.u1)
 
@@ -295,7 +293,7 @@
                                                 user=self.anon,
                                                 perm='group.none')
         # make group
-        self.ug1 = UserGroupModel().create('G1')
+        self.ug1 = fixture.create_user_group('G1')
         # add user to group
         UserGroupModel().add_user_to_group(self.ug1, self.u1)
         Session().commit()
@@ -351,7 +349,9 @@
         self.assertEqual(u1_auth.permissions['global'],
                          set(['hg.create.repository', 'hg.fork.repository',
                               'hg.register.manual_activate',
-                              'repository.read', 'group.read']))
+                              'hg.extern_activate.auto',
+                              'repository.read', 'group.read',
+                              'usergroup.read']))
 
     def test_inherited_permissions_from_default_on_user_disabled(self):
         user_model = UserModel()
@@ -369,7 +369,9 @@
         self.assertEqual(u1_auth.permissions['global'],
                          set(['hg.create.none', 'hg.fork.none',
                               'hg.register.manual_activate',
-                              'repository.read', 'group.read']))
+                              'hg.extern_activate.auto',
+                              'repository.read', 'group.read',
+                              'usergroup.read']))
 
     def test_non_inherited_permissions_from_default_on_user_enabled(self):
         user_model = UserModel()
@@ -395,7 +397,9 @@
         self.assertEqual(u1_auth.permissions['global'],
                          set(['hg.create.none', 'hg.fork.none',
                               'hg.register.manual_activate',
-                              'repository.read', 'group.read']))
+                              'hg.extern_activate.auto',
+                              'repository.read', 'group.read',
+                              'usergroup.read']))
 
     def test_non_inherited_permissions_from_default_on_user_disabled(self):
         user_model = UserModel()
@@ -421,7 +425,9 @@
         self.assertEqual(u1_auth.permissions['global'],
                          set(['hg.create.repository', 'hg.fork.repository',
                               'hg.register.manual_activate',
-                              'repository.read', 'group.read']))
+                              'hg.extern_activate.auto',
+                              'repository.read', 'group.read',
+                              'usergroup.read']))
 
     def test_owner_permissions_doesnot_get_overwritten_by_group(self):
         #create repo as USER,
@@ -434,8 +440,7 @@
         self.assertEqual(u1_auth.permissions['repositories']['myownrepo'],
                          'repository.admin')
         #set his permission as user group, he should still be admin
-        self.ug1 = UserGroupModel().create('G1')
-        # add user to group
+        self.ug1 = fixture.create_user_group('G1')
         UserGroupModel().add_user_to_group(self.ug1, self.u1)
         RepoModel().grant_users_group_permission(self.test_repo,
                                                  group_name=self.ug1,
@@ -463,3 +468,60 @@
         u1_auth = AuthUser(user_id=self.u1.user_id)
         self.assertEqual(u1_auth.permissions['repositories']['myownrepo'],
                          'repository.admin')
+
+    def _test_def_perm_equal(self, user, change_factor=0):
+        perms = UserToPerm.query()\
+                .filter(UserToPerm.user == user)\
+                .all()
+        self.assertEqual(len(perms),
+                         len(Permission.DEFAULT_USER_PERMISSIONS,)+change_factor,
+                         msg=perms)
+
+    def test_set_default_permissions(self):
+        PermissionModel().create_default_permissions(user=self.u1)
+        self._test_def_perm_equal(user=self.u1)
+
+    def test_set_default_permissions_after_one_is_missing(self):
+        PermissionModel().create_default_permissions(user=self.u1)
+        self._test_def_perm_equal(user=self.u1)
+        #now we delete one, it should be re-created after another call
+        perms = UserToPerm.query()\
+                .filter(UserToPerm.user == self.u1)\
+                .all()
+        Session().delete(perms[0])
+        Session().commit()
+
+        self._test_def_perm_equal(user=self.u1, change_factor=-1)
+
+        #create missing one !
+        PermissionModel().create_default_permissions(user=self.u1)
+        self._test_def_perm_equal(user=self.u1)
+
+    @parameterized.expand([
+        ('repository.read', 'repository.none'),
+        ('group.read', 'group.none'),
+        ('usergroup.read', 'usergroup.none'),
+        ('hg.create.repository', 'hg.create.none'),
+        ('hg.fork.repository', 'hg.fork.none'),
+        ('hg.register.manual_activate', 'hg.register.auto_activate',)
+    ])
+    def test_set_default_permissions_after_modification(self, perm, modify_to):
+        PermissionModel().create_default_permissions(user=self.u1)
+        self._test_def_perm_equal(user=self.u1)
+
+        old = Permission.get_by_key(perm)
+        new = Permission.get_by_key(modify_to)
+        self.assertNotEqual(old, None)
+        self.assertNotEqual(new, None)
+
+        #now modify permissions
+        p = UserToPerm.query()\
+                .filter(UserToPerm.user == self.u1)\
+                .filter(UserToPerm.permission == old)\
+                .one()
+        p.permission = new
+        Session().add(p)
+        Session().commit()
+
+        PermissionModel().create_default_permissions(user=self.u1)
+        self._test_def_perm_equal(user=self.u1)
--- a/rhodecode/tests/models/test_repos.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_repos.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,3 @@
-import os
-import unittest
 from rhodecode.tests import *
 
 from rhodecode.model.meta import Session
@@ -11,7 +9,7 @@
 fixture = Fixture()
 
 
-class TestRepos(unittest.TestCase):
+class TestRepos(BaseTestCase):
 
     def setUp(self):
         pass
--- a/rhodecode/tests/models/test_repos_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_repos_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,4 @@
 import os
-import unittest
 from sqlalchemy.exc import IntegrityError
 
 from rhodecode.tests import *
@@ -34,7 +33,7 @@
     return r
 
 
-class TestReposGroups(unittest.TestCase):
+class TestReposGroups(BaseTestCase):
 
     def setUp(self):
         self.g1 = fixture.create_group('test1', skip_if_exists=True)
--- a/rhodecode/tests/models/test_user_permissions_on_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_user_permissions_on_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,5 +1,3 @@
-import os
-import unittest
 import functools
 from rhodecode.tests import *
 
@@ -10,7 +8,6 @@
 from nose.tools import with_setup
 from rhodecode.tests.models.common import _create_project_tree, check_tree_perms, \
     _get_perms, _check_expected_count, expected_count, _destroy_project_tree
-from rhodecode.model.repo import RepoModel
 
 
 test_u1_id = None
@@ -28,7 +25,8 @@
     perms_updates = [[test_u1_id, perm, 'user']]
     ReposGroupModel()._update_permissions(repos_group,
                                           perms_updates=perms_updates,
-                                          recursive=recursive)
+                                          recursive=recursive,
+                                          check_perms=False)
     Session().commit()
 
 
--- a/rhodecode/tests/models/test_users.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_users.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,4 +1,3 @@
-import unittest
 from rhodecode.tests import *
 
 from rhodecode.model.db import User, UserGroup, UserGroupMember, UserEmailMap,\
@@ -7,9 +6,12 @@
 
 from rhodecode.model.meta import Session
 from rhodecode.model.users_group import UserGroupModel
+from rhodecode.tests.fixture import Fixture
+
+fixture = Fixture()
 
 
-class TestUser(unittest.TestCase):
+class TestUser(BaseTestCase):
     def __init__(self, methodName='runTest'):
         Session.remove()
         super(TestUser, self).__init__(methodName=methodName)
@@ -26,7 +28,7 @@
         self.assertEqual(User.get_by_username(u'test_user'), usr)
 
         # make user group
-        users_group = UserGroupModel().create('some_example_group')
+        users_group = fixture.create_user_group('some_example_group')
         Session().commit()
 
         UserGroupModel().add_user_to_group(users_group, usr)
@@ -84,7 +86,7 @@
         Session().commit()
 
 
-class TestUsers(unittest.TestCase):
+class TestUsers(BaseTestCase):
 
     def __init__(self, methodName='runTest'):
         super(TestUsers, self).__init__(methodName=methodName)
--- a/rhodecode/tests/models/test_users_group_permissions_on_groups.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/models/test_users_group_permissions_on_groups.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,18 +1,17 @@
-import os
-import unittest
 import functools
 from rhodecode.tests import *
 
 from rhodecode.model.repos_group import ReposGroupModel
-from rhodecode.model.db import RepoGroup, Repository, User
+from rhodecode.model.db import RepoGroup
 
 from rhodecode.model.meta import Session
 from nose.tools import with_setup
 from rhodecode.tests.models.common import _create_project_tree, check_tree_perms, \
     _get_perms, _check_expected_count, expected_count, _destroy_project_tree
 from rhodecode.model.users_group import UserGroupModel
-from rhodecode.model.repo import RepoModel
+from rhodecode.tests.fixture import Fixture
 
+fixture = Fixture()
 
 test_u2_id = None
 test_u2_gr_id = None
@@ -30,7 +29,8 @@
     perms_updates = [[test_u2_gr_id, perm, 'users_group']]
     ReposGroupModel()._update_permissions(repos_group,
                                           perms_updates=perms_updates,
-                                          recursive=recursive)
+                                          recursive=recursive,
+                                          check_perms=False)
     Session().commit()
 
 
@@ -40,7 +40,7 @@
     Session().commit()
     test_u2_id = test_u2.user_id
 
-    gr1 = UserGroupModel().create(name='perms_group_1')
+    gr1 = fixture.create_user_group('perms_group_1')
     Session().commit()
     test_u2_gr_id = gr1.users_group_id
     UserGroupModel().add_user_to_group(gr1, user=test_u2_id)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/other/test_libs.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,294 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.tests.test_libs
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+    Package for testing various lib/helper functions in rhodecode
+
+    :created_on: Jun 9, 2011
+    :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from __future__ import with_statement
+import datetime
+import hashlib
+import mock
+from rhodecode.tests import *
+
+proto = 'http'
+TEST_URLS = [
+    ('%s://127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+     '%s://127.0.0.1' % proto),
+    ('%s://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+     '%s://127.0.0.1' % proto),
+    ('%s://marcink: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',
+                                                '8080'],
+     '%s://domain.org: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://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
+     '%s://127.0.0.1' % proto),
+    ('%s://marcink: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',
+                                                '8080'],
+     '%s://domain.org:8080' % proto),
+]
+
+
+class TestLibs(BaseTestCase):
+
+    @parameterized.expand(TEST_URLS)
+    def test_uri_filter(self, test_url, expected, expected_creds):
+        from rhodecode.lib.utils2 import uri_filter
+        self.assertEqual(uri_filter(test_url), expected)
+
+    @parameterized.expand(TEST_URLS)
+    def test_credentials_filter(self, test_url, expected, expected_creds):
+        from rhodecode.lib.utils2 import credentials_filter
+        self.assertEqual(credentials_filter(test_url), expected_creds)
+
+    @parameterized.expand([('t', True),
+                           ('true', True),
+                           ('y', True),
+                           ('yes', True),
+                           ('on', True),
+                           ('1', True),
+                           ('Y', True),
+                           ('yeS', True),
+                           ('Y', True),
+                           ('TRUE', True),
+                           ('T', True),
+                           ('False', False),
+                           ('F', False),
+                           ('FALSE', False),
+                           ('0', False),
+                           ('-1', False),
+                           ('', False)
+    ])
+    def test_str2bool(self, str_bool, expected):
+        from rhodecode.lib.utils2 import str2bool
+        self.assertEqual(str2bool(str_bool), expected)
+
+    def test_mention_extractor(self):
+        from rhodecode.lib.utils2 import extract_mentioned_users
+        sample = (
+            "@first hi there @marcink here's my email marcin@email.com "
+            "@lukaszb check @one_more22 it pls @ ttwelve @D[] @one@two@three "
+            "@MARCIN    @maRCiN @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"
+        )
+
+        s = sorted([
+        'first', 'marcink', 'lukaszb', 'one_more22', 'MARCIN', 'maRCiN', 'john',
+        'marian.user', 'marco-polo', 'marco_polo'
+        ], key=lambda k: k.lower())
+        self.assertEqual(s, extract_mentioned_users(sample))
+
+    @parameterized.expand([
+        (dict(), u'just now'),
+        (dict(seconds= -1), u'1 second ago'),
+        (dict(seconds= -60 * 2), u'2 minutes ago'),
+        (dict(hours= -1), u'1 hour ago'),
+        (dict(hours= -24), u'1 day ago'),
+        (dict(hours= -24 * 5), u'5 days ago'),
+        (dict(months= -1), u'1 month ago'),
+        (dict(months= -1, days= -2), u'1 month and 2 days ago'),
+        (dict(years= -1, months= -1), u'1 year and 1 month ago'),
+    ])
+    def test_age(self, age_args, expected):
+        from rhodecode.lib.utils2 import age
+        from dateutil import relativedelta
+        n = datetime.datetime(year=2012, month=5, day=17)
+        delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
+        self.assertEqual(age(n + delt(**age_args), now=n), expected)
+
+    @parameterized.expand([
+
+        (dict(), u'just now'),
+        (dict(seconds=1), u'in 1 second'),
+        (dict(seconds=60 * 2), u'in 2 minutes'),
+        (dict(hours=1), u'in 1 hour'),
+        (dict(hours=24), u'in 1 day'),
+        (dict(hours=24 * 5), u'in 5 days'),
+        (dict(months=1), u'in 1 month'),
+        (dict(months=1, days=1), u'in 1 month and 1 day'),
+        (dict(years=1, months=1), u'in 1 year and 1 month')
+    ])
+    def test_age_in_future(self, age_args, expected):
+        from rhodecode.lib.utils2 import age
+        from dateutil import relativedelta
+        n = datetime.datetime(year=2012, month=5, day=17)
+        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 => url] [lang => python] [just a tag]"
+            "[,d] [ => ULR ] [obsolete] [desc]]"
+        )
+        from rhodecode.lib.helpers import desc_stylize
+        res = desc_stylize(sample)
+        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
+        self.assertTrue('<div class="metatag" tag="obsolete">obsolete</div>' in res)
+        self.assertTrue('<div class="metatag" tag="stale">stale</div>' in res)
+        self.assertTrue('<div class="metatag" tag="lang">python</div>' in res)
+        self.assertTrue('<div class="metatag" tag="requires">requires =&gt; <a href="/url">url</a></div>' in res)
+        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
+
+    def test_alternative_gravatar(self):
+        from rhodecode.lib.helpers import gravatar_url
+        _md5 = lambda s: hashlib.md5(s).hexdigest()
+
+        def fake_conf(**kwargs):
+            from pylons import config
+            config = {}
+            config['use_gravatar'] = True
+            config.update(kwargs)
+            return config
+
+        class fake_url():
+            @classmethod
+            def current(cls, *args, **kwargs):
+                return 'https://server.com'
+
+        with mock.patch('pylons.url', fake_url):
+            fake = fake_conf(alternative_gravatar_url='http://test.com/{email}')
+            with mock.patch('rhodecode.CONFIG', 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'
+
+            fake = fake_conf(alternative_gravatar_url='http://test.com/{email}')
+            with mock.patch('rhodecode.CONFIG', fake):
+                grav = gravatar_url(email_address='test@foo.com', size=24)
+                assert grav == 'http://test.com/test@foo.com'
+
+            fake = fake_conf(alternative_gravatar_url='http://test.com/{md5email}')
+            with mock.patch('rhodecode.CONFIG', fake):
+                em = 'test@foo.com'
+                grav = gravatar_url(email_address=em, size=24)
+                assert grav == 'http://test.com/%s' % (_md5(em))
+
+            fake = fake_conf(alternative_gravatar_url='http://test.com/{md5email}/{size}')
+            with mock.patch('rhodecode.CONFIG', fake):
+                em = 'test@foo.com'
+                grav = gravatar_url(email_address=em, size=24)
+                assert grav == 'http://test.com/%s/%s' % (_md5(em), 24)
+
+            fake = fake_conf(alternative_gravatar_url='{scheme}://{netloc}/{md5email}/{size}')
+            with mock.patch('rhodecode.CONFIG', fake):
+                em = 'test@foo.com'
+                grav = gravatar_url(email_address=em, size=24)
+                assert grav == 'https://server.com/%s/%s' % (_md5(em), 24)
+
+    def _quick_url(self, text, tmpl="""<a class="revision-link" href="%s">%s</a>""", url_=None):
+        """
+        Changes `some text url[foo]` => `some text <a href="/">foo</a>
+
+        :param text:
+        """
+        import re
+        # quickly change expected url[] into a link
+        URL_PAT = re.compile(r'(?:url\[)(.+?)(?:\])')
+
+        def url_func(match_obj):
+            _url = match_obj.groups()[0]
+            return tmpl % (url_ or '/some-url', _url)
+        return URL_PAT.sub(url_func, text)
+
+    @parameterized.expand([
+      ("",
+       ""),
+      ("git-svn-id: https://svn.apache.org/repos/asf/libcloud/trunk@1441655 13f79535-47bb-0310-9956-ffa450edef68",
+       "git-svn-id: https://svn.apache.org/repos/asf/libcloud/trunk@1441655 13f79535-47bb-0310-9956-ffa450edef68"),
+      ("from rev 000000000000",
+       "from rev url[000000000000]"),
+      ("from rev 000000000000123123 also rev 000000000000",
+       "from rev url[000000000000123123] also rev url[000000000000]"),
+      ("this should-000 00",
+       "this should-000 00"),
+      ("longtextffffffffff rev 123123123123",
+       "longtextffffffffff rev url[123123123123]"),
+      ("rev ffffffffffffffffffffffffffffffffffffffffffffffffff",
+       "rev ffffffffffffffffffffffffffffffffffffffffffffffffff"),
+      ("ffffffffffff some text traalaa",
+       "url[ffffffffffff] some text traalaa"),
+       ("""Multi line
+       123123123123
+       some text 123123123123
+       sometimes !
+       """,
+       """Multi line
+       url[123123123123]
+       some text url[123123123123]
+       sometimes !
+       """)
+    ])
+    def test_urlify_changesets(self, sample, expected):
+        def fake_url(self, *args, **kwargs):
+            return '/some-url'
+
+        expected = self._quick_url(expected)
+
+        with mock.patch('pylons.url', fake_url):
+            from rhodecode.lib.helpers import urlify_changesets
+            self.assertEqual(urlify_changesets(sample, 'repo_name'), expected)
+
+    @parameterized.expand([
+      ("",
+       "",
+       ""),
+      ("https://svn.apache.org/repos",
+       "url[https://svn.apache.org/repos]",
+       "https://svn.apache.org/repos"),
+      ("http://svn.apache.org/repos",
+       "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
+       some text lalala""",
+       """Multi line
+       url[https://foo.bar.com]
+       some text lalala""",
+       "https://foo.bar.com")
+    ])
+    def test_urlify_test(self, sample, expected, url_):
+        from rhodecode.lib.helpers import urlify_text
+        expected = self._quick_url(expected,
+                                   tmpl="""<a href="%s">%s</a>""", url_=url_)
+        self.assertEqual(urlify_text(sample), expected)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/other/test_validators.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,253 @@
+# -*- coding: utf-8 -*-
+import formencode
+
+from rhodecode.tests import *
+
+from rhodecode.model import validators as v
+from rhodecode.model.users_group import UserGroupModel
+
+from rhodecode.model.meta import Session
+from rhodecode.model.repos_group import ReposGroupModel
+from rhodecode.model.db import ChangesetStatus, Repository
+from rhodecode.model.changeset_status import ChangesetStatusModel
+from rhodecode.tests.fixture import Fixture
+
+fixture = Fixture()
+
+
+class TestReposGroups(BaseTestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        Session.remove()
+
+    def test_Message_extractor(self):
+        validator = v.ValidUsername()
+        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
+
+        class StateObj(object):
+            pass
+
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, 'default', StateObj)
+
+    def test_ValidUsername(self):
+        validator = v.ValidUsername()
+
+        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
+        self.assertRaises(formencode.Invalid, validator.to_python, 'new_user')
+        self.assertRaises(formencode.Invalid, validator.to_python, '.,')
+        self.assertRaises(formencode.Invalid, validator.to_python,
+                          TEST_USER_ADMIN_LOGIN)
+        self.assertEqual('test', validator.to_python('test'))
+
+        validator = v.ValidUsername(edit=True, old_data={'user_id': 1})
+
+    def test_ValidRepoUser(self):
+        validator = v.ValidRepoUser()
+        self.assertRaises(formencode.Invalid, validator.to_python, 'nouser')
+        self.assertEqual(TEST_USER_ADMIN_LOGIN,
+                         validator.to_python(TEST_USER_ADMIN_LOGIN))
+
+    def test_ValidUserGroup(self):
+        validator = v.ValidUserGroup()
+        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
+        self.assertRaises(formencode.Invalid, validator.to_python, '.,')
+
+        gr = fixture.create_user_group('test')
+        gr2 = fixture.create_user_group('tes2')
+        Session().commit()
+        self.assertRaises(formencode.Invalid, validator.to_python, 'test')
+        assert gr.users_group_id is not None
+        validator = v.ValidUserGroup(edit=True,
+                                    old_data={'users_group_id':
+                                              gr2.users_group_id})
+
+        self.assertRaises(formencode.Invalid, validator.to_python, 'test')
+        self.assertRaises(formencode.Invalid, validator.to_python, 'TesT')
+        self.assertRaises(formencode.Invalid, validator.to_python, 'TEST')
+        UserGroupModel().delete(gr)
+        UserGroupModel().delete(gr2)
+        Session().commit()
+
+    def test_ValidReposGroup(self):
+        validator = v.ValidReposGroup()
+        model = ReposGroupModel()
+        self.assertRaises(formencode.Invalid, validator.to_python,
+                          {'group_name': HG_REPO, })
+        gr = model.create(group_name='test_gr', group_description='desc',
+                          parent=None,
+                          just_db=True,
+                          owner=TEST_USER_ADMIN_LOGIN)
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, {'group_name': gr.group_name, })
+
+        validator = v.ValidReposGroup(edit=True,
+                                      old_data={'group_id':  gr.group_id})
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, {
+                                        'group_name': gr.group_name + 'n',
+                                        'group_parent_id': gr.group_id
+                                        })
+        model.delete(gr)
+
+    def test_ValidPassword(self):
+        validator = v.ValidPassword()
+        self.assertEqual('lol', validator.to_python('lol'))
+        self.assertEqual(None, validator.to_python(None))
+        self.assertRaises(formencode.Invalid, validator.to_python, 'ąćżź')
+
+    def test_ValidPasswordsMatch(self):
+        validator = v.ValidPasswordsMatch()
+        self.assertRaises(formencode.Invalid,
+                    validator.to_python, {'password': 'pass',
+                                          'password_confirmation': 'pass2'})
+
+        self.assertRaises(formencode.Invalid,
+                    validator.to_python, {'new_password': 'pass',
+                                          'password_confirmation': 'pass2'})
+
+        self.assertEqual({'new_password': 'pass',
+                          'password_confirmation': 'pass'},
+                    validator.to_python({'new_password': 'pass',
+                                         'password_confirmation': 'pass'}))
+
+        self.assertEqual({'password': 'pass',
+                          'password_confirmation': 'pass'},
+                    validator.to_python({'password': 'pass',
+                                         'password_confirmation': 'pass'}))
+
+    def test_ValidAuth(self):
+        validator = v.ValidAuth()
+        valid_creds = {
+            'username': TEST_USER_REGULAR2_LOGIN,
+            'password': TEST_USER_REGULAR2_PASS,
+        }
+        invalid_creds = {
+            'username': 'err',
+            'password': 'err',
+        }
+        self.assertEqual(valid_creds, validator.to_python(valid_creds))
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, invalid_creds)
+
+    def test_ValidAuthToken(self):
+        validator = v.ValidAuthToken()
+        # this is untestable without a threadlocal
+#        self.assertRaises(formencode.Invalid,
+#                          validator.to_python, 'BadToken')
+        validator
+
+    def test_ValidRepoName(self):
+        validator = v.ValidRepoName()
+
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, {'repo_name': ''})
+
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, {'repo_name': HG_REPO})
+
+        gr = ReposGroupModel().create(group_name='group_test',
+                                      group_description='desc',
+                                      parent=None,
+                                      owner=TEST_USER_ADMIN_LOGIN)
+        self.assertRaises(formencode.Invalid,
+                          validator.to_python, {'repo_name': gr.group_name})
+
+        #TODO: write an error case for that ie. create a repo withinh a group
+#        self.assertRaises(formencode.Invalid,
+#                          validator.to_python, {'repo_name': 'some',
+#                                                'repo_group': gr.group_id})
+
+    def test_ValidForkName(self):
+        # this uses ValidRepoName validator
+        assert True
+
+    @parameterized.expand([
+        ('test', 'test'), ('lolz!', 'lolz'), ('  aavv', 'aavv'),
+        ('ala ma kota', 'ala-ma-kota'), ('@nooo', 'nooo'),
+        ('$!haha lolz !', 'haha-lolz'), ('$$$$$', ''), ('{}OK!', 'OK'),
+        ('/]re po', 're-po')])
+    def test_SlugifyName(self, name, expected):
+        validator = v.SlugifyName()
+        self.assertEqual(expected, validator.to_python(name))
+
+    def test_ValidCloneUri(self):
+            #TODO: write this one
+            pass
+
+    def test_ValidForkType(self):
+            validator = v.ValidForkType(old_data={'repo_type': 'hg'})
+            self.assertEqual('hg', validator.to_python('hg'))
+            self.assertRaises(formencode.Invalid, validator.to_python, 'git')
+
+    def test_ValidPerms(self):
+            #TODO: write this one
+            pass
+
+    def test_ValidSettings(self):
+        validator = v.ValidSettings()
+        self.assertEqual({'pass': 'pass'},
+                         validator.to_python(value={'user': 'test',
+                                                    'pass': 'pass'}))
+
+        self.assertEqual({'user2': 'test', 'pass': 'pass'},
+                         validator.to_python(value={'user2': 'test',
+                                                    'pass': 'pass'}))
+
+    def test_ValidPath(self):
+            validator = v.ValidPath()
+            self.assertEqual(TESTS_TMP_PATH,
+                             validator.to_python(TESTS_TMP_PATH))
+            self.assertRaises(formencode.Invalid, validator.to_python,
+                              '/no_such_dir')
+
+    def test_UniqSystemEmail(self):
+        validator = v.UniqSystemEmail(old_data={})
+
+        self.assertEqual('mail@python.org',
+                         validator.to_python('MaiL@Python.org'))
+
+        email = TEST_USER_REGULAR2_EMAIL
+        self.assertRaises(formencode.Invalid, validator.to_python, email)
+
+    def test_ValidSystemEmail(self):
+        validator = v.ValidSystemEmail()
+        email = TEST_USER_REGULAR2_EMAIL
+
+        self.assertEqual(email, validator.to_python(email))
+        self.assertRaises(formencode.Invalid, validator.to_python, 'err')
+
+    def test_LdapLibValidator(self):
+        if ldap_lib_installed:
+            validator = v.LdapLibValidator()
+            self.assertEqual("DN", validator.to_python('DN'))
+        else:
+            validator = v.LdapLibValidator()
+            self.assertRaises(v.LdapImportError, validator.to_python, 'err')
+
+    def test_AttrLoginValidator(self):
+        validator = v.AttrLoginValidator()
+        self.assertEqual('DN_attr', validator.to_python('DN_attr'))
+
+    def test_NotReviewedRevisions(self):
+        repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
+        validator = v.NotReviewedRevisions(repo_id)
+        rev = '0' * 40
+        # add status for a rev, that should throw an error because it is already
+        # reviewed
+        new_status = ChangesetStatus()
+        new_status.author = ChangesetStatusModel()._get_user(TEST_USER_ADMIN_LOGIN)
+        new_status.repo = ChangesetStatusModel()._get_repo(HG_REPO)
+        new_status.status = ChangesetStatus.STATUS_APPROVED
+        new_status.comment = None
+        new_status.revision = rev
+        Session().add(new_status)
+        Session().commit()
+        try:
+            self.assertRaises(formencode.Invalid, validator.to_python, [rev])
+        finally:
+            Session().delete(new_status)
+            Session().commit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/other/test_vcs_operations.py	Fri Jun 07 00:31:11 2013 +0200
@@ -0,0 +1,507 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.tests.test_scm_operations
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Test suite for making push/pull operations.
+    Run using after doing paster serve test.ini::
+     RC_WHOOSH_TEST_DISABLE=1 RC_NO_TMP_PATH=1 nosetests rhodecode/tests/scripts/test_vcs_operations.py
+
+    You must have git > 1.8.1 for tests to work fine
+
+    :created_on: Dec 30, 2010
+    :author: marcink
+    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import tempfile
+import unittest
+import time
+from os.path import join as jn
+from os.path import dirname as dn
+
+from tempfile import _RandomNameSequence
+from subprocess import Popen, PIPE
+
+from rhodecode.tests import *
+from rhodecode.model.db import User, Repository, UserLog, UserIpMap,\
+    CacheInvalidation
+from rhodecode.model.meta import Session
+from rhodecode.model.repo import RepoModel
+from rhodecode.model.user import UserModel
+
+DEBUG = True
+HOST = '127.0.0.1:5000'  # test host
+
+
+class Command(object):
+
+    def __init__(self, cwd):
+        self.cwd = cwd
+
+    def execute(self, cmd, *args):
+        """
+        Runs command on the system with given ``args``.
+        """
+
+        command = cmd + ' ' + ' '.join(args)
+        if DEBUG:
+            print '*** CMD %s ***' % command
+        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
+        stdout, stderr = p.communicate()
+        if DEBUG:
+            print stdout, stderr
+        return stdout, stderr
+
+
+def _get_tmp_dir():
+    return tempfile.mkdtemp(prefix='rc_integration_test')
+
+
+def _construct_url(repo, dest=None, **kwargs):
+    if dest is None:
+        #make temp clone
+        dest = _get_tmp_dir()
+    params = {
+        'user': TEST_USER_ADMIN_LOGIN,
+        'passwd': TEST_USER_ADMIN_PASS,
+        'host': HOST,
+        'cloned_repo': repo,
+        'dest': dest
+    }
+    params.update(**kwargs)
+    if params['user'] and params['passwd']:
+        _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s %(dest)s' % params
+    else:
+        _url = 'http://(host)s/%(cloned_repo)s %(dest)s' % params
+    return _url
+
+
+def _add_files_and_push(vcs, DEST, **kwargs):
+    """
+    Generate some files, add it to DEST repo and push back
+    vcs is git or hg and defines what VCS we want to make those files for
+
+    :param vcs:
+    :param DEST:
+    """
+    # commit some stuff into this repo
+    cwd = path = jn(DEST)
+    #added_file = jn(path, '%ssetupążźć.py' % _RandomNameSequence().next())
+    added_file = jn(path, '%ssetup.py' % _RandomNameSequence().next())
+    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 = 'Marcin Kuźminski <me@email.com>'
+        if vcs == 'hg':
+            cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
+                i, author_str, added_file
+            )
+        elif vcs == 'git':
+            cmd = """git commit -m 'commited new %s' --author '%s' %s """ % (
+                i, author_str, added_file
+            )
+        Command(cwd).execute(cmd)
+    # PUSH it back
+    if vcs == 'hg':
+        _REPO = HG_REPO
+    elif vcs == 'git':
+        _REPO = GIT_REPO
+
+    kwargs['dest'] = ''
+    clone_url = _construct_url(_REPO, **kwargs)
+    if 'clone_url' in kwargs:
+        clone_url = kwargs['clone_url']
+    if vcs == 'hg':
+        stdout, stderr = Command(cwd).execute('hg push --verbose', clone_url)
+    elif vcs == 'git':
+        stdout, stderr = Command(cwd).execute('git push --verbose', clone_url + " master")
+
+    return stdout, stderr
+
+
+def set_anonymous_access(enable=True):
+    user = User.get_by_username(User.DEFAULT_USER)
+    user.active = enable
+    Session().add(user)
+    Session().commit()
+    print '\tanonymous access is now:', enable
+    if enable != User.get_by_username(User.DEFAULT_USER).active:
+        raise Exception('Cannot set anonymous access')
+
+
+#==============================================================================
+# TESTS
+#==============================================================================
+
+class TestVCSOperations(BaseTestCase):
+
+    @classmethod
+    def setup_class(cls):
+        #DISABLE ANONYMOUS ACCESS
+        set_anonymous_access(False)
+
+    def setUp(self):
+        r = Repository.get_by_repo_name(GIT_REPO)
+        Repository.unlock(r)
+        r.enable_locking = False
+        Session().add(r)
+        Session().commit()
+
+        r = Repository.get_by_repo_name(HG_REPO)
+        Repository.unlock(r)
+        r.enable_locking = False
+        Session().add(r)
+        Session().commit()
+
+    def test_clone_hg_repo_by_admin(self):
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        assert 'requesting all changes' in stdout
+        assert 'adding changesets' in stdout
+        assert 'adding manifests' in stdout
+        assert 'adding file changes' in stdout
+
+        assert stderr == ''
+
+    def test_clone_git_repo_by_admin(self):
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        assert 'Cloning into' in stdout
+        assert stderr == ''
+
+    def test_clone_wrong_credentials_hg(self):
+        clone_url = _construct_url(HG_REPO, passwd='bad!')
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'abort: authorization failed' in stderr
+
+    def test_clone_wrong_credentials_git(self):
+        clone_url = _construct_url(GIT_REPO, passwd='bad!')
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'fatal: Authentication failed' in stderr
+
+    def test_clone_git_dir_as_hg(self):
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_clone_hg_repo_as_git(self):
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'not found:' in stderr
+
+    def test_clone_non_existing_path_hg(self):
+        clone_url = _construct_url('trololo')
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_clone_non_existing_path_git(self):
+        clone_url = _construct_url('trololo')
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        assert 'not found:' in stderr
+
+    def test_push_new_file_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST)
+
+        assert 'pushing to' in stdout
+        assert 'Repository size' in stdout
+        assert 'Last revision is now' in stdout
+
+    def test_push_new_file_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        # commit some stuff into this repo
+        stdout, stderr = _add_files_and_push('git', DEST)
+
+        #WTF git stderr ?!
+        assert 'master -> master' in stderr
+
+    def test_push_invalidates_cache_hg(self):
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==HG_REPO).one()
+        key.cache_active = True
+        Session().add(key)
+        Session().commit()
+
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST, files_no=1)
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==HG_REPO).one()
+        self.assertEqual(key.cache_active, False)
+
+    def test_push_invalidates_cache_git(self):
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==GIT_REPO).one()
+        key.cache_active = True
+        Session().add(key)
+        Session().commit()
+
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        # commit some stuff into this repo
+        stdout, stderr = _add_files_and_push('git', DEST, files_no=1)
+
+        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
+                                               ==GIT_REPO).one()
+        self.assertEqual(key.cache_active, False)
+
+    def test_push_wrong_credentials_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST, user='bad',
+                                             passwd='name')
+
+        assert 'abort: authorization failed' in stderr
+
+    def test_push_wrong_credentials_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('git', DEST, user='bad',
+                                             passwd='name')
+
+        assert 'fatal: Authentication failed' in stderr
+
+    def test_push_back_to_wrong_url_hg(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('hg', DEST,
+                                    clone_url='http://127.0.0.1:5000/tmp',)
+
+        assert 'HTTP Error 404: Not Found' in stderr
+
+    def test_push_back_to_wrong_url_git(self):
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(GIT_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        stdout, stderr = _add_files_and_push('git', DEST,
+                                    clone_url='http://127.0.0.1:5000/tmp',)
+
+        assert 'not found:' in stderr
+
+    def test_clone_and_create_lock_hg(self):
+        # enable locking
+        r = Repository.get_by_repo_name(HG_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        # clone
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #check if lock was made
+        r = Repository.get_by_repo_name(HG_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+    def test_clone_and_create_lock_git(self):
+        # enable locking
+        r = Repository.get_by_repo_name(GIT_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        # clone
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        #check if lock was made
+        r = Repository.get_by_repo_name(GIT_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+    def test_clone_after_repo_was_locked_hg(self):
+        #lock repo
+        r = Repository.get_by_repo_name(HG_REPO)
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+        #pull fails since repo is locked
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
+        assert msg in stderr
+
+    def test_clone_after_repo_was_locked_git(self):
+        #lock repo
+        r = Repository.get_by_repo_name(GIT_REPO)
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+        #pull fails since repo is locked
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+        msg = ("""The requested URL returned error: 423""")
+        assert msg in stderr
+
+    def test_push_on_locked_repo_by_other_user_hg(self):
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #lock repo
+        r = Repository.get_by_repo_name(HG_REPO)
+        # let this user actually push !
+        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
+                                          perm='repository.write')
+        Session().commit()
+        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+
+        #push fails repo is locked by other user !
+        stdout, stderr = _add_files_and_push('hg', DEST,
+                                             user=TEST_USER_REGULAR_LOGIN,
+                                             passwd=TEST_USER_REGULAR_PASS)
+        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
+        assert msg in stderr
+
+#TODO: fix me ! somehow during tests hooks don't get called on GIT
+#    def test_push_on_locked_repo_by_other_user_git(self):
+#        #clone some temp
+#        DEST = _get_tmp_dir()
+#        clone_url = _construct_url(GIT_REPO, dest=DEST)
+#        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+#
+#        #lock repo
+#        r = Repository.get_by_repo_name(GIT_REPO)
+#        # let this user actually push !
+#        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
+#                                          perm='repository.write')
+#        Session().commit()
+#        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
+#
+#        #push fails repo is locked by other user !
+#        stdout, stderr = _add_files_and_push('git', DEST,
+#                                             user=TEST_USER_REGULAR_LOGIN,
+#                                             passwd=TEST_USER_REGULAR_PASS)
+#        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
+#                % (GIT_REPO, TEST_USER_ADMIN_LOGIN))
+#        #TODO: fix this somehow later on GIT, GIT is stupid and even if we throw
+#        # back 423 to it, it makes ANOTHER request and we fail there with 405 :/
+#        msg = "405 Method Not Allowed"
+#        assert msg in stderr
+
+    def test_push_unlocks_repository_hg(self):
+        # enable locking
+        r = Repository.get_by_repo_name(HG_REPO)
+        r.enable_locking = True
+        Session().add(r)
+        Session().commit()
+        #clone some temp
+        DEST = _get_tmp_dir()
+        clone_url = _construct_url(HG_REPO, dest=DEST)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        #check for lock repo after clone
+        r = Repository.get_by_repo_name(HG_REPO)
+        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+
+        #push is ok and repo is now unlocked
+        stdout, stderr = _add_files_and_push('hg', DEST)
+        assert ('remote: Released lock on repo `%s`' % HG_REPO) in stdout
+        #we need to cleanup the Session Here !
+        Session.remove()
+        r = Repository.get_by_repo_name(HG_REPO)
+        assert r.locked == [None, None]
+
+#TODO: fix me ! somehow during tests hooks don't get called on GIT
+#    def test_push_unlocks_repository_git(self):
+#        # enable locking
+#        r = Repository.get_by_repo_name(GIT_REPO)
+#        r.enable_locking = True
+#        Session().add(r)
+#        Session().commit()
+#        #clone some temp
+#        DEST = _get_tmp_dir()
+#        clone_url = _construct_url(GIT_REPO, dest=DEST)
+#        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+#
+#        #check for lock repo after clone
+#        r = Repository.get_by_repo_name(GIT_REPO)
+#        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
+#
+#        #push is ok and repo is now unlocked
+#        stdout, stderr = _add_files_and_push('git', DEST)
+#        #assert ('remote: Released lock on repo `%s`' % GIT_REPO) in stdout
+#        #we need to cleanup the Session Here !
+#        Session.remove()
+#        r = Repository.get_by_repo_name(GIT_REPO)
+#        assert r.locked == [None, None]
+
+    def test_ip_restriction_hg(self):
+        user_model = UserModel()
+        try:
+            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
+            Session().commit()
+            clone_url = _construct_url(HG_REPO)
+            stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+            assert 'abort: HTTP Error 403: Forbidden' in stderr
+        finally:
+            #release IP restrictions
+            for ip in UserIpMap.getAll():
+                UserIpMap.delete(ip.ip_id)
+            Session().commit()
+
+        time.sleep(2)
+        clone_url = _construct_url(HG_REPO)
+        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
+
+        assert 'requesting all changes' in stdout
+        assert 'adding changesets' in stdout
+        assert 'adding manifests' in stdout
+        assert 'adding file changes' in stdout
+
+        assert stderr == ''
+
+    def test_ip_restriction_git(self):
+        user_model = UserModel()
+        try:
+            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
+            Session().commit()
+            clone_url = _construct_url(GIT_REPO)
+            stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+            msg = ("""The requested URL returned error: 403""")
+            assert msg in stderr
+        finally:
+            #release IP restrictions
+            for ip in UserIpMap.getAll():
+                UserIpMap.delete(ip.ip_id)
+            Session().commit()
+
+        time.sleep(2)
+        clone_url = _construct_url(GIT_REPO)
+        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
+
+        assert 'Cloning into' in stdout
+        assert stderr == ''
--- a/rhodecode/tests/scripts/test_concurency.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/scripts/test_concurency.py	Fri Jun 07 00:31:11 2013 +0200
@@ -161,7 +161,7 @@
                                 seq=None, backend='hg'):
     cwd = path = jn(TESTS_TMP_PATH, repo)
 
-    if seq == None:
+    if seq is None:
         seq = _RandomNameSequence().next()
 
     try:
@@ -217,5 +217,4 @@
                                         seq=seq, backend=backend)
         print 'time taken %.3f' % (time.time() - s)
     except Exception, e:
-        raise
         sys.exit('stop on %s' % e)
--- a/rhodecode/tests/scripts/test_vcs_operations.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    rhodecode.tests.test_scm_operations
-    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-    Test suite for making push/pull operations.
-    Run using after doing paster serve test.ini::
-     RC_WHOOSH_TEST_DISABLE=1 RC_NO_TMP_PATH=1 nosetests rhodecode/tests/scripts/test_vcs_operations.py
-
-    You must have git > 1.8.1 for tests to work fine
-
-    :created_on: Dec 30, 2010
-    :author: marcink
-    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
-    :license: GPLv3, see COPYING for more details.
-"""
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-import os
-import tempfile
-import unittest
-import time
-from os.path import join as jn
-from os.path import dirname as dn
-
-from tempfile import _RandomNameSequence
-from subprocess import Popen, PIPE
-
-from rhodecode.tests import *
-from rhodecode.model.db import User, Repository, UserLog, UserIpMap,\
-    CacheInvalidation
-from rhodecode.model.meta import Session
-from rhodecode.model.repo import RepoModel
-from rhodecode.model.user import UserModel
-
-DEBUG = True
-HOST = '127.0.0.1:5000'  # test host
-
-
-class Command(object):
-
-    def __init__(self, cwd):
-        self.cwd = cwd
-
-    def execute(self, cmd, *args):
-        """
-        Runs command on the system with given ``args``.
-        """
-
-        command = cmd + ' ' + ' '.join(args)
-        if DEBUG:
-            print '*** CMD %s ***' % command
-        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
-        stdout, stderr = p.communicate()
-        if DEBUG:
-            print stdout, stderr
-        return stdout, stderr
-
-
-def _get_tmp_dir():
-    return tempfile.mkdtemp(prefix='rc_integration_test')
-
-
-def _construct_url(repo, dest=None, **kwargs):
-    if dest is None:
-        #make temp clone
-        dest = _get_tmp_dir()
-    params = {
-        'user': TEST_USER_ADMIN_LOGIN,
-        'passwd': TEST_USER_ADMIN_PASS,
-        'host': HOST,
-        'cloned_repo': repo,
-        'dest': dest
-    }
-    params.update(**kwargs)
-    if params['user'] and params['passwd']:
-        _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s %(dest)s' % params
-    else:
-        _url = 'http://(host)s/%(cloned_repo)s %(dest)s' % params
-    return _url
-
-
-def _add_files_and_push(vcs, DEST, **kwargs):
-    """
-    Generate some files, add it to DEST repo and push back
-    vcs is git or hg and defines what VCS we want to make those files for
-
-    :param vcs:
-    :param DEST:
-    """
-    # commit some stuff into this repo
-    cwd = path = jn(DEST)
-    #added_file = jn(path, '%ssetupążźć.py' % _RandomNameSequence().next())
-    added_file = jn(path, '%ssetup.py' % _RandomNameSequence().next())
-    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 = 'Marcin Kuźminski <me@email.com>'
-        if vcs == 'hg':
-            cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
-                i, author_str, added_file
-            )
-        elif vcs == 'git':
-            cmd = """git commit -m 'commited new %s' --author '%s' %s """ % (
-                i, author_str, added_file
-            )
-        Command(cwd).execute(cmd)
-    # PUSH it back
-    if vcs == 'hg':
-        _REPO = HG_REPO
-    elif vcs == 'git':
-        _REPO = GIT_REPO
-
-    kwargs['dest'] = ''
-    clone_url = _construct_url(_REPO, **kwargs)
-    if 'clone_url' in kwargs:
-        clone_url = kwargs['clone_url']
-    if vcs == 'hg':
-        stdout, stderr = Command(cwd).execute('hg push --verbose', clone_url)
-    elif vcs == 'git':
-        stdout, stderr = Command(cwd).execute('git push --verbose', clone_url + " master")
-
-    return stdout, stderr
-
-
-def set_anonymous_access(enable=True):
-    user = User.get_by_username(User.DEFAULT_USER)
-    user.active = enable
-    Session().add(user)
-    Session().commit()
-    print '\tanonymous access is now:', enable
-    if enable != User.get_by_username(User.DEFAULT_USER).active:
-        raise Exception('Cannot set anonymous access')
-
-
-#==============================================================================
-# TESTS
-#==============================================================================
-
-class TestVCSOperations(unittest.TestCase):
-
-    @classmethod
-    def setup_class(cls):
-        #DISABLE ANONYMOUS ACCESS
-        set_anonymous_access(False)
-
-    def setUp(self):
-        r = Repository.get_by_repo_name(GIT_REPO)
-        Repository.unlock(r)
-        r.enable_locking = False
-        Session().add(r)
-        Session().commit()
-
-        r = Repository.get_by_repo_name(HG_REPO)
-        Repository.unlock(r)
-        r.enable_locking = False
-        Session().add(r)
-        Session().commit()
-
-    def test_clone_hg_repo_by_admin(self):
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        assert 'requesting all changes' in stdout
-        assert 'adding changesets' in stdout
-        assert 'adding manifests' in stdout
-        assert 'adding file changes' in stdout
-
-        assert stderr == ''
-
-    def test_clone_git_repo_by_admin(self):
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        assert 'Cloning into' in stdout
-        assert stderr == ''
-
-    def test_clone_wrong_credentials_hg(self):
-        clone_url = _construct_url(HG_REPO, passwd='bad!')
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'abort: authorization failed' in stderr
-
-    def test_clone_wrong_credentials_git(self):
-        clone_url = _construct_url(GIT_REPO, passwd='bad!')
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'fatal: Authentication failed' in stderr
-
-    def test_clone_git_dir_as_hg(self):
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_clone_hg_repo_as_git(self):
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'not found:' in stderr
-
-    def test_clone_non_existing_path_hg(self):
-        clone_url = _construct_url('trololo')
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_clone_non_existing_path_git(self):
-        clone_url = _construct_url('trololo')
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        assert 'not found:' in stderr
-
-    def test_push_new_file_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST)
-
-        assert 'pushing to' in stdout
-        assert 'Repository size' in stdout
-        assert 'Last revision is now' in stdout
-
-    def test_push_new_file_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        # commit some stuff into this repo
-        stdout, stderr = _add_files_and_push('git', DEST)
-
-        #WTF git stderr ?!
-        assert 'master -> master' in stderr
-
-    def test_push_invalidates_cache_hg(self):
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==HG_REPO).one()
-        key.cache_active = True
-        Session().add(key)
-        Session().commit()
-
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST, files_no=1)
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==HG_REPO).one()
-        self.assertEqual(key.cache_active, False)
-
-    def test_push_invalidates_cache_git(self):
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==GIT_REPO).one()
-        key.cache_active = True
-        Session().add(key)
-        Session().commit()
-
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        # commit some stuff into this repo
-        stdout, stderr = _add_files_and_push('git', DEST, files_no=1)
-
-        key = CacheInvalidation.query().filter(CacheInvalidation.cache_key
-                                               ==GIT_REPO).one()
-        self.assertEqual(key.cache_active, False)
-
-    def test_push_wrong_credentials_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST, user='bad',
-                                             passwd='name')
-
-        assert 'abort: authorization failed' in stderr
-
-    def test_push_wrong_credentials_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('git', DEST, user='bad',
-                                             passwd='name')
-
-        assert 'fatal: Authentication failed' in stderr
-
-    def test_push_back_to_wrong_url_hg(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('hg', DEST,
-                                    clone_url='http://127.0.0.1:5000/tmp',)
-
-        assert 'HTTP Error 404: Not Found' in stderr
-
-    def test_push_back_to_wrong_url_git(self):
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(GIT_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        stdout, stderr = _add_files_and_push('git', DEST,
-                                    clone_url='http://127.0.0.1:5000/tmp',)
-
-        assert 'not found:' in stderr
-
-    def test_clone_and_create_lock_hg(self):
-        # enable locking
-        r = Repository.get_by_repo_name(HG_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        # clone
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #check if lock was made
-        r = Repository.get_by_repo_name(HG_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-    def test_clone_and_create_lock_git(self):
-        # enable locking
-        r = Repository.get_by_repo_name(GIT_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        # clone
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        #check if lock was made
-        r = Repository.get_by_repo_name(GIT_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-    def test_clone_after_repo_was_locked_hg(self):
-        #lock repo
-        r = Repository.get_by_repo_name(HG_REPO)
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-        #pull fails since repo is locked
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
-        assert msg in stderr
-
-    def test_clone_after_repo_was_locked_git(self):
-        #lock repo
-        r = Repository.get_by_repo_name(GIT_REPO)
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-        #pull fails since repo is locked
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-        msg = ("""The requested URL returned error: 423""")
-        assert msg in stderr
-
-    def test_push_on_locked_repo_by_other_user_hg(self):
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #lock repo
-        r = Repository.get_by_repo_name(HG_REPO)
-        # let this user actually push !
-        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
-                                          perm='repository.write')
-        Session().commit()
-        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-
-        #push fails repo is locked by other user !
-        stdout, stderr = _add_files_and_push('hg', DEST,
-                                             user=TEST_USER_REGULAR_LOGIN,
-                                             passwd=TEST_USER_REGULAR_PASS)
-        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-                % (HG_REPO, TEST_USER_ADMIN_LOGIN))
-        assert msg in stderr
-
-#TODO: fix me ! somehow during tests hooks don't get called on GIT
-#    def test_push_on_locked_repo_by_other_user_git(self):
-#        #clone some temp
-#        DEST = _get_tmp_dir()
-#        clone_url = _construct_url(GIT_REPO, dest=DEST)
-#        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-#
-#        #lock repo
-#        r = Repository.get_by_repo_name(GIT_REPO)
-#        # let this user actually push !
-#        RepoModel().grant_user_permission(repo=r, user=TEST_USER_REGULAR_LOGIN,
-#                                          perm='repository.write')
-#        Session().commit()
-#        Repository.lock(r, User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id)
-#
-#        #push fails repo is locked by other user !
-#        stdout, stderr = _add_files_and_push('git', DEST,
-#                                             user=TEST_USER_REGULAR_LOGIN,
-#                                             passwd=TEST_USER_REGULAR_PASS)
-#        msg = ("""abort: HTTP Error 423: Repository `%s` locked by user `%s`"""
-#                % (GIT_REPO, TEST_USER_ADMIN_LOGIN))
-#        #TODO: fix this somehow later on GIT, GIT is stupid and even if we throw
-#        # back 423 to it, it makes ANOTHER request and we fail there with 405 :/
-#        msg = "405 Method Not Allowed"
-#        assert msg in stderr
-
-    def test_push_unlocks_repository_hg(self):
-        # enable locking
-        r = Repository.get_by_repo_name(HG_REPO)
-        r.enable_locking = True
-        Session().add(r)
-        Session().commit()
-        #clone some temp
-        DEST = _get_tmp_dir()
-        clone_url = _construct_url(HG_REPO, dest=DEST)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        #check for lock repo after clone
-        r = Repository.get_by_repo_name(HG_REPO)
-        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-
-        #push is ok and repo is now unlocked
-        stdout, stderr = _add_files_and_push('hg', DEST)
-        assert ('remote: Released lock on repo `%s`' % HG_REPO) in stdout
-        #we need to cleanup the Session Here !
-        Session.remove()
-        r = Repository.get_by_repo_name(HG_REPO)
-        assert r.locked == [None, None]
-
-#TODO: fix me ! somehow during tests hooks don't get called on GIT
-#    def test_push_unlocks_repository_git(self):
-#        # enable locking
-#        r = Repository.get_by_repo_name(GIT_REPO)
-#        r.enable_locking = True
-#        Session().add(r)
-#        Session().commit()
-#        #clone some temp
-#        DEST = _get_tmp_dir()
-#        clone_url = _construct_url(GIT_REPO, dest=DEST)
-#        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-#
-#        #check for lock repo after clone
-#        r = Repository.get_by_repo_name(GIT_REPO)
-#        assert r.locked[0] == User.get_by_username(TEST_USER_ADMIN_LOGIN).user_id
-#
-#        #push is ok and repo is now unlocked
-#        stdout, stderr = _add_files_and_push('git', DEST)
-#        #assert ('remote: Released lock on repo `%s`' % GIT_REPO) in stdout
-#        #we need to cleanup the Session Here !
-#        Session.remove()
-#        r = Repository.get_by_repo_name(GIT_REPO)
-#        assert r.locked == [None, None]
-
-    def test_ip_restriction_hg(self):
-        user_model = UserModel()
-        try:
-            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
-            Session().commit()
-            clone_url = _construct_url(HG_REPO)
-            stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-            assert 'abort: HTTP Error 403: Forbidden' in stderr
-        finally:
-            #release IP restrictions
-            for ip in UserIpMap.getAll():
-                UserIpMap.delete(ip.ip_id)
-            Session().commit()
-
-        time.sleep(2)
-        clone_url = _construct_url(HG_REPO)
-        stdout, stderr = Command('/tmp').execute('hg clone', clone_url)
-
-        assert 'requesting all changes' in stdout
-        assert 'adding changesets' in stdout
-        assert 'adding manifests' in stdout
-        assert 'adding file changes' in stdout
-
-        assert stderr == ''
-
-    def test_ip_restriction_git(self):
-        user_model = UserModel()
-        try:
-            user_model.add_extra_ip(TEST_USER_ADMIN_LOGIN, '10.10.10.10/32')
-            Session().commit()
-            clone_url = _construct_url(GIT_REPO)
-            stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-            msg = ("""The requested URL returned error: 403""")
-            assert msg in stderr
-        finally:
-            #release IP restrictions
-            for ip in UserIpMap.getAll():
-                UserIpMap.delete(ip.ip_id)
-            Session().commit()
-
-        time.sleep(2)
-        clone_url = _construct_url(GIT_REPO)
-        stdout, stderr = Command('/tmp').execute('git clone', clone_url)
-
-        assert 'Cloning into' in stdout
-        assert stderr == ''
--- a/rhodecode/tests/test_libs.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    rhodecode.tests.test_libs
-    ~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-    Package for testing various lib/helper functions in rhodecode
-
-    :created_on: Jun 9, 2011
-    :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
-    :license: GPLv3, see COPYING for more details.
-"""
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-from __future__ import with_statement
-import unittest
-import datetime
-import hashlib
-import mock
-from rhodecode.tests import *
-
-proto = 'http'
-TEST_URLS = [
-    ('%s://127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
-     '%s://127.0.0.1' % proto),
-    ('%s://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
-     '%s://127.0.0.1' % proto),
-    ('%s://marcink: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',
-                                                '8080'],
-     '%s://domain.org: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://marcink@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
-     '%s://127.0.0.1' % proto),
-    ('%s://marcink: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',
-                                                '8080'],
-     '%s://domain.org:8080' % proto),
-]
-
-
-class TestLibs(unittest.TestCase):
-
-    @parameterized.expand(TEST_URLS)
-    def test_uri_filter(self, test_url, expected, expected_creds):
-        from rhodecode.lib.utils2 import uri_filter
-        self.assertEqual(uri_filter(test_url), expected)
-
-    @parameterized.expand(TEST_URLS)
-    def test_credentials_filter(self, test_url, expected, expected_creds):
-        from rhodecode.lib.utils2 import credentials_filter
-        self.assertEqual(credentials_filter(test_url), expected_creds)
-
-    @parameterized.expand([('t', True),
-                           ('true', True),
-                           ('y', True),
-                           ('yes', True),
-                           ('on', True),
-                           ('1', True),
-                           ('Y', True),
-                           ('yeS', True),
-                           ('Y', True),
-                           ('TRUE', True),
-                           ('T', True),
-                           ('False', False),
-                           ('F', False),
-                           ('FALSE', False),
-                           ('0', False),
-                           ('-1', False),
-                           ('', False)
-    ])
-    def test_str2bool(self, str_bool, expected):
-        from rhodecode.lib.utils2 import str2bool
-        self.assertEqual(str2bool(str_bool), expected)
-
-    def test_mention_extractor(self):
-        from rhodecode.lib.utils2 import extract_mentioned_users
-        sample = (
-            "@first hi there @marcink here's my email marcin@email.com "
-            "@lukaszb check @one_more22 it pls @ ttwelve @D[] @one@two@three "
-            "@MARCIN    @maRCiN @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"
-        )
-
-        s = sorted([
-        'first', 'marcink', 'lukaszb', 'one_more22', 'MARCIN', 'maRCiN', 'john',
-        'marian.user', 'marco-polo', 'marco_polo'
-        ], key=lambda k: k.lower())
-        self.assertEqual(s, extract_mentioned_users(sample))
-
-    @parameterized.expand([
-        (dict(), u'just now'),
-        (dict(seconds= -1), u'1 second ago'),
-        (dict(seconds= -60 * 2), u'2 minutes ago'),
-        (dict(hours= -1), u'1 hour ago'),
-        (dict(hours= -24), u'1 day ago'),
-        (dict(hours= -24 * 5), u'5 days ago'),
-        (dict(months= -1), u'1 month ago'),
-        (dict(months= -1, days= -2), u'1 month and 2 days ago'),
-        (dict(years= -1, months= -1), u'1 year and 1 month ago'),
-    ])
-    def test_age(self, age_args, expected):
-        from rhodecode.lib.utils2 import age
-        from dateutil import relativedelta
-        n = datetime.datetime(year=2012, month=5, day=17)
-        delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
-        self.assertEqual(age(n + delt(**age_args), now=n), expected)
-
-    @parameterized.expand([
-
-        (dict(), u'just now'),
-        (dict(seconds=1), u'in 1 second'),
-        (dict(seconds=60 * 2), u'in 2 minutes'),
-        (dict(hours=1), u'in 1 hour'),
-        (dict(hours=24), u'in 1 day'),
-        (dict(hours=24 * 5), u'in 5 days'),
-        (dict(months=1), u'in 1 month'),
-        (dict(months=1, days=1), u'in 1 month and 1 day'),
-        (dict(years=1, months=1), u'in 1 year and 1 month')
-    ])
-    def test_age_in_future(self, age_args, expected):
-        from rhodecode.lib.utils2 import age
-        from dateutil import relativedelta
-        n = datetime.datetime(year=2012, month=5, day=17)
-        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 => url] [lang => python] [just a tag]"
-            "[,d] [ => ULR ] [obsolete] [desc]]"
-        )
-        from rhodecode.lib.helpers import desc_stylize
-        res = desc_stylize(sample)
-        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
-        self.assertTrue('<div class="metatag" tag="obsolete">obsolete</div>' in res)
-        self.assertTrue('<div class="metatag" tag="stale">stale</div>' in res)
-        self.assertTrue('<div class="metatag" tag="lang">python</div>' in res)
-        self.assertTrue('<div class="metatag" tag="requires">requires =&gt; <a href="/url">url</a></div>' in res)
-        self.assertTrue('<div class="metatag" tag="tag">tag</div>' in res)
-
-    def test_alternative_gravatar(self):
-        from rhodecode.lib.helpers import gravatar_url
-        _md5 = lambda s: hashlib.md5(s).hexdigest()
-
-        def fake_conf(**kwargs):
-            from pylons import config
-            config['app_conf'] = {}
-            config['app_conf']['use_gravatar'] = True
-            config['app_conf'].update(kwargs)
-            return config
-
-        class fake_url():
-            @classmethod
-            def current(cls, *args, **kwargs):
-                return 'https://server.com'
-
-        with mock.patch('pylons.url', fake_url):
-            fake = fake_conf(alternative_gravatar_url='http://test.com/{email}')
-            with mock.patch('pylons.config', 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'
-
-            fake = fake_conf(alternative_gravatar_url='http://test.com/{email}')
-            with mock.patch('pylons.config', fake):
-                grav = gravatar_url(email_address='test@foo.com', size=24)
-                assert grav == 'http://test.com/test@foo.com'
-
-            fake = fake_conf(alternative_gravatar_url='http://test.com/{md5email}')
-            with mock.patch('pylons.config', fake):
-                em = 'test@foo.com'
-                grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'http://test.com/%s' % (_md5(em))
-
-            fake = fake_conf(alternative_gravatar_url='http://test.com/{md5email}/{size}')
-            with mock.patch('pylons.config', fake):
-                em = 'test@foo.com'
-                grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'http://test.com/%s/%s' % (_md5(em), 24)
-
-            fake = fake_conf(alternative_gravatar_url='{scheme}://{netloc}/{md5email}/{size}')
-            with mock.patch('pylons.config', fake):
-                em = 'test@foo.com'
-                grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'https://server.com/%s/%s' % (_md5(em), 24)
-
-    def _quick_url(self, text, tmpl="""<a class="revision-link" href="%s">%s</a>""", url_=None):
-        """
-        Changes `some text url[foo]` => `some text <a href="/">foo</a>
-
-        :param text:
-        """
-        import re
-        # quickly change expected url[] into a link
-        URL_PAT = re.compile(r'(?:url\[)(.+?)(?:\])')
-
-        def url_func(match_obj):
-            _url = match_obj.groups()[0]
-            return tmpl % (url_ or '/some-url', _url)
-        return URL_PAT.sub(url_func, text)
-
-    @parameterized.expand([
-      ("",
-       ""),
-      ("git-svn-id: https://svn.apache.org/repos/asf/libcloud/trunk@1441655 13f79535-47bb-0310-9956-ffa450edef68",
-       "git-svn-id: https://svn.apache.org/repos/asf/libcloud/trunk@1441655 13f79535-47bb-0310-9956-ffa450edef68"),
-      ("from rev 000000000000",
-       "from rev url[000000000000]"),
-      ("from rev 000000000000123123 also rev 000000000000",
-       "from rev url[000000000000123123] also rev url[000000000000]"),
-      ("this should-000 00",
-       "this should-000 00"),
-      ("longtextffffffffff rev 123123123123",
-       "longtextffffffffff rev url[123123123123]"),
-      ("rev ffffffffffffffffffffffffffffffffffffffffffffffffff",
-       "rev ffffffffffffffffffffffffffffffffffffffffffffffffff"),
-      ("ffffffffffff some text traalaa",
-       "url[ffffffffffff] some text traalaa"),
-       ("""Multi line
-       123123123123
-       some text 123123123123
-       sometimes !
-       """,
-       """Multi line
-       url[123123123123]
-       some text url[123123123123]
-       sometimes !
-       """)
-    ])
-    def test_urlify_changesets(self, sample, expected):
-        def fake_url(self, *args, **kwargs):
-            return '/some-url'
-
-        expected = self._quick_url(expected)
-
-        with mock.patch('pylons.url', fake_url):
-            from rhodecode.lib.helpers import urlify_changesets
-            self.assertEqual(urlify_changesets(sample, 'repo_name'), expected)
-
-    @parameterized.expand([
-      ("",
-       "",
-       ""),
-      ("https://svn.apache.org/repos",
-       "url[https://svn.apache.org/repos]",
-       "https://svn.apache.org/repos"),
-      ("http://svn.apache.org/repos",
-       "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
-       some text lalala""",
-       """Multi line
-       url[https://foo.bar.com]
-       some text lalala""",
-       "https://foo.bar.com")
-    ])
-    def test_urlify_test(self, sample, expected, url_):
-        from rhodecode.lib.helpers import urlify_text
-        expected = self._quick_url(expected,
-                                   tmpl="""<a href="%s">%s</a>""", url_=url_)
-        self.assertEqual(urlify_text(sample), expected)
--- a/rhodecode/tests/test_validators.py	Mon May 20 12:26:09 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,252 +0,0 @@
-# -*- coding: utf-8 -*-
-import unittest
-import formencode
-
-from rhodecode.tests import *
-
-from rhodecode.model import validators as v
-from rhodecode.model.users_group import UserGroupModel
-
-from rhodecode.model.meta import Session
-from rhodecode.model.repos_group import ReposGroupModel
-from rhodecode.config.routing import ADMIN_PREFIX
-from rhodecode.model.db import ChangesetStatus, Repository
-from rhodecode.model.changeset_status import ChangesetStatusModel
-
-
-class TestReposGroups(unittest.TestCase):
-
-    def setUp(self):
-        pass
-
-    def tearDown(self):
-        Session.remove()
-
-    def test_Message_extractor(self):
-        validator = v.ValidUsername()
-        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
-
-        class StateObj(object):
-            pass
-
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, 'default', StateObj)
-
-    def test_ValidUsername(self):
-        validator = v.ValidUsername()
-
-        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
-        self.assertRaises(formencode.Invalid, validator.to_python, 'new_user')
-        self.assertRaises(formencode.Invalid, validator.to_python, '.,')
-        self.assertRaises(formencode.Invalid, validator.to_python,
-                          TEST_USER_ADMIN_LOGIN)
-        self.assertEqual('test', validator.to_python('test'))
-
-        validator = v.ValidUsername(edit=True, old_data={'user_id': 1})
-
-    def test_ValidRepoUser(self):
-        validator = v.ValidRepoUser()
-        self.assertRaises(formencode.Invalid, validator.to_python, 'nouser')
-        self.assertEqual(TEST_USER_ADMIN_LOGIN,
-                         validator.to_python(TEST_USER_ADMIN_LOGIN))
-
-    def test_ValidUserGroup(self):
-        validator = v.ValidUserGroup()
-        self.assertRaises(formencode.Invalid, validator.to_python, 'default')
-        self.assertRaises(formencode.Invalid, validator.to_python, '.,')
-
-        gr = UserGroupModel().create('test')
-        gr2 = UserGroupModel().create('tes2')
-        Session.commit()
-        self.assertRaises(formencode.Invalid, validator.to_python, 'test')
-        assert gr.users_group_id != None
-        validator = v.ValidUserGroup(edit=True,
-                                    old_data={'users_group_id':
-                                              gr2.users_group_id})
-
-        self.assertRaises(formencode.Invalid, validator.to_python, 'test')
-        self.assertRaises(formencode.Invalid, validator.to_python, 'TesT')
-        self.assertRaises(formencode.Invalid, validator.to_python, 'TEST')
-        UserGroupModel().delete(gr)
-        UserGroupModel().delete(gr2)
-        Session.commit()
-
-    def test_ValidReposGroup(self):
-        validator = v.ValidReposGroup()
-        model = ReposGroupModel()
-        self.assertRaises(formencode.Invalid, validator.to_python,
-                          {'group_name': HG_REPO, })
-        gr = model.create(group_name='test_gr', group_description='desc',
-                          parent=None,
-                          just_db=True,
-                          owner=TEST_USER_ADMIN_LOGIN)
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, {'group_name': gr.group_name, })
-
-        validator = v.ValidReposGroup(edit=True,
-                                      old_data={'group_id':  gr.group_id})
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, {
-                                        'group_name': gr.group_name + 'n',
-                                        'group_parent_id': gr.group_id
-                                        })
-        model.delete(gr)
-
-    def test_ValidPassword(self):
-        validator = v.ValidPassword()
-        self.assertEqual('lol', validator.to_python('lol'))
-        self.assertEqual(None, validator.to_python(None))
-        self.assertRaises(formencode.Invalid, validator.to_python, 'ąćżź')
-
-    def test_ValidPasswordsMatch(self):
-        validator = v.ValidPasswordsMatch()
-        self.assertRaises(formencode.Invalid,
-                    validator.to_python, {'password': 'pass',
-                                          'password_confirmation': 'pass2'})
-
-        self.assertRaises(formencode.Invalid,
-                    validator.to_python, {'new_password': 'pass',
-                                          'password_confirmation': 'pass2'})
-
-        self.assertEqual({'new_password': 'pass',
-                          'password_confirmation': 'pass'},
-                    validator.to_python({'new_password': 'pass',
-                                         'password_confirmation': 'pass'}))
-
-        self.assertEqual({'password': 'pass',
-                          'password_confirmation': 'pass'},
-                    validator.to_python({'password': 'pass',
-                                         'password_confirmation': 'pass'}))
-
-    def test_ValidAuth(self):
-        validator = v.ValidAuth()
-        valid_creds = {
-            'username': TEST_USER_REGULAR2_LOGIN,
-            'password': TEST_USER_REGULAR2_PASS,
-        }
-        invalid_creds = {
-            'username': 'err',
-            'password': 'err',
-        }
-        self.assertEqual(valid_creds, validator.to_python(valid_creds))
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, invalid_creds)
-
-    def test_ValidAuthToken(self):
-        validator = v.ValidAuthToken()
-        # this is untestable without a threadlocal
-#        self.assertRaises(formencode.Invalid,
-#                          validator.to_python, 'BadToken')
-        validator
-
-    def test_ValidRepoName(self):
-        validator = v.ValidRepoName()
-
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, {'repo_name': ''})
-
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, {'repo_name': HG_REPO})
-
-        gr = ReposGroupModel().create(group_name='group_test',
-                                      group_description='desc',
-                                      parent=None,
-                                      owner=TEST_USER_ADMIN_LOGIN)
-        self.assertRaises(formencode.Invalid,
-                          validator.to_python, {'repo_name': gr.group_name})
-
-        #TODO: write an error case for that ie. create a repo withinh a group
-#        self.assertRaises(formencode.Invalid,
-#                          validator.to_python, {'repo_name': 'some',
-#                                                'repo_group': gr.group_id})
-
-    def test_ValidForkName(self):
-        # this uses ValidRepoName validator
-        assert True
-
-    @parameterized.expand([
-        ('test', 'test'), ('lolz!', 'lolz'), ('  aavv', 'aavv'),
-        ('ala ma kota', 'ala-ma-kota'), ('@nooo', 'nooo'),
-        ('$!haha lolz !', 'haha-lolz'), ('$$$$$', ''), ('{}OK!', 'OK'),
-        ('/]re po', 're-po')])
-    def test_SlugifyName(self, name, expected):
-        validator = v.SlugifyName()
-        self.assertEqual(expected, validator.to_python(name))
-
-    def test_ValidCloneUri(self):
-            #TODO: write this one
-            pass
-
-    def test_ValidForkType(self):
-            validator = v.ValidForkType(old_data={'repo_type': 'hg'})
-            self.assertEqual('hg', validator.to_python('hg'))
-            self.assertRaises(formencode.Invalid, validator.to_python, 'git')
-
-    def test_ValidPerms(self):
-            #TODO: write this one
-            pass
-
-    def test_ValidSettings(self):
-        validator = v.ValidSettings()
-        self.assertEqual({'pass': 'pass'},
-                         validator.to_python(value={'user': 'test',
-                                                    'pass': 'pass'}))
-
-        self.assertEqual({'user2': 'test', 'pass': 'pass'},
-                         validator.to_python(value={'user2': 'test',
-                                                    'pass': 'pass'}))
-
-    def test_ValidPath(self):
-            validator = v.ValidPath()
-            self.assertEqual(TESTS_TMP_PATH,
-                             validator.to_python(TESTS_TMP_PATH))
-            self.assertRaises(formencode.Invalid, validator.to_python,
-                              '/no_such_dir')
-
-    def test_UniqSystemEmail(self):
-        validator = v.UniqSystemEmail(old_data={})
-
-        self.assertEqual('mail@python.org',
-                         validator.to_python('MaiL@Python.org'))
-
-        email = TEST_USER_REGULAR2_EMAIL
-        self.assertRaises(formencode.Invalid, validator.to_python, email)
-
-    def test_ValidSystemEmail(self):
-        validator = v.ValidSystemEmail()
-        email = TEST_USER_REGULAR2_EMAIL
-
-        self.assertEqual(email, validator.to_python(email))
-        self.assertRaises(formencode.Invalid, validator.to_python, 'err')
-
-    def test_LdapLibValidator(self):
-        if ldap_lib_installed:
-            validator = v.LdapLibValidator()
-            self.assertEqual("DN", validator.to_python('DN'))
-        else:
-            validator = v.LdapLibValidator()
-            self.assertRaises(v.LdapImportError, validator.to_python, 'err')
-
-    def test_AttrLoginValidator(self):
-        validator = v.AttrLoginValidator()
-        self.assertEqual('DN_attr', validator.to_python('DN_attr'))
-
-    def test_NotReviewedRevisions(self):
-        repo_id = Repository.get_by_repo_name(HG_REPO).repo_id
-        validator = v.NotReviewedRevisions(repo_id)
-        rev = '0' * 40
-        # add status for a rev, that should throw an error because it is already
-        # reviewed
-        new_status = ChangesetStatus()
-        new_status.author = ChangesetStatusModel()._get_user(TEST_USER_ADMIN_LOGIN)
-        new_status.repo = ChangesetStatusModel()._get_repo(HG_REPO)
-        new_status.status = ChangesetStatus.STATUS_APPROVED
-        new_status.comment = None
-        new_status.revision = rev
-        Session().add(new_status)
-        Session().commit()
-        try:
-            self.assertRaises(formencode.Invalid, validator.to_python, [rev])
-        finally:
-            Session().delete(new_status)
-            Session().commit()
--- a/rhodecode/tests/vcs/__init__.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/__init__.py	Fri Jun 07 00:31:11 2013 +0200
@@ -19,10 +19,10 @@
 .. _unittest: http://pypi.python.org/pypi/unittest
 
 """
-import os
-from rhodecode.lib import vcs
 from rhodecode.lib.vcs.utils.compat import unittest
-from utils import VCSTestError, SCMFetcher
+from rhodecode.tests.vcs.conf import *
+from rhodecode.tests.vcs.utils import VCSTestError, SCMFetcher
+
 from rhodecode.tests import *
 
 
@@ -36,7 +36,7 @@
             'alias': 'hg',
             'test_repo_path': TEST_HG_REPO,
             'remote_repo': HG_REMOTE_REPO,
-            'clone_cmd': 'hg clone',
+            'clone_cmd': 'hg clone --insecure',
         },
         'git': {
             'alias': 'git',
@@ -52,5 +52,16 @@
     except VCSTestError, err:
         raise RuntimeError(str(err))
 
-#start_dir = os.path.abspath(os.path.dirname(__file__))
-#unittest.defaultTestLoader.discover(start_dir)
+
+def collector():
+    setup_package()
+    start_dir = os.path.abspath(os.path.dirname(__file__))
+    return unittest.defaultTestLoader.discover(start_dir)
+
+
+def main():
+    collector()
+    unittest.main()
+
+#if __name__ == '__main__':
+#    main()
--- a/rhodecode/tests/vcs/base.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/base.py	Fri Jun 07 00:31:11 2013 +0200
@@ -3,14 +3,13 @@
 InMemoryChangeset class is working properly at backend class.
 """
 import os
-from rhodecode.lib import vcs
 import time
 import shutil
 import datetime
-from rhodecode.lib.vcs.utils.compat import unittest
+from rhodecode.tests.vcs.conf import SCM_TESTS, get_new_dir
 
-from conf import SCM_TESTS, get_new_dir
-
+from rhodecode.lib import vcs
+from rhodecode.lib.vcs.utils.compat import unittest
 from rhodecode.lib.vcs.nodes import FileNode
 
 
@@ -68,6 +67,7 @@
         cls.repo_path = get_new_dir(str(time.time()))
         cls.repo = Backend(cls.repo_path, create=True)
         cls.imc = cls.repo.in_memory_changeset
+        cls.default_branch = cls.repo.DEFAULT_BRANCH_NAME
 
         for commit in cls._get_commits():
             for node in commit.get('added', []):
--- a/rhodecode/tests/vcs/conf.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/conf.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,64 +1,65 @@
 """
 Unit tests configuration module for vcs.
 """
-
 import os
 import time
 import hashlib
 import tempfile
 import datetime
 import shutil
-from rhodecode.tests import *
 from utils import get_normalized_path
 from os.path import join as jn
 
-TEST_TMP_PATH = TESTS_TMP_PATH
-#__all__ = (
-#    'TEST_HG_REPO', 'TEST_GIT_REPO', 'HG_REMOTE_REPO', 'GIT_REMOTE_REPO',
-#    'SCM_TESTS',
-#)
-#
-#SCM_TESTS = ['hg', 'git']
-#uniq_suffix = str(int(time.mktime(datetime.datetime.now().timetuple())))
-#
+__all__ = (
+    'TEST_HG_REPO', 'TEST_GIT_REPO', 'HG_REMOTE_REPO', 'GIT_REMOTE_REPO',
+    'SCM_TESTS',
+)
+
+SCM_TESTS = ['hg', 'git']
+uniq_suffix = str(int(time.mktime(datetime.datetime.now().timetuple())))
+
 THIS = os.path.abspath(os.path.dirname(__file__))
-#
-#GIT_REMOTE_REPO = 'git://github.com/codeinn/vcs.git'
-#
-#TEST_TMP_PATH = os.environ.get('VCS_TEST_ROOT', '/tmp')
-#TEST_GIT_REPO = os.environ.get('VCS_TEST_GIT_REPO',
-#                              jn(TEST_TMP_PATH, 'vcs-git'))
-#TEST_GIT_REPO_CLONE = os.environ.get('VCS_TEST_GIT_REPO_CLONE',
-#                            jn(TEST_TMP_PATH, 'vcsgitclone%s' % uniq_suffix))
-#TEST_GIT_REPO_PULL = os.environ.get('VCS_TEST_GIT_REPO_PULL',
-#                            jn(TEST_TMP_PATH, 'vcsgitpull%s' % uniq_suffix))
-#
-#HG_REMOTE_REPO = 'http://bitbucket.org/marcinkuzminski/vcs'
-#TEST_HG_REPO = os.environ.get('VCS_TEST_HG_REPO',
-#                              jn(TEST_TMP_PATH, 'vcs-hg'))
-#TEST_HG_REPO_CLONE = os.environ.get('VCS_TEST_HG_REPO_CLONE',
-#                              jn(TEST_TMP_PATH, 'vcshgclone%s' % uniq_suffix))
-#TEST_HG_REPO_PULL = os.environ.get('VCS_TEST_HG_REPO_PULL',
-#                              jn(TEST_TMP_PATH, 'vcshgpull%s' % uniq_suffix))
-#
-#TEST_DIR = os.environ.get('VCS_TEST_ROOT', tempfile.gettempdir())
-#TEST_REPO_PREFIX = 'vcs-test'
-#
-#
-#def get_new_dir(title):
-#    """
-#    Returns always new directory path.
-#    """
-#    name = TEST_REPO_PREFIX
-#    if title:
-#        name = '-'.join((name, title))
-#    hex = hashlib.sha1(str(time.time())).hexdigest()
-#    name = '-'.join((name, hex))
-#    path = os.path.join(TEST_DIR, name)
-#    return get_normalized_path(path)
+
+GIT_REMOTE_REPO = 'git://github.com/codeinn/vcs.git'
+
+TEST_TMP_PATH = os.environ.get('VCS_TEST_ROOT', '/tmp')
+TEST_GIT_REPO = os.environ.get('VCS_TEST_GIT_REPO',
+                              jn(TEST_TMP_PATH, 'vcs-git'))
+TEST_GIT_REPO_CLONE = os.environ.get('VCS_TEST_GIT_REPO_CLONE',
+                            jn(TEST_TMP_PATH, 'vcsgitclone%s' % uniq_suffix))
+TEST_GIT_REPO_PULL = os.environ.get('VCS_TEST_GIT_REPO_PULL',
+                            jn(TEST_TMP_PATH, 'vcsgitpull%s' % uniq_suffix))
+
+HG_REMOTE_REPO = 'http://bitbucket.org/marcinkuzminski/vcs'
+TEST_HG_REPO = os.environ.get('VCS_TEST_HG_REPO',
+                              jn(TEST_TMP_PATH, 'vcs-hg'))
+TEST_HG_REPO_CLONE = os.environ.get('VCS_TEST_HG_REPO_CLONE',
+                              jn(TEST_TMP_PATH, 'vcshgclone%s' % uniq_suffix))
+TEST_HG_REPO_PULL = os.environ.get('VCS_TEST_HG_REPO_PULL',
+                              jn(TEST_TMP_PATH, 'vcshgpull%s' % uniq_suffix))
+
+TEST_DIR = os.environ.get('VCS_TEST_ROOT', tempfile.gettempdir())
+TEST_REPO_PREFIX = 'vcs-test'
+
+
+def get_new_dir(title):
+    """
+    Returns always new directory path.
+    """
+    name = TEST_REPO_PREFIX
+    if title:
+        name = '-'.join((name, title))
+    hex = hashlib.sha1(str(time.time())).hexdigest()
+    name = '-'.join((name, hex))
+    path = os.path.join(TEST_DIR, name)
+    return get_normalized_path(path)
+
 
 PACKAGE_DIR = os.path.abspath(os.path.join(
     os.path.dirname(__file__), '..'))
-_dest = jn(TESTS_TMP_PATH,'aconfig')
+_dest = jn(TEST_TMP_PATH, 'aconfig')
 shutil.copy(jn(THIS, 'aconfig'), _dest)
 TEST_USER_CONFIG_FILE = _dest
+
+#overide default configurations with rhodecode ones
+from rhodecode.tests import *
--- a/rhodecode/tests/vcs/test_archives.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_archives.py	Fri Jun 07 00:31:11 2013 +0200
@@ -6,8 +6,8 @@
 import datetime
 import tempfile
 import StringIO
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 from rhodecode.lib.vcs.exceptions import VCSError
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
--- a/rhodecode/tests/vcs/test_branches.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_branches.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,13 +1,12 @@
 from __future__ import with_statement
 
+import datetime
 from rhodecode.lib import vcs
-import datetime
 from rhodecode.lib.vcs.utils.compat import unittest
+from rhodecode.lib.vcs.nodes import FileNode
 
-from base import BackendTestMixin
-from conf import SCM_TESTS
-
-from rhodecode.lib.vcs.nodes import FileNode
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 
 
 class BranchesTestCaseMixin(BackendTestMixin):
--- a/rhodecode/tests/vcs/test_changesets.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_changesets.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,16 +1,23 @@
+# encoding: utf8
 from __future__ import with_statement
 
-from rhodecode.lib import vcs
+import time
 import datetime
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.lib import vcs
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
+
 from rhodecode.lib.vcs.backends.base import BaseChangeset
-from rhodecode.lib.vcs.nodes import FileNode, AddedFileNodesGenerator,\
+from rhodecode.lib.vcs.nodes import (
+    FileNode, AddedFileNodesGenerator,
     ChangedFileNodesGenerator, RemovedFileNodesGenerator
-from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError
-from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
-from rhodecode.lib.vcs.exceptions import RepositoryError
+)
+from rhodecode.lib.vcs.exceptions import (
+    BranchDoesNotExistError, ChangesetDoesNotExistError,
+    RepositoryError, EmptyRepositoryError
+)
 from rhodecode.lib.vcs.utils.compat import unittest
+from rhodecode.tests.vcs.conf import get_new_dir
 
 
 class TestBaseChangeset(unittest.TestCase):
@@ -193,6 +200,14 @@
         changesets = list(self.repo.get_changesets(start=2, end=3))
         self.assertEqual(len(changesets), 2)
 
+    def test_get_changesets_on_empty_repo_raises_EmptyRepository_error(self):
+        Backend = self.get_backend()
+        repo_path = get_new_dir(str(time.time()))
+        repo = Backend(repo_path, create=True)
+
+        with self.assertRaises(EmptyRepositoryError):
+            list(repo.get_changesets(start='foobar'))
+
     def test_get_changesets_includes_end_changeset(self):
         second_id = self.repo.revisions[1]
         changesets = list(self.repo.get_changesets(end=second_id))
@@ -204,6 +219,14 @@
             self.assertGreaterEqual(cs.date, start_date)
 
     def test_get_changesets_respects_end_date(self):
+        start_date = datetime.datetime(2010, 1, 1)
+        end_date = datetime.datetime(2010, 2, 1)
+        for cs in self.repo.get_changesets(start_date=start_date,
+                                           end_date=end_date):
+            self.assertGreaterEqual(cs.date, start_date)
+            self.assertLessEqual(cs.date, end_date)
+
+    def test_get_changesets_respects_start_date_and_end_date(self):
         end_date = datetime.datetime(2010, 2, 1)
         for cs in self.repo.get_changesets(end_date=end_date):
             self.assertLessEqual(cs.date, end_date)
@@ -280,6 +303,7 @@
                 'date': datetime.datetime(2010, 1, 1, 20),
                 'added': [
                     FileNode('foo/bar', content='foo'),
+                    FileNode('foo/bał', content='foo'),
                     FileNode('foobar', content='foo'),
                     FileNode('qwe', content='foo'),
                 ],
@@ -301,6 +325,7 @@
         changeset = self.repo.get_changeset(0)
         self.assertItemsEqual(changeset.added, [
             changeset.get_node('foo/bar'),
+            changeset.get_node('foo/bał'),
             changeset.get_node('foobar'),
             changeset.get_node('qwe'),
         ])
@@ -322,6 +347,14 @@
         self.assertEqual(len(changeset.removed), 1)
         self.assertEqual(list(changeset.removed)[0].path, 'qwe')
 
+    def test_get_filemode(self):
+        changeset = self.repo.get_changeset()
+        self.assertEqual(33188, changeset.get_file_mode('foo/bar'))
+
+    def test_get_filemode_non_ascii(self):
+        changeset = self.repo.get_changeset()
+        self.assertEqual(33188, changeset.get_file_mode('foo/bał'))
+        self.assertEqual(33188, changeset.get_file_mode(u'foo/bał'))
 
 # For each backend create test case class
 for alias in SCM_TESTS:
--- a/rhodecode/tests/vcs/test_filenodes_unicode_path.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_filenodes_unicode_path.py	Fri Jun 07 00:31:11 2013 +0200
@@ -5,8 +5,8 @@
 import datetime
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
-from test_inmemchangesets import BackendBaseTestCase
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.test_inmemchangesets import BackendBaseTestCase
+from rhodecode.tests.vcs.conf import SCM_TESTS
 
 
 class FileNodeUnicodePathTestsMixin(object):
--- a/rhodecode/tests/vcs/test_getitem.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_getitem.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,8 +1,8 @@
 from __future__ import with_statement
 
 import datetime
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
 
--- a/rhodecode/tests/vcs/test_getslice.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_getslice.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,8 +1,8 @@
 from __future__ import with_statement
 
 import datetime
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
 
--- a/rhodecode/tests/vcs/test_git.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_git.py	Fri Jun 07 00:31:11 2013 +0200
@@ -8,7 +8,7 @@
 from rhodecode.lib.vcs.nodes import NodeKind, FileNode, DirNode, NodeState
 from rhodecode.lib.vcs.utils.compat import unittest
 from rhodecode.tests.vcs.base import BackendTestMixin
-from conf import TEST_GIT_REPO, TEST_GIT_REPO_CLONE, get_new_dir
+from rhodecode.tests.vcs.conf import TEST_GIT_REPO, TEST_GIT_REPO_CLONE, get_new_dir
 
 
 class GitRepositoryTest(unittest.TestCase):
@@ -257,7 +257,7 @@
             .get_node('index.rst'))
 
     def test_branch_and_tags(self):
-        '''
+        """
         rev0 = self.repo.revisions[0]
         chset0 = self.repo.get_changeset(rev0)
         self.assertEqual(chset0.branch, 'master')
@@ -274,7 +274,7 @@
 
         tip = self.repo.get_changeset('tip')
         self.assertTrue('tip' in tip.tags)
-        '''
+        """
         # Those tests would fail - branches are now going
         # to be changed at main API in order to support git backend
         pass
--- a/rhodecode/tests/vcs/test_hg.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_hg.py	Fri Jun 07 00:31:11 2013 +0200
@@ -4,13 +4,13 @@
 from rhodecode.lib.vcs.backends.hg import MercurialRepository, MercurialChangeset
 from rhodecode.lib.vcs.exceptions import RepositoryError, VCSError, NodeDoesNotExistError
 from rhodecode.lib.vcs.nodes import NodeKind, NodeState
-from conf import PACKAGE_DIR, TEST_HG_REPO, TEST_HG_REPO_CLONE, \
+from rhodecode.tests.vcs.conf import PACKAGE_DIR, TEST_HG_REPO, TEST_HG_REPO_CLONE, \
     TEST_HG_REPO_PULL
 from rhodecode.lib.vcs.utils.compat import unittest
 
 
 # Use only clean mercurial's ui
-import mercurial.scmutil
+from rhodecode.lib.vcs.utils.hgcompat import mercurial
 mercurial.scmutil.rcpath()
 if mercurial.scmutil._rcpath:
     mercurial.scmutil._rcpath = mercurial.scmutil._rcpath[:1]
@@ -156,9 +156,10 @@
 
         #active branches
         self.assertTrue('default' in self.repo.branches)
-        self.assertTrue('git' in self.repo.branches)
+        self.assertTrue('stable' in self.repo.branches)
 
         # closed
+        self.assertTrue('git' in self.repo._get_branches(closed=True))
         self.assertTrue('web' in self.repo._get_branches(closed=True))
 
         for name, id in self.repo.branches.items():
--- a/rhodecode/tests/vcs/test_inmemchangesets.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_inmemchangesets.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,12 +1,14 @@
+# encoding: utf8
 """
 Tests so called "in memory changesets" commit API of vcs.
 """
 from __future__ import with_statement
 
-from rhodecode.lib import vcs
 import time
 import datetime
-from conf import SCM_TESTS, get_new_dir
+
+from rhodecode.lib import vcs
+from rhodecode.tests.vcs.conf import SCM_TESTS, get_new_dir
 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError
 from rhodecode.lib.vcs.exceptions import NodeAlreadyAddedError
 from rhodecode.lib.vcs.exceptions import NodeAlreadyExistsError
@@ -17,6 +19,7 @@
 from rhodecode.lib.vcs.nodes import DirNode
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
+from rhodecode.lib.vcs.utils import safe_unicode
 
 
 class InMemoryChangesetTestMixin(object):
@@ -111,6 +114,28 @@
         self.assertEqual(changeset.get_node('foobar/foobaz/file').content, 'foo')
         self.assertEqual(changeset.get_node('foobar/barbaz').content, 'foo')
 
+    def test_add_non_ascii_files(self):
+        rev_count = len(self.repo.revisions)
+        to_add = [
+            FileNode('żółwik/zwierzątko', content='ćććć'),
+            FileNode(u'żółwik/zwierzątko_uni', content=u'ćććć'),
+        ]
+        for node in to_add:
+            self.imc.add(node)
+        message = u'Added: %s' % ', '.join((node.path for node in self.nodes))
+        author = unicode(self.__class__)
+        changeset = self.imc.commit(message=message, author=author)
+
+        newtip = self.repo.get_changeset()
+        self.assertEqual(changeset, newtip)
+        self.assertEqual(rev_count + 1, len(self.repo.revisions))
+        self.assertEqual(newtip.message, message)
+        self.assertEqual(newtip.author, author)
+        self.assertTrue(not any((self.imc.added, self.imc.changed,
+            self.imc.removed)))
+        for node in to_add:
+            self.assertEqual(newtip.get_node(node.path).content, node.content)
+
     def test_add_raise_already_added(self):
         node = FileNode('foobar', content='baz')
         self.imc.add(node)
@@ -139,7 +164,37 @@
         self.assertNotEqual(tip, newtip)
         self.assertNotEqual(tip.id, newtip.id)
         self.assertEqual(newtip.get_node('foo/bar/baz').content,
-            'My **changed** content')
+                        'My **changed** content')
+
+    def test_change_non_ascii(self):
+        to_add = [
+            FileNode('żółwik/zwierzątko', content='ćććć'),
+            FileNode(u'żółwik/zwierzątko_uni', content=u'ćććć'),
+        ]
+        for node in to_add:
+            self.imc.add(node)
+
+        tip = self.imc.commit(u'Initial', u'joe.doe@example.com')
+
+        # Change node's content
+        node = FileNode('żółwik/zwierzątko', content='My **changed** content')
+        self.imc.change(node)
+        self.imc.commit(u'Changed %s' % safe_unicode(node.path),
+                        u'joe.doe@example.com')
+
+        node = FileNode(u'żółwik/zwierzątko_uni', content=u'My **changed** content')
+        self.imc.change(node)
+        self.imc.commit(u'Changed %s' % safe_unicode(node.path),
+                        u'joe.doe@example.com')
+
+        newtip = self.repo.get_changeset()
+        self.assertNotEqual(tip, newtip)
+        self.assertNotEqual(tip.id, newtip.id)
+
+        self.assertEqual(newtip.get_node('żółwik/zwierzątko').content,
+                         'My **changed** content')
+        self.assertEqual(newtip.get_node('żółwik/zwierzątko_uni').content,
+                         'My **changed** content')
 
     def test_change_raise_empty_repository(self):
         node = FileNode('foobar')
--- a/rhodecode/tests/vcs/test_repository.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_repository.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,8 +1,8 @@
 from __future__ import with_statement
 import datetime
-from base import BackendTestMixin
-from conf import SCM_TESTS
-from conf import TEST_USER_CONFIG_FILE
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
+from rhodecode.tests.vcs.conf import TEST_USER_CONFIG_FILE
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
 from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
@@ -31,6 +31,19 @@
         self.assertEqual(self.repo.get_user_email(TEST_USER_CONFIG_FILE),
             'foo.bar@example.com')
 
+    def test_repo_equality(self):
+        self.assertTrue(self.repo == self.repo)
+
+    def test_repo_equality_broken_object(self):
+        import copy
+        _repo = copy.copy(self.repo)
+        delattr(_repo, 'path')
+        self.assertTrue(self.repo != _repo)
+
+    def test_repo_equality_other_object(self):
+        class dummy(object):
+            path = self.repo.path
+        self.assertTrue(self.repo != dummy())
 
 
 class RepositoryGetDiffTest(BackendTestMixin):
--- a/rhodecode/tests/vcs/test_tags.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_tags.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,7 +1,7 @@
 from __future__ import with_statement
 
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 from rhodecode.lib.vcs.exceptions import TagAlreadyExistError
 from rhodecode.lib.vcs.exceptions import TagDoesNotExistError
 from rhodecode.lib.vcs.utils.compat import unittest
--- a/rhodecode/tests/vcs/test_utils.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_utils.py	Fri Jun 07 00:31:11 2013 +0200
@@ -18,7 +18,7 @@
 from rhodecode.lib.vcs.utils.paths import get_user_home
 from rhodecode.lib.vcs.exceptions import VCSError
 
-from conf import TEST_HG_REPO, TEST_GIT_REPO, TEST_TMP_PATH
+from rhodecode.tests.vcs.conf import TEST_HG_REPO, TEST_GIT_REPO, TEST_TMP_PATH
 
 
 class PathsTest(unittest.TestCase):
--- a/rhodecode/tests/vcs/test_vcs.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_vcs.py	Fri Jun 07 00:31:11 2013 +0200
@@ -1,11 +1,13 @@
 from __future__ import with_statement
 
+import os
+import shutil
+
 from rhodecode.lib.vcs import VCSError, get_repo, get_backend
 from rhodecode.lib.vcs.backends.hg import MercurialRepository
 from rhodecode.lib.vcs.utils.compat import unittest
-from conf import TEST_HG_REPO, TEST_GIT_REPO, TEST_TMP_PATH
-import os
-import shutil
+from rhodecode.tests.vcs.conf import TEST_HG_REPO, TEST_GIT_REPO, TEST_TMP_PATH
+
 
 
 class VCSTest(unittest.TestCase):
--- a/rhodecode/tests/vcs/test_workdirs.py	Mon May 20 12:26:09 2013 +0200
+++ b/rhodecode/tests/vcs/test_workdirs.py	Fri Jun 07 00:31:11 2013 +0200
@@ -3,8 +3,8 @@
 import datetime
 from rhodecode.lib.vcs.nodes import FileNode
 from rhodecode.lib.vcs.utils.compat import unittest
-from base import BackendTestMixin
-from conf import SCM_TESTS
+from rhodecode.tests.vcs.base import BackendTestMixin
+from rhodecode.tests.vcs.conf import SCM_TESTS
 
 
 class WorkdirTestCaseMixin(BackendTestMixin):
@@ -49,8 +49,10 @@
             author=u'joe',
             branch='foobar',
         )
+        self.assertEqual(self.repo.workdir.get_branch(), self.default_branch)
 
     def test_get_changeset(self):
+        old_head = self.repo.get_changeset()
         self.imc.add(FileNode('docs/index.txt',
             content='Documentation\n'))
         head = self.imc.commit(
@@ -58,8 +60,14 @@
             author=u'joe',
             branch='foobar',
         )
+        self.assertEqual(self.repo.workdir.get_branch(), self.default_branch)
+        self.repo.workdir.checkout_branch('foobar')
         self.assertEqual(self.repo.workdir.get_changeset(), head)
 
+        # Make sure that old head is still there after update to defualt branch
+        self.repo.workdir.checkout_branch(self.default_branch)
+        self.assertEqual(self.repo.workdir.get_changeset(), old_head)
+
     def test_checkout_branch(self):
         from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError
         # first, 'foobranch' does not exist.
Binary file rhodecode/tests/vcs_test_git.tar.gz has changed
Binary file rhodecode/tests/vcs_test_hg.tar.gz has changed
--- a/setup.cfg	Mon May 20 12:26:09 2013 +0200
+++ b/setup.cfg	Fri Jun 07 00:31:11 2013 +0200
@@ -23,7 +23,9 @@
 [extract_messages]
 add_comments = TRANSLATORS:
 output_file = rhodecode/i18n/rhodecode.pot
-width = 80
+msgid-bugs-address = marcin@maq.io
+copyright-holder = Marcin Kuzminski RhodeCode
+no-wrap = true
 
 [init_catalog]
 domain = rhodecode
@@ -42,4 +44,4 @@
 all_files  = 1
 
 [upload_sphinx]
-upload-dir = docs/_build/html
\ No newline at end of file
+upload-dir = docs/_build/html
--- a/setup.py	Mon May 20 12:26:09 2013 +0200
+++ b/setup.py	Fri Jun 07 00:31:11 2013 +0200
@@ -30,10 +30,10 @@
 # defines current platform
 __platform__ = platform.system()
 
-is_windows = __platform__ in _get_meta_var('PLATFORM_WIN', _metadata)
+is_windows = __platform__ in ['Windows']
 
 requirements = [
-    "waitress==0.8.2",
+    "waitress==0.8.4",
     "webob==1.0.8",
     "webtest==1.4.3",
     "Pylons==1.0.0",
@@ -62,10 +62,10 @@
     requirements.append("argparse")
 
 if is_windows:
-    requirements.append("mercurial==2.5.4")
+    requirements.append("mercurial==2.6.2")
 else:
     requirements.append("py-bcrypt")
-    requirements.append("mercurial==2.5.4")
+    requirements.append("mercurial==2.6.2")
 
 
 dependency_links = [
@@ -151,6 +151,7 @@
     entry_points="""
     [console_scripts]
     rhodecode-api =  rhodecode.bin.rhodecode_api:main
+    rhodecode-gist =  rhodecode.bin.rhodecode_gist:main
 
     [paste.app_factory]
     main = rhodecode.config.middleware:make_app
@@ -166,7 +167,7 @@
     repo-scan=rhodecode.lib.paster_commands.repo_scan:Command
     cache-keys=rhodecode.lib.paster_commands.cache_keys:Command
     ishell=rhodecode.lib.paster_commands.ishell:Command
-    make-index=rhodecode.lib.indexers:MakeIndex
+    make-index=rhodecode.lib.paster_commands.make_index:Command
     upgrade-db=rhodecode.lib.dbmigrate:UpgradeDb
     celeryd=rhodecode.lib.celerypylons.commands:CeleryDaemonCommand
     """,
--- a/test.ini	Mon May 20 12:26:09 2013 +0200
+++ b/test.ini	Fri Jun 07 00:31:11 2013 +0200
@@ -47,7 +47,7 @@
 max_request_body_size = 107374182400
 use = egg:waitress#main
 
-host = 127.0.0.1
+host = 0.0.0.0
 port = 5000
 
 ## prefix middleware for rc
@@ -68,6 +68,10 @@
 cache_dir = /tmp/rc/data
 index_dir = /tmp/rc/index
 
+## perform a full repository scan on each server start, this should be
+## set to false after first startup, to allow faster server restarts.
+initial_repo_scan = true
+
 ## uncomment and set this path to use archive download cache
 #archive_cache_dir = /tmp/tarballcache