# HG changeset patch # User Marcin Kuzminski # Date 2013-06-06 22:31:11 # Node ID 5293d4bbb1ea8259427ea19b578ba3888a455901 # Parent 51596d9ef2f8a7e8ff9d7fb863f48dbe479df4bf # Parent e1a0fdaecf63e6d3f8b6f663e284352955754ded Merged dev into stable/default/master branch diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -12,6 +12,7 @@ syntax: regexp ^docs/build/ ^docs/_build/ ^data$ +^sql_dumps/ ^\.settings$ ^\.project$ ^\.pydevproject$ @@ -22,3 +23,4 @@ syntax: regexp ^rc.*\.ini$ ^fabfile.py ^\.rhodecode$ +^\.idea$ diff --git a/.tx/config b/.tx/config new file mode 100644 --- /dev/null +++ b/.tx/config @@ -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 diff --git a/CONTRIBUTORS b/CONTRIBUTORS --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -34,3 +34,5 @@ List of contributors to RhodeCode projec Mads Kiilerich Dan Sheridan Dennis Brakhane + Simon Lopez + diff --git a/README.rst b/README.rst old mode 100755 new mode 100644 --- a/README.rst +++ b/README.rst @@ -74,10 +74,12 @@ RhodeCode Features 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 @@ Incoming / Plans - 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) diff --git a/development.ini b/development.ini --- a/development.ini +++ b/development.ini @@ -29,24 +29,38 @@ pdebug = false #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 @@ lang = en 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 @@ use_htsts = false ## 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 @@ rss_include_diff = false 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/. +## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal +## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/ +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 :. 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 @@ auth_ret_code = ## codes don't break the transactions while 4XX codes do lock_ret_code = 423 +allow_repo_location_change = True #################################### ### CELERY CONFIG #### diff --git a/docs/api/api.rst b/docs/api/api.rst --- a/docs/api/api.rst +++ b/docs/api/api.rst @@ -16,9 +16,24 @@ API ACCESS FOR WEB VIEWS 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=` 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 @@ INPUT:: OUTPUT:: id : - result : "Cache for repository `` was invalidated: invalidated cache keys: " + result : "Caches of repository ``" error : null lock @@ -197,7 +212,13 @@ INPUT:: OUTPUT:: id : - result : "User `` set lock state for repo `` to `true|false`" + result : { + "repo": "", + "locked": "", + "locked_since": "", + "locked_by": "", + "msg": "User `` set lock state for repo `` to ``" + } error : null @@ -302,6 +323,7 @@ OUTPUT:: result: [ { "user_id" : "", + "api_key" : "", "username" : "", "firstname": "", "lastname" : "", @@ -333,7 +355,7 @@ INPUT:: args : { "username" : "", "email" : "", - "password" : "", + "password" : "", "firstname" : " = Optional(None)", "lastname" : " = Optional(None)", "active" : " = Optional(True)", @@ -393,6 +415,7 @@ OUTPUT:: "msg" : "updated user ID: ", "user": { "user_id" : "", + "api_key" : "", "username" : "", "firstname": "", "lastname" : "", @@ -461,6 +484,7 @@ OUTPUT:: "members" : [ { "user_id" : "", + "api_key" : "", "username" : "", "firstname": "", "lastname" : "", @@ -518,8 +542,9 @@ INPUT:: api_key : "" method : "create_users_group" args: { - "group_name": "", - "active":" = Optional(True)" + "group_name": "", + "owner" : "", + "active": " = Optional(True)" } OUTPUT:: @@ -642,6 +667,7 @@ OUTPUT:: { "type": "user", "user_id" : "", + "api_key" : "", "username" : "", "firstname": "", "lastname" : "", @@ -667,6 +693,7 @@ OUTPUT:: { "user_id" : "", "username" : "", + "api_key" : "", "firstname": "", "lastname" : "", "email" : "", diff --git a/docs/changelog.rst b/docs/changelog.rst --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -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 @@ fixes 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 @@ 1.6.0rc1 (**2013-04-07**) 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 @@ news - 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 @@ fixes - #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 @@ fixes - 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**) ---------------------- diff --git a/docs/setup.rst b/docs/setup.rst --- a/docs/setup.rst +++ b/docs/setup.rst @@ -196,6 +196,13 @@ Here's a typical ldap setup:: 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 @@ to define a regular expression that will 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 # eg. #300. Matched issues will be replace with the link specified as `issue_server_link` @@ -527,6 +534,27 @@ Sample config for nginx using proxy:: #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 @@ Sample config for nginx using proxy:: 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 @@ pushes or large pushes:: 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 diff --git a/docs/usage/general.rst b/docs/usage/general.rst --- a/docs/usage/general.rst +++ b/docs/usage/general.rst @@ -113,3 +113,54 @@ might pass the url with stored credentia 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] diff --git a/production.ini b/production.ini --- a/production.ini +++ b/production.ini @@ -29,26 +29,40 @@ pdebug = false #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 @@ lang = en 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 @@ use_htsts = false ## 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 @@ rss_include_diff = false 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/. +## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal +## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/ +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 :. 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 @@ auth_ret_code = ## codes don't break the transactions while 4XX codes do lock_ret_code = 423 +allow_repo_location_change = True #################################### ### CELERY CONFIG #### diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -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 @@ CONFIG = {} # 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 diff --git a/rhodecode/bin/base.py b/rhodecode/bin/base.py new file mode 100644 --- /dev/null +++ b/rhodecode/bin/base.py @@ -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 diff --git a/rhodecode/bin/ldap_sync.py b/rhodecode/bin/ldap_sync.py --- a/rhodecode/bin/ldap_sync.py +++ b/rhodecode/bin/ldap_sync.py @@ -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 @@ class RhodecodeAPI(): 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"] diff --git a/rhodecode/bin/rhodecode_api.py b/rhodecode/bin/rhodecode_api.py --- a/rhodecode/bin/rhodecode_api.py +++ b/rhodecode/bin/rhodecode_api.py @@ -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 . 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 ..." + "rhodecode-api [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] " + "[--config=CONFIG] [--save-config] " + "METHOD ...\n" + "Create config file: rhodecode-gist --apikey= --apihost=http://rhodecode.server --save-config" ) parser = argparse.ArgumentParser(description='RhodeCode API cli', @@ -188,14 +46,15 @@ def argparser(argv): 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 @@ def main(argv=None): Main execution function for cli :param argv: - :type argv: """ if argv is None: argv = sys.argv @@ -216,12 +74,13 @@ def main(argv=None): 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 @@ def main(argv=None): '--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__': diff --git a/rhodecode/bin/rhodecode_gist.py b/rhodecode/bin/rhodecode_gist.py new file mode 100755 --- /dev/null +++ b/rhodecode/bin/rhodecode_gist.py @@ -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 + :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 . + +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= --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)) diff --git a/rhodecode/config/deployment.ini_tmpl b/rhodecode/config/deployment.ini_tmpl --- a/rhodecode/config/deployment.ini_tmpl +++ b/rhodecode/config/deployment.ini_tmpl @@ -29,24 +29,38 @@ pdebug = false #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 @@ lang = en 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 @@ use_htsts = false ## 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 @@ rss_include_diff = false 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/. +## example: http://gist.rhodecode.org/{gistid}. Empty means use the internal +## RhodeCode url, ie. http[s]://rhodecode.server/_admin/gists/ +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 :. 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 @@ auth_ret_code = ## codes don't break the transactions while 4XX codes do lock_ret_code = 423 +allow_repo_location_change = True #################################### ### CELERY CONFIG #### diff --git a/rhodecode/config/environment.py b/rhodecode/config/environment.py --- a/rhodecode/config/environment.py +++ b/rhodecode/config/environment.py @@ -18,7 +18,7 @@ from rhodecode.config.routing import mak 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 @@ def load_environment(global_conf, app_co 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 @@ def load_environment(global_conf, app_co # 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 diff --git a/rhodecode/config/routing.py b/rhodecode/config/routing.py --- a/rhodecode/config/routing.py +++ b/rhodecode/config/routing.py @@ -68,6 +68,15 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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 @@ def make_map(config): 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)) diff --git a/rhodecode/controllers/admin/admin.py b/rhodecode/controllers/admin/admin.py --- a/rhodecode/controllers/admin/admin.py +++ b/rhodecode/controllers/admin/admin.py @@ -27,17 +27,17 @@ import logging 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__) diff --git a/rhodecode/controllers/admin/gists.py b/rhodecode/controllers/admin/gists.py new file mode 100644 --- /dev/null +++ b/rhodecode/controllers/admin/gists.py @@ -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 + :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 . +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: + # + # 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: + # + # 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) diff --git a/rhodecode/controllers/admin/ldap_settings.py b/rhodecode/controllers/admin/ldap_settings.py --- a/rhodecode/controllers/admin/ldap_settings.py +++ b/rhodecode/controllers/admin/ldap_settings.py @@ -71,8 +71,6 @@ class LdapSettingsController(BaseControl @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 diff --git a/rhodecode/controllers/admin/notifications.py b/rhodecode/controllers/admin/notifications.py --- a/rhodecode/controllers/admin/notifications.py +++ b/rhodecode/controllers/admin/notifications.py @@ -30,15 +30,13 @@ from pylons import request 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 diff --git a/rhodecode/controllers/admin/permissions.py b/rhodecode/controllers/admin/permissions.py --- a/rhodecode/controllers/admin/permissions.py +++ b/rhodecode/controllers/admin/permissions.py @@ -38,7 +38,7 @@ from rhodecode.lib.auth import LoginRequ 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 @@ class PermissionsController(BaseControll @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 @@ class PermissionsController(BaseControll ('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 @@ class PermissionsController(BaseControll # 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 @@ class PermissionsController(BaseControll 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 @@ class PermissionsController(BaseControll #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 diff --git a/rhodecode/controllers/admin/repos.py b/rhodecode/controllers/admin/repos.py --- a/rhodecode/controllers/admin/repos.py +++ b/rhodecode/controllers/admin/repos.py @@ -40,17 +40,18 @@ from rhodecode.lib.auth import LoginRequ 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 @@ class ReposController(BaseRepoController @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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController @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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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 @@ class ReposController(BaseRepoController 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') diff --git a/rhodecode/controllers/admin/repos_groups.py b/rhodecode/controllers/admin/repos_groups.py --- a/rhodecode/controllers/admin/repos_groups.py +++ b/rhodecode/controllers/admin/repos_groups.py @@ -37,20 +37,21 @@ from sqlalchemy.exc import IntegrityErro 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 @@ class ReposGroupsController(BaseControll #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 @@ class ReposGroupsController(BaseControll 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 @@ class ReposGroupsController(BaseControll 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 @@ class ReposGroupsController(BaseControll # 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 @@ class ReposGroupsController(BaseControll )() 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 @@ class ReposGroupsController(BaseControll # 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 @@ class ReposGroupsController(BaseControll #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 @@ class ReposGroupsController(BaseControll """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 @@ class ReposGroupsController(BaseControll .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 @@ class ReposGroupsController(BaseControll """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'): diff --git a/rhodecode/controllers/admin/settings.py b/rhodecode/controllers/admin/settings.py --- a/rhodecode/controllers/admin/settings.py +++ b/rhodecode/controllers/admin/settings.py @@ -41,13 +41,13 @@ from rhodecode.lib.auth import LoginRequ 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.notification import 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 @@ class SettingsController(BaseController) @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 @@ class SettingsController(BaseController) 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 @@ class SettingsController(BaseController) ) 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 @@ class SettingsController(BaseController) 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 @@ class SettingsController(BaseController) 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) diff --git a/rhodecode/controllers/admin/users.py b/rhodecode/controllers/admin/users.py --- a/rhodecode/controllers/admin/users.py +++ b/rhodecode/controllers/admin/users.py @@ -41,8 +41,8 @@ from rhodecode.lib.auth import LoginRequ 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 @@ class UsersController(BaseController): @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 @@ class UsersController(BaseController): """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 @@ class UsersController(BaseController): 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 @@ class UsersController(BaseController): .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 @@ class UsersController(BaseController): 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()) diff --git a/rhodecode/controllers/admin/users_groups.py b/rhodecode/controllers/admin/users_groups.py --- a/rhodecode/controllers/admin/users_groups.py +++ b/rhodecode/controllers/admin/users_groups.py @@ -33,19 +33,23 @@ from pylons.controllers.util import abor 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 @@ class UsersGroupsController(BaseControll # 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 @@ class UsersGroupsController(BaseControll 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 @@ class UsersGroupsController(BaseControll 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 @@ class UsersGroupsController(BaseControll # 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 @@ class UsersGroupsController(BaseControll 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 @@ class UsersGroupsController(BaseControll 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 @@ class UsersGroupsController(BaseControll 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()) diff --git a/rhodecode/controllers/api/api.py b/rhodecode/controllers/api/api.py --- a/rhodecode/controllers/api/api.py +++ b/rhodecode/controllers/api/api.py @@ -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 @@ from rhodecode.lib.auth import PasswordG 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 @@ def get_repo_or_error(repoid): """ 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 @@ def get_repo_or_error(repoid): 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 @@ class ApiController(JSONRPCController): :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 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): :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 @@ class ApiController(JSONRPCController): :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 @@ class ApiController(JSONRPCController): """ 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 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): """ 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 @@ class ApiController(JSONRPCController): data['followers'] = followers return data + # permission check inside def get_repos(self, apiuser): """" Get all repositories @@ -792,6 +851,71 @@ class ApiController(JSONRPCController): 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 @@ class ApiController(JSONRPCController): fork_name) ) + # perms handled inside def delete_repo(self, apiuser, repoid, forks=Optional(None)): """ Deletes a given repository @@ -874,9 +999,9 @@ class ApiController(JSONRPCController): _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 @@ class ApiController(JSONRPCController): 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') diff --git a/rhodecode/controllers/bookmarks.py b/rhodecode/controllers/bookmarks.py --- a/rhodecode/controllers/bookmarks.py +++ b/rhodecode/controllers/bookmarks.py @@ -36,12 +36,12 @@ log = logging.getLogger(__name__) 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() diff --git a/rhodecode/controllers/branches.py b/rhodecode/controllers/branches.py --- a/rhodecode/controllers/branches.py +++ b/rhodecode/controllers/branches.py @@ -38,12 +38,12 @@ log = logging.getLogger(__name__) 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 @@ class BranchesController(BaseRepoControl key=lambda ctx: ctx[0], reverse=False)) - return render('branches/branches.html') diff --git a/rhodecode/controllers/changelog.py b/rhodecode/controllers/changelog.py --- a/rhodecode/controllers/changelog.py +++ b/rhodecode/controllers/changelog.py @@ -37,22 +37,65 @@ from rhodecode.lib.helpers import RepoPa 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 @@ class ChangelogController(BaseRepoContro 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 @@ class ChangelogController(BaseRepoContro 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() diff --git a/rhodecode/controllers/changeset.py b/rhodecode/controllers/changeset.py --- a/rhodecode/controllers/changeset.py +++ b/rhodecode/controllers/changeset.py @@ -37,7 +37,8 @@ from rhodecode.lib.vcs.exceptions import 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 @@ def _context_url(GET, fileid=None): 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 @@ class ChangesetController(BaseRepoContro 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 @@ class ChangesetController(BaseRepoContro # 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 @@ class ChangesetController(BaseRepoContro 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 @@ class ChangesetController(BaseRepoContro 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 @@ class ChangesetController(BaseRepoContro 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 @@ class ChangesetController(BaseRepoContro else: raise HTTPForbidden() + @LoginRequired() + @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', + 'repository.admin') @jsonify def changeset_info(self, repo_name, revision): if request.is_xhr: diff --git a/rhodecode/controllers/compare.py b/rhodecode/controllers/compare.py --- a/rhodecode/controllers/compare.py +++ b/rhodecode/controllers/compare.py @@ -23,8 +23,10 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . + 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.controllers.util import abor 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 @@ class CompareController(BaseRepoControll 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 @@ class CompareController(BaseRepoControll 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 @@ class CompareController(BaseRepoControll 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 @@ class CompareController(BaseRepoControll 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') diff --git a/rhodecode/controllers/error.py b/rhodecode/controllers/error.py --- a/rhodecode/controllers/error.py +++ b/rhodecode/controllers/error.py @@ -87,8 +87,8 @@ class ErrorController(BaseController): 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: diff --git a/rhodecode/controllers/feed.py b/rhodecode/controllers/feed.py --- a/rhodecode/controllers/feed.py +++ b/rhodecode/controllers/feed.py @@ -76,8 +76,8 @@ class FeedController(BaseRepoController) 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 @@ class FeedController(BaseRepoController) 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))) + '
') + desc_msg = [(_('%s committed on %s') + % (h.person(cs.author), h.fmt_date(cs.date))) + '
'] #branches, tags, bookmarks if cs.branch: desc_msg.append('branch: %s
' % cs.branch) @@ -118,7 +117,7 @@ class FeedController(BaseRepoController) """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 @@ class FeedController(BaseRepoController) 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 @@ class FeedController(BaseRepoController) 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) diff --git a/rhodecode/controllers/files.py b/rhodecode/controllers/files.py --- a/rhodecode/controllers/files.py +++ b/rhodecode/controllers/files.py @@ -32,7 +32,7 @@ import shutil 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.model.db import Repositor 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 @@ class FilesController(BaseRepoController 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 @@ class FilesController(BaseRepoController 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 @@ class FilesController(BaseRepoController 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 @@ class FilesController(BaseRepoController 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) diff --git a/rhodecode/controllers/followers.py b/rhodecode/controllers/followers.py --- a/rhodecode/controllers/followers.py +++ b/rhodecode/controllers/followers.py @@ -37,12 +37,12 @@ log = logging.getLogger(__name__) 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 diff --git a/rhodecode/controllers/forks.py b/rhodecode/controllers/forks.py --- a/rhodecode/controllers/forks.py +++ b/rhodecode/controllers/forks.py @@ -42,7 +42,7 @@ from rhodecode.model.db import Repositor 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 @@ log = logging.getLogger(__name__) 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 @@ class ForksController(BaseRepoController 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 @@ class ForksController(BaseRepoController return defaults + @LoginRequired() @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin') def forks(self, repo_name): @@ -128,6 +128,7 @@ class ForksController(BaseRepoController return render('/forks/forks.html') + @LoginRequired() @NotAnonymous() @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository') @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', @@ -147,6 +148,7 @@ class ForksController(BaseRepoController force_defaults=False ) + @LoginRequired() @NotAnonymous() @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository') @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', diff --git a/rhodecode/controllers/home.py b/rhodecode/controllers/home.py --- a/rhodecode/controllers/home.py +++ b/rhodecode/controllers/home.py @@ -32,7 +32,7 @@ from sqlalchemy.sql.expression import fu 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 @@ log = logging.getLogger(__name__) 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 @@ class HomeController(BaseController): 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) diff --git a/rhodecode/controllers/journal.py b/rhodecode/controllers/journal.py --- a/rhodecode/controllers/journal.py +++ b/rhodecode/controllers/journal.py @@ -29,21 +29,21 @@ from sqlalchemy import or_ 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 @@ class JournalController(BaseController): 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 @@ class JournalController(BaseController): .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 @@ class JournalController(BaseController): 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): """ diff --git a/rhodecode/controllers/login.py b/rhodecode/controllers/login.py --- a/rhodecode/controllers/login.py +++ b/rhodecode/controllers/login.py @@ -126,7 +126,7 @@ class LoginController(BaseController): @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: diff --git a/rhodecode/controllers/pullrequests.py b/rhodecode/controllers/pullrequests.py --- a/rhodecode/controllers/pullrequests.py +++ b/rhodecode/controllers/pullrequests.py @@ -30,8 +30,8 @@ from webob.exc import HTTPNotFound, HTTP 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.helpers import Page 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 @@ log = logging.getLogger(__name__) 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon # 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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 @@ class PullrequestsController(BaseRepoCon 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) diff --git a/rhodecode/controllers/search.py b/rhodecode/controllers/search.py --- a/rhodecode/controllers/search.py +++ b/rhodecode/controllers/search.py @@ -28,30 +28,28 @@ import urllib 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 = [] diff --git a/rhodecode/controllers/shortlog.py b/rhodecode/controllers/shortlog.py deleted file mode 100644 --- a/rhodecode/controllers/shortlog.py +++ /dev/null @@ -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 - :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 . - -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 diff --git a/rhodecode/controllers/summary.py b/rhodecode/controllers/summary.py --- a/rhodecode/controllers/summary.py +++ b/rhodecode/controllers/summary.py @@ -55,6 +55,7 @@ from rhodecode.lib.celerylib.tasks impor 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 @@ README_FILES = [''.join([x[0][0], x[1][0 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 @@ class SummaryController(BaseRepoControll 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 @@ class SummaryController(BaseRepoControll 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 diff --git a/rhodecode/controllers/tags.py b/rhodecode/controllers/tags.py --- a/rhodecode/controllers/tags.py +++ b/rhodecode/controllers/tags.py @@ -35,12 +35,12 @@ log = logging.getLogger(__name__) 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() diff --git a/rhodecode/i18n/en/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/en/LC_MESSAGES/rhodecode.mo index 678bc1fb6ff08138c37bf6d6353d5d38494ab9c9..cd21bed5d53e0bb9ab1f492b3b051b9537763722 GIT binary patch literal 61524 zc%1EgcbHT~)_1RK#IXA5y1KY>7he=sW&|Swk_Q-=#LNJaggf1LW}4~gZu)i)G{Hm` zMZiE-NrGfi$yq=^kep0pF#zi726tWk&Z*zI-S_tN0Pp)e-~0X3J~F4P>QvRKb55N) zb*gTC{(mli#YO*3{;kV(2f-itkL|x5kGfpf5!^}eUVl3`1;G>PvUkida6YSU+{dgOr zz5b2S-!Q2+mf)2HCrZ0-5UfFPVPlNxm+5Ln_wxy1_XacaN1*N?`?wZ z39cYGf#4NQ2$$e%O@OzQ;1vY7Gy(n&g4ZxV3Eo8T^CsZacT#>$Q_y#lz}pCtNL@9W zVqAAM1$_@TMf+`8IB zMlzcct62K8Nff0f%$Y@ zYt(Dh8uO;CHQHa;8s!IDqn#_-fSJ;&lgBLD@kOz1=POr#&oguI(%LO-%IL9b3Qll3$c<6NDI`FfgQ z0ndv}=xM8VH1`SiX$Sef+79|ZuN~-L)edqv*beiLCnfiP8^KP@-}Y#CM0?QllEA6$ zG2Yn(+p(P5L+^fSk8xd@1wP-B1^(YbusZW63;nmtLVsNe*5h$x!Jf>>!g${oxL5Fx zOMBl-dp~7?57%a+-#fA~zB<{UzezUmI!n1%U`00gKbWAG;7o#d5xgM>cI^Hf=xt#R z=;@z>c`zvl{MwKMet((+zFv`wdG?oF$fu3KZn>a0kPABd=0cxGNcrMijBAs?{kh=B zDJlOs7y5Ez9@2N^A^k`m+HIEyx#Z_Te|ix76G1Z%d>)&Jb{7a-BX~Qd-pM@h<9r_E z`0qT(^|B7Yzpex3!yO$kZ)$e{U(-5(p4J_}hpq%4V}5o3-!^o>JUP<=?S9t*{rsZ? z_;7hX#_{`n^iw+@bT!CFe>wTEi(T`9-zOjSpUsCnUljalQobx7{cX($|Mp1wE5ZM( z^mBOu;4KBv&;Kfb9lO5(^z$>PRsjCZDM0)0NWIO1cd!8T zeNg~@{Verxgx@xFhg(b;SJoTStuJ@=mY=w|2s~n{~oGX-hDT=T9fl zJ-!q0-|d8Uw@Cg8fxmXbdT>W)w3pu*c70%H%=7u3G2cED_?yQehgy$ApYk3@f6>RW zUd)#CK7tQ0eizK6hq@rYM;GLe>VkgPb%7oDTNm)9T33wc)~*=Oon68Ard>gQR#(WY zv@7`kWLL<4NLTP@WLL;R;Cl<<+}^uDiRT zexq)XUq(0dpC$Q4-C);!-N5Ii-7p`vb^~2UyJ7sN1pm73GQRHU=g#h^SEoDrYt$Y6 zjC{9-vi^EBjqc5fWGwv zC$qjtI`9POefA0H*=q!w5#08K(Ag7qqh3$owe1NyJUy|l`Fg^yT1JpuC)cW;pyNM+ zcUdpdvtFR*)?ToWwR^!2Xxt0*_7oTt{AYS$d@l(8_+HSjdA-2z6}`Z}t&+d57x;Bt z%Du9IF4*X68n=m~D-OLXiLghbA#@2 z0%yC??`k*b-{!`6_PW8(&m?``4Zi#&`B!^D&+Q(h>v&MVp$GcX(t~kldce0F59saX z0bLbRe~8q3*@O0{dO**75A=A2w7*a4pOX6jl6qGgsCSbAIyD3GzSjU=Qv>~H8<1O1 z!7DSMzZHTvQra0WcyAhLe~AJ9uab853f?IL^!*_1U0;m(e_Ju|9wT#Df@-Btp+8kB$^%}ZdXJC~rnp#&SVdcg7y4G>g*_PP#rpNK7xrSU7kv5Ei}`SQZ?to5Z_xdx-r#qw z-m<FLua}b_)EUx0@gGH2oOg2tVr26!^9u`nuK+`adUlC&7P9 z{vQLV*DwG&I|=j!upfRl0DW3Z@KM(P0POv5gMfDjA+O9J_6cP{*po3q(Dz0V<5(U< z|2u-{@2ep6<%&K?-_{4?e6SDXk=qCS=_UD3_CfuLeK4PvO8GZ^M1Ml?d#ZYPc@fBaYXthXJA(QL zBG8wU5%BBl2-c&2N5HQuD$t)+f&L$^Y->_ZqJ|aj{(e+thj4!hv#+Ba>^?Uadf2AMjd$u3u>%@Mt zf9nVOcJ_nb9q9)>KGhF)=lg!JSJy@%$A_Zm_lc;iuTjwVTom%15(Qu0mi$#w=)q1& z{}{!(ePw^hyKaBf)B9t7RP={_zS;Nw>Vp`X7Ugz`HEq5h+TP~L42=!gu$_+A+V`c@7CKQ|5n z|8@*QJD(4N9{gjF?6U`nzx5>Ax#~%b;~s*PeZSs5jf##*r`QNgD-oZ#(2Mc8usjpXE45| z1RD_aJOepSeFl26{~7f6?`II-y5(8g6A^6rEY|xUpT)Rq4#vE{dobivS74*T;6pos zxr1T13J0TJXfXWLioqE7dxN3x2L@yQoEQv!{AMuZ>>2|8-ZBL9sQM7#rAzveA($8K zhRC`w1mhhs1oEFX1ns;t1pND82-eY)L%^S#heB`a427Pz9SXS=4h8<}L($$UNgo#c zABSRpdh;;sf7=X$y!#Eqd>uRtc3{CU^uKu+=sPkDayl>NR}4qLe;N+C))@}Dwi=H1 zo*0htdWSQl#M_?eMTTXYy|lG{0PWl;t0rP*$B|JdIad% zJp%fEW(54AZ%060^+v)@Jvb8eTa84!MI)gfr6Zvi<43{{Y#xa??{A)i9<_Q7=^g}I z5q#r0%SZuMYO+P(kEX8zyJ9n znS_U|b%_e@@`IF=%&^)O$_Zn>7Y{ zvQ_eTjzPcsrM;s9&q}{Pje#EjItJsrb}ZoSV^RN}vFI;-Eb2Wx7VWnji~4OPKW8k) z)om>7eYvEcl=@>NJz*^7#oV!=>m7k>rN3>0zgyZrJQm~pT+%0`{+DB+ci#&=wZ@^H zzYx5P;6vkp-(Vcss^@=(zu7)Nk-I`1{z)$Zt>Z$=?uNFQebxuV9{i_6p|d zHLpUh4PM23>Lzf+tC$z>y^48y=vCOoKaPi8s5c(tZ8IM7=rmsTQ{%ypf#Wd`UzGeg zg12To`1sLy&~rrK7vrHPKS=slf!9qCeVHKfhzSypm;gC7o`C)`CSYDYJ^}ssCZN4R z6VTsCsrT{(@Oz51J7WUo_uCUN-aXRZ57OS16X8$)aU$ZWjV40AGbf_GcPHXpbM-`= zuU$O}_IuhS;H{VhIc%E*{9ThE&qI@-ug52WPd`Zcb(3XX6Igw+tgDkTuDd78`Zih4 zRVITET_>Ym_hhtFJ{kOqOh)_9N_w)?pEDV9UNsqZ^UKMQ=gm_fubNY!7mrMV+`CRe zKfx)$i%!9~MofV|jGlsiW=#R#)(YNU!8<+${5~@U73Z2=r{Y|5(Nvsk=DY^JpLh-Y8SpyjfBtpY>1nTHef;ostV4f&9r~aC2FBg> z4a8T6zJYz~f;Uj_37pnugP@G8~=2) z|Mqm0ADNDJuATvY-a7+yKPc&p8IVuT49H)f0Y9d62KY2~2Il#U8Ibdw8PM~^(#~p0 z@0WB_LjM=O3HsN*2{{~j6Z7x4v*lcMHqJF4oQ-xz%?3TM3VdTW#yfX5{JXbj z%e{)(7}qs(z~?{A0sm{vfxlOO4*JiYgZ_HVfxj1-1AFr39E^91zypGRO4|ET+WUD9 z_;ABp=(omO7+>ADK!5YMfY(*ZeFCFzf&ata!nx+`x3G`6X)f&8Lvx|Go#%p{L31$= zrp^VwHq8aUkIn^Oubzi_mNpOaX(#ZBd7w8m4|MjQ2YntT1`z6?q_?Cd~ zNlSpgYzf-kCi$lYUiJ>wgBtIky^im|u0Qn-=J}#`FyD>|y!>6rq4vAbr-FCU-@tdV zUd)yB!FSc@%(uy_}*eE=+9jW zd6g{%|DRb3`43+T{ye`F@|(O=_P>&TXDRH#nx)W(!%M-}lhV#L%TWJ!%jCRqncTZr zhWbsG$-ZJ4`p=boV;SsvU>W$lVj1Schs!|MiDel78NvVEav9%p^z-NCs8@G6`fIWr z{S+(*y$wcH@Cnz-zw>bd;>Zx)xXkziQA?F?EAx`wX>pQo-xJnsFqIM=MX4&y3X2fGnmhjw3B z2fAMoICmZTUAGSO?^q}I2-bn0$0YszI`HLZ$-j0z=(%G((skFP{$uN*FRj;O+*#|v zw+`z;uX{b{ic0(6eYg^mw(je^Bb5k^29Ude?41y<0ZOx!MNEJADK2 zT5Lf7c^e?NBEj=-kbACz_q?<-N$}p#LB`qq0h?7>r;v3`x;412L*v&5sf zU_M;61?}9h1$1j$!0*~yWPRC!bIsf>kmGcz_nwrm-U9z%+ZK%H#1_!=y`=vm?O*o+ z=)dy=_@{M00RMA7!1~$q1FZ9dKLEd`eSr0L%?IGaxevgf%eMmmwym&(jkluRlC7v0 zk@VQDpyTze=x5$m@MHB>@PGeS(Dm6?@Z;O9avyvv_;AxUTTF2_ZGHcJbSmveeG@F+s{((x7#tE8@EGl|FvE0&~~)bX*=kBVmstn zu^r$xAyx-;5n{k9i0B-?an%o!tR_xq2tk)puf?kL-jz@^^wi zZpnXUC+bhxiTSib%Fpi<{rO1lbA2Ry`Ura0=_Ak)_z3%(;UB^OTKEz8cIYGU zzq|IL|Au=Zm#n?ex9)pUuXHc=HPOAWSIZ>*<6fL=-oFp?^re01fBHVOH+vt(y<#8y zhMj`9XCKZrkL|?=X(c1-;smh-|2(U`@bK=c|!F=m^b-{Ah*#1Up<8Jymkokd+U&#ryPPD zR}0?zhtThbhrr)&q~5QGuurIV7~_5TF#69p47^T+i3H+#GpFp2ae*(H(pQ67%ehRrf z@Tsh8pQ60?r_ie*0w;e8JGJCf@a4d#81FZq!k%6I8OGP*GsM$NK7$9 z%V&sh{o!+*YqtIz>-|4Im+vi(V&2y|3i;e8u*p&IAzNVnQP{1{M^P_w6n<*-D8{|~ zDD?gCQOuvyN1>1BkIHv6$H3n|9K$@i^BC~zOS<7P%!}+}vMwCMct;(B{O25#`v}M6 z-sUl^qhA~Ye{MYvy{UT~dfxsx_fmfKN%X6ogk0;Mgk0O4M0@&4jMsM(@`;>;{HC0QoHv}r zx#p>pkca;i`U#&xdgLka_r+6?!<18y%gR%rYuzc(v+or2{p(Zki~f2F@_OJj?9?Nt zQNPV;v}>G(ew3YtUQ9X-JFxXM;=GrC0X=H-1=78~z`5p(FEFpa`~r6OmNS6)XTZ-f zXCR+VXW&=-cn0y#x?f`4UA}~$^W>Lk|E({fzZ<`VUHj=v)T{9o%ihUtwPV<16s{H(!gN`!(8W^flzDe+_<)`Wkxh#@EpEHIl#MYw+>7r2qCc=&be) z^6&cw>6YI>A4>&Rd;|K12%PZ^>Tmo8?H`i#7vF&2|NaK@_{~}9#T92Ut{cxn4{DwT zUdCC>m-c5N&-}BHf7i1ZSBd1mAn=v5Xm_gAn)g$$eo-KO^;DlJw+rm=_Dq zfv%+jH%Naw1b?5j|H(Ow^SGo>OZ{)oLGOMPdTO6XJ89=}uG!!`@Ee_ny=i_P@+mxz zdEq`UagOuox1YeL&SN~o&dYa0l0Q}OXP$@u@z#0R;V%TQ#3@(saK^t7U5Cfso;iz0V^)D1jQD(7$mkO>%qq|s*BkH?dNdG8juHqOT<$meUP5~zqr_{5 zjSyAv`nCMhfX8S_|B@q{)HzXLntDkU7=3kr*i@v21JrhfH<5_DYSj*gdU`!|%!Zo! z8TN*K1~;MC)oKwhi?mu@v|4Q&*2->JtH4D$!XVpElYe{kr~s8L4Mai~R2k)7e^Mq)vvoG6U)&qBRK73(Dd1)$WDa%iZ|1u>OQuT<_3cFkI5O$);t z77S2E70@;R@PakPUY{Xtd#tpXm|>;0zTR*t6XW%h>hYY2(d{vOhRUea$fZ{DdHvK8 z>4?!!i3ZaNLaY|3JuNgg}((*8OopSPZpmu_55`*Kzz#OUuv5&h3<;wa(3NpO)roo|To`+0{HR zQ!6u~uDI%}U%hD(`gNZzCm1OrLJ|tx?m&blc5^q=r$B|_YVPsyKTRhFlSnY%RR*!B zln5_3%8O{aa+bT)>+@(OJQq}&8KHi}v&afsFkZ|F8~YvD8e1|)!d9-hUmmD1Vy1%m z7%n9N+BG8GLXHG|0o@}y=<$XOci0!zD!h8!(kj$AF$qaq-4#x1{ zuV$3%ULR{MRkv^r5M7y6UMGT;k(pPeWb!CU<`#c#L{yOdGuV)Z!(M-h>BwPfii?Re zhMI?pSFYwI)SJ)8|Kiq@6PbCM?(vZ3n#55(WU!u)ne?ba-Hj<-uG0z@@Pkb@X7=?G zQW4d0yQu+h5e<-rVN@8QC@rZxHxk)L_#UHJkNCnoAvKLTbUM z#@(d>S~YEz>+)2meoJZnWF2=$%rMR4%Dr$WiS3)Q4txPK{NEw({}o|mGyZ!t#g*{? z1G7ZD?D8meV$E@=R4h|16ncbuBkSpAjbU4*G^|30y|QDL>;8!Ds}hY|C+3yEgnROG zzHSZ1+h5H!!{;%1JhoBLoF<-yLS#n*Zg(WaKAI<@T5%I6Szjx3pVuS(REf(ghhkAN z`l%Y#S_2uCmg!5vvvJ)F>)}hR1=Deei=o&R_M*6Ke$^Vx zOG22n%zY72sI`M6e{o6JxJuqd8E0KcAhb3F6cV)@A4ApnVu&jl$Rrl9swPxb@`pkf z8MDGO$z7(oe+lRjKe4e4j3*;aRMC%sKUyA$m}0kG&4a-Zt--{;F!_!}oZk zW!7<7K0b>k?(bu{5}=B#^{YjM-4&%WrkfbSSdH$k7$Ed;gq5;*v{iDLp;iW!uZCpK8)6YOsm21qDnq;Pxut9&3)~ zrsaxKjxC1l5G-d$u^)6Xoy33TXYwQ?9~uprks`%GAP0yxllbl?@25D-ZnUlphU(5w zdWNMJN@Y!jmb9A)(d6|RaM4?mWhm3g30HoTZg;CuM7g|0vJWa@_ix5A%|M8U?>77% zp6||lk5Rb*wjo{XLVK!mT0GftARP+Z!WQ=J4UN#S%#WBm&M}m;Nh0ELtJx?&$pFQE z`S_Q~oF)*n_SP`imZ-f5L`oV<9tt}kz2U~v^wGse@mwnMl8@|ni1<#8y%QLkUS$%qGf$T2ahY#&RqRX=Si|awIGo zlVn=vPYRe9Y5|YsggLljC4^D_VsEHi%^jFar6$UaXoy~tBB8QINqTDjt3%h)e+R*Z5&AfEt^VLJadT&-lM*OA-L zvq`U2x1)^HO z$Kmp@P8sY5#(EZ?&_)Y+i#|hz+v7H~6?;Y!$yA$*R$i0+W)fn+e@|E|)oBvbB4}-a zn^HcQ82h0jqo$%d=CP2G()&8n{k_3>TCI*&3IQLF^s9uHXb9t|7Md#~P3;b2dj(ep z?ZDL^rbNNGVj->OwEBgOr}{}u73o;j;yF!`VIw3VZEq;qJW~Z~Qylwct71jth=0z2 z92fFh9wXRFn3k)k_7WN&)5OUo4^H>Q1)0J8!Cxy7;!GJ`ol$MY)TR|QvYc_A;{2&~qK0Q=oV9=Gz zXw^t7il(s@7QaZbHC-#j{#8wuSX_|9<%qy@vybY&$)>6u$5evZ)dBoXx~q{diV8CIhV*{eo;&)EY;> zy&*QVu>e(sg8`M}$%GJ+X=%DzW1$u=+7ZM_D5J$$ozJw^eYC4=&F62ejj&qyv8cOR z^9qxrlY^svsnbtBds8Vzqx$8I$35a95)|>VB=Gqc?G{vcsmKshN!A2MV7x}OR>wT8 zu~fji@uR4DZkO8d2H8}2{jSVB=Ab?5mg(kEXO{SBy(E?K@@6)uyA4;SpOoEX z1-GBL>2j&SI;yuF)AO_st2i2av_7La9ANi`!&j^-?4=iRgYI~oPh1s_kMW^>pvVlU z4F%(Jy;vPMDr&}i!|6nu$LOaOsn9dppe*Xz8%}miM`dc`Z+8=F)4WL2O}E!uM;#D| zuE$ZWm|0zoV_ul)_M*~oI9S`PbDvq^zgK>%5S!J2oDR@(#?!Kpc-JQqP}ULy0G7>k zD`m*MK!~E9oL;myjG&5xE6+u7J)k%o40!$Fblz4Ht@#*Mc%0cIW|#w7v6U=N&(X)kq}pw4yPgJ?`P>mFap&0tqgALm(AX)ynIJJ z>ncwONnfDED<$OtS|rGORw+N440EW`3KM2|i^*-`eBqcI8&Bn*Qn7VYLMxTY$~jCq z+a&9^LZJ0EY|F$?IefEzAVRE8mwh_lEFr}WV;`?dcw)=J2z3C(4wuHO_f^x=;qmia zWy%asy4G9;(cM;TUrkXs+PW2%t}9bf%~xf!`$TB{^Kc(!>W^w({gPbX8)OAav`oJM z*4J95O5{eu3aWX4=o-mF=Zk5!Y*IISHVw-rPL=l4x`|)ZHjZNCEG*kP#J=E(8L)g& zdyEk0(MdMs=~}LzWX5Z`EUHQFB#0iU3rg|k)t!KZ^GQC7Lg<$_CvqVub`Ofxg6dPL zuKZ)&qf)Xe%6eEFUtqK4m?PT=aR8CVm|^W7?U}YkFxv?0X@zaoThdy*XM>J+Y*hAgyx@tB({ zC!oOzq#xGBov0D!q-8PUKWQvs_=xd5K3sF8;?-%fBOgKih8xR2)k?{61-?8BOvCRE zMTJ2D>nfsESS*gL_1ld7;JdFSWKzUtlAi^_p=S&jMaT7e@pDSevI9 zv^abHaZ1T=CbpY6;!H=5%{0Zb<-V~BCSSuJQuKdNi--?-*?imV zQZ9LqeM9V!8rDWL=85O>;k+x)n#I-+5{kwI%)AP-IYh4s4Fi- zv%4RI3NLRsV@5F#D}n_zwG~rZY(+To>}N+-qLQ1UoKtR7?l=Ywo>Qb9yjAn^B~)GA z+vHmdd=gz0AhrcU%w-C+709Kc~v+`O08Sta*xDOCf*!7B)QfH zcCx0`T@qXZ!A*`TaHL5!Ja|0GxgjQxDd5qS5Xjg{_U$s!)tBXGsaNO7CjAZw? z^Yy-%#Q8=VW>9Qi<+Bf#ua3=Rdj%Tg*p2v|Zxj;~OBr$kAEU&>F0q{0Wo*Tf_=S(y zJxzOz?9ytLC%U^*FH|{UC& z-6c=4D&aPs6eWg$knORcSR~beI#aUp$+N4RnJnCzZv@qbSu2W^sDy1mHcNwej555| z-Ml2_{=fwa)qS_Bi?OIBD^D=@jJ;&r38 zpB%$tHdc;au`5*K2y+pRy=JW{w(&L;a3Xd{VN=DbPz-++7)egX?MMaQ{)RoBT(Z&l zF-4NRr1V{gGP&QHBr9oCR#}pkaA2C4QROH~s?tuYD5-A7Z~Bu7QNf@pg`cESQgycO zt5?pcQp=-SDJ=j+hT(TArFBuzhnRw`06AC*?fGg5)(EVSw*)*B&^&Rxst1~spBK@) zDj1DRKTcE!+by&Ev`+2)XR5x3pjvBZt1cIM0?d_;f9^SQQfwl=i8BvQ;}wE2^fB z4{)OQV7-SMa_ojfIYuz7ZZH%SHqS5YS(sJ8&Y_CE+TyAO9a|LUXJohvh<^1azU4w3 zS3o>uX=TtxB=$=jH=8oVi;`vAR(;7y=v5=Xr#$vM6!E*&Y%9P%GvO#fO>{^2+%nX$ zSf26~F0r;{n=iexEvSEyuK7+Pjx8$P*{c=1;Y$;vGaCrG^(*`SB7?g^*SrNa+3UKpbOEBrSj!3fKNa4OL!OMX_!fH`a8tAM3Bzy;~vf|T8Y#g$6#FdLw z?8z2dt7WD&sU=m_xo*4*>k^mxP3uc$tJqH!qEv|_m)fN@H9d6x2*MlYaI0lcUjK&^mEYIr!u?{;|2rRCi?5FMA{pId*YrUU%g$QC{7_xnH~G+(kB_Xqmg)=D z)SahNug9v>>l>1x!5$q|_$}$}ujG(FF}R z>8YzgeR@!=?iwWdmI~$Snxch~#(CCi8~=InTaAosY9+clGWH}S8)_;eVtwS!5~*b- zR!f8E__|IhuI5ZLt! zKi@0hCqxu>sE%qU7I;%pc3}z5)5C#)+Px?SVKMeZ3Tw+B%t17S#yBuY)YqOP$aB4-_O8p!qfuy9VMXGXkVyq|$3R{B8 zxwg+1Y=vsGs;PjQy4YfQzUf+C{2dFqfUmGZ?Z`pT(&erS`(=aDdkv+p|A3yiP3(G~81%)fS46HT(w5u-$;h z=K=d=&Id?50WK|0g*Uv_kTt{k(a@fl*;dF2LfH zwJ;PR6h49HKM7Yy`8fe~Q$5|)F+a=I5%;U(abiQ=cjbHFhE_8e4VRMN%{evWd;Qq9 zF`cWcPv6wn`f`&2FQ~vN=*Tuo&QmFY^^<;-`Ds$dzROg%1*}Ya6uhH~bO^8{uKd}K zRt%&g?y$mTL-1I#?Dr#L4xLuJ)VlXtM-WA_)~>T!OBY(K2B1m z&Z4|N{+h7zN9Gp3^LDP4Tg8>yj`6ouTzrqKSxmp=x+y-76+c;>P&y{3^^8hf`IV=@ zP1)!+?ALA8S4dTbW0MtHK}uU$vQU^RcAPg{{P~G0>Qwy@MaQ_e6aUFkG#<7UnobO& z*)Sbp)Q*++?e@HQ5YU!skMh~F9l^PHzT49Sk;G+!~4ahGqQ5pjnp{#2fIaEe&6skflnz zDfa)M8%di|rZv`>q6Fhg!a?5GI1EB3b$uM# zW{tvMUI$C9@5y5yw)m5LWXm6wa}c&fU601JoO9xTZr*U@fd*PwX)7l4?7y(%8PsR<-fvqOxuw#2W%O zl)9G72abBf@j3}dhqi|lsfGAQdR=V(QxWcm#!wYo)%}bR?_tm{Zo^fs$8UeYyGzbQ z8*=P2mtq1US?LNX?knPB3~PJMxGIo}w+_45=Ah$42uFdkN_}-NE?U_xjuu7j1}6}5 zR^uIHQtR!+ioMnahs`76fs^C7S*Yr<9f>dImPO&OHDkrGlZ`HpGY$KVCLPaQCdE*N zF?#DdEmzE8H)S8K%$PcgcXi9gvzX84jp-7^^52#jPR}oN*+DGk8RYjETz@KUZfE zc=}B4tjhZ9j=vxf@q3*gbh}H-10I(|Qmyc*<6~`i{N)5wg^&Y$3D&FbRmY;MF6&EP zxh_G_=YptQvcV=#NGUM8L9ufaJC?Y6zU#4xavZHz~wk&h(DNuQ!AIr2b!i8p!aA2^{f&9 zid|E@V5#X!yuMnho7VFJ7b>HQfuN?Y{<`=vru(pQBemucTi*^c%}RRwx~#l#MZ9qa zc)XP&Jfc_Wn#61sJ5Ae*o?(6gDdCj8mULx{RQ&Hd^@;@3rJfCPzU-v7POiLAfbXKE zWqQ&&;mo6<7Gk^4pW12l((6~lb*{8*v&8F3YY{0i(+UF(wT$fMnOV)6w`!H2QBY7V zFSjtQrEKNW`0b5`+WqzFKaf`M;k0`7wfYSjKG5LadiU3>M~G?GNq-!#ep4Lb@-lHTg$oL(LylN%OJ$8)^9YSZ%-d=f|}Ab*g1&W@p5C zP(Qt1wU)U4pT+^AhAJ3vU(iQVYlJJBM)Iv}F6X2;Qz*A3vr=9>$I?qy1 zfTx}SPdx#idICK41bFHR@YECFsVBf$J5x`9r=9>$JprD20zCBuc zz*A3vr=9>$JprD20^DYoQcr-Vo&a~aDXAyGQ%``Wo&Zlh0iJpSyz-;EsVBhgC*!Fn zz*A3vr=9>$JprD20zCBucIv}F6X2;Qz*A3vr=9>$JprD20zCBuctU3C3Gmbt R;Hf9TQ%`{ZFFpbOe*pvE0sa60 diff --git a/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po --- a/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po +++ b/rhodecode/i18n/en/LC_MESSAGES/rhodecode.po @@ -7,7 +7,7 @@ msgid "" 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 \n" "Language-Team: en \n" @@ -17,38 +17,37 @@ msgstr "" "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 @@ msgid "%s %s feed" 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 @@ msgstr "" 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 @@ msgid "" "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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgid "You have admin right to this grou 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 @@ 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: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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ 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:212 +#: rhodecode/templates/base/base.html:224 msgid "Password" msgstr "" @@ -1683,7 +1784,7 @@ msgstr "" 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 @@ 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: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 @@ msgid "There are no tags yet" 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 @@ msgstr[1] "" #: 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgid "" 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 @@ msgid "Show notification" 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 @@ 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/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 @@ 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 "" @@ -2062,86 +2290,85 @@ msgid "" 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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ 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: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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ 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 +#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91 msgid "Repository groups" msgstr "" @@ -2533,7 +2770,7 @@ msgstr "" 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 @@ 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: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 @@ msgid "Google Analytics code" 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 @@ msgid "General" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ 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: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 @@ msgid "I participate in" 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 @@ 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 +#: 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 @@ msgid "UserGroups" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "Add another comment" 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 @@ msgid "members" 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 @@ msgid "No matching files" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "Changeset status" 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 @@ msgid "Patch diff" 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[0] "" 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[0] "" 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 @@ msgid_plural "%s files changed" 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 @@ msgid_plural "%s files changed with %s i 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr[1] "" 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 @@ msgstr "" 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 @@ msgstr "" msgid "Fork of" msgstr "" -#: rhodecode/templates/summary/summary.html:96 +#: rhodecode/templates/summary/summary.html:97 msgid "Remote clone" msgstr "" @@ -4245,8 +4553,7 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 "" diff --git a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo index 505f67c600c87c21239d68ec0b3b3297fc2a2d7c..0933b4cfc148e587fb4a095342ada882f36423b9 GIT binary patch literal 45633 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 VdfqHC;(hgcdEF}mP-X?W{|9Q88cqNJ diff --git a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po --- a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po +++ b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po @@ -7,7 +7,7 @@ msgid "" 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 \n" "Language-Team: fr \n" @@ -17,32 +17,30 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgid "%s %s feed" 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 @@ msgstr "Flux %s de %s" 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 @@ msgstr "" "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 @@ msgstr "Mise à jour réussie des réglages LDAP" 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 @@ msgstr "Connection LDAPS" 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 @@ msgstr "Écrire" #: 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 @@ msgstr "Le dépôt %s a été créé." 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 @@ msgstr "L’utilisateur a été supprimé avec succès." 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "Veuillez entrer un mot de passe" 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 @@ msgid "Username \"%(username)s\" is forb 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 @@ msgstr "Vous n’avez pas la permission de créer un dépôt dans ce groupe." 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 @@ msgstr "" "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 @@ msgid "You have admin right to this grou 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 @@ msgstr "Description" #: 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 @@ msgstr "Groupe de dépôt" 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 @@ msgstr "" #: 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 @@ msgstr "Nom d’utilisateur" #: 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 @@ msgstr "Connexion" 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 @@ msgstr "Votre compte utilisateur devra être activé par un administrateur." #: 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 @@ msgid "There are no tags yet" 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 @@ msgstr[1] "" #: 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgstr "" "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 @@ msgid "Show notification" 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 @@ msgid "Permissions administration" 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 @@ msgstr "" #: 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 @@ msgstr "" "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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ msgstr "" "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 @@ msgstr "Éditer le dépôt" #: 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 @@ msgstr "" "Invalide manuellement le cache de ce dépôt. Au prochain accès sur ce " "dépôt, il sera à nouveau mis en cache." -#: 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 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgstr "Dépôt privé" #: 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 @@ msgstr "[Par défaut]" #: 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 @@ msgstr "Groupe de dépôt" #: 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 @@ msgstr "Édition du groupe de dépôt %s" 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 @@ msgid "Number of toplevel repositories" 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 @@ msgid "Google Analytics code" 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 @@ msgid "General" 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 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgstr "" "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 @@ msgstr "Ajouter un utilisateur" #: 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 @@ msgstr "Nouveau mot de passe" 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 @@ msgstr "Requête de pull nº%s ouverte le %s" #: 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 @@ msgid "I participate in" 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 @@ msgstr "Ajouter un groupe d’utilisateur" #: 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 @@ msgid "UserGroups" 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 @@ msgstr "Membres disponibles" 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 @@ msgstr "Historique" 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 @@ msgstr "followers" 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 @@ msgid "Add another comment" 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 @@ msgid "members" 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 @@ msgid "No matching files" 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 @@ msgstr "Diff de fichier" 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 @@ msgstr "Branches de %s" 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 @@ msgstr "Ajoutés" 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 @@ msgid "Changeset status" 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 @@ msgid "Patch diff" 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[0] "%d commentaire" 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[0] "(et %d en ligne)" 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 @@ msgid_plural "%s files changed" 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 @@ msgid_plural "%s files changed with %s i 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 @@ msgstr "Requêtes de pull %s" 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 @@ msgstr "Changesets de %s" 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 @@ msgstr "S’abonner au flux ATOM de %s" 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 @@ msgstr "" 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 @@ msgstr "Fichiers de %s" #: 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 @@ msgstr "Fichiers de %s" 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 @@ msgstr "Emplacement" 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 @@ msgstr "Éditer le fichier" 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 @@ msgstr "Flux RSS du journal public" 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 @@ msgstr[1] "%d relecteurs" 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 @@ msgstr "Les noms de fichiers" 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 @@ msgstr "publique" 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 @@ msgstr "Populaires" #: 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 @@ msgstr "Il n’y a pas encore de téléchargements proposés." 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 @@ msgstr "Flux RSS" 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 @@ msgid "Quick start" 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é" diff --git a/rhodecode/i18n/how_to b/rhodecode/i18n/how_to --- a/rhodecode/i18n/how_to +++ b/rhodecode/i18n/how_to @@ -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 lang -#edit the new po file with poedit or any other editor -msgfmt -f -c <- 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 <- 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 + +This creates a new language under directory rhodecode/i18n/ +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//LC_MESSAGES/ + +finally compile the translations:: + + python setup.py compile_catalog -l + +########################## +# 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 <- 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= + +Run RhodeCode tests by executing:: + + nosetests diff --git a/rhodecode/i18n/ja/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/ja/LC_MESSAGES/rhodecode.mo index 41adcd28b546a1193fd737b98302a1b8413c8efb..d5304ab9fc2c1853b964386136db7d250ed25af4 GIT binary patch literal 68288 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 hm8Ug|D+p^FI9mqkHsI0Zg~$7S\n" "Language-Team: ja \n" @@ -22,38 +22,37 @@ msgstr "" "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 @@ msgid "%s %s feed" 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 @@ msgstr "%s %s フィード" 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 @@ msgid "" "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 @@ msgstr "デフォルト設定を更新しました" 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 @@ msgstr "LDAPS接続" 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 @@ msgstr "書込" #: 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 @@ msgstr "リポジトリ %s を作成しました" 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 @@ msgstr "ユーザーの削除に成功しました" 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 @@ msgstr "チェンジセットが大きすぎるため省略しました。差分を表示する場合は差分メニューを使用してください" 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 @@ msgstr "" 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 @@ msgstr "パスワードを入力してください" 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 @@ msgid "Username \"%(username)s\" is forb 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 @@ msgstr "ルートにリポジトリを作成する権限がありません" 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 @@ msgid "You have admin right to this grou 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 @@ 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: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 @@ msgstr "リポジトリグループ" 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 @@ msgstr "%s へログイン" #: 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 @@ 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:212 +#: rhodecode/templates/base/base.html:224 msgid "Password" msgstr "パスワード" @@ -1686,7 +1808,7 @@ msgstr "サインイン" 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 @@ 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: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 @@ msgid "There are no tags yet" 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 @@ msgstr[0] "%s エントリ" #: 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgid "" 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 @@ msgid "Show notification" 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 @@ 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/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 @@ 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 "現在の設定を上書きする" @@ -2063,86 +2320,88 @@ msgid "" 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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ 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: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 @@ msgstr "" "このリポジトリは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 @@ msgstr "非公開リポジトリ" #: 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 @@ msgstr "default" #: 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 @@ 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 +#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91 msgid "Repository groups" msgstr "リポジトリグループ" @@ -2535,7 +2807,7 @@ msgstr "リポジトリグループを編集 %s" 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 @@ 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: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 @@ msgid "Google Analytics code" 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 @@ msgid "General" 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 @@ msgstr "" "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 @@ msgstr "ユーザーを追加" #: 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 @@ msgstr "新しいパスワード" 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 @@ msgstr "プルリクエスト #%s %s に作成" #: 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 @@ msgid "I participate in" 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 @@ 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 +#: 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 @@ msgid "UserGroups" 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 @@ msgstr "有効なメンバー" 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 @@ msgstr "履歴" 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 @@ msgstr "アンフォロー" 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 @@ msgid "Add another comment" 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 @@ msgid "members" 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 @@ msgid "No matching files" 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 @@ msgstr "差分を折りたたむ" 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 @@ msgstr "%s ブランチ" 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 @@ msgstr "追加" 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 @@ msgid "Changeset status" 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 @@ msgid "Patch diff" 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 "%s file changed" 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 "%s file changed with %s insertion 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 @@ msgstr "プルリクエスト #%s のステータスを変更" 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 @@ msgstr "%s チェンジセット" 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 @@ msgstr "%s の ATOM フィードを購読" 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 @@ msgstr "あなたのアカウントの新しいパスワードの生成リクエストを受け取りました。" 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 @@ msgstr "%s ファイル" #: 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 @@ msgstr "%s ファイルを追加" 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 @@ msgstr "場所" 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 @@ msgstr "ファイルを編集" 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 @@ msgstr "RSS 公開ジャーナルフィード" 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 @@ msgstr[0] "%d レビュアー" 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 @@ msgstr "ファイル名" 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 @@ msgstr "公開" msgid "Fork of" msgstr "フォーク元: " -#: rhodecode/templates/summary/summary.html:96 +#: rhodecode/templates/summary/summary.html:97 msgid "Remote clone" msgstr "リモートクローン" @@ -4235,8 +4593,8 @@ msgstr "トレンドファイル" #: 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 @@ msgstr "まだダウンロードがありません" 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 @@ msgstr "フィード" 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 @@ msgid "Quick start" 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 "削除されたファイル" diff --git a/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.mo index 679e54f22b20b23917dfb7665fcbc2cd9204d90c..af10be58c2555a745f1f2057c5fee3eeb3f0a0fc GIT binary patch literal 46381 zc$~$334B~vdGCd?23{$IEkMd8;KUA+A}>j7$4g{Owqvb>LXVHImzSy$fM(Ojfw^IN0&9SUkQ`%4I8z|jG=^H66 zQTp4I?xFN|D7~9f?)n6!ucP!RrEjM6PqqASwB0W$J&n@eJ{RMjLFua~JzMkhG+j>V z|KRyGzlqY9Q#wKED<}=l#XQ^3#dtSq{oRzljM4|R|6}K3{v(v0PU&YUwJH53rIQQ~ zrLUoM{N3okjnaE5y_(WDQTnDf)SpM`OBt>NN?T?91*NkX zj`Ps2ozi)fZlsi|ti6=3p!DPCq5rS6{OnG^zrGXmZSMs9H*{j%cXR?Tk5M|C(hqe4 zkAFt#ODO$8C-C?q?fG0tl!eG8>;o{RO*pNshxQA+=_E}IKDZkdbuJ~0>j z{>8b#=TGKhyqC|zzP)xH^5@P2oh+D#dDl?d%j=y7I3Jk@di!HaM=1SsN@=UCch9%1 zcTsxje9+5|`JkVh=VScGDBVEmC+DO88x~+bThntF03Qn$VBaoUfc39g0K5z>z<8Mj zSbu}kPTprq-%jcC3qTKFU4Z$&tNs6J0oL(vI_|5_2Rvt-ul%Oz^7Db8K1w}Gilb33H)#8ZF2w$QSo5E~5cvD1w*P_Ve{mt!@#2NR<7*ZIuWwuk`C=~w zU9~O5ICB>Q-X2PqQtB_n`aZM}`2Dhu^Nod=|F3kMpD)CIyl4^V==4QsKW7o(o~QY> zi_mUl5#V$efxoMZuT7-3cgHl?O^*4(^-}Ykg_t}fle!*hE)x8+= zjV;EwmoEmKS1iVQc4+w{iy`lx*YYzj0==xf2yhNx1b)w5g#EeYBGAL#l#K5`NE z^RKo2i zq5UhCVV<`vL%FT#>}BZRsrBbC0~{Ao`c~d&Z8yFQ>-DwW?qz`g#$|x_xn;o1$925V zQhElZU(oyybetb){%6Yo=fCQBzqK6YuUwA({O#o^e>6f{VhG1@17pa|9B7f<4_OQbzH~&iq`*i z59G-|YW;7mLjTvUQu(5=KF`wz6$Vua24?Q z(N%!=4_0BmFHt%`>0hpbe(6|^`36>FpT<^04i#5poCB1SXt187bOFP^8g|QD)?oah zHNfMgYcS5%H5g}t(#4FYHCV?-*8uK6T?4qkz6R_4(Hh93e_4ZlKD`(6eReP8T2|3@etru6rFf!Eiq1>CdNLjTTN3;eBHi}^Nbeta$9sIGW zdTK57@y94Vllhg>^O#Q8VjXSkfbW&-fX}gY;CEN^JJ(^JTi0Q{1M9G!53R#|$JSvT zUt0(GzoF&dT?f4Wd>!=ByZf+?Y#-W{`hef{ zJR1f8hd+REcMV{i2M4e}AJ_b!3;@o*9RQwQItX~*IEZ~~AH;a824Vkf9fTcm-5}`X z8EyZ1 z;S!8@8Kq@PE04 z{(4OFe?{r#l-eVp)14z2|F#jpyKe;RdP3_zJ_2|@KLR+vqV4}~1nc_85zzC?N3n13 z9>xA&Fbe)!ISRZMM=}20qrmr*n*Y;L$nEcp0`D(h5Bhl9df1;!C?(U=a@NDoxpzJA z@>Na0xgPU=Z$0qy;QjM4 z!1>KF!1wQz))^m{0>3*cUCsM=DfIo{UyAk%H$vZCx)F5nk&S@s%NsGzk2ZoIUb+eO z@7RR;C7ZB+8#ZB`#ZBP1Yc~PzPf)s$>17l4>#dtH-ipoe$2M;U{5Ng}-QThqc)Ux~ zM>b40N$44EF-#Fl- zzj45CZ_l7#PX_qfkpbPlpVB_YPX_YkRaxNe4O#5hd0F%y%!0qGS>Wlxtj3+P*#9qO zfuC<{{m(T2${gT3GlzX!q3KW#aBS6dM-KhopTl^Ea=_ak{i9YWb*(aW}i@Kdx!$VxDVU(AE1~z5G}KwZ1eCKH4@8eBLk)y1ZBWJ*ne9Jq|dZ*ZDs+4m$X})_+yoe`6ea<=a|+ z<^<^b97?B{t|l<=a}#L)dlSIZ$F=-(ls@|+qRR=)_g)Y1?e)Ot4|>oypY=d@-}XRX zJh=G1Q=spaQ=k`r3Uch`DV0A{827NIzdr@M{;}47YYO!B_fx>bi}Tpm*J=8@d9453 zJnHA?(SKzgcwe8#xLfj=e<~0Dxq(trJ=O;)Jxb||3Xl(=* zhl?2ZkBh+PSBrq-TSctvZ;QZ#<*Q%eW4yC{^qZ^Yi+u3=av%7*)Cc@kANJpMzS>DX z@cSn|;Qzjszcc_`Zw^48ivsN1+5qh@4FF#$06#YZtoxP#`~IBvdus`Dt*r!oFn|{`xDRk6xg(pZVho$m?}w$h~qIbn=?>B9O9D8~j;*ww7hV`9O13o%yfMZz=^wM9$_?K#$sbPJE8us@ZZFg@CdghTD z@b{e>)^*x;)W2;z`k%91<8a#nSI>6Hfz8`7Z(Yl;-wymdKCQJXXj4 z{!ty}KdpmKez$@3ZEAoncQk;92O7{LpKHLr`G*Gf;j}Bk5AV1VaLu_A^tJR#z@NVo z`?^ExKX4`X;geT_ZoYIS*7bdD|Bsq~@l}}T)mI@u`znpQUWIiozY210;3}+lYHQ*khbTf~CHRSqHEq~!^(9IXG20eW1YK^m94Ln)z zMZ44A3x2iVi}Fh-CDOBU?*+cUq2;f<2IVMqU^=6`D!=zx{F-==NpTqI}-9Sm&B+v7V7@ zfyctN*ynB6qTiL8-+e9Sz2RESd+W8}ql4FC{!d7%=`Ut6xjzPy*xHIzPe z9nNWfdL8!tUGLL*-UmB!^ZPK)lkbCGeCB=X*X{v+UcCqSdD9-yN#`EOiIsblU-xJ{ zY!B9d%N~sX$R5D|p*Idd=QXwF{9+n&8x|I}X0Tic6qckRVEd-nqF z2lirpAJ+C?)BfMx3%Fi!Gxqb%Hv``Go6&CB&EV^GH>3U3%^3Gqt$*ld$bn}x{p`)4 z+rQHKA87t(H-irT^=8Pk*W7~rJ@Xdmv%)QCzwZ|4^@nePzxAbCfQQ%L3V-{YTcHO7 zO`pCMc>B9s(f=p6f=+&QE7tSU+tBVUw_*NEZv!6v+pzA2=5M?W@ZYWZ=WfGzM{k21 z`P^-g=Rdy<>$%`|(D_BTV}DlOjyO)=?U?83+f{zwuJZGCtmB8bWBh;D{44Ij{=D@L z(C5565EmG_1NKb*4$$+#JFt!~+yQ*O>Q3sBuSKkGCIsGo^moq8tq4fN_u-+^00=!4>!oGi2+kgEo$nWpn1$ueKKH%ew zeOT{1_5qH?`xNi{U@!ao0M{-1Fz$hUSkDvtAkV(I5B&Jkec;10?gqUtzZ>Ihz8m9T zaW}@f@ov~9_uLKs|H|Fy|FV04*Yt5_bx29Lzi}gKlFUCE3FUI}qz1X+EzZdhLwIA>=qLfJATE8Fk^4uQTq4eX!zwja%Ih`BS_f zc-VeF=;U^-KX53H*Wm|XhfF+x_1yCS?3N6!YBrsNOGn6mT7V6!iL)M*;tjwcUR_3Oaq$V~`8&kAa^2$AItK z9|OE!cntjVqsM@^-+mn9EPovIIQTf`+weH>o7eJfk0Xw><8h3;^Ksajk3Noded}@E zzb6348=n9_v^@d*E`I{++V}+GndK)SM-M##x%kK0{_mea9MyUf<1TsM!5=;ay!_}X;PF)- z0Dr&p1EAOQK7e(HAHe!*AAnzS(+8l}UibjcO+TmQulykH8+CmU^8aqlfAWL4H*@-j zly5!+zx|#MVZXloA<*0DPow^_r_q1!)8M=3pT;`A{WS3N%csF#7d!*Lb)NyA?|TOQ zpMM5%-0wXDJe>C|TNF`oA<*1u2lAA1)2^ZjRGm;T4Iz(@OYDDTm9>vN#j+H-(! z-*dp%C!Pa-KKC5<^DmwQyuZ@+Z#{(kqC=1?8z_AdrMW}kpYcN)cRPgr-lpl!L!hU< zhd>VxYx~b=`!62Cd|x{RI{n2V?DMY<0j`%F#(uv}({~(3zs|#Y?s6FPzf#i?tI{9(}1=MO^;{O~aF_tV2z?`cN>&zp|`j(2H(zNX8M zpx?S9m}gYWHy#1~xkmu6cLeioJEHNwBY^wCBUt~lNAz4x`yV|5ct3jtc=@vCzpm}S zcLa9c-yMM*U;I4eLm#DN+FAbdnD>{@V?R#&FxtK0!Qv_e$Jj1+Qp#kTCCA6lK2_&@0?TDM6#1XwQN!;D0+Ui;>N#F82FXR z=!X=Q-EE#*bIZx!QW3h@z|Y0Mq_FNfWs_1t$l#B=ZjOJh2!edkDd(kpMcMJQldk+; zIqCQlZXuY6Gof2aWu)Dzpil@fJ!i^!lS;wra!@VV-A*`}37oRbI8rUrgmwNo>P$#0 zXCjaUm^Ha-WilwozoaE05?%R+2S~@gf@^05sGP}%%>^cJ*SyLk&*J%^TdsJ4AI+O{ z3$7GQ8{||w6+E9NqFr*g3#LFLA#G792)#;BuG?N{`$5GnI;9egTM6u3#xA+#NvA}k zSL~WYla^hlLX|<8I{HqLevX%eqFtGE0aiV%xJA2EaGlV#%T-@$XuyJ(br=@HpyT-j zEDe!!%REcj4YQ6P1H!1AO(fy@4D+1S@AmfLp8mlNJ@%@>;dSlpR##u&;F#4l)NAM6 zy45v0*bnNFUsFW7zEen)l&Tp5q^TmC4XVTrU0H@tl5MWlmCNxz+bI-mLL<0D3J67$ z1bERcW{AkS$aib9c*ziEs-;5UIUfIo73Uzy%=h(xOLC#%C|D%!!0^qf%l$TCW;xtN#Z8T67%A3JVZhM#T>?& z-XYt`~^z{?Pc6FlxVw_Fd1 z3Tf`oX~k{?GhLWD^BGUdtsYqYKaXEoo$qv zxfP+H=n5JsY;l(>=uKHYZrp-Nsy6P*f>c~E;hfZ6=Er`##eU(lwxE zodhyz7n1JCPM%8hs!xl}13iIXF9y|6iPY*UmCC_3Ch!VL?+ht85rov1>LBhZ35qmB zRv2KLV|I`vsw?uuF`{G}ZJNVm4=E8^E4oH{tQ9O1y9cZlp6@U!S@h4I70$6@MHlhl zimF$rFvgf|L%W^uNFpWh3w3KHlQI4ESy(%?>l4a>6Qa;aN|%UX2@Gu_#O8{Ms1RW? zZ?YaBF-(iERCu(U>}zOxkR%H7Zi1?~+OD%D;1(`IEZJSsyl$395Upef zHJ`YWaMMHs9i{;fW;=vKhmwjFYjoA%ELKw5$%^%S^h?y$IH5e3C}Y;EhKT~!Ta_TN zGv0(~M$u!{3PCsC#@t6DdVHLA%CCyf^TJZWsRMAXIkk~GIy$U`@gYBj7X%t!jiVZy z2clgIvYu#CQQuTo2tvvwMZVF;M)C@V0T;tbC>Axtv`-of1BKO$pbU)zf-NLOXGs)~ zS6FE|!n`t_Pc%eox=id-aH0EF5^v^t@GvMdkXhHyF|(x0bMEvCFjj}XF{s)_lF+Qw zX=^L7#!IPug2OeutFnSi-0^XOgb>NliHy>p#J$n40{;pbACz!cUbwYVjap4*djzMZ zgj>=sh#7R{+#MaJJdA!Y+wdM#LkKuKtP_`Pj|{A^S}M`{(UVw7gn(D6+nG9B&Gvc5 zEYy14Zj&vNlyNlA3~Ew4V|d;aFfXPu0KsszR#ezPH5s-XDC3WN<)TmrcwSH}Dr7NB z>=_z}+~5Y$Qj=`=YxnWo8D~n8_e^b0K6l*WM5|)G+FT#$emAL?vJj|oGp6Mk;E)yQ z&Ze|z=;cyla4~VE=pP?ai7Xp0n}P>y(=?S2Ze%Zs=)TfaChQ`EkmP10mg-6MKdk^j zG8MTgi*uz|^0Doj$ftJ+<)tz!JXg%Ks4TYFOi`K$jI-cJKZ$6uCyJKdA^OP%9rT>l z-P7MS&~3#|SvP42DDw{f?ONULxKkz7m|Sysz(jk)QNLcq4}eMRG%|{;9NA0?8|N%(v*%=)^!hRp9sm5L3(T!t`!&_qXbtI!lM>$Yd= z?aVH!T|_E&*rTvsg<~UMh<#wV)$CKkiIn!C(pbzn?8~z_nR%k5MU`m9I$5&`fitay zfbwZMGcA?S=d-miYc?5qb37JzWs)^y$Fg@Tfde#fY!atcw^c(@))P&wb1~JkW$3_v z)5>s?O$#!bUE1x|-kYe=87e~aiXU0LOo$+A)y%+CaC#^J720o!~^5l!@BkFk_Vu%6T83fW@#s4Ai5T$d;=KHUXrjeuTnYY!3}mHVauc43wDV;l{3{qon$jMK)2(9dMOtFD zOAZBjjH_AMtda^flT?jJlgC$~3k+xh-&^XyVrNIR4L>D=0bzy`o$6_Q9h`;t( zvt|oZzK5Zk6P`uP%F@41P97$eRsuSH>WbEM4R>2>Mn{Ll2xNOxVW8fHqP2$Ed5sqe zq-z4|&3}aJ=of3gH32QGmxrUSUWt_{d04$!)^EK&QA@}ak_@sq8sRfBxJ3Mo1quro zR|I^)9j_2^mszgJmXOwRGCW{5b}3X`v60WwxF8b-VoPyb?icleuo77v@${F3cukYbVdb^X5oAKnW;rYOMS=oBeU{MY3wLQYp<2=bRUA^WUw%#VIfY zXfS{z0Mq&?A?k{1AW{I(&TIg#)u6;W*DZ;wEFwuz83@`+f#+8`?Det}!#!Qy{XKBv zS#h$!OAEQMgNCZ}Kie=oxQ_RfNP&eQp_tJ^eyC5bQJ5uZNk#}+KP)@_DuM^Bt2k~T zDai!tf!`xo>qs^zxhN68oW|Bbh?Je!T;V1o43e6dR-Xe=8mZtuhhT+oi{B!FqF)IC zBxS>?evsM%F=vYbiAqv~R-ZTSRy-a@F_DE8BnpL=YyznEq%sYc7z2X5xUj+=w-(~3 zMzPEf_@Noz=z_yBT_Uy$>^Z4n;j3{FyQ2fdNRDLGy(avVQp?Ot42_%Xu)D;e&Kf^o zcnI3iG0tzB@`^B&m{nI)Ny6uN4pG&8!GzuGYr<4EE0oM&wIV5-QR;CJ8XZ0|NfZ;2 zB#UVQiJg$VAJp_0jg5$lMyUE7zv>iD7RN%XLOtm>A&A<-RP3+^$(|Oyq>vzlSRM8sA z4sd;lskktqPWs6TZy$9gcz3OSqEuF4R)5_#=LPh0Akgp^hN;JhOZ#M;P54hJNQS#5 zA6qU`fH=-T&xW31OE_+TTr)Ri2oH$!MwW~kPMjBSjDJL;HJM?GXXg{FGSKYo4FonU z5Bgz({B>8#O*A9^NwTg2!z3=_*jFkSb%(vgKSiUkCGF-+t?OsYb@)S)lk+oEIj$Cy z`5i_-Y^Or&-R3ImQnAKcO;dLEUp!vo5~5o%4Ll#L z$zifd@;*8e!&QP(!QJK-(l*oJKu;eLOrJGaBBV_76YKf;zXMNJLLENeS8}uUJ zIRI@986FsFN&iu4S)#J!T;(H4#U2GhmE;D*CozWgOjp{{Ku=Anot1EmZ!V0OyQv&DQ18&T1#Cd{mNr}vLyVT*gwNy^M+R+goOJ_{ zX3j?NA7tTxQVfbZtRXUotf8_y?ro<;#FoH9RtsJ}KvdRwwAgZae5NqRL@b$iwb9t!I)_-UGIcjZ+zw z@Vv5pve@{n0EZ&gN|3NnPO(?9*|O1oWs~v9(%w$#6m-`xF+nM5sHFrd)rv-85jZTE zlVqElz8Iiog5ahjPOWN=tD)E&*h@zVnhm=p@jC2GbwV-;P!cQ#-%|vKIlydD?*}KS zlmo??t83)cxh?CP#8s*;XM&%p(umlGlL&|;H~HL*nd#m(E6ItJTTX3~J!j3})Fhg; z#!(%S!Zb`#S&~wxSGxYRIz1I{QPgrMQ`cf7S!J?dk|botbwyw#iuG)eLpED?<4cdmFYs_0FQjAmL6jHJ@D~&^GOCZ&q}QPSiZcY^5jbYSNQu z$gzGH#$>L#daa;TD%3l40uM*ydCK}Z`IGh>M%?l?0@d@0wEV0qr&uF$k->P`oHcmY zcvF+27$F}<{v=d3M}WP9W;{RTh|pZ^%XmI+LvpRRJNhYpv1BAHM_DL3C5!BIo6KOP9}3_01n+;15j-e}3~=~1UV zK{7(+TXfuI4uz~y=06U{B!VUabakN<`Z1$>mtP<4mbqAbD8; zZAZY%^m@2Nc3{R_Uz7k?x=QahO|LP|_DmHfc9^P*&fuq4As|S_O#JDZpe1O`go#oy zsBLi$XqnUg^ab)fZ%3B4>7ILvL3D@ z_&QpyQWFk_^Pi@B&xAQ#!RWBov7>qmoK`0y*QAnS8*>= zi;|}ik=C_mPfn=QIY%4j> z(*}<|Jh1qb@?sx+`Kin6!mRPLI_p%@)#r2N3BICk5gyhgm zSf=keq@cNDj2}X8mghZ(KL)C@=R{Ta|mlN@|-(Zkje48$D z-JP~_TSOLeNn^&gVPfCY-#WziWTiK5>`64L4EsAsG-)$R05~CAp8NPN?70k1l@b4R z@x>3K>SeYIFb)pvruX9y1aRQgdRd9ag9#ZbCc^zjk2PEOGc5nfIPgQXv{YAo;! z(=MK+iz&4_BXW4fex+p#sf?g&ON)X?0f%adid>K&u(i3LX*BS+Sex-Rz?Ny}bX0>) z;mW{2X??`xUh)bUTESUJeU-LF4$;yraiMa{$qG#*AWqx{MD~dEwA}TS5y*3MNNT- zGqEF#p%a}i$%O15PvOo^&C<9{h0N7LeEmm1$28wt6#BRMf8BryJ(SVAH$pGWay4|*y`8|UP64=s|qy;)91P! zjKZo|Uh>IJ`hz10&09m|fX~(1dvom@5GYz~msz~C(COa=X)} z>REF;mo1%VpMAFcT(Wcl|D4UgJD1Guw6D5K%DGMF9O^Td`plbiT7PeUPmHv=9i6AG z#GRRT_Olj?*?wNBK>p)JI1hF!ORJUf_JwgfUf{S}Zto$FpBZDZy)ffdPFt3pSWBar2lr<~YF{{`yYhzpLxqy7Y3dJcmQknYnT(04{$9Kyw z-%BJD0oC|U{IeeajGhy4qF?ps7k;>*ckH@s{Cj`4J}o1W(}q53U@}=RRrSJ=8r~kr zSN)t5|4jcX2YF72OdL)1QG$jOdIjg$9?ouZ^2c{Mxx6RO2sp=g9otW9=S(-HzVGGj zM$vP8yfRQN)#L0Yz8YBb_(F&l4rYj@YD|_5IkPk4HUHMJ9BU}Zh1FtEb9fA@=&986 zo=ffwS+@DAHm$hDDyOo+Cc`J{<>*JF-t@EPP8~mx#X{saR-5?AGuVxQmT-I*gHOu{ z{JN>}OjSLqb4?v#-_!kPB!%an*m6-kO@^I zULYpS$M`cm1u5L9vka{kZQipf)?Y=Z#9PSUmGCYVHpm6igIfp{+Y7i3(U9Cd2AVcww}k#qt= zM_yatHFu(zrrw@`-k$b$YiMxO*b8^|S?dbbY{Tvv z>b2H6KJO{Ny=_ zms;9^N;&Y4?blw(-6ht{lQc}gBP?#9;hok+IvUw&FmPHu4MaaM!Npl}&8$@eSw#G_ zgZMT?tueM!{*+^l8PMWi_CzGX;xdP$nRR{!B0P2-P2Q*l5*mwJq5=G zV^`|MG|gv@?a#>|VddEV5|ezviEu=0R*TS5jnGmr{?|SVF-DUeyRPIBHD+kF*O3(( z@K0 zZE~DEUxQ#_A6Wg6`pjUJay?TOtE5ZR@+rSAp>z0NfO1%h%J}cY#GZ`a|{$~F(+TC>IReYXeVAS;`B#tiNakl8|+xFIFnliE%g~_Ro|)BK9223m=^|NjadZtXrIClYP> z%NPg0?M$8Evm2Ru#m>>LJ9cDiId+iA(w0=5Hlc?pe8oym7OjpH>28}03sU{H`tbvV z+Dd^91gc|!mvv8hk}Bq4S9mz;tT@4;DdQvwKY>6-&~**rCTu3vIK@1hPl8~g+aM$! z7JGqpNp?QRbS?>79?BgG!<>lClDg{tY z1VYu$7ufg_E*+~AENs&fJTeiR<7BpY1lyFcl=!U+HIIUjXe=Ad+@eT3Iwej1n_k3N zN5EI7?1ub+-N)I4ymw(ptVlb_X{I?PKYc!6h8!@G|RR&%RJmPwJ9V6xzIRGqjg=A77-<{XO5^a^|bXYWJl@%EICytnIF0lv^({&S7 zb`Tvrn?dq#lT%^V=N(k5X*TXn5mg^JrLy+#e0Aqc08lCsl)N6}<5{$^d-{rE5H z8@V+6i6b~wj4Q%}S46s5;iia56bBU(LCYV0qCWjpg&xOQEVcS}70s~H5PKFt)Et-&- zx8xD)8k>!~n6iZKYb02}Nl(7MQhVVDc_*>oGZL4$L_uWNIL%`@MWCB+$OG$|7B#>z(ZNyfQTMnnlme3Md6~^Zl^6;_{yKPAmSzEN(=FO0J+IWAX zFiAXL6C`mzqKhh#!FrHi#fgL&kVnRrHJIZ75>1h|lO#Aa(x82uAdS6?_c$TjY$B2% zUuD53n=N0sv0dea4GCsA%Za9WT@9165FvvKjENGlulPxkA#s;;0W>u)lKsYLp|yAx zLF6<8%j$wXZ1<=K)03;yzT4|#7lle#ccpr1S;|w=o)Qg9W_aTw6GJWATE)%P+w6%P z-_fgi4QeXZNX;gPIS={8#hyKJd>5n6jrEScjY5t$-{El+nYzj8>nSF-MGgjg%+aeV zxqv^vsWb_RF`x=hl$eYfbrGG3*~LW2n;OLfN#B|dQCl}EN=PO1ln5dkVzqVHgC#~4 zkr+GdL_+Lohwuz&V-pU$=Zo;;Ze&Wtz%zzxZjE$9g{Y?0wDAIJP4@Nl)=^O;WWA^; z$dmOPm7f$F61gB&X+%$zaIi;XbZn3_aZrmg^C;f_bVgUaOhA$T4U!@{j^9|lVTJN+%cV(bxkQVY zL0mw|j9$%2q>+Q@u|nral4Gr+ny_IVzfbHmSd>fx{0_>1)2KP0J~$-YwaJMw1%87Z zF#ZKRP~j*t7ul((3n>|63*H=!SpW1vWzkc7AVub}5Tqmjwi?PF_p(tCi4q>z3u!$F zu|u$q)r-~R2a-hTr}boqt{5W$LlBLC3xh6iFHZRk*~;7QmL1!Z6bD!`^+0K%_TNNk&7@K+rUkZXk;)qyS>Xj`<_3f|?V8ogaZPIsVGSoozG_<7iC`zrG1ei!11ItMdZckYq7jZLi$0{j z8sX z$6BUM>6Gdf5!N<&@Gl(6us!Q!>*`rg1bh|LnEq4BTgmtntu006CM-iXN{tki1D1kB z=8y*Kez)lGLoO07!Ks-(=fbuL0Y)TA+D_h-^+MXk4xDM|$%fAYOHXXz_cEj+NFg#B z$+Jn5zov)C4 zQ!ffTW+xH&b%nVT{&j~v6d;NruI*I3RHHG9&ICsbO;E_wqd6uh$5;Dj1?i~j6d|V& zOb~9Ez)~4jrE&_9sORq|SjW3rGMQU@a!G4h$S>7JZB)+$1)CZx4e)oS6H(MD0TPkD z)0hTjSPQ0DnTcO3wN`4OMCu!fTpDrL1^bgbaJrEY^@fJ!uHg9N$566ZmD2t z$@M~;PIN}903z;edUwC zSHnGwHQG8{AWh_g{Xp+(Qrx20tpU~yPSRl-VELnFvZK~%^o$KF2r-s|D82&m#SshI zd>B#~1K>C_8pkWh*tUn%$dn8j-(L{yY{(X8PnJol(!Q9MQVu3I#a zeifGdB;1aF+{yW(U9Bi zAdZoe0V1YK6{0tSN^~}+7SG_n_Vt`TvV<~hIZctpP70n^PaNe1#cJAwSliRxGhh!5 zZt5NEw+7=N8C!5dWhB*RBC}twIqg$SJymlfsKV-^uFiRpWf3zlpLBEI_6XIocidX&05onx0R{;_@*@t+mLJ3 zU<<8_rMHQwuvM25D{IhD9Z}i|(T?jALQY6BaRQ#KOZ-k;ppcVb@$c~_4}Kf@q}OoB zGU~YWzrgeF(#Gs83Xx9_Nzo3`nqKny$A% z6_Q~l`l%L{IBZDE$l`>#qtyf)ML(t2d7{(O=*Ca#g`TLo)KuM=Hl2nZ<6wQ_QbJ_p z;sRI1X8d5!7#}yf`5BBNd7VcYkFVR9D;~c_r;{{>(MNkwsq*!vhI!nFoi09+8J3%h zq&0CaDtEhDs@CHlH<5aC@;cM8O&oMh9+sKF;EeYCBLGtZ}>wdjaB44xh09LP`bMqmYypj1hm@7A`*&uc4!%LX=F;&Yo1jj^;rXcY* z#}SW&mzc)Q@Jtyy`9M)BT1DEM)t~21d!H!k z%QuJ3rOug8d(z7=sA_gvtWiEYJ2B+Rla{86L^)iK>F1L(g$~oB&e&*%nKhc1+DdVQ zXEg;Jqsy@k$HZrwhDubZdBm?XA|jgFvgidPGafTCWJjV|Al9^(co-=ija-qW+-cj9 z8Y)4$=_ztEEG3%zBoWc(S(NfeBor9m=uO_?9f^gE2`eN8J?noy1lIQ)qD|qajjJ^= zn#3kL${V7G-L45^MmK`=>I{ce`F$kEzMQ;uw&E`rk00?%hcEMp0mp$1{b6T#a5<$& z9PLE45-cz}VK_4WjA6*&!;g%fO+pw-Q#*b%N%mf_nI+SVtxgi)BI~CTYMD=S>;Q2( zTf!7NaO%}0oA)94bP}{VzltO$8tJHs+$D|J*+@YSakNSEjJ!6C9t@@hu3N~4VgVhpi;A@JLQ!{eliHFI5H_bRMYi^xKZBvm1E^Lr&;UfxoOK5GA z-QyE-YfWT7{T-*o2+@_}6Aqzp1PF^8%TZ(MT1lHj2rD=H?vXe#5dm#Z1Q&me)uPOu zxv;@vM}jkaD$SQ7j_q%Yg5FcO)E3xe?`9`yF?`%ym1}}wkYW4uKl2_`QvkaRvw5Zh zz7?@TUx+gIu!eyrc`Is)wGs8=;P4bb*vFS&pO;B|k?60ASb=^ZMPy4FiSHoQf*i>(YM&1qym{mg^X*E#EZjl# zE^(+tSUip|*IBjIqO_QP0m^TNoEVDk4;Lx|7Z@Z1@(OR#lba3RAVB@LD>=)ioSU;r4FnftY5rKxiS&sNX#H}yG4A&_^L)Vb?xP3hKD^nc?s8^ zoS2jD9+|)V0@h4b@pYk81HNj;H^>r!kibN$v2Q{)X@e{J@N1^Y$OWuM!C-t>DOa6w z*CT!qE4ro#)mkA|VZrOjmokh4iQy;7xak8-L)3|L+gOAp7gg8zM9RNO_G)?ytJQs| z)Wps0n*tmydZZrGGGE&yI4}WDw%!zsN)A-?q-D)nEDvlYJj=1@8X#_IG>M23H?=ke z8TqJZTBNm7t&m%qbTyN^n7q9=NIOQ3cfmV;fbUqvzEL&yFH>j3@)=t4_CbeLtJSQO zaKy`7M2fj&$Ye?-sDw=P;lG4PBJ&rAYVfnIeqJrP+qJqp&V}1cetdvUEJ#b0?`&## zMQHtSU*sJwmj2PTWHQk8{*!)JA6-KZ__loV60#9aJa^n}I*xfJxkdp3$n#Am4x+G$ zo8^0nQwc^r#X1&8fi3Ca6s5iWnffvE#NsZB3bkC&uvaFk`lv`TD zU;LRLYuTj2Z#rd2c07gf`n2XgzTz=+5SICZC3{%rM8`{BK7m2Ngdx$D(b@|~roh89 z9!@83`;R69nh6mSb#>cPf};6wTW%=pvG(S%x_O^si?uoWnzFtHhlXUE&lD!w9BtsQ z*EScJgTVBS{p2HJ*rUWVV$G5A&Cz=nTTZPaid`kYXNgELQ6esKo*Xy@h8va;p3x;7uZUnb6&e7Y@f z?f56U?A%9Sf diff --git a/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po --- a/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po +++ b/rhodecode/i18n/pl/LC_MESSAGES/rhodecode.po @@ -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 , 2010. -# Nemcio , 2012. -# Nemo , 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 , 2010 +# marcinkuzminski , 2013 +# Nemcio , 2012 +# Nemcio , 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 \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 \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 @@ msgid "Home page" 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 @@ msgstr "Zasób nie został znaleziony" 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 @@ msgid "%s %s feed" 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 @@ msgstr "%s %s zasilać" 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 @@ msgstr "Twój link zresetowania hasła został wysłany" #: 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 @@ msgid "Default settings updated successf 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 @@ msgstr "Połączenie LDAP" 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 @@ msgstr "Zapis" #: 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[0] "%d rok" 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[0] "%d miesiąc" 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[0] "%d dzień" 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[0] "%d godzina" 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[0] "%d minuta" 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[0] "%d sekunda" 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 @@ msgstr "Wpisz hasło" 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 @@ msgstr "Nazwa użytkownika \"%(username)s\" jest zabroniona" #: 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 @@ msgid "Username %(username)s is not vali 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 @@ msgid "Repository \"%(repo)s\" already e 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 @@ msgid "You don't have permissions to cre 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 @@ msgstr "Dodaj repozytorium" #: 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 @@ msgstr "Opis" #: 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 @@ msgstr "Repozytorium grupy" 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 @@ msgstr "" #: 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 @@ msgstr "Nazwa użytkownika" #: 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 @@ msgstr "Zaloguj się" 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 @@ msgstr "Twoje konto musi zostać aktywowane przez administratora" #: 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 @@ msgid "There are no tags yet" 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 @@ msgstr[2] "%s wejść" #: 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgid "Show notification" 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 @@ msgid "Permissions administration" 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 @@ msgid "Anonymous access" 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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ msgstr "Edytuj repozytorium" #: 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 @@ msgstr "prywatne repozytorium" #: 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 @@ msgstr "domyślne" #: 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 @@ msgid "with" 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 @@ msgid "save" 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[1] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami" 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 @@ msgid "Remap and rescan repositories" 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 @@ msgid "Whoosh indexing" 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 @@ msgstr "Globalne ustawienia aplikacji" #: 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 @@ msgid "General" 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 @@ msgstr "Dodaj użytkownika" #: 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 @@ msgstr "Edytuj użytkownika" #: 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 @@ msgstr "Klucz API" #: 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 @@ msgstr "Nowe hasło" 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 @@ msgstr "Moje prośby połączenia gałęzi" #: 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 @@ msgstr "Wniosek połączenia gałęzi #%s otwarty %s" #: 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 @@ msgid "I participate in" 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 @@ msgid "users" 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 @@ msgstr "Dostępni użytkownicy" 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 @@ msgstr "Dziennik zmian" 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 @@ msgstr "obserwatorzy" 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 @@ msgid "members" 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 @@ msgid "Open new pull request for selecte 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 @@ msgstr "Wybór linku" #: 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 @@ msgstr "%s Gałęzie" 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[0] "pokazano %d z rewizji %d" 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 @@ msgstr "dodana" #: 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 @@ msgid "No parents" msgstr "Brak rewizji" #: rhodecode/templates/changeset/changeset.html:49 -#, fuzzy msgid "No children" msgstr "Brak dzieci" @@ -3584,24 +3749,21 @@ msgid "Changeset status" 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[1] "%d komentarzy" 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[1] "(%d linii)" 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[0] "%s plik został zmieniony" 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[0] "%s plik został zmieniony z %s inercjami i %s usunięciami" 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 @@ msgstr "%s Zestawienie zmian" 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 @@ msgstr "Brak plików" #: 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 @@ msgid "Git repository" 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 @@ msgstr "Subskrybuj %s kanał atom" 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 @@ msgstr "Otrzymaliśmy prośbę o utworzenie nowego hasła do twojego konta." 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 @@ msgid "You will be redirected to %s in % 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 @@ msgstr "Pliki różnic" #: 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 @@ msgstr "Położenie" 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 @@ msgid "Last committer" 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 @@ msgid "History" 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 @@ msgid "Load file history" 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 @@ msgid "Checkout source after making a cl 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 @@ msgid "Forks" 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 @@ msgstr "Publiczny dziennik kanału RSS" 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[1] "%d recenzenci" 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 @@ msgid "reviewer" 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 @@ msgstr "Nazwy plików" 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 @@ msgid "Non changable ID %s" 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 @@ msgstr "Statystyki" #: 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 @@ msgstr "Nie pobrano jeszcze plików" 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 @@ msgid "with subrepos" 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 @@ msgstr "Szybki start" #: 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 @@ msgstr "Etykiety pliku %s" #: rhodecode/templates/tags/tags.html:26 msgid "Compare tags" msgstr "Porównaj tagi" - diff --git a/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po --- a/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po +++ b/rhodecode/i18n/pt_BR/LC_MESSAGES/rhodecode.po @@ -7,7 +7,7 @@ msgid "" 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 \n" "Language-Team: pt_BR \n" @@ -17,40 +17,39 @@ msgstr "" "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 @@ msgid "%s %s feed" 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 @@ msgstr "%s - feed %s" 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 @@ msgstr "" "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 @@ msgstr "Configurações de LDAP atualizadas com sucesso" 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 @@ msgstr "Conexão LDAPS" 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 @@ msgstr "Gravar" #: 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 @@ msgstr "repositório %s criado" 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 @@ msgstr "usuário excluído com sucesso" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "Por favor entre com uma senha" 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 @@ msgstr "" #: 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 @@ msgstr "Você não tem permissão para ver esta página" 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 @@ msgstr "" "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 @@ msgid "You have admin right to this grou 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 @@ msgstr "Descrição" #: 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 @@ msgstr "Grupo de repositórios" 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 @@ msgstr "" #: 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 @@ msgstr "Nome de usuário" #: 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 @@ msgstr "Entrar" 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 @@ msgstr "Sua conta precisa esperar ativação por um administrador" #: 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 @@ msgid "There are no tags yet" 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 @@ msgstr[1] "" #: 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgstr "" "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 @@ msgid "Show notification" 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 @@ msgid "Permissions administration" 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 @@ msgstr "" #: 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 @@ msgstr "" "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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ msgstr "Editar repositório" #: 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 @@ msgstr "" "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 @@ msgstr "" " 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 @@ msgstr "repositório privado" #: 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 @@ msgstr "excluir" #: 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 @@ msgstr "Grupo de repositórios" #: 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 @@ msgstr "editar grupo de repositórios" 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 @@ msgid "Number of toplevel repositories" 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 @@ msgid "Google Analytics code" 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 @@ msgid "General" 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 @@ msgstr "Adicionar usuário" #: 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 @@ msgstr "Nova senha" 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 @@ 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: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 @@ msgid "I participate in" 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 @@ msgstr "Adicionar grupo de usuários" #: 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 @@ msgid "UserGroups" 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 @@ msgstr "Membros disponíveis" 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 @@ msgstr "Registro de alterações" 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 @@ msgstr "seguidores" 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 @@ msgid "Add another comment" 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 @@ msgid "members" 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 @@ msgid "No matching files" 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 @@ msgstr "Diff do arquivo" 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 @@ msgstr "ramos" 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 @@ msgstr "adicionados" 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 @@ msgid "Changeset status" 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 @@ msgid "Patch diff" 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[0] "%d comentário" 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[0] "(%d em linha)" 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 @@ msgid_plural "%s files changed" 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 @@ msgid_plural "%s files changed with %s i 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 @@ msgstr "Criar novo arquivo" 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 @@ msgstr "Conjuntos de mudanças" 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 @@ msgstr "Assinar o feed atom de %s" 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 @@ msgstr "" 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 @@ msgstr "arquivos" #: 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 @@ msgstr "arquivos" 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 @@ msgstr "Local" 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 @@ msgstr "editar arquivo" 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 @@ msgstr "diário público de %s - feed %s" 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 @@ msgstr[1] "" 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 @@ msgstr "Nomes dos arquivos" 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 @@ msgstr "público" 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 @@ msgstr "Tendências em arquivos" #: 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 @@ msgstr "Ainda não há downloads" 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 @@ msgstr "%s - feed %s" 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 @@ msgstr "Início rápido" #: 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" diff --git a/rhodecode/i18n/rhodecode.pot b/rhodecode/i18n/rhodecode.pot --- a/rhodecode/i18n/rhodecode.pot +++ b/rhodecode/i18n/rhodecode.pot @@ -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 , 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 \n" "Language-Team: LANGUAGE \n" @@ -17,36 +16,35 @@ msgstr "" "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 @@ 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." +msgid "The server encountered an unexpected condition which prevented it from fulfilling the request." msgstr "" #: rhodecode/controllers/feed.py:52 @@ -87,8 +83,8 @@ msgid "%s %s feed" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ 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" +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 @@ msgid "Username \"%(username)s\" is forb 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 @@ msgid "User group \"%(usergroup)s\" alre 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ 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: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 @@ msgstr "" #: 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 @@ 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:212 +#: rhodecode/templates/base/base.html:224 msgid "Password" msgstr "" @@ -1659,7 +1757,7 @@ msgstr "" 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 @@ 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: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 @@ msgid "There are no tags yet" 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[0] "" 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 @@ msgid "Repository" 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 @@ msgid "Repositories defaults" 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 @@ msgid "Show notification" 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 @@ 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/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 @@ 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" +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 @@ msgid "Clone from" 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 @@ msgid "Type of repository to create." 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 @@ 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: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 @@ msgstr "" #: 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 @@ msgstr "" #: 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 @@ 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 +#: rhodecode/templates/base/base.html:75 rhodecode/templates/base/base.html:91 msgid "Repository groups" msgstr "" @@ -2505,10 +2721,8 @@ msgstr "" 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 @@ 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: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 @@ 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." +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 @@ 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 " +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 @@ msgid "Google Analytics code" 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 @@ msgid "General" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ 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: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 @@ msgid "I participate in" 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 @@ 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 +#: 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 @@ msgid "UserGroups" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgid "Changeset status" 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 @@ msgid "Patch diff" 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[0] "" 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[0] "" 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 @@ msgid_plural "%s files changed" 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 @@ msgid_plural "%s files changed with %s i 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr[1] "" 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 @@ msgstr "" 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 @@ msgstr "" msgid "Fork of" msgstr "" -#: rhodecode/templates/summary/summary.html:96 +#: rhodecode/templates/summary/summary.html:97 msgid "Remote clone" msgstr "" @@ -4204,8 +4477,7 @@ msgstr "" #: 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 @@ msgstr "" 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 @@ msgstr "" 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 @@ msgstr "" #: 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 "" diff --git a/rhodecode/i18n/ru/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/ru/LC_MESSAGES/rhodecode.po new file mode 100644 --- /dev/null +++ b/rhodecode/i18n/ru/LC_MESSAGES/rhodecode.po @@ -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 , 2013 +# ivlevdenis , 2013 +# Михаил Жолобов , 2013 +# Andrey Mivrenik , 2013 +# zhmylove , 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 \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 "" diff --git a/rhodecode/lib/__init__.py b/rhodecode/lib/__init__.py --- a/rhodecode/lib/__init__.py +++ b/rhodecode/lib/__init__.py @@ -12,11 +12,13 @@ def get_current_revision(quiet=False): 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. " diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -39,10 +39,11 @@ from sqlalchemy.orm.exc import ObjectDel 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 @@ def authenticate(username, password): '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 @@ def login_container_auth(username): '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 @@ class AuthUser(object): 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 @@ class AuthUser(object): 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 @@ class AuthUser(object): 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 @@ class AuthUser(object): return False def __repr__(self): - return "" % (self.user_id, self.username, - self.is_authenticated) + return ""\ + % (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 @@ class LoginRequired(object): 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 @@ class LoginRequired(object): 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 HasRepoPermissionAnyDecorator(Perm 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 HasReposGroupPermissionAllDecorato 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 @@ class HasReposGroupPermissionAnyDecorato 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 @@ class HasReposGroupPermissionAll(PermsFu 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 #============================================================================== diff --git a/rhodecode/lib/base.py b/rhodecode/lib/base.py --- a/rhodecode/lib/base.py +++ b/rhodecode/lib/base.py @@ -21,7 +21,7 @@ from rhodecode.lib.utils2 import str2boo 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 @@ class BaseVCSController(object): :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 @@ class BaseController(WSGIController): # 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) diff --git a/rhodecode/lib/celerypylons/commands.py b/rhodecode/lib/celerypylons/commands.py --- a/rhodecode/lib/celerypylons/commands.py +++ b/rhodecode/lib/celerypylons/commands.py @@ -35,7 +35,7 @@ class CeleryCommand(BasePasterCommand): 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 diff --git a/rhodecode/lib/compat.py b/rhodecode/lib/compat.py --- a/rhodecode/lib/compat.py +++ b/rhodecode/lib/compat.py @@ -25,14 +25,17 @@ # along with this program. If not, see . 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 @@ from sqlalchemy.util import OrderedSet #============================================================================== # kill FUNCTIONS #============================================================================== -if __platform__ in PLATFORM_WIN: +if is_windows: import ctypes def kill(pid, sig): @@ -419,6 +422,7 @@ else: 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 @@ else: 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 "" % (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() diff --git a/rhodecode/lib/db_manage.py b/rhodecode/lib/db_manage.py --- a/rhodecode/lib/db_manage.py +++ b/rhodecode/lib/db_manage.py @@ -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.lib.utils import ask_ok 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 @@ def notify(msg): 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 @@ class DbManage(object): 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 @@ class DbManage(object): '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 @@ class DbManage(object): 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 @@ class DbManage(object): ('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 @@ class DbManage(object): ('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 @@ class DbManage(object): 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 @@ class DbManage(object): 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 @@ class DbManage(object): 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 @@ class DbManage(object): 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 @@ class DbManage(object): 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(): diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py b/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/genmodel.py @@ -144,11 +144,11 @@ class ModelGenerator(object): 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()', diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/schema.py b/rhodecode/lib/dbmigrate/migrate/versioning/schema.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/schema.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/schema.py @@ -7,7 +7,7 @@ import logging 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 @@ from rhodecode.lib.dbmigrate.migrate.ver log = logging.getLogger(__name__) + class ControlledSchema(object): """A database under version control""" diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py b/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/schemadiff.py @@ -10,6 +10,7 @@ from sqlalchemy.types import Float log = logging.getLogger(__name__) + def getDiffOfModelAgainstDatabase(metadata, engine, excludeTables=None): """ Return differences of model against database. @@ -17,7 +18,8 @@ def getDiffOfModelAgainstDatabase(metada :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 @@ class SchemaDiff(object): self.tables_different[table_name]=td def __str__(self): - ''' Summarize differences. ''' + """ Summarize differences. """ out = [] column_template =' %%%is: %%r' % self.label_width diff --git a/rhodecode/lib/dbmigrate/migrate/versioning/version.py b/rhodecode/lib/dbmigrate/migrate/versioning/version.py --- a/rhodecode/lib/dbmigrate/migrate/versioning/version.py +++ b/rhodecode/lib/dbmigrate/migrate/versioning/version.py @@ -90,7 +90,7 @@ class Collection(pathed.Pathed): 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 diff --git a/rhodecode/lib/dbmigrate/schema/db_1_4_0.py b/rhodecode/lib/dbmigrate/schema/db_1_4_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_4_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_4_0.py @@ -787,7 +787,7 @@ class Repository(Base, BaseModel): 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(): diff --git a/rhodecode/lib/dbmigrate/schema/db_1_5_0.py b/rhodecode/lib/dbmigrate/schema/db_1_5_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_5_0.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_5_0.py @@ -807,7 +807,7 @@ class Repository(Base, BaseModel): 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(): diff --git a/rhodecode/lib/dbmigrate/schema/db_1_5_2.py b/rhodecode/lib/dbmigrate/schema/db_1_5_2.py --- a/rhodecode/lib/dbmigrate/schema/db_1_5_2.py +++ b/rhodecode/lib/dbmigrate/schema/db_1_5_2.py @@ -873,7 +873,7 @@ class Repository(Base, BaseModel): 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(): diff --git a/rhodecode/lib/dbmigrate/schema/db_1_7_0.py b/rhodecode/lib/dbmigrate/schema/db_1_7_0.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/dbmigrate/schema/db_1_7_0.py @@ -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 + :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 . + +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 '' % (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 '' % (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 = ' » ' + _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' %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' %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) diff --git a/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py b/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/dbmigrate/versions/012_version_1_7_0.py @@ -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 diff --git a/rhodecode/lib/dbmigrate/versions/013_version_1_7_0.py b/rhodecode/lib/dbmigrate/versions/013_version_1_7_0.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/dbmigrate/versions/013_version_1_7_0.py @@ -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 diff --git a/rhodecode/lib/diffs.py b/rhodecode/lib/diffs.py --- a/rhodecode/lib/diffs.py +++ b/rhodecode/lib/diffs.py @@ -128,6 +128,7 @@ DEL_FILENODE = 2 MOD_FILENODE = 3 RENAMED_FILENODE = 4 CHMOD_FILENODE = 5 +BIN_FILENODE = 6 class DiffLimitExceeded(Exception): @@ -166,21 +167,23 @@ class DiffProcessor(object): (?:^deleted[ ]file[ ]mode[ ](?P.+)(?:\n|$))? (?:^index[ ](?P[0-9A-Fa-f]+) \.\.(?P[0-9A-Fa-f]+)[ ]?(?P.+)?(?:\n|$))? + (?:^(?PGIT[ ]binary[ ]patch)(?:\n|$))? (?:^---[ ](a/(?P.+)|/dev/null)(?:\n|$))? (?:^\+\+\+[ ](b/(?P.+)|/dev/null)(?:\n|$))? """, re.VERBOSE | re.MULTILINE) _hg_header_re = re.compile(r""" #^diff[ ]--git [ ]a/(?P.+?)[ ]b/(?P.+?)\n + (?:^old[ ]mode[ ](?P\d+)\n + ^new[ ]mode[ ](?P\d+)(?:\n|$))? (?:^similarity[ ]index[ ](?P\d+)%(?:\n|$))? (?:^rename[ ]from[ ](?P\S+)\n ^rename[ ]to[ ](?P\S+)(?:\n|$))? - (?:^old[ ]mode[ ](?P\d+)\n - ^new[ ]mode[ ](?P\d+)(?:\n|$))? (?:^new[ ]file[ ]mode[ ](?P.+)(?:\n|$))? (?:^deleted[ ]file[ ]mode[ ](?P.+)(?:\n|$))? (?:^index[ ](?P[0-9A-Fa-f]+) \.\.(?P[0-9A-Fa-f]+)[ ]?(?P.+)?(?:\n|$))? + (?:^(?PGIT[ ]binary[ ]patch)(?:\n|$))? (?:^---[ ](a/(?P.+)|/dev/null)(?:\n|$))? (?:^\+\+\+[ ](b/(?P.+)|/dev/null)(?:\n|$))? """, re.VERBOSE | re.MULTILINE) @@ -233,7 +236,6 @@ class DiffProcessor(object): 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 @@ class DiffProcessor(object): 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 @@ class DiffProcessor(object): ##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 @@ class DiffProcessor(object): 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? diff --git a/rhodecode/lib/exceptions.py b/rhodecode/lib/exceptions.py --- a/rhodecode/lib/exceptions.py +++ b/rhodecode/lib/exceptions.py @@ -62,6 +62,14 @@ class AttachedForksError(Exception): pass +class RepoGroupAssignmentError(Exception): + pass + + +class NonRelativePathError(Exception): + pass + + class HTTPLockedRC(HTTPClientError): """ Special Exception For locked Repos in RhodeCode, the return code can diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -16,7 +16,7 @@ import textwrap 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 @@ from webhelpers.text import chop_at, col 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 @@ def is_following_repo(repo_name, user_id 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 show_id(cs): 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 @@ def person(author, show_attr="username_a 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 @@ def person(author, show_attr="username_a 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 @@ def action_parser(user_log, feed=False, '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 @@ def action_parser(user_log, feed=False, 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 @@ def action_parser(user_log, feed=False, 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 @@ HasReposGroupPermissionAny # 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 @@ def gravatar_url(email_address, size=30) .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 @@ def gravatar_url(email_address, size=30) 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('' % 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 @@ def fancy_file_stats(stats): :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 @@ def fancy_file_stats(stats): 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 = '
%s
' % (d, cgen('a', a_v='', d_v=0), 'bin') - b_a = '
%s
' % ('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 = '
%s
' % (bin_op, cgen('a', a_v='', d_v=0), lbl) + b_a = '
' return literal('
%s%s
' % (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 diff --git a/rhodecode/lib/hooks.py b/rhodecode/lib/hooks.py --- a/rhodecode/lib/hooks.py +++ b/rhodecode/lib/hooks.py @@ -29,9 +29,7 @@ import binascii 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 @@ def handle_git_receive(repo_path, revs, 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 diff --git a/rhodecode/lib/indexers/__init__.py b/rhodecode/lib/indexers/__init__.py --- a/rhodecode/lib/indexers/__init__.py +++ b/rhodecode/lib/indexers/__init__.py @@ -24,32 +24,17 @@ # along with this program. If not, see . 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 @@ JOURNAL_SCHEMA = Schema( ) -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 @@ class WhooshResultWrapper(object): 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 @@ class WhooshResultWrapper(object): 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, diff --git a/rhodecode/lib/indexers/daemon.py b/rhodecode/lib/indexers/daemon.py --- a/rhodecode/lib/indexers/daemon.py +++ b/rhodecode/lib/indexers/daemon.py @@ -41,6 +41,7 @@ sys.path.append(project_path) 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 @@ class WhooshIndexingDaemon(object): 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 @@ class WhooshIndexingDaemon(object): """ 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 @@ class WhooshIndexingDaemon(object): 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 @@ class WhooshIndexingDaemon(object): (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 @@ class WhooshIndexingDaemon(object): :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 @@ class WhooshIndexingDaemon(object): 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 @@ class WhooshIndexingDaemon(object): 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): diff --git a/rhodecode/lib/middleware/pygrack.py b/rhodecode/lib/middleware/pygrack.py --- a/rhodecode/lib/middleware/pygrack.py +++ b/rhodecode/lib/middleware/pygrack.py @@ -7,7 +7,7 @@ import traceback 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 @@ class GitRepository(object): Small fix for repo_path :param path: - :type path: """ return path.split(self.repo_name, 1)[-1].strip('/') diff --git a/rhodecode/lib/middleware/simplegit.py b/rhodecode/lib/middleware/simplegit.py --- a/rhodecode/lib/middleware/simplegit.py +++ b/rhodecode/lib/middleware/simplegit.py @@ -55,8 +55,7 @@ class SimpleGitUploadPackHandler(dulserv 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 @@ def is_git(environ): 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 @@ class SimpleGit(BaseVCSController): # 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') diff --git a/rhodecode/lib/middleware/simplehg.py b/rhodecode/lib/middleware/simplehg.py --- a/rhodecode/lib/middleware/simplehg.py +++ b/rhodecode/lib/middleware/simplehg.py @@ -28,8 +28,6 @@ import os 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.base import BaseVCSCo 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 @@ class SimpleHg(BaseVCSController): 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') diff --git a/rhodecode/lib/paster_commands/cache_keys.py b/rhodecode/lib/paster_commands/cache_keys.py --- a/rhodecode/lib/paster_commands/cache_keys.py +++ b/rhodecode/lib/paster_commands/cache_keys.py @@ -29,15 +29,14 @@ import os 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__) diff --git a/rhodecode/lib/paster_commands/cleanup.py b/rhodecode/lib/paster_commands/cleanup.py --- a/rhodecode/lib/paster_commands/cleanup.py +++ b/rhodecode/lib/paster_commands/cleanup.py @@ -32,15 +32,14 @@ import shutil 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__) diff --git a/rhodecode/lib/paster_commands/ishell.py b/rhodecode/lib/paster_commands/ishell.py --- a/rhodecode/lib/paster_commands/ishell.py +++ b/rhodecode/lib/paster_commands/ishell.py @@ -29,12 +29,12 @@ import os 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__) diff --git a/rhodecode/lib/paster_commands/make_index.py b/rhodecode/lib/paster_commands/make_index.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/paster_commands/make_index.py @@ -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 + :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 . +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) diff --git a/rhodecode/lib/paster_commands/make_rcextensions.py b/rhodecode/lib/paster_commands/make_rcextensions.py --- a/rhodecode/lib/paster_commands/make_rcextensions.py +++ b/rhodecode/lib/paster_commands/make_rcextensions.py @@ -26,17 +26,16 @@ from __future__ import with_statement 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 @@ class Command(BasePasterCommand): 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]') diff --git a/rhodecode/lib/paster_commands/repo_scan.py b/rhodecode/lib/paster_commands/repo_scan.py --- a/rhodecode/lib/paster_commands/repo_scan.py +++ b/rhodecode/lib/paster_commands/repo_scan.py @@ -29,17 +29,13 @@ import os 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__) diff --git a/rhodecode/lib/paster_commands/setup_rhodecode.py b/rhodecode/lib/paster_commands/setup_rhodecode.py --- a/rhodecode/lib/paster_commands/setup_rhodecode.py +++ b/rhodecode/lib/paster_commands/setup_rhodecode.py @@ -4,8 +4,8 @@ from paste.script.appinstall import Abst 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) diff --git a/rhodecode/lib/paster_commands/update_repoinfo.py b/rhodecode/lib/paster_commands/update_repoinfo.py --- a/rhodecode/lib/paster_commands/update_repoinfo.py +++ b/rhodecode/lib/paster_commands/update_repoinfo.py @@ -29,16 +29,16 @@ import sys 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__) diff --git a/rhodecode/lib/rcmail/response.py b/rhodecode/lib/rcmail/response.py --- a/rhodecode/lib/rcmail/response.py +++ b/rhodecode/lib/rcmail/response.py @@ -87,7 +87,7 @@ class MailBase(object): 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 @@ class MIMEPart(MIMEBase): 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'] diff --git a/rhodecode/lib/subprocessio.py b/rhodecode/lib/subprocessio.py deleted file mode 100644 --- a/rhodecode/lib/subprocessio.py +++ /dev/null @@ -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 - -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 . -''' -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() diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -39,13 +39,12 @@ from os.path import dirname as dn, join 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.lib.caching_query import 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 @@ def repo_name_slug(value): 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 @@ def get_repos_group_slug(request): 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 @@ def set_rhodecode_config(config): 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 @@ def map_groups(path): # 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 @@ def map_groups(path): 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 @@ def repo2db_mapper(initial_repo_list, re 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 @@ def repo2db_mapper(initial_repo_list, re 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 @@ def repo2db_mapper(initial_repo_list, re 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 @@ def load_rcextensions(root_path): #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 @@ def create_test_env(repos_test_path, con #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 @@ def check_git_version(): """ 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 @@ def check_git_version(): 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 @@ def jsonify(func, *args, **kwargs): """ 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) diff --git a/rhodecode/lib/utils2.py b/rhodecode/lib/utils2.py --- a/rhodecode/lib/utils2.py +++ b/rhodecode/lib/utils2.py @@ -27,6 +27,7 @@ import os import re import sys import time +import uuid import datetime import traceback import webob @@ -280,8 +281,6 @@ def safe_str(unicode_, to_encoding=None) 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 _extract_extras(env=None): 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] diff --git a/rhodecode/lib/vcs/__init__.py b/rhodecode/lib/vcs/__init__.py --- a/rhodecode/lib/vcs/__init__.py +++ b/rhodecode/lib/vcs/__init__.py @@ -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 @@ def get_version(): """ return '.'.join((str(each) for each in VERSION[:3])) + def main(argv=None): if argv is None: argv = sys.argv diff --git a/rhodecode/lib/vcs/backends/base.py b/rhodecode/lib/vcs/backends/base.py --- a/rhodecode/lib/vcs/backends/base.py +++ b/rhodecode/lib/vcs/backends/base.py @@ -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 @@ class BaseRepository(object): 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 @@ class BaseInMemoryChangeset(object): 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 @@ class EmptyChangeset(BaseChangeset): 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)) diff --git a/rhodecode/lib/vcs/backends/git/changeset.py b/rhodecode/lib/vcs/backends/git/changeset.py --- a/rhodecode/lib/vcs/backends/git/changeset.py +++ b/rhodecode/lib/vcs/backends/git/changeset.py @@ -2,22 +2,21 @@ import re 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): """ 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): 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 @@ class GitChangeset(BaseChangeset): """ 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 @@ class GitChangeset(BaseChangeset): :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 diff --git a/rhodecode/lib/vcs/backends/git/config.py b/rhodecode/lib/vcs/backends/git/config.py --- a/rhodecode/lib/vcs/backends/git/config.py +++ b/rhodecode/lib/vcs/backends/git/config.py @@ -318,9 +318,7 @@ class StackedConfig(Config): 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: diff --git a/rhodecode/lib/vcs/backends/git/inmemory.py b/rhodecode/lib/vcs/backends/git/inmemory.py --- a/rhodecode/lib/vcs/backends/git/inmemory.py +++ b/rhodecode/lib/vcs/backends/git/inmemory.py @@ -46,7 +46,7 @@ class GitInMemoryChangeset(BaseInMemoryC 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 @@ class GitInMemoryChangeset(BaseInMemoryC 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) diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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 @@ class GitRepository(BaseRepository): 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) diff --git a/rhodecode/lib/vcs/backends/git/workdir.py b/rhodecode/lib/vcs/backends/git/workdir.py --- a/rhodecode/lib/vcs/backends/git/workdir.py +++ b/rhodecode/lib/vcs/backends/git/workdir.py @@ -20,8 +20,8 @@ class GitWorkdir(BaseWorkdir): 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: diff --git a/rhodecode/lib/vcs/backends/hg/changeset.py b/rhodecode/lib/vcs/backends/hg/changeset.py --- a/rhodecode/lib/vcs/backends/hg/changeset.py +++ b/rhodecode/lib/vcs/backends/hg/changeset.py @@ -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 diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -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 @@ class MercurialRepository(BaseRepository @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 @@ class MercurialRepository(BaseRepository 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 @@ class MercurialRepository(BaseRepository 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 @@ class MercurialRepository(BaseRepository ' 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 @@ class MercurialRepository(BaseRepository """ 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)) diff --git a/rhodecode/lib/vcs/backends/hg/workdir.py b/rhodecode/lib/vcs/backends/hg/workdir.py --- a/rhodecode/lib/vcs/backends/hg/workdir.py +++ b/rhodecode/lib/vcs/backends/hg/workdir.py @@ -10,7 +10,8 @@ class MercurialWorkdir(BaseWorkdir): 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: diff --git a/rhodecode/lib/vcs/conf/settings.py b/rhodecode/lib/vcs/conf/settings.py --- a/rhodecode/lib/vcs/conf/settings.py +++ b/rhodecode/lib/vcs/conf/settings.py @@ -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 @@ VCSRC_PATH = VCSRC_PATH or abspath(HOME_ 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 @@ ARCHIVE_SPECS = { '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', -} diff --git a/rhodecode/lib/vcs/exceptions.py b/rhodecode/lib/vcs/exceptions.py --- a/rhodecode/lib/vcs/exceptions.py +++ b/rhodecode/lib/vcs/exceptions.py @@ -89,5 +89,6 @@ class NodeAlreadyRemovedError(CommitErro class ImproperArchiveTypeError(VCSError): pass + class CommandError(VCSError): pass diff --git a/rhodecode/lib/vcs/nodes.py b/rhodecode/lib/vcs/nodes.py --- a/rhodecode/lib/vcs/nodes.py +++ b/rhodecode/lib/vcs/nodes.py @@ -13,13 +13,10 @@ import stat 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 @@ class Node(object): 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 @@ class FileNode(Node): @LazyProperty def mimetype_main(self): - return ['', ''] return self.mimetype.split('/')[0] @LazyProperty @@ -362,7 +358,7 @@ class FileNode(Node): 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: diff --git a/rhodecode/lib/vcs/subprocessio.py b/rhodecode/lib/vcs/subprocessio.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/vcs/subprocessio.py @@ -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 + +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 . +""" +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() diff --git a/rhodecode/lib/vcs/utils/__init__.py b/rhodecode/lib/vcs/utils/__init__.py --- a/rhodecode/lib/vcs/utils/__init__.py +++ b/rhodecode/lib/vcs/utils/__init__.py @@ -16,6 +16,27 @@ def makedate(): 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 @@ def date_fromtimestamp(unixts, tzoffset= 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 @@ def safe_unicode(str_, from_encoding=Non :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 @@ def safe_unicode(str_, from_encoding=Non 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 @@ def safe_str(unicode_, to_encoding=None) :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 @@ def safe_str(unicode_, to_encoding=None) 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): diff --git a/rhodecode/lib/vcs/utils/annotate.py b/rhodecode/lib/vcs/utils/annotate.py --- a/rhodecode/lib/vcs/utils/annotate.py +++ b/rhodecode/lib/vcs/utils/annotate.py @@ -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, diff --git a/rhodecode/lib/vcs/utils/baseui_config.py b/rhodecode/lib/vcs/utils/baseui_config.py --- a/rhodecode/lib/vcs/utils/baseui_config.py +++ b/rhodecode/lib/vcs/utils/baseui_config.py @@ -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'): diff --git a/rhodecode/lib/vcs/utils/compat.py b/rhodecode/lib/vcs/utils/compat.py --- a/rhodecode/lib/vcs/utils/compat.py +++ b/rhodecode/lib/vcs/utils/compat.py @@ -5,9 +5,314 @@ Those utilities may be deleted once ``vc 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 "" % (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() diff --git a/rhodecode/lib/vcs/utils/diffs.py b/rhodecode/lib/vcs/utils/diffs.py --- a/rhodecode/lib/vcs/utils/diffs.py +++ b/rhodecode/lib/vcs/utils/diffs.py @@ -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 @@ def get_gitdiff(filenode_old, filenode_n 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 @@ class DiffProcessor(object): 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 @@ class DiffProcessor(object): 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): diff --git a/rhodecode/lib/vcs/utils/helpers.py b/rhodecode/lib/vcs/utils/helpers.py --- a/rhodecode/lib/vcs/utils/helpers.py +++ b/rhodecode/lib/vcs/utils/helpers.py @@ -4,10 +4,11 @@ Utitlites aimed to help achieve mostly b 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 @@ def parse_changesets(text): return result raise ValueError("IDs not recognized") + def parse_datetime(text): """ Parses given text and returns ``datetime.datetime`` instance or raises diff --git a/rhodecode/lib/vcs/utils/hgcompat.py b/rhodecode/lib/vcs/utils/hgcompat.py --- a/rhodecode/lib/vcs/utils/hgcompat.py +++ b/rhodecode/lib/vcs/utils/hgcompat.py @@ -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 diff --git a/rhodecode/lib/vcs/utils/progressbar.py b/rhodecode/lib/vcs/utils/progressbar.py --- a/rhodecode/lib/vcs/utils/progressbar.py +++ b/rhodecode/lib/vcs/utils/progressbar.py @@ -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 @@ class ProgressBar(object): 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: diff --git a/rhodecode/model/__init__.py b/rhodecode/model/__init__.py --- a/rhodecode/model/__init__.py +++ b/rhodecode/model/__init__.py @@ -104,8 +104,7 @@ class BaseModel(object): """ 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 @@ class BaseModel(object): """ 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 @@ class BaseModel(object): """ 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, diff --git a/rhodecode/model/comment.py b/rhodecode/model/comment.py --- a/rhodecode/model/comment.py +++ b/rhodecode/model/comment.py @@ -91,7 +91,7 @@ class ChangesetCommentsModel(BaseModel): {'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 @@ class ChangesetCommentsModel(BaseModel): '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 @@ class ChangesetCommentsModel(BaseModel): #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, diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -24,12 +24,12 @@ # along with this program. If not, see . 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 @@ class BaseModel(object): @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 @@ class RhodeCodeUi(Base, BaseModel): 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 @@ class User(Base, BaseModel): '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 @@ class User(Base, BaseModel): 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 @@ class UserLog(Base, BaseModel): 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 @@ class UserGroup(Base, BaseModel): 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'' % (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 @@ class Repository(Base, BaseModel): 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 @@ class Repository(Base, BaseModel): .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 @@ class Repository(Base, BaseModel): Returns statuses for this repository :param revisions: list of revisions to get statuses for - :type revisions: list """ statuses = ChangesetStatus.query()\ @@ -1141,20 +1176,16 @@ class Repository(Base, BaseModel): # 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 @@ class Repository(Base, BaseModel): 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 @@ class RepoGroup(Base, BaseModel): 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 @@ class RepoGroup(Base, BaseModel): repo_groups = [] if show_empty_group: - repo_groups = [('-1', '-- %s --' % _('top level'))] + repo_groups = [('-1', u'-- %s --' % _('top level'))] sep = ' » ' _name = lambda k: _literal(sep.join(k)) @@ -1385,6 +1408,8 @@ class Permission(Base, BaseModel): '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 @@ class Permission(Base, BaseModel): ('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 @@ class Permission(Base, BaseModel): '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 @@ class Permission(Base, BaseModel): 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 @@ class UserRepoToPerm(Base, BaseModel): return n def __unicode__(self): - return u' %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 @@ class UserToPerm(Base, BaseModel): 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 @@ class UserGroupRepoToPerm(Base, BaseMode return n def __unicode__(self): - return u' %s >' % (self.users_group, self.repository) + return u' %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' %s >' % (self.target_user_group, self.user_group) class UserGroupToPerm(Base, BaseModel): @@ -1636,146 +1768,115 @@ class CacheInvalidation(Base, BaseModel) 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 @@ class UserNotification(Base, BaseModel): 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__ = ( diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -134,9 +134,7 @@ def ReposGroupForm(edit=False, old_data= 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 @@ def RepoPermsForm(): 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 @@ def ApplicationVisualisationForm(): 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 ApplicationUiSettingsForm(): 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 @@ def PullRequestForm(repo_id): 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 diff --git a/rhodecode/model/gist.py b/rhodecode/model/gist.py new file mode 100644 --- /dev/null +++ b/rhodecode/model/gist.py @@ -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 + :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 . +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 diff --git a/rhodecode/model/notification.py b/rhodecode/model/notification.py --- a/rhodecode/model/notification.py +++ b/rhodecode/model/notification.py @@ -85,6 +85,9 @@ class NotificationModel(BaseModel): 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 @@ class NotificationModel(BaseModel): 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_ diff --git a/rhodecode/model/permission.py b/rhodecode/model/permission.py --- a/rhodecode/model/permission.py +++ b/rhodecode/model/permission.py @@ -30,7 +30,7 @@ from sqlalchemy.exc import DatabaseError 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 @@ class PermissionModel(BaseModel): 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 @@ class PermissionModel(BaseModel): # 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 @@ class PermissionModel(BaseModel): 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 @@ class PermissionModel(BaseModel): 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,): diff --git a/rhodecode/model/pull_request.py b/rhodecode/model/pull_request.py --- a/rhodecode/model/pull_request.py +++ b/rhodecode/model/pull_request.py @@ -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 @@ class PullRequestModel(BaseModel): 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 @@ class PullRequestModel(BaseModel): '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 @@ class PullRequestModel(BaseModel): 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 diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -41,8 +41,9 @@ from rhodecode.model.db import Repositor 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): :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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): :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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): :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 @@ class RepoModel(BaseModel): 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 @@ class RepoModel(BaseModel): ) 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): """ diff --git a/rhodecode/model/repos_group.py b/rhodecode/model/repos_group.py --- a/rhodecode/model/repos_group.py +++ b/rhodecode/model/repos_group.py @@ -42,11 +42,11 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): _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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): :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 @@ class ReposGroupModel(BaseModel): :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 @@ class ReposGroupModel(BaseModel): :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 @@ class ReposGroupModel(BaseModel): 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 @@ class ReposGroupModel(BaseModel): :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)\ diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -30,7 +30,7 @@ import traceback 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 import BACKENDS 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 @@ class CachedRepoList(object): 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 @@ class SimpleCachedRepoList(CachedRepoLis 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 @@ class SimpleCachedRepoList(CachedRepoLis 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 @@ class ScmModel(BaseModel): 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 @@ class ScmModel(BaseModel): :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 @@ class ScmModel(BaseModel): 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 @@ class ScmModel(BaseModel): 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 @@ class ScmModel(BaseModel): grouped by type :param repo: - :type repo: """ hist_l = [] @@ -654,7 +727,6 @@ class ScmModel(BaseModel): 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 @@ class ScmModel(BaseModel): _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) diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -39,7 +39,7 @@ from rhodecode.model import BaseModel 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 @@ class UserModel(BaseModel): 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 @@ class UserModel(BaseModel): """ 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 @@ class UserModel(BaseModel): 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 @@ class UserModel(BaseModel): 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 @@ class UserModel(BaseModel): 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 @@ class UserModel(BaseModel): for perm in user_perms: user.permissions[GLOBAL].add(perm.permission.permission_name) + ## END GLOBAL PERMISSIONS #====================================================================== # !! PERMISSIONS FOR REPOSITORIES !! @@ -588,15 +608,7 @@ class UserModel(BaseModel): # 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 @@ class UserModel(BaseModel): 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 @@ class UserModel(BaseModel): 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): diff --git a/rhodecode/model/users_group.py b/rhodecode/model/users_group.py --- a/rhodecode/model/users_group.py +++ b/rhodecode/model/users_group.py @@ -29,8 +29,10 @@ import traceback 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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): :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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): .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 @@ class UserGroupModel(BaseModel): 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 @@ class UserGroupModel(BaseModel): .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)) diff --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py --- a/rhodecode/model/validators.py +++ b/rhodecode/model/validators.py @@ -11,7 +11,7 @@ from webhelpers.pylonslib.secure_form im 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 @@ from rhodecode.lib.auth import HasReposG # 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 @@ def ValidUsername(edit=False, old_data={ _(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 @@ def ValidUsername(edit=False, old_data={ 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 ValidCloneUri(): 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 @@ def ValidCloneUri(): 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 CanCreateGroup(can_create_in_root=Fa 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 @@ def ValidIp(): 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 @@ def FieldKey(): 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 diff --git a/rhodecode/public/css/contextbar.css b/rhodecode/public/css/contextbar.css --- a/rhodecode/public/css/contextbar.css +++ b/rhodecode/public/css/contextbar.css @@ -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 @@ ul#context-actions { 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; diff --git a/rhodecode/public/css/pygments.css b/rhodecode/public/css/pygments.css --- a/rhodecode/public/css/pygments.css +++ b/rhodecode/public/css/pygments.css @@ -14,12 +14,12 @@ div.codeblock { 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 .stats .butto } div.codeblock .code-header .author { - margin-left: 25px; + margin-left: 15px; font-weight: bold; height: 25px; } @@ -55,18 +55,22 @@ div.codeblock .code-header .author .user 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 @@ div.annotatediv { 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 */ diff --git a/rhodecode/public/css/style.css b/rhodecode/public/css/style.css --- a/rhodecode/public/css/style.css +++ b/rhodecode/public/css/style.css @@ -218,6 +218,8 @@ div.options a { a.permalink { visibility: hidden; + position: absolute; + margin: 3px 4px; } a.permalink:hover { @@ -365,7 +367,6 @@ div:hover > a.permalink { height: 40px; width: 46px; display: block; - background: url("../images/button_home.png"); background-position: 0 0; margin: 0; padding: 0; @@ -542,10 +543,6 @@ div:hover > a.permalink { 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 @@ div.form div.fields div.field div.button 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 @@ div.form div.fields div.field div.button 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 @@ div.form div.fields div.field div.button 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 @@ div.form div.fields div.field div.button 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 @@ div.form div.fields div.field div.button 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 @@ div.form div.fields div.field div.button #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 @@ h3.files_location { 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 @@ h3.files_location { 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 @@ h3.files_location { } #graph_content .comments-container, +#shortlog_data .comments-container, #graph_content .logtags { display: block; float: left; @@ -2635,7 +2649,7 @@ h3.files_location { left: initial; } -#graph_content .logtags .bookbook, +#graph_content .logtags .booktag, #graph_content .logtags .tagtag { float: left; line-height: 1em; @@ -2690,7 +2704,13 @@ h3.files_location { 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 @@ h3.files_location { .branchtag, .tagtag, -.bookbook, +.booktag, .spantag { padding: 1px 3px 1px 3px; font-size: 10px; @@ -2775,14 +2795,14 @@ h3.files_location { #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 @@ h3.files_location { display: block; } -.bookbook { +.booktag { border-color: #46A546; color: #46A546; } @@ -2830,7 +2850,7 @@ h3.files_location { 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 @@ h3.files_location { -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 @@ table.code-browser .submodule-dir { } #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 @@ div.gravatar img { 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 @@ div.gravatar img { 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 @@ div.gravatar img { } .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 @@ div.gravatar img { 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 @@ div.rst-block pre { 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 @@ form.comment-form { 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 @@ form.comment-form { } .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 @@ form.comment-form { .comment .buttons { float: right; - padding: 2px 2px 0px 0px; + margin: -1px 0px 0px 0px; } @@ -4365,6 +4422,9 @@ form.comment-form { } /** comment inline form **/ +.comment-inline-form { + margin: 4px; +} .comment-inline-form .overlay { display: none; } @@ -4383,11 +4443,13 @@ form.comment-form { 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 @@ form.comment-inline-form { } .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 { diff --git a/rhodecode/public/images/favicon.ico b/rhodecode/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7c0ab2b4c643f33162c0ebd80c4b0f8418acef2c GIT binary patch literal 468 zc$@*$0W1EAP)xrrOlR+AYYd7dzkRXrG^eM& z0Ukd7oRTC-k|gQnMef{;h-hbg699m%$}xbdi0=mUTP2n)`eug$pemyB(~7A5(p8B9 zpo-`-pi=3n1vBanKvhJor`FPV@4HbW;>w}!^`!?_&$o+c)M|~!f&*g2sIl2&+nRI7 z2dg4_dK!Hio3Z4v0sAzDZropP7e%esh`Tl#_R2+_g}2LFOq{)tc4JXTKlp1=*9P-? z()(@ByuPV7UnkqEhjpwo;fJpEp5FC1>gt?lJ 0; o[--m] = i); - return o.join(''); + for (var o = []; m > 0; o[--m] = i); + return o.join(''); }; /** @@ -19,48 +19,48 @@ var str_repeat = function(i, m) { * 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 @@ var prevElementSibling = function( el ) * 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 @@ ColorGenerator.prototype = { 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 @@ ColorGenerator.prototype = { 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/ */ 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 @@ var pyroutes = (function() { '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 @@ var pyroutes = (function() { 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 @@ var YUQ = YAHOO.util.Selector.query; // 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 @@ var _run_callbacks = function(callbacks) * 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='ERROR: {0}'.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='ERROR: {0}'.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 ajaxGET = function(url,success) { 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 @@ var ajaxPOST = function(url,postData,suc * 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 @@ var show_more_event = function(){ * 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 @@ var toggleFollowingUser = function(targe } YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{ success:function(o){ - onSuccessFollow(target); + onSuccessFollow(target); } },args); return false; @@ -556,7 +559,7 @@ var toggleFollowingRepo = function(targe } YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{ success:function(o){ - onSuccessFollow(target); + onSuccessFollow(target); } },args); return false; @@ -564,18 +567,18 @@ var toggleFollowingRepo = function(targe 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 @@ var showRepoSize = function(target, repo 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'+ - ''+ - ''+ + 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 = (''+ + ''+ + ''+ ''+ '
{2}
').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 @@ var createInlineForm = function(parent_t * 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 = '{0}'.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 = '{0}'.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 matches_max){ - break; - } - - var n = nodes[i].name; - var t = nodes[i].type; - var n_hl = n.substring(0,pos) - +"{0}".format(n.substring(pos,pos+query.length)) - +n.substring(pos+query.length) - var new_url = url_base.replace('__FPATH__',n); - match.push('
{2}'.format(t,new_url,n_hl)); - } - if(match.length >= matches_max){ - match.push('{0}'.format(_TM['Search truncated'])); - } - } - } - if(query != ""){ - YUD.setStyle('tbody','display','none'); - YUD.setStyle('tbody_filtered','display',''); - - if (match.length==0){ - match.push('{0}'.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) + +"{0}".format(n.substring(pos,pos+query.length)) + +n.substring(pos+query.length) + var new_url = url_base.replace('__FPATH__',n); + match.push('{2}'.format(t,new_url,n_hl)); + } + if(match.length >= matches_max){ + match.push('{0}'.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('{0}'.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 @@ var initCodeMirror = function(textAreadI 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 @@ var MembersAutoComplete = function (divi // 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 @@ var MembersAutoComplete = function (divi 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 @@ var MembersAutoComplete = function (divi // Helper highlight function for the formatter var highlightMatch = function (full, snippet, matchindex) { - return full.substring(0, matchindex) - + "" - + full.substr(matchindex, snippet.length) + return full.substring(0, matchindex) + + "" + + full.substr(matchindex, snippet.length) + "" + full.substring(matchindex + snippet.length); }; @@ -1351,11 +1380,11 @@ var MembersAutoComplete = function (divi 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 = '
{1}
' - return tmpl.format(em,res) + if (group !== undefined){ + em = '/images/icons/group.png' + } + tmpl = '
{1}
' + return tmpl.format(em,res) } // group if (oResultData.grname != undefined) { @@ -1369,13 +1398,13 @@ var MembersAutoComplete = function (divi 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 @@ var MembersAutoComplete = function (divi 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 @@ var MembersAutoComplete = function (divi membersAC.itemSelectEvent.subscribe(myHandler); if(ownerAC.itemSelectEvent){ - ownerAC.itemSelectEvent.subscribe(myHandler); + ownerAC.itemSelectEvent.subscribe(myHandler); } return { @@ -1445,11 +1474,11 @@ var MentionsAutoComplete = function (div // 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 @@ var MentionsAutoComplete = function (div // 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 @@ var MentionsAutoComplete = function (div 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) - + "" - + full.substr(matchindex, snippet.length) + return full.substring(0, matchindex) + + "" + + full.substr(matchindex, snippet.length) + "" + 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 = '
{1}
' - return tmpl.format(em,res) + if (group !== undefined){ + em = '/images/icons/group.png' + } + tmpl = '
{1}
' + 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 @@ var MentionsAutoComplete = function (div }; 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 @@ var MentionsAutoComplete = function (div //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 @@ var MentionsAutoComplete = function (div 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 MentionsAutoComplete = function (div } var addReviewMember = function(id,fname,lname,nname,gravatar_link){ - var members = YUD.get('review_members'); - var tmpl = '
  • '+ + var members = YUD.get('review_members'); + var tmpl = '
  • '+ '
    '+ '
    gravatar
    '+ '
    {1}
    '+ ''+ ''+ '
    '+ - '
  • ' ; + '' ; 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 -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 @@ var PullRequestAutoComplete = function ( 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) - + "" - + full.substr(matchindex, snippet.length) + return full.substring(0, matchindex) + + "" + + full.substr(matchindex, snippet.length) + "" + 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 = '
    {1}
    ' - return tmpl.format(em,res) + if (group !== undefined){ + em = '/images/icons/group.png' + } + tmpl = '
    {1}
    ' + 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 @@ var PullRequestAutoComplete = function ( 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 @@ var quick_repo_menu = function(){ // 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_rev = function(node){ } 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 @@ var nameSort = function(a, b, desc, fiel // 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 @@ var permNameSort = function(a, b, desc, // 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 permNameSort = function(a, b, desc, 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 groupNameSort = function(a, b, desc, 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 @@ var addPermAction = function(_html, user 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: '>', + previousPageLinkLabel: '<', + 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 = "↑ {0} ↑".format(_TM['Collapse diff']); - } - else if(!YUD.hasClass(t, 'hidden')){ - YUD.addClass(t, 'hidden'); - YUD.get(button).innerHTML = "↓ {0} ↓".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 = "↑ {0} ↑".format(_TM['Collapse diff']); + } + else if(!YUD.hasClass(t, 'hidden')){ + YUD.addClass(t, 'hidden'); + YUD.get(button).innerHTML = "↓ {0} ↓".format(_TM['Expand diff']); + } + }); + + + }); - diff --git a/rhodecode/templates/admin/gists/index.html b/rhodecode/templates/admin/gists/index.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/admin/gists/index.html @@ -0,0 +1,71 @@ +## -*- coding: utf-8 -*- +<%inherit file="/base/base.html"/> + +<%def name="title()"> + ${_('Gists')} · ${c.rhodecode_name} + + +<%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 name="page_nav()"> + ${self.menu('gists')} + + +<%def name="main()"> +
    + +
    + ${self.breadcrumbs()} + %if c.rhodecode_user.username != 'default': + + %endif +
    + %if c.gists_pager.item_count>0: + % for gist in c.gists_pager: +
    + +
    + gravatar +
    +
    + ${h.person(gist.owner.full_contact)} / + gist:${gist.gist_access_id} +
    +
    + ${_('Created')} ${h.age(gist.created_on)} / + + %if gist.gist_expires == -1: + ${_('Expires')}: ${_('never')} + %else: + ${_('Expires')}: ${h.age(h.time_to_datetime(gist.gist_expires))} + %endif + +
    + +
    ${gist.gist_description}
    +
    + % endfor + +
    +
    + ${c.gists_pager.pager('$link_previous ~2~ $link_next')} +
    +
    + %else: +
    ${_('There are no gists yet')}
    + %endif +
    + diff --git a/rhodecode/templates/admin/gists/new.html b/rhodecode/templates/admin/gists/new.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/admin/gists/new.html @@ -0,0 +1,64 @@ +## -*- coding: utf-8 -*- +<%inherit file="/base/base.html"/> + +<%def name="title()"> + ${_('New gist')} · ${c.rhodecode_name} + + +<%def name="js_extra()"> + + +<%def name="css_extra()"> + + + +<%def name="breadcrumbs_links()"> + ${_('New gist')} + + +<%def name="page_nav()"> + ${self.menu('gists')} + + +<%def name="main()"> +
    + +
    + ${self.breadcrumbs()} +
    + +
    +
    + ${h.form(h.url('gists'), method='post',id='eform')} +
    +
    + gravatar +
    + +
    +
    +
    + ## + ${h.text('filename', size=30, placeholder='gistfile1.txt')} + ## + ${h.select('lifetime', '', c.lifetime_options)} +
    +
    +
    
    +                    
    +                
    +
    +
    + ${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")} +
    + ${h.end_form()} + +
    +
    + +
    + diff --git a/rhodecode/templates/admin/gists/show.html b/rhodecode/templates/admin/gists/show.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/admin/gists/show.html @@ -0,0 +1,97 @@ +## -*- coding: utf-8 -*- +<%inherit file="/base/base.html"/> + +<%def name="title()"> + ${_('gist')}:${c.gist.gist_access_id} · ${c.rhodecode_name} + + +<%def name="breadcrumbs_links()"> + ${_('Gist')} · gist:${c.gist.gist_access_id} + + +<%def name="page_nav()"> + ${self.menu('gists')} + + +<%def name="main()"> +
    + +
    + ${self.breadcrumbs()} + %if c.rhodecode_user.username != 'default': + + %endif +
    +
    +
    +
    +
    +
    +
    + %if c.gist.gist_type == 'public': +
    ${_('Public gist')}
    + %else: +
    ${_('Private gist')}
    + %endif +
    +
    + %if c.gist.gist_expires == -1: + ${_('Expires')}: ${_('never')} + %else: + ${_('Expires')}: ${h.age(h.time_to_datetime(c.gist.gist_expires))} + %endif +
    +
    + ${c.gist.gist_description} +
    + %if h.HasPermissionAny('hg.admin')() or c.gist.gist_owner == c.rhodecode_user.user_id: +
    + ${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()} +
    + %endif +
    + ## 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")} +
    +
    + +
    +
    + gravatar +
    +
    ${h.person(c.file_changeset.author)} - ${_('created')} ${h.age(c.file_changeset.date)}
    +
    +
    ${h.urlify_commit(c.file_changeset.message,c.repo_name)}
    +
    +
    + + ## iterate over the files + % for file in c.files: +
    +
    + + ${file.path} +
    + ${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")} +
    +
    +
    + ${h.pygmentize(file,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")} +
    +
    + %endfor +
    +
    + + +
    + diff --git a/rhodecode/templates/admin/permissions/permissions.html b/rhodecode/templates/admin/permissions/permissions.html --- a/rhodecode/templates/admin/permissions/permissions.html +++ b/rhodecode/templates/admin/permissions/permissions.html @@ -66,18 +66,32 @@
    - +
    - ${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')} + +
    - +
    - ${h.select('default_create','',c.create_choices)} + ${h.select('default_repo_create','',c.repo_create_choices)} +
    +
    +
    +
    + +
    +
    + ${h.select('default_user_group_create','',c.user_group_create_choices)}
    @@ -88,6 +102,22 @@ ${h.select('default_fork','',c.fork_choices)}
    +
    +
    + +
    +
    + ${h.select('default_register','',c.register_choices)} +
    +
    +
    +
    + +
    +
    + ${h.select('default_extern_activate','',c.extern_activate_choices)} +
    +
    ${h.submit('save',_('Save'),class_="ui-btn large")} ${h.reset('reset',_('Reset'),class_="ui-btn large")} @@ -104,7 +134,8 @@
    ## 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)}
    diff --git a/rhodecode/templates/admin/repos/repo_edit.html b/rhodecode/templates/admin/repos/repo_edit.html --- a/rhodecode/templates/admin/repos/repo_edit.html +++ b/rhodecode/templates/admin/repos/repo_edit.html @@ -33,6 +33,7 @@
    ${h.text('repo_name',class_="medium")} + ${_('Non-changeable id')}: ${c.repo_info.repo_id}
    @@ -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
    @@ -285,7 +286,7 @@
    ${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",)}
      diff --git a/rhodecode/templates/admin/repos/repo_edit_perms.html b/rhodecode/templates/admin/repos/repo_edit_perms.html --- a/rhodecode/templates/admin/repos/repo_edit_perms.html +++ b/rhodecode/templates/admin/repos/repo_edit_perms.html @@ -29,7 +29,7 @@ %if r2p.user.username !='default': - + ${_('revoke')} %endif @@ -54,7 +54,7 @@ %endif - + ${_('revoke')} @@ -86,34 +86,9 @@ diff --git a/rhodecode/templates/admin/users/user_edit.html b/rhodecode/templates/admin/users/user_edit.html --- a/rhodecode/templates/admin/users/user_edit.html +++ b/rhodecode/templates/admin/users/user_edit.html @@ -149,49 +149,12 @@
      ${_('Permissions')}
      - ${h.form(url('user_perm', id=c.user.user_id),method='put')} -
      - -
      -
      -
      - -
      -
      - ${h.checkbox('inherit_default_permissions',value=True)} -
      - ${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')))} -
      -
      -
      -
      - -
      -
      - ${h.checkbox('create_repo_perm',value=True)} -
      -
      -
      -
      - -
      -
      - ${h.checkbox('fork_repo_perm',value=True)} -
      -
      -
      -
      - ${h.submit('save',_('Save'),class_="ui-btn large")} - ${h.reset('reset',_('Reset'),class_="ui-btn large")} -
      -
      -
      - ${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)}
    diff --git a/rhodecode/templates/admin/users/user_edit_my_account.html b/rhodecode/templates/admin/users/user_edit_my_account.html --- a/rhodecode/templates/admin/users/user_edit_my_account.html +++ b/rhodecode/templates/admin/users/user_edit_my_account.html @@ -178,20 +178,7 @@ function table_renderer(data){ 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: '>', - previousPageLinkLabel: '<', - firstPageLinkLabel: '<<', - lastPageLinkLabel: '>>', - containers:['user-paginator'] - }), + paginator: YUI_paginator(50, ['user-paginator']), MSG_SORTASC:"${_('Click to sort ascending')}", MSG_SORTDESC:"${_('Click to sort descending')}", diff --git a/rhodecode/templates/admin/users_groups/user_group_edit_perms.html b/rhodecode/templates/admin/users_groups/user_group_edit_perms.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/admin/users_groups/user_group_edit_perms.html @@ -0,0 +1,101 @@ + + + + + + + + + + ## USERS + %for r2p in c.users_group.user_user_group_to_perm: + ##forbid revoking permission from yourself + + %if c.rhodecode_user.user_id != r2p.user.user_id or c.rhodecode_user.is_admin: + + + + + + + %else: + + + + + + + %endif + + %endfor + + ## USER GROUPS + %for g2p in c.users_group.user_group_user_group_to_perm: + + + + + + + + + %endfor + + <% + _tmpl = h.literal("""' \ + \ + \ + \ + \ + \ + '""") + %> + ## ADD HERE DYNAMICALLY NEW INPUTS FROM THE '_tmpl' + + + + +
    ${_('none')}${_('read')}${_('write')}${_('admin')}${_('member')}
    ${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none')}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read')}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write')}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.admin')} + ${r2p.user.username if r2p.user.username != 'default' else _('default')} + + %if r2p.user.username !='default': + + ${_('revoke')} + + %endif + ${h.radio('u_perm_%s' % r2p.user.username,'usergroup.none', disabled="disabled")}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.read', disabled="disabled")}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.write', disabled="disabled")}${h.radio('u_perm_%s' % r2p.user.username,'usergroup.admin', disabled="disabled")} + ${r2p.user.username if r2p.user.username != 'default' else _('default')} + +
    ${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.none')}${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.read')}${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.write')}${h.radio('g_perm_%s' % g2p.user_group.users_group_name,'usergroup.admin')} + ${g2p.user_group.users_group_name} + + + ${_('revoke')} + +
    \ +
    \ + \ + \ +
    \ +
    \ +
    + + ${_('Add another member')} + +
    + diff --git a/rhodecode/templates/admin/users_groups/users_group_edit.html b/rhodecode/templates/admin/users_groups/users_group_edit.html --- a/rhodecode/templates/admin/users_groups/users_group_edit.html +++ b/rhodecode/templates/admin/users_groups/users_group_edit.html @@ -18,7 +18,7 @@ <%def name="main()"> -
    +
    ${self.breadcrumbs()} @@ -92,64 +92,6 @@
    ${h.end_form()} -
    - -
    - -
    -
    ${_('Permissions')}
    -
    - ${h.form(url('users_group_perm', id=c.users_group.users_group_id), method='put')} -
    - -
    -
    -
    - -
    -
    - ${h.checkbox('inherit_default_permissions',value=True)} -
    - ${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')))} -
    -
    -
    -
    - -
    -
    - ${h.checkbox('create_repo_perm',value=True)} -
    -
    -
    -
    - -
    -
    - ${h.checkbox('fork_repo_perm',value=True)} -
    -
    -
    -
    - ${h.submit('save',_('Save'),class_="ui-btn large")} - ${h.reset('reset',_('Reset'),class_="ui-btn large")} -
    -
    -
    - ${h.end_form()} - - ## permissions overview - <%namespace name="p" file="/base/perms_summary.html"/> - ${p.perms_summary(c.users_group.permissions)} -
    - -
    - -
    -
    ${_('Group members')}
    -
    -
    % if c.group_members_obj:
      @@ -169,6 +111,43 @@
    +
    + +
    +
    ${_('Global Permissions')}
    +
    + <%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)} +
    + +
    +
    +
    ${_('Permissions')}
    +
    + ${h.form(url('set_user_group_perm_member', id=c.users_group.users_group_id),method='post')} +
    +
    +
    +
    + +
    +
    + <%include file="user_group_edit_perms.html"/> +
    +
    +
    + ${h.submit('save',_('Save'),class_="ui-btn large")} + ${h.reset('reset',_('Reset'),class_="ui-btn large")} +
    +
    +
    + ${h.end_form()} +
    + diff --git a/rhodecode/templates/admin/users_groups/users_groups.html b/rhodecode/templates/admin/users_groups/users_groups.html --- a/rhodecode/templates/admin/users_groups/users_groups.html +++ b/rhodecode/templates/admin/users_groups/users_groups.html @@ -21,20 +21,23 @@
    ${self.breadcrumbs()}
    +
    + %if c.users_groups_list: - + %for cnt,u_group in enumerate(c.users_groups_list): @@ -42,6 +45,11 @@ + %endfor
    ${_('Group name')} ${_('Members')} ${_('Active')}${_('Action')}${_('Action')}
    ${len(u_group.members)} ${h.boolicon(u_group.users_group_active)} + + ${h.submit('edit_%s' % u_group.users_group_name,_('edit'),class_="edit_icon action_button")} + + ${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 @@
    + %else: + ${_('There are no user groups yet')} + %endif
    diff --git a/rhodecode/templates/base/base.html b/rhodecode/templates/base/base.html --- a/rhodecode/templates/base/base.html +++ b/rhodecode/templates/base/base.html @@ -39,12 +39,17 @@ @@ -77,9 +82,17 @@ -<%def name="admin_menu_simple()"> +<%def name="admin_menu_simple(repositories=None, repository_groups=None, user_groups=None)">
      + %if repositories: +
    • ${h.link_to(_('Repositories'),h.url('repos'),class_='repos')}
    • + %endif + %if repository_groups:
    • ${h.link_to(_('Repository groups'),h.url('repos_groups'),class_='repos_groups')}
    • + %endif + %if user_groups: +
    • ${h.link_to(_('User groups'),h.url('users_groups'),class_='groups')}
    • + %endif
    @@ -123,7 +136,6 @@ %if c.rhodecode_db_repo.fork:
  • ${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')}
  • %endif -
  • ${h.link_to(_('Lightweight changelog'),h.url('shortlog_home',repo_name=c.repo_name),class_='shortlog')}
  • ${h.link_to(_('Search'),h.url('search_repo',repo_name=c.repo_name),class_='search')}
  • %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking: @@ -282,6 +294,19 @@ %endif +
  • + + ${_('Gists')} + +
      +
    • ${h.link_to(_('Create new gist'),h.url('new_gist'),class_='gists-new ')}
    • +
    • ${h.link_to(_('All public gists'),h.url('gists'),class_='gists ')}
    • + %if c.rhodecode_user.username != 'default': +
    • ${h.link_to(_('My public gists'),h.url('gists', public=1),class_='gists')}
    • +
    • ${h.link_to(_('My private gists'),h.url('gists', private=1),class_='gists-private ')}
    • + %endif +
    +
  • ${_('Search')} @@ -294,12 +319,14 @@ ${admin_menu()}
  • - % 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:
  • ${_('Admin')} - ${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')())}
  • % endif ${usermenu()} diff --git a/rhodecode/templates/base/default_perms_box.html b/rhodecode/templates/base/default_perms_box.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/base/default_perms_box.html @@ -0,0 +1,86 @@ +## snippet for displaying default permission box +## usage: +## <%namespace name="dpb" file="/base/default_perms_box.html"/> +## ${dpb.default_perms_box()} + + +<%def name="default_perms_box(form_url)"> +${h.form(form_url, method='put')} +
    + +
    +
    +
    + + ${h.checkbox('inherit_default_permissions',value=True)} +
    + + ${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')))} + +
    +
    +
    +
    + + ${h.checkbox('create_repo_perm',value=True)} +
    + + ${h.literal(_('Select this option to allow repository creation for this user'))} + +
    +
    +
    + + ${h.checkbox('create_user_group_perm',value=True)} +
    + + ${h.literal(_('Select this option to allow user group creation for this user'))} + +
    +
    +
    + + ${h.checkbox('fork_repo_perm',value=True)} +
    + + ${h.literal(_('Select this option to allow repository forking for this user'))} + +
    +
    +
    + ${h.submit('save',_('Save'),class_="ui-btn large")} + ${h.reset('reset',_('Reset'),class_="ui-btn large")} +
    +
    +
    +${h.end_form()} + +## JS + + + diff --git a/rhodecode/templates/base/perms_summary.html b/rhodecode/templates/base/perms_summary.html --- a/rhodecode/templates/base/perms_summary.html +++ b/rhodecode/templates/base/perms_summary.html @@ -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)">
    %for section in sorted(permissions.keys()):
    ${section.replace("_"," ").capitalize()}
    @@ -9,35 +12,44 @@ %else:
    - - - - - - - + ## global permission box %if section == 'global': - %for k in sorted(permissions[section], key=lambda s: s.lower()): + - + + + + %for k in permissions[section]: + + - %endfor + %else: + + + + + + + %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: + %endif %endfor + %endif - -
    ${_('Name')}${_('Permission')}${_('Edit Permission')}
    + ${_('Permission')}${_('Edit Permission')}
    ${h.get_permission_name(k)} - ${h.boolicon(k.split('.')[-1] != 'none')} - ${_('edit')}
    ${_('Name')}${_('Permission')}${_('Edit Permission')}
    %if section == 'repositories': ${k} %elif section == 'repositories_groups': ${k} + %elif section == 'user_groups': + ##${k} + ${k} %endif @@ -48,13 +60,15 @@ ${_('edit')} %elif section == 'repositories_groups': ${_('edit')} + %elif section == 'user_groups': + ##${_('edit')} %endif
    %endif diff --git a/rhodecode/templates/base/root.html b/rhodecode/templates/base/root.html --- a/rhodecode/templates/base/root.html +++ b/rhodecode/templates/base/root.html @@ -1,11 +1,12 @@ ## -*- coding: utf-8 -*- + ${self.title()} - + ## CSS ### <%def name="css()"> @@ -15,8 +16,8 @@ ## EXTRA FOR CSS ${self.css_extra()} - <%def name="css_extra()"> - + + <%def name="css_extra()"> ${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 + %if c.repo_bookmarks: + + %endif
    <%include file='bookmarks_data.html'/>
    diff --git a/rhodecode/templates/bookmarks/bookmarks_data.html b/rhodecode/templates/bookmarks/bookmarks_data.html --- a/rhodecode/templates/bookmarks/bookmarks_data.html +++ b/rhodecode/templates/bookmarks/bookmarks_data.html @@ -7,13 +7,14 @@ ${_('Date')} ${_('Author')} ${_('Revision')} + ${_('Compare')} %for cnt,book in enumerate(c.repo_bookmarks.items()): - ${h.link_to(book[0], + ${h.link_to(book[0], h.url('files_home',repo_name=c.repo_name,revision=book[1].raw_id))} @@ -24,6 +25,10 @@
    r${book[1].revision}:${h.short_id(book[1].raw_id)}
    + + + + %endfor diff --git a/rhodecode/templates/changelog/changelog.html b/rhodecode/templates/changelog/changelog.html --- a/rhodecode/templates/changelog/changelog.html +++ b/rhodecode/templates/changelog/changelog.html @@ -3,12 +3,20 @@ <%inherit file="/base/base.html"/> <%def name="title()"> -${_('%s Changelog') % c.repo_name} · ${c.rhodecode_name} +${_('%s Changelog') % c.repo_name} · +%if c.changelog_for_path: + /${c.changelog_for_path} · +%endif +${c.rhodecode_name} <%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 name="page_nav()"> @@ -25,26 +33,28 @@
    % if c.pagination:
    -
    - - +
    +
    + + - %if c.rhodecode_db_repo.fork: - ${_('Compare fork with parent')} - %endif - %if h.is_hg(c.rhodecode_repo): - ${_('Open new pull request')} - %endif -
    -
    - ${h.form(h.url.current(),method='get')} -
    - ${h.submit('set',_('Show'),class_="ui-btn")} - ${h.text('size',size=1,value=c.size)} - ${_('revisions')} + %if c.rhodecode_db_repo.fork: + ${_('Compare fork with parent')} + %endif + %if h.is_hg(c.rhodecode_repo): + ${_('Open new pull request')} + %endif
    - ${h.end_form()} -
    ${h.select('branch_filter',c.branch_name,c.branch_filters)}
    +
    + ${h.form(h.url.current(),method='get')} +
    + ${h.submit('set',_('Show'),class_="ui-btn")} + ${h.text('size',size=1,value=c.size)} + ${_('revisions')} +
    + ${h.end_form()} +
    ${h.select('branch_filter',c.branch_name,c.branch_filters)}
    +
    @@ -56,7 +66,11 @@ %for cnt,cs in enumerate(c.pagination): - ${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 %if c.statuses.get(cs.raw_id):
    @@ -87,7 +101,7 @@
    ${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
    ↓ ${_('Show more')} ↓
    - %if c.comments.get(cs.raw_id,[]): + %if c.comments.get(cs.raw_id):
    @@ -98,7 +112,7 @@ %endif %if h.is_hg(c.rhodecode_repo): %for book in cs.bookmarks: -
    +
    ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
    %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{ diff --git a/rhodecode/templates/changelog/changelog_summary_data.html b/rhodecode/templates/changelog/changelog_summary_data.html new file mode 100644 --- /dev/null +++ b/rhodecode/templates/changelog/changelog_summary_data.html @@ -0,0 +1,112 @@ +## -*- coding: utf-8 -*- +%if c.repo_changesets: + + + + + + + + +%for cnt,cs in enumerate(c.repo_changesets): + + + + + + + +%endfor + +
    ${_('Revision')}${_('Commit message')}${_('Age')}${_('Author')}${_('Refs')}
    +
    +
    + %if c.comments.get(cs.raw_id,[]): + + %endif + %if c.statuses.get(cs.raw_id): +
    + %if c.statuses.get(cs.raw_id)[2]: + + + + %else: + + %endif +
    + %endif +
    +
    ${h.show_id(cs)}
    +
    +
    + ${h.urlify_commit(h.truncate(cs.message,50),c.repo_name, h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))} + + ${h.age(cs.date)} + ${h.person(cs.author)} + %if h.is_hg(c.rhodecode_repo): + %for book in cs.bookmarks: +
    + ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} +
    + %endfor + %endif + %for tag in cs.tags: +
    + ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} +
    + %endfor + %if cs.branch: +
    + ${h.link_to(h.shorter(cs.branch),h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))} +
    + %endif +
    + + + +
    +${c.repo_changesets.pager('$link_previous ~2~ $link_next')} +
    +%else: + +%if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name): +

    ${_('Add or upload files directly via RhodeCode')}

    +
    +%endif + + +

    ${_('Push new repo')}

    +
    +    ${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
    +
    + +

    ${_('Existing repository?')}

    +
    +%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
    +
    +%endif diff --git a/rhodecode/templates/changeset/changeset_file_comment.html b/rhodecode/templates/changeset/changeset_file_comment.html --- a/rhodecode/templates/changeset/changeset_file_comment.html +++ b/rhodecode/templates/changeset/changeset_file_comment.html @@ -12,7 +12,7 @@ ${co.author.username}
    - ${h.age(co.modified_at)} + ${h.age(co.modified_at)}
    %if co.status_change:
    @@ -22,7 +22,7 @@
    %endif -
    +
    %if co.pull_request: @@ -35,11 +35,9 @@ %endif
    - + %if h.HasPermissionAny('hg.admin', 'repository.admin')() or co.author.user_id == c.rhodecode_user.user_id: -
    - ${_('Delete')} -
    +
    ${_('Delete')}
    %endif
    @@ -56,7 +54,7 @@ %if c.rhodecode_user.username != 'default':
    ${_('Submitting...')}
    ${h.form('#', class_='inline-form')} -
    +
    ${_('Commenting on line {1}.')} ${(_('Comments parsed using %s syntax with %s support.') % ( ('RST' % h.url('rst_help')), @@ -64,9 +62,17 @@ ) )|n } +
    ${_('Preview')}
    - + +
    +
    @@ -134,7 +140,7 @@ %if c.rhodecode_user.username != 'default':
    ${h.form(post_url)} -
    +
    ${(_('Comments parsed using %s syntax with %s support.') % (('RST' % h.url('rst_help')), '@mention' % @@ -143,6 +149,7 @@ | ${_('Change status')} %endif +
    ${_('Preview')}
    %if change_status: %endif
    - ${h.textarea('text')} + ${h.textarea('text', class_="comment-block-ta")}
    + + +
    ${h.submit('save', _('Comment'), class_="ui-btn large")} %if close_btn and change_status: @@ -185,6 +201,27 @@ YUE.onDOMReady(function () { 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'); + }) }); diff --git a/rhodecode/templates/changeset/changeset_range.html b/rhodecode/templates/changeset/changeset_range.html --- a/rhodecode/templates/changeset/changeset_range.html +++ b/rhodecode/templates/changeset/changeset_range.html @@ -54,7 +54,12 @@ %for cs in c.cs_ranges:
    ${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))}
    %for FID, (cs1, cs2, change, path, diff, stats) in c.changes[cs.raw_id].iteritems(): -
    ${h.link_to(h.safe_unicode(path),h.url.current(anchor=FID))}
    +
    +
    + ${h.link_to(h.safe_unicode(path),h.url.current(anchor=FID))} +
    +
    ${h.fancy_file_stats(stats)}
    +
    %endfor %endfor
    @@ -78,7 +83,7 @@ %endif %if h.is_hg(c.rhodecode_repo): %for book in cs.bookmarks: - + ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} %endfor diff --git a/rhodecode/templates/changeset/diff_block.html b/rhodecode/templates/changeset/diff_block.html --- a/rhodecode/templates/changeset/diff_block.html +++ b/rhodecode/templates/changeset/diff_block.html @@ -9,13 +9,12 @@
    %for FID,(cs1, cs2, change, path, diff, stats) in change.iteritems(): - ##%if op !='removed':
    - ${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)))}
    @@ -38,7 +37,6 @@ ${diff|n}
    - ##%endif %endfor
    diff --git a/rhodecode/templates/data_table/_dt_elements.html b/rhodecode/templates/data_table/_dt_elements.html --- a/rhodecode/templates/data_table/_dt_elements.html +++ b/rhodecode/templates/data_table/_dt_elements.html @@ -126,10 +126,17 @@ <%def name="user_actions(user_id, username)"> + +
    ${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()} +
    <%def name="user_name(user_id, username)"> diff --git a/rhodecode/templates/email_templates/changeset_comment.html b/rhodecode/templates/email_templates/changeset_comment.html --- a/rhodecode/templates/email_templates/changeset_comment.html +++ b/rhodecode/templates/email_templates/changeset_comment.html @@ -1,17 +1,18 @@ ## -*- coding: utf-8 -*- <%inherit file="main.html"/> -##message from user goes here -

    -${cs_comment_user}:
    + +

    ${_('URL')}: ${cs_comment_url}

    + +

    ${_('%s commented on a %s changeset.') % (cs_comment_user,cs_target_repo) |n}

    + +

    ${_('Changeset')}: ${h.short_id(raw_id)}

    +

    ${_('Description')}:
    +${h.shorter(message, 256)} +

    + +%if status_change: +

    ${_('The changeset status was changed to')}: ${status_change}

    +%endif +

    ${_('Comment')}:
    ${body}

    -%if status_change: - ${_('New status')} -> ${status_change} -%endif -
    ${_('View this comment here')}: ${cs_comment_url}
    - -
    -${_('Repo')}: ${cs_target_repo}
    -${_('Changeset')}: ${h.short_id(raw_id)}
    -${_('desc')}: ${h.shorter(message, 256)}
    -
    diff --git a/rhodecode/templates/email_templates/password_reset.html b/rhodecode/templates/email_templates/password_reset.html --- a/rhodecode/templates/email_templates/password_reset.html +++ b/rhodecode/templates/email_templates/password_reset.html @@ -2,10 +2,9 @@ <%inherit file="main.html"/>

    ${_('Hello %s') % user}

    -
    ${_('We received a request to create a new password for your account.')}
    -
    ${_('You can generate it by clicking following URL')}:
    +

    ${_('We received a request to create a new password for your account.')}

    +

    ${_('You can generate it by clicking following URL')}:

     ${reset_url}
     
    -
    -${_("If you did not request new password please ignore this email.")} +

    ${_("Please ignore this email if you did not request a new password .")}

    diff --git a/rhodecode/templates/email_templates/pull_request.html b/rhodecode/templates/email_templates/pull_request.html --- a/rhodecode/templates/email_templates/pull_request.html +++ b/rhodecode/templates/email_templates/pull_request.html @@ -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.') % (('%s' % pr_user_created),pr_repo_url) |n} -
    ${_('View this pull request here')}: ${pr_url}
    -
    ${_('title')}: ${pr_title}
    -
    ${_('description')}:
    -

    -${body} -

    +

    ${_('URL')}: ${pr_url}

    + +

    ${_('%s opened a pull request for repository %s and wants you to review changes.') % (pr_user_created,pr_repo_url) |n}

    -
    ${_('revisions for reviewing')}
    +

    ${_('Title')}: ${pr_title}

    +

    ${_('Description')}:

    +

    ${body}

    + +

    ${_('Changesets')}:

    %for r,r_msg in pr_revisions: ${h.short_id(r)}: ${h.shorter(r_msg, 256)} + %endfor

    diff --git a/rhodecode/templates/email_templates/pull_request_comment.html b/rhodecode/templates/email_templates/pull_request_comment.html --- a/rhodecode/templates/email_templates/pull_request_comment.html +++ b/rhodecode/templates/email_templates/pull_request_comment.html @@ -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 -

    -${pr_comment_user}:
    -${body} -

    -
    ${_('View this comment here')}: ${pr_comment_url}
    + +

    ${_('URL')}: ${pr_comment_url}

    + +

    ${_('%s commented on pull request "%s"') % (pr_comment_user,pr_title) |n}

    %if status_change: %if closing_pr: - ${_('Closing pull request with status')} -> ${status_change} +

    ${_('Pull request was closed with status')}: ${status_change}

    %else: - ${_('New status')} -> ${status_change} +

    ${_('Pull request changed status')}: ${status_change}

    %endif %endif -

    + +

    ${_('Comment')}:

    +

    ${body}

    diff --git a/rhodecode/templates/email_templates/registration.html b/rhodecode/templates/email_templates/registration.html --- a/rhodecode/templates/email_templates/registration.html +++ b/rhodecode/templates/email_templates/registration.html @@ -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} diff --git a/rhodecode/templates/errors/error_document.html b/rhodecode/templates/errors/error_document.html --- a/rhodecode/templates/errors/error_document.html +++ b/rhodecode/templates/errors/error_document.html @@ -5,7 +5,7 @@ Error - ${c.error_message} - + %if c.redirect_time: diff --git a/rhodecode/templates/files/files_add.html b/rhodecode/templates/files/files_add.html --- a/rhodecode/templates/files/files_add.html +++ b/rhodecode/templates/files/files_add.html @@ -75,7 +75,7 @@
    ${_('Commit message')}
    -
    +
    ${h.submit('commit',_('Commit changes'),class_="ui-btn")} ${h.reset('reset',_('Reset'),class_="ui-btn")}
    diff --git a/rhodecode/templates/files/files_history_box.html b/rhodecode/templates/files/files_history_box.html --- a/rhodecode/templates/files/files_history_box.html +++ b/rhodecode/templates/files/files_history_box.html @@ -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()}
    diff --git a/rhodecode/templates/index_base.html b/rhodecode/templates/index_base.html --- a/rhodecode/templates/index_base.html +++ b/rhodecode/templates/index_base.html @@ -70,160 +70,13 @@ - <%cnt=0%> - <%namespace name="dt" file="/data_table/_dt_elements.html"/> - % if not c.visual.lightweight_dashboard: - ## old full detailed version -
    - - - - - - - - - - - - - - %for cnt,repo in enumerate(c.repos_list): - - ##QUICK MENU - - ##REPO NAME AND ICONS - - ##DESCRIPTION - - ##LAST CHANGE DATE - - ##LAST REVISION - - ## - - - - %endfor - -
    ${_('Name')}${_('Description')}${_('Last change')}${_('Tip')}${_('Owner')}${_('Atom')}
    - ${dt.quick_menu(repo['name'])} - - ${dt.repo_name(repo['name'],repo['dbrepo']['repo_type'],repo['dbrepo']['private'],h.AttributeDict(repo['dbrepo_fork']),pageargs.get('short_repo_names'))} - - %if c.visual.stylify_metatags: - ${h.urlify_text(h.desc_stylize(h.truncate(repo['description'],60)))} - %else: - ${h.truncate(repo['description'],60)} - %endif - - ${dt.last_change(repo['last_change'])} - - ${dt.revision(repo['name'],repo['rev'],repo['tip'],repo['author'],repo['last_msg'])} - ${h.person(repo['contact'])} - ${dt.atom(repo['name'])} -
    -
    - % else: - ## lightweight version -
    -
    - % endif + <%cnt=0%> + <%namespace name="dt" file="/data_table/_dt_elements.html"/> +
    +
    - % if not c.visual.lightweight_dashboard: - - % else: - % endif diff --git a/rhodecode/templates/journal/journal.html b/rhodecode/templates/journal/journal.html --- a/rhodecode/templates/journal/journal.html +++ b/rhodecode/templates/journal/journal.html @@ -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: '>', - previousPageLinkLabel: '<', - firstPageLinkLabel: '<<', - lastPageLinkLabel: '>>', - 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: '>', - previousPageLinkLabel: '<', - firstPageLinkLabel: '<<', - lastPageLinkLabel: '>>', - containers:['user-paginator'] - }), + paginator: YUI_paginator(25, ['user-paginator']), MSG_SORTASC:"${_('Click to sort ascending')}", MSG_SORTDESC:"${_('Click to sort descending')}", diff --git a/rhodecode/templates/journal/journal_data.html b/rhodecode/templates/journal/journal_data.html --- a/rhodecode/templates/journal/journal_data.html +++ b/rhodecode/templates/journal/journal_data.html @@ -2,7 +2,7 @@ %if c.journal_day_aggreagate: %for day,items in c.journal_day_aggreagate: -
    ${day}
    +
    ${day}
    % for user,entries in items:
    @@ -35,7 +35,9 @@ %endfor %endfor -
    +
    + ${c.journal_pager.pager('$link_previous ~2~ $link_next')} +
    - ${c.journal_pager.pager('$link_previous ~2~ $link_next')} -
    %else:
    ${_('No entries yet')} diff --git a/rhodecode/templates/pullrequests/pullrequest.html b/rhodecode/templates/pullrequests/pullrequest.html --- a/rhodecode/templates/pullrequests/pullrequest.html +++ b/rhodecode/templates/pullrequests/pullrequest.html @@ -19,80 +19,22 @@
    ${self.breadcrumbs()}
    - ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')} -
    - ##ORG -
    -
    - - ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref',c.default_org_ref,c.org_refs,class_='refs')} - -
    ${c.rhodecode_db_repo.description}
    -
    -
    -
    -
    - -
    - ##OTHER, most Probably the PARENT OF THIS FORK -
    -
    - - ${h.select('other_repo',c.default_other_repo,c.other_repos,class_='refs')}:${c.default_other_repo_info['revs']} - -
    -
    -
    -
    -
    - ## overview pulled by ajax -
    - -
    -
    -

    ${_('Pull request reviewers')}

    -
    - ## members goes here ! -
    -
      - %for member in [c.default_other_repo_info['user']]: -
    • -
      -
      gravatar
      -
      ${member['firstname']} ${member['lastname']} (${_('owner')})
      - - -
      -
    • - %endfor -
    -
    + ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')} -
    -
    - ${h.text('user', class_='yui-ac-input')} - ${_('Add reviewer to this pull request.')} -
    -
    -
    -
    -

    ${_('Create new pull request')}

    -
    +
    - ${h.text('pullrequest_title',size=30)} + ${h.text('pullrequest_title', class_="large")}
    @@ -101,16 +43,96 @@
    - ${h.textarea('pullrequest_desc',size=30)} + ${h.textarea('pullrequest_desc',size=30, style="height:100px")} + ${_('Write a short description on this pull request')} +
    +
    + +
    +
    + +
    +
    + ##ORG +
    +
    +
    + ${_('Origin repository')}: ${c.rhodecode_db_repo.description} +
    + + ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref',c.default_org_ref,c.org_refs,class_='refs')} + +
    +
    + + ##OTHER, most Probably the PARENT OF THIS FORK +
    +
    + ## filled with JS +
    +
    + + ${h.select('other_repo',c.default_other_repo,c.other_repos,class_='refs')}:${c.default_other_repo_info['revs']} + +
    +
    +
    -
    - ${h.submit('save',_('Send pull request'),class_="ui-btn large")} - ${h.reset('reset',_('Reset'),class_="ui-btn large")} +
    +
    + ${h.submit('save',_('Send pull request'),class_="ui-btn large")} + ${h.reset('reset',_('Reset'),class_="ui-btn large")} +
    +
    + +
    + + ## Reviewers +
    +

    ${_('Pull request reviewers')}

    +
    + ## members goes here ! +
    +
      + %for member in [c.default_other_repo_info['user']]: +
    • +
      +
      gravatar
      +
      ${member['firstname']} ${member['lastname']} (${_('owner')})
      + + +
      +
    • + %endfor +
    +
    + +
    +
    + ${h.text('user', class_='yui-ac-input')} + ${_('Add reviewer to this pull request.')} +
    +
    +
    +
    +
    + +
    + +

    ${_('Changesets')}

    +
    + ## overview pulled by ajax +
    +
    +
    +
    + ${h.end_form()}
    @@ -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 = "${_('Destination repository')}: {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']); diff --git a/rhodecode/templates/pullrequests/pullrequest_data.html b/rhodecode/templates/pullrequests/pullrequest_data.html --- a/rhodecode/templates/pullrequests/pullrequest_data.html +++ b/rhodecode/templates/pullrequests/pullrequest_data.html @@ -3,36 +3,22 @@ % for pr in c.pullrequests_pager:
    - %if pr.is_closed(): -
    ${_('Closed')}
    - %endif ${_('Pull request #%s opened by %s on %s') % (pr.pull_request_id, pr.author.full_name, h.fmt_date(pr.created_on))} + %if pr.is_closed(): + ${_('Closed')} + %endif
    ${_('Title')}: ${pr.title}
    ${pr.description}
    % endfor -
    - +
    ${c.pullrequests_pager.pager('$link_previous ~2~ $link_next')}
    - -
    diff --git a/rhodecode/templates/pullrequests/pullrequest_show.html b/rhodecode/templates/pullrequests/pullrequest_show.html --- a/rhodecode/templates/pullrequests/pullrequest_show.html +++ b/rhodecode/templates/pullrequests/pullrequest_show.html @@ -78,7 +78,7 @@
    - +
    ${h.literal(c.pull_request.description)}
    diff --git a/rhodecode/templates/search/search.html b/rhodecode/templates/search/search.html --- a/rhodecode/templates/search/search.html +++ b/rhodecode/templates/search/search.html @@ -54,7 +54,7 @@
    -
    ${c.runtime}
    +
    ${c.runtime}
    diff --git a/rhodecode/templates/shortlog/shortlog.html b/rhodecode/templates/shortlog/shortlog.html deleted file mode 100644 --- a/rhodecode/templates/shortlog/shortlog.html +++ /dev/null @@ -1,37 +0,0 @@ -## -*- coding: utf-8 -*- -<%inherit file="/base/base.html"/> - -<%def name="title()"> - ${_('%s Lightweight Changelog') % c.repo_name} · ${c.rhodecode_name} - - - -<%def name="breadcrumbs_links()"> - %if c.file_history: - ${h.link_to(_('Lightweight Changelog'),h.url('shortlog_home',repo_name=c.repo_name))} - » - ${c.file_history} - %else: - ${_('Lightweight Changelog')} - %endif - - -<%def name="page_nav()"> - ${self.menu('repositories')} - - -<%def name="main()"> -${self.context_bar('options')} -
    - -
    - ${self.breadcrumbs()} -
    - -
    -
    - ${c.shortlog_data} -
    -
    -
    - diff --git a/rhodecode/templates/shortlog/shortlog_data.html b/rhodecode/templates/shortlog/shortlog_data.html deleted file mode 100644 --- a/rhodecode/templates/shortlog/shortlog_data.html +++ /dev/null @@ -1,101 +0,0 @@ -## -*- coding: utf-8 -*- -%if c.repo_changesets: - - - - - - - - - -%for cnt,cs in enumerate(c.repo_changesets): - - - - - - - - -%endfor - -
    ${_('Revision')}${_('Commit message')}${_('Age')}${_('Author')}${_('Branch')}${_('Tags')}
    -
    -
    - %if c.statuses.get(cs.raw_id): -
    - %if c.statuses.get(cs.raw_id)[2]: - - - - %else: - - %endif -
    - %endif -
    -
    ${h.show_id(cs)}
    -
    -
    - ${h.urlify_commit(h.truncate(cs.message,50),c.repo_name, h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))} - - ${h.age(cs.date)} - ${h.person(cs.author)} - - %if cs.branch: - - ${cs.branch} - - %endif - - - - %for tag in cs.tags: - ${tag} - %endfor - -
    - - - -
    -${c.repo_changesets.pager('$link_previous ~2~ $link_next')} -
    -%else: - -%if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name): -

    ${_('Add or upload files directly via RhodeCode')}

    - -%endif - - -

    ${_('Push new repo')}

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

    ${_('Existing repository?')}

    -
    -%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
    -
    -%endif diff --git a/rhodecode/templates/summary/summary.html b/rhodecode/templates/summary/summary.html --- a/rhodecode/templates/summary/summary.html +++ b/rhodecode/templates/summary/summary.html @@ -85,17 +85,17 @@ window.onhashchange = function() { ##FORK %if c.dbrepo.fork: %endif ##REMOTE %if c.dbrepo.clone_uri: %endif
    @@ -148,7 +148,7 @@ window.onhashchange = function() { %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
    @@ -164,14 +164,14 @@ window.onhashchange = function() { %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: + ${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")} ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)} - ${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")} - - + + %endif
    @@ -261,7 +261,7 @@ window.onhashchange = function() {
    - <%include file='../shortlog/shortlog_data.html'/> + <%include file='../changelog/changelog_summary_data.html'/>
    @@ -269,10 +269,9 @@ window.onhashchange = function() { %if c.readme_data:
    -
    +
    diff --git a/rhodecode/tests/__init__.py b/rhodecode/tests/__init__.py --- a/rhodecode/tests/__init__.py +++ b/rhodecode/tests/__init__.py @@ -25,22 +25,26 @@ import hashlib 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 @@ log = logging.getLogger(__name__) __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 @@ def get_new_dir(title): 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): diff --git a/rhodecode/tests/api/api_base.py b/rhodecode/tests/api/api_base.py --- a/rhodecode/tests/api/api_base.py +++ b/rhodecode/tests/api/api_base.py @@ -11,7 +11,8 @@ from rhodecode.model.users_group import 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 @@ def _build_data(apikey, method, **kw): 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 @@ def api_call(test_obj, params): ## 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): @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 @@ class BaseTestApi(object): 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 @@ class BaseTestApi(object): @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', diff --git a/rhodecode/tests/fixture.py b/rhodecode/tests/fixture.py --- a/rhodecode/tests/fixture.py +++ b/rhodecode/tests/fixture.py @@ -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 @@ class Fixture(object): 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 @@ class Fixture(object): 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 diff --git a/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff b/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff --- a/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff +++ b/rhodecode/tests/fixtures/hg_diff_binary_and_normal.diff @@ -9,7 +9,11 @@ y)y@U((_~Lrb!=|_@`K?vV_&A58+!u-Gs6x+MGjB 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$@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#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-V6Y5MY!uto=R2=&d?)y?yZLYL +zJ^SCEe$Bh{bKS3dDW9gTe~ +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 nlp;Uwh7i4wY)bHwv&hP6C9T1} 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 `!YJOlvpw#XXgnqT0!}#a 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 z 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

    hsFOC|~@G3=9C8l~PITTERCcC&i;Veuf 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Ê{VHA_wloDkRGulYPJ~ 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

    `Ictg3x>5`Tw9-l91VJV(0_EthI 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∓$F$SBD=6TZw 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�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Ð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 QskgAvGq_-L=k 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

    #$wmYEfShdzOzYw0jA0&~+!zmTY=K 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 z zQY;L&KTgn&kbcvaQ788w+eqw;aG^NnR?Med0ym7rlEIkfk*Ze13_=|X2)RFbhilet z1>;VD!Xd=U-+t69kEL9&Uq9Nvtdc=0q4I_4Q7rWX&CmxEyR`LPs5Jvlv5&Jf>j-Xj zQFH>EW-3$pR8KSTd9iI)lN4r}n@jaPkx}<|nfc6AoIzRd4|ulq7?IDhv#!s$0RKPw z{Ezd0%&e`9tPD)`tWAs@j2s>QpAG~1pXdKDGO{o-{A>OXGXo3r|C#^uzvc5E^M62u z004-$l@8eZGyms*vG>+dbv;Yk@IixH&_Hl^cL)}OySrO(cXxM!1qtp1hv4q+?oM!m zB)o8b$=sXFJ9p-r_0F9?zT0bY*5RzR_pV*t)m{Bm^;4Epbn@ZF9^X$uJ4Y6s1^hVN z$n*aG@+U7`QPOIP9;ta(IUGI9fI!GsKbNOER|Jhx;K&wq>xwikf}qmx*j}CB2iIm4 z@ghWMAA!wLGMm*$x`HEFN8hHz$f8YA;AQ9{z(cyafbT%5)!%67D{} zIoM)p^H-ZD5)z9~MTBSKvoir>-#m~~;%i}oF{g?wruqALtl!tn!J|e5>I9}oIija& zBbjXVI8)WnTaLCNE(O8`0^S`Y^Ao?%pXk2bUMzMhpItn*6&NR`IBc-M@xA9Ht>qt! zn_=ke6!q;=bQ>wUHd#wxh>P`<(LHuz`%J)S@p{@ZN|?)JzwUIZ$T@n|Ht@6B0!uiAQHy7SbzO$pOgRw2*pBWypY${D;T@1W7*6qo zaWkG=VyVm(R>^%oz5eY+HE;02=0-XH$F7`g?*1D=_gl#{UlF5G(D`Kdpq^76l>5ss zMFrGReV|E`UctN#XFjg7T+O8j2lP8!;gwi!6CO(#y@W8hn`IkpQNhKhAy)^up;m7n zb&NG#q~_*Dv5;O&T_4=HEt)e95DgL4UL?K=O1jl{`i|_6l>LD*)X&S!KkXef`OOye z7XpWv$p!{op{!HssL`%;!u74}CZooe0whgLW6`#6NFn$Apif@KS4#+DO&t!cUR z^m_;BF11Yg(v-_qMg+j<&T$mjECJfG}-xL%-`^fW<4zWR615TZ+P02cjX02b?hdw=N`wE+n-F zE`{3%DJdEsUWLioT?|IEpeN@0Du4oXL-Bx!A~=xF5iAG*c=aoj<{2Lb()eV5Q=lQ* zfk9bHoMn%lax|M~WgD|E|RC%%Zu-C2tj_f$RVUy>VYk)`Ft& z_pQW4dQr*A)$n9Gg9JMLpd)Q0?2u$SJxq?~y^hC9XsF`yB%3!Y?qA)!;$8*X=oC2M z1uBEZ! zI2xmV(W%4+N3xg2)YR!w#fTt+>Q}83{3zXQG9kAO0pcj)>|31Ri$pue7S7cQr=Jd+ zt)GJjS#{39O!8ka~D3_7A%y!$f0^3LsVbFF%j^~9SN~+DQBdSBZ6$n zycssy>JK48#ogWwJg|m0Wdsa0Da5^`Aix@oOu#{4-oNWJ5cjHt)#>#oyhUFp#{da2 z-b__PY*FqnvU7r|Me&GY$aKHdJsGBs;lSzjBMyP-J3f@UYhoQ#%6B(6c_3cKs=0GV!Z0~)CQ z3V5KAFOFeiGe-srXFOVZrs=*{8FVc{oAiR@{HhS0xCORF_AK99vjDgV216W*qh<;I zoai;OLo!iLib=S7!=w-mqqDQgILcOg%boKP{-m73W}&JO1q{hZCe>Ft3)bjs@dFdw zDw&?zwa~I2{HK5O zoWlVuoeLhca#LB2+do;^sD0;bD@JjwL>Ck++|+%K7I--qFDXpPxz8zeCHWG(Bw<$~b(U8V@xL8(r9 zq;PNfNAE>Bg?S%xGenJO+akU++l^qIbNK_m)j>e9T zWc=1Yu)r~-eWC`VPSTqFB5+{o3nXjRj5KB(Oqr)u(AK}h-H8zROxr$`d|+jb6Z6q8 zi-u7nho}w>p_#aRu{;Y=JRU0|t5iP*j-DBjZGl-lD~#=m0iqgf-LWo*iP}?@vqXPI z2(`q=1p=Mi)Dl%|VOBl``xcCCe|56Qvbny*W#~Mu5wg`G9kzBq_>j@Q<%Ck8r((>m z3CzMuSr@#7fvXV3b}J<&jd?}Q{PReN_HVz!I$*~ zm!eaAW3nyWl~+pRFaeLLm45TRl~cK>3nOWPk1;ZRXpDZh3dWt^aNqJeSHF$BqPT00 z(^u(|!R+lr7&_``HRk0w!5ID63*4ST1M|TFYEOOg^AI}7bKV<}eyb!XWN|a*2h!ld zfd?j?{s|MT#~;k+`a01PIy%uuPvZqj4&WO<#T*bjwGsPmX(BCl$Tw~3+t$O<(on2k z#53w9Nkt1mekxy~NUtQL)JHWeDMlmLCoS(ysX*SZOfEtrHb^(H4GO5T#s;QzLJtF_ zd0O`He+I9f`Pu(s(GpOw)(tFcE39{}s(vT+&MOK9EbR|ZAZ}O;i~%*^Yb`{v@3GwH z_prJ46apAO?6bmXyVCoRj3<(HjOAh%XH=nEg4LZYHNJu0ff8DJAho9^kINm7!cDXV zBrk1krA2{f+Jnisf_l>kcfJG*?8w}N?BH=S@b8#K(SK)W>fafpW=-eV6~H`4ug7j; znFKOmtdIjXOO0JSotU+_^Kmvfo-Ad%0i8|Qg!^-L-gy2GsiLK-j=cPuiPGfY;tmM`)AQT zq%@zyRWyqF*1^up$7r10h&GqghiH?3*Rl=l?ZXmJ>+dtZ?!uv-DJwYXyR+m+M;GKg z9Of%=Dj?0dKE*=a2{kuvVbny5k0EtJh5yWlf0p44=Yl^3fz`c##qD&iep_ z#5HyE)7t`4j*}kHKzscO%SDf!9J|KqFb1Mn+*F1vb(Bc@y#5$Ql!Qn-?*d#o%^$ZW z=e`7$7~Zdl+V3;)X|BfIJM;DqU0(QtX8=gNxh zXD0#;b!ej@)o!K^xy--!YN^uVb5`Xr(ZEY>z@*6ZLM($tCJJh}3~a&x7-9i;Ci!R9 zYhuyx$<0^)!5i2n0!xZ7HbU>D1aI_UgQo?STSG%fa%@Q4XRRv~8!-))L?0S3pOB z#j1GO9Cn6ahpiZ}mG823!S0AEbuXGsG_^q2>S=SW-NJsVv+8H;c6auWsTexIElpC$ z(q`0~jB}XZg;@_C0HzF$ZVjWX(Ux5T<9yYX?hGIM%AF|gGmJ`YCVTvMzVCLu9ybk0 zD*ZPY*dIB1Qm&^>qEDT142i+sadY+(@@{~Rl4tZ@+Or0ni}n?2Tg`uwB7ON?VS@9! z4qu{SZj$ek^e1r2FLOC)Fs`aegb9WYn>PUT9<#oxcu;t65-L_p`P^C~N$yp*^(vfz zH7bLkHmUyccw?ootBWp)?D(Z1l=aucv)ba6sv%ZqDZ7VoimzATrWJfeOq;qUn?2;! z?@~`11mD|)Gwct$E}Fqn)Jwi$1vE*%Z!Cq(&v!E8CE-X}ZCt4K2d7%XG8?I;^yg|za47oMzl9$Nfw$7#0fVBk<~93HvhlN$`14V%n5aFJBY zMti=-a@j)4<|?rxS|kXVj{AckNd;$ z3mDCOdvP;_dfzh(@@wlunx;L48|^?zA*WPU+s8%Mx2DZsf*gpP!mfPMb)#yI3F!w_ zCwX_YmPHTgYPE;ztQ3|F-!m-Z?R0ulO*%x;rvO+KgA*@dch0O*y!K{?_vq$7#R8A9 zAOQLAp5rFuV?S-}dHx3S-#t(p-@F~WpD>9(KmLQkWfs$fyN~-@%Ah>mr=iA4kRmF-B8-*JNRA}9y^)x#? zgZXWO!`*JCuF7%9cyuT^pUH68O0_lv6?4{H^TUaZXaIH3CVJ_%x5N^DDNJtze$HZ^a zVodTwsUpIsD^SB?gw~7W?qB+~H`CVb&GkvfYDJymj@2&;_F^;on&jMqyg%(TTc&uS zY%Q6^|28)JO}vsBi)1@SAb&OvQ7B&PDyAN9t`54F73bxZP1`g!!6f6S%($&<5LnJt zR7iCXAz2CEZ}Nh}DhMP{H*%w>EuROnU>Xn}H)xgQ)*x}zFi<}z92LITx}y)xNureT zNd1A#{o$%Fh--fBZU`oTTq~U`8IpB%Jqq@5W99op-)HmhtQG%!Wt1_#%zSAa1A=G^Zt4N}t5i*Hs}+@vLsg z@f{?_dy*P zlmqg+*wWy}ZAd z&jjt71XXC&qoJR z8QF8qdS2GpL})P@aLsZ@?h^FT%|wf^ccctO_49T{wM_emY1bC3micrn2!3lc=fm%y zu8e6uZ}sH~0^s3ys`hdaZ$@?K3uepf;|F}Bx5%7nTks_m0yFdQPA6W~qdS7+juZ#< zH>d*YbTFXg)3`pQ^`;Nas`a~w$$$|-9a`K}804X1Tb_`}m#H?to-R(F(DILlUx-6r z*~YZfmsw<@g-aRRW|&di&yqIX!z|iXC#d>1yx(Lq^+v_=v!vB|D|jm}4^gxIpmx7! ztR!whPE%#f4IGwwkUcn#7qts6rwa9LEFl9rvR#yj+vuLLGg97~qwKogXDffV)xy48 z5-+m%Xd7JfRxmc>SRDlZtj_xz5#^bSpCx#kCeLmoH2 znu_72dzy2qJ0cbnngfTscgkaVP=q@(69P(R8r82u<>(66UgbJ0ucIlhP0jLnQksD3 z&YaFOc8-Mfdw+1DXOaPNe;kK_DTSH3HLh0}%qH$Rahc}!O$a^lQxPTfZ(Zf6jos(2 zveVS7w+)pw>WP?+CZPsR!Ne#9S$7FIV?h>fGn@(KI+tv!IZ!G~e>ab7uG?+ zJ`-UQF>GquPOXq^%=}=gKSszASTyC)$Fokf3dY8NY9PvU^Wf7lE3^ye3A27OVd8TC zDsL03?6`KJ&UJAkesWB>dB?4F-oN_Y52=t7eHpU3Gn%=*U>@j4kTOXgprZf=OpFJa zdm4(rlDeJ~FMwz&p;-AsX)WbCR>{nQ`zK}y__Hdc-^XN)e5KhEAJQ@`=8HO;bz5ut z*tKXb3|7lnjlT6Y?@F%DO5gbkx~o6G?o2s&SeZFIH8QZtRN#mgA^g&5(g#d=s`He&_eY}A znvU&mZ4WzNZUIv-f7qw*a(1do#00!x3K}R%Fo))&wUH=S9Yw+lb`u( zO?&1U2jbbL>P6yWO6UewI5DHfR@UKa!|6A_j|+XBwLM*ce&GFYNAhtp5|iWp?mWKB zEk)szXY9!*Cdk83E~oio=z3&GeBAEh(q`Jf7~FK~uWUeQ3QEao!2Xn9a#3M_cYvj) zm=Q9;BA?l1OsV}D9HBW;pH5}~z+*uOc)%PY0w_Z>000y9Q=aE+C?Hz4?vNdUr2y}M zP1?zi5;GW%hNG(WyWr_jf7MGjE?jo;J4z8KB(o;?VGfS5(E`qupp)7sfy(X8Wp&h( zQ%Fb%1*zrS`Ng0G#2XnP(QL#ruaxGbfvHXayNpZ2QF;A#WtqyNXb)W|(YA65zUNv) zo*uew4HrUrJmWO=!&MN6_R%~EdeI@V1a6HAjRuL#@in$mHYbye&&b z1Gvmcc@885!}LgcRaq8`=63u9eulhQ_DmE5msDd;Tnr#R98RR6pu}SL#XjfZi|-8P z6PZ`-mwV3Q$od$on62TJgGBQ>c-)A`T>>c{vSwtBWyB)kBlO@X`8*pEO|)zZUaSn` zugQ>TgOyCmHCCZO0T8q4D{8kByuKn6y7b(Eyp3ZuW;)E4I6}s~{P_mA*^G}Tz3=&M zXEkdVGnC91(5{!9V27nzoxX%*zuBt41x~{+{wj0J z^we>`>R>(Nj6gh*gR4$?nbb0o7>V~4lwePIsJhC@zcaT|L!C9vj_3SaZ}9VTc{wz5 z3p6>#Fg}UrV+PJhf?z{bBGmn3Tc7~vRzz>$Bd>v1Kh6K}zbY_1vqJ)b!uZdW6iu+M zeTD0?L9LWJT%pHmwh`hF|b2lZD$uzUaj@z>#y=c7$PuhDItSYy^R z>y$7{<6B=NXeah{#vgQ7rI8G<&qjKvcKU|BkD1GUEUIVKp za$+{tm+kE~PG6gpQ5T&UW{rY!e1xGYFL~jns!Xy{`Xh#0x(IWp7FJ6n)+wxK-r$4W zh`I?%_#PQsFEoP4s*`F=?4jxhFH0*qu6b8E#M2#$-6u)Rq!y`K*~UvT$;ZDpvTYVn z#}u<6VM(6KPMP#dPI~bU`*D!&&B2v6@Nfv!{PQQ+lPRJJ{*>Mb@DoY+^uB52TBS!c zS)hNXM&YUgkN)=J_t&&gT$EcBLE5H3Xq;1lZKjxeCh`7GVw7X~I3VE753RAU#lt$pyB7k+C`Eq#?6R9V z#XJ2A%g!H&xheD<@ORBTjBP60qzke^c{SiaQF*Z^o^>v0L=gVa=*y5H{VYR+8Au>E z%eDUnqY^W0Di%}n;x=M2C_=hbRc`Phqh`=*JAj8Uwl#I=T=Ka7`m37o)~R`_e)MI> zqIk;pEprr-8%Cvy>5hCDA@xPHXov|hYdIQ%r5 zOyk|WUth3+uxDs`388-UlSw8t4dAX?%5a_P>|TTSOXehAGb6pFW-B3D8ORdh4K)C- zysowGVNu7@xGQXV6bY9HoZ=u0fQcNlCPvHyv`_`U)Ii5drLcGC#<)i*BlVrDix4@= za#V=d2^Gz{WfK~PHuA@jccabm812$0<6PCkSAmhZaTW)Uyp5$O(WE}up5LKBSD;MQ zi{3U^YU%@bkpoSBtH#h)VCN#IlcbaMV+uNvyAqk&1*#S_lrIMj!OPsxN!MPR;DI85 zs`0ZN)(%`IwX@r2AIy-4*D%m}i3sOn6-Pshvq|~yXo^EFG~y%tnym!G-QG2fFPs?d zeH=P*hqM)f%Ppavmn?OFP#)&X(Y834(%1ctGIC|)uXkEPX+U}x78$*;3t9VC>JBy{ zP5`y4aU<+-?`Xyo%-wx{szI+Mk2kp3$oHIwE^80W3Sq%D=nFr4?Z_-GiJy7ASJMA`fqL88qXG*HNshIw;xB*Jr#iCWX0S7NbaK zmY>AkZW+WzbDZv8UvimfGG>l$O(2XX@dh0m3f&_t@4I?wwt|Z)_DM}*q>q@halvmX zeSd}39dX@oBitGD%8qLH$KnP>CBBB z?A5{=ZISME?ynbzVPTH|is*Y_kwv(_f^vFKM*gd^*)v@T5S|OOiIJG&uBHUhhk?cQ z^PP^oG)nq&>IQ&;;G+-yUIdL{0~96@)P@G>J?SnnItJCZ?fe{05_DtIAOM<4o8o~_ z{YXf6VTux;r28lq<~InRlxpOZw2KQdxeKvV)0b$FddAW30Y+40hd>F}fDhw&lJKt* zsec7Efo$(va>OGH-pK;`2rjH&yk0h<5}E#1?)k5`0=^jo%>UQ2tiXlhHSjKqPdAbL z`EZDTdpMdh#WcZ`4vNiIGb8#zv}Cp7zssv%GkW@SG}6(rmixbCp~Lsa#%2%YOvEbu z%te1%?SwL;BL%cP#fl<*IfE&cX1DZokQ{<^AcbiGgd`Zif>rRqcLafba%v%d3Z)JB z$syf|=}q;BC-0^jLFWpm*XpPvO+x;=P|dO9Vx9Du0kA7*^Gpx;bLhgs6;eo!P5TjI zb?YYrW{;l*%!K27TjEA{m_8VMqBl2CoI~{CYl*WHkV3MzQ=R6TH<3v>q=ypLzIQl- zHiDt%|1?oj0{)pz6~9WOL?*sp6Dp|k1-)N`5AHB)q!@+WijaPA#mYXS0FE!T+XYVB9YsB}*h%Ik?rcnrUu~Z&4lLnzBZ< zP<5sUkD#-k^e4BXPrgP{0*KD19(!ud9o@{gN&;HekHq_A(0pHj+eS6ygW7yyA`n)aZhDmOKxP40k zL!128laCj}QMGO;O@Vs?JVzre^gQge&&_xz*BS&syuhvv_*eViYyS}cwbwQNe*pjf zC-^Tt0~<5jpY=ak|CRsyPip^$|333ngS-9wF7ONfl_nWr7`LR^FB-@2wK8$=v~aTp0xqq^(Kkb)vYFRc>&I^$_tQkEm(3V@!Md?^(J~7M_fR{y-yJ(ou$$^ygg>kWk?47Nd}1rU zGVbLJNYwU|G>LaNq{nT^!JE<(X2FI;c5=9{h6QJW+n;;D{f zkXHmPoG=D|6dm-=F;STj`##ui?;Wv)MRv@V6(zQpeolG-{-J;i9ej+ErT!eV(sua>P?4Nma~MASH`ZP%T#cvAVuWuC%ih1$>TAY;cdSyYjN!`q z{POD!68hF?$w-m81uZrrr{Y=5%Ftq~e%RgI66{&9X5oaKfn!_tIB_Q48Fy8ctF#`l%8$K!wWY%FYl&i@SbEX@C!|NklNZ}b0?XALI)^H=^~^FP#d(KjCKI;>3IyLo2P zR7~f){N2C5+&RrdPSVPc99Vw4ghUvgJP+9C{Qu7XNr^-AOAv@Pp zaj7(V_L2t=Y{z96=A2>{_z5Gojwlp%vJWg%+gA{Azl2i1#n9}&-pHAQm@M=$6X9j# zXcJ^`m%Ins@z?;+zL7x14KBBE;aAvIgaX@^;|7Emmk*=U_J8R^bB z@-FFm)WPrwBe(dG?w8U5KoAe?=h6!V@qp8;hJ#5 zUBE8;Z-IC~YMv)g|LGpT(jT7bUx9OwNqMwV$32nz=5FukE4xbr8|DSA|KQmmf8ER< z_^a5{k3YAGz+E&j-au$8jumm}rZbvzgXIUgzG|2j@JERw{r_+m%?Yr9K`Q=h7Y$CF zXn-07AYoZ6y5!T??b=X~q{@UevcfL|!GZ=_B**rq-WDIYFLF8v_Ff z29mC^%R~sZ2P$m~8SS{U@DW_Ef0rae7PxYexE?BB3X6LCy?gmGf}p9#oVcm$z2F>3 z5nrYJ)aaSK#XJNCdW0nDzQk^`%f$ivNU2?Lxki6Vi!r97ngV8`OigBVXk&udBq(!l z32Bbipg|lWooKcAH`neu*@rE>&(ngoDWs_%dY$@H!imR((SC$!hR3!{(Mx18ggYs;u8?+j;IM3huv92igP-ai*Hxby`k2N&CR_KV zv4@!wYbD9@NEb|1H_Ih5P}BhTHHGnr{M5NfbKDEgzT!}2bJ{yqyzq-c0A zUe{eZ%NBzy(;c14upi&w$G<=A$+wdKbj1Q37C=rX5KI67>es2!=OGS^U?6_PCdarM z2xJtD_`)+Y5gEyl`$sN8P3&KFxiJuN&*5-wRTtV=gUOIxFDViYsSk4^SS^Ng4mPo_ksjz%Mqy~oqi_29xE~L0( z>Rko{l{qM949Gfv&F82VQ+XkZzTYF3e8cYnV0^y-#QDL2WQrj5PaF21q_!XjfS&<| zh-OK1Mpfs9%0)~qjmGMiW(Ul;f9N$%{h2AFch`{rjslc-2sN?f^;cNmilgG-VCjHp z(tHbiNuyB?edTVtT;d`b|(q5}7V&mAI&oaKFV{X56XGHF& zrhXe)5aGzrAqTaj2Pl>h0`L4G|8^~jLi;k&%TNtEnyy^!xR^jeapa&^`Xet@e*VT_ z3$?mvNz9<#87U-tGxh+0!d9LuSfJuff=4<6^N~?28?xGAw;sVZGM2{(Qf(3=;dzun zPLA74f?S3kwR>gbGjR~ZH~YxQUuO0zBPjLmgaL*`aT8EtZg_P%L1vg`E~Hwyk_oo5 zD>k#u_hXN4XHC#?C*yoPuSp!UOr4a2F*PT1mbE#Fc?UQlsk&$xcU?YIeOsNfw#d}Q zXhN8Y>~UiAb2ui+Xm!3dQA*m#!pBg;72r> zXojJ7+O;`O7DkbI$@=JDL)Rh%z^50`b_Q#f)cmr7 zl2nUMojzKphbRyeN(;4rt{$p2{8;wMdED!9E9o}dHv7Xi1C?I!=eY&ii0n80!kPqA zuI8slD)|PSeVdL{JViH58#phw@V#+Z9CV75Qu%ScsA8;yDn+|nH7LJ<5>HM0JgWur zD^QK)0072MhEm|cc3|+zR;k13%F=)wI}|))gk5_}HA+D44^v9e6z`-*4WtUjXgViL zYpPWVgIVc|?@xo;cwwp4k6D@bYL=Oa?Cfy#cGg_3xcL3fi&s$9{T!qBJJBCqS32^H z^Xn4D+Shs8Rj3jP=y{RlK*kS*`;fQ&4P~zqUrMQetb33f$?Ya43Z~C2aI_HmDk~aG zPQWn6Azw5%7d-5kgb!b*CKJwI{s!~-BO-#-$Xx|IhL4w!L5D5-)M(l^yV2N=V=j{m zW#;XHU$lPs%XX)SK0@9oRewC6uioEu=Y&iv#xtV*39H-reZStj=zk9>tvl%2G~1Rw zV1BV%-D3!2e7`LFSUp>6Ui#28!@SoyffGL&D@-}e5>V@MFn7@f`1~JWsk>^-`AE~lxzQ% zA#$8ly*Km@@&m1S@EQ-UMY5)Sj!=l|j%T5HI z7qCb-)JI^?od5tYe__Sfzq;E-{*537dxJshMYk(^>-k!os4vQ&o{0{#p^lD(App$B z32BI46a?zu*kLZt2Y<1`pk@NPrhk$j4fPMx(f*`B5}~G)ijWqi7NzMQlAM-#aiB0e zCF>2n*N%lx#Nx2l<5TL_?-Lw9l@=?MncIKsLeX6tn3AHwm(*;mgTw=AzbuA2o3NEn ztd!k^NL`>4W>$qOR7lFIt>g4Y#gCIVsAJmHXWHkrmYiC2Tu~O5g&_{CWA&a5z9)$N zB@601Wzdi*LTZE{@ip5ozO=Q`pkhA0ALSc*#<8KwPAHNbkJZ^9 zD@iDfxX6s2g#O%o-^nEs36x=SJ>wxJ(!>K`+gT12L#H15#4_4Zmn7=HGf>61zjpRd z%TUx8D$Q*pF;Q^Ms$!0th@Y378?tk2boo$cA(#%`!jOkC{N+281arQT=y3VmOu!(U zAx_%7Q!ec}IECBCZn_?SVH?0~og?#SytbPR2x-o)kuhWbq!g*6+He=Gu&Ixwf~Err zJEkpRsy5RFliISIv_*DD`ps~ep4hL;?A)ix@1$hnj#iUY<|5e#AE9);W32*B6xEjy zN`>6tc$(4sq{@qzan}cd#pgBob$J;jmCcYxrfV8hF@>Zp42KQ)ebrLvz_%DBS9P_|2h7nt!-p#ZfIxfYWP3H|3OdB%*OEV_&-?L{)PYiQ`+D1zn@kC z(4Pk#L9Tw`KZlp7(G*1Gm{w&YD%1;u%)+m@WdHv1XQm$>=`MOWzMBUaD+}b%6IW{d zWl&Jat{%&PjU`oLix5rXZ&x`yq4xG0onf2oo^&xCm0x2!#y(Sqyvk^VDvy}s=Lo*S z5&4$xjkvqB;6%a6(!<;y(k6)8%wd+mG#=SZMW&#M3C8iUuXC=gw=PXAYt0UpSD)HK zSZ?AlsXgF)PNhtFngaC@O#^+JZG|c5Bx&dlPAU_(pJj=rKgRKdZc9~%Ew00I&68sO ztW{)3Vew+0e-hL(iFcXn?VIWd+gUxr{X$v(EL^uF4F$2w&0+&x234{QUBuwhFn_2; z8r0x%n=loeXl*ZpC7O%27oT$mMgPg&^gq@9EB0?~Yh`R}XlJLVYy01t0{#>GXJlhx z{L}tf85sX%|NoTsZ}tyS^yCEmta1!;{mcGI*y#d$@gtcMhVs6O_tI~FSQGs%zr;Ch zT2<0&ksYb|UKwhy{klVuIQM`M!nOdzLI#{4-NJIkTgQSE9ba56){>RxZq+Gps*YS$ zPNVv&Jz8XBD76>MRs`ancxM7dS`THf7d}A((k-zWFPl${bjx6Hv-!%9=Ex6DK$nc$ zb4?<6G+upwtd79g{^F817_?G9)hVs_OVHe^>16DAzrkmOLZq43D%3TjjHs-R4{sq- zTazWIzgf)9bRd8tULuK|w-F;#XQd5%7zKx|qn{GgLex=FOO0Mw5x1w$nrnQ0L>162>q;WPYCt9)lphuD`MR@>+se&amQ;6C<&b?}>` z;p`9^rkZOgy6@9T&ry12`9M7|B{HI^`A;-PO{)bj-sitiBst_u{5mHU2H$J4saFvK zTRmprQw0U3mnuJ|8+gE3`v#K+W_n$(g%=XL0UJgJx;^-!ECgCrK?_SKLd~1+bte&G z%6{H;m~`xm@y?({^RT`Z*f>f`5aAj5w=Vu03QBJjn&qSEBNzgrN_z0aaXquv`Hf9! zl@>u9nO${EJ$ZYzXOAjQE~PpG7X^B&!Md8! zig_1$T8R=lL9u_NPCguZqL&WQrqq4Oq zD|{JM#1|4AnqUqixKBlp$lJDF_UDRLkjPT^zf}7E>f41~Mc@+LA{4tO+G0MrX+SLb zGSYO0YVg(G{o>;GVpLD|Wn||-{9M98UbwP!mNQ&tY~Lm3I^*f4P(N7B_}K#kZU4v^ zzT(5~x+=^(?qn#gKJn9NYoB4DCZq3ep#I@2G7_I~M}LS2d&pWv=5^PaO7?LTxf@9# z@Y^241-_!cjhbgopv{g{w-JkP6-?R7BDKhO-io%P-o?j}AZhg9UT8q8cjlF8qeU`k zp-yam;kzBzngXFalZkKD+&o0t7~aWStHqX5UU5rmb+WeRIb{yC8CHC2}V{KTV&TOs_5{|D_8WD<%z56c3XfcX25-3 zS)ZfMfpDSR$d@8yn1iy9StI4e7fcSX&!{;fy3lJ+xfw1JD;rc5=_z@b(3tXR-Ub!h zsykd|?&cdjM6;7Gb%h5}6k3K&HdW(gqbmUp;d)gD`LhyJ>!m&&8_ipGzZ)H$K*cf^ zhNv;lpev!iQZH>M$MM%HB<}c7uIbekWANBdP-9C8`u)k=`YW4O?Uy>#6hZXAOuLiQ z_8;)5@J=sgDiyF5ey<-77UvVx6;m#3wt10GNXA9Eh9$N1-oxp7(?q=Zi~W$;sv3qi z#$~rAV!WUwSHxRnT)nVQ7Fi=(eMQ_>H?J+xI$@F|Fshq1aBPvv>VpZ5*c752IK08& z#s>4tdB=hIibJ~G zZ3v0L{B0D>01$@n{cE<6f**WYvy36WV6bLRL0tki1x=CbLGDO z`}F@0*MCR-{}<^$|M~jQ^r!#-v?ci0`v1>qfAjxWp8iSy`5ph)`i}#dq-&X6Hxs$I zRHkrp6Q(b|MECcXJEvJhw_A4N!v%ij4oH9%3OxrTI2O4s<)%7DsB9oH2Xm#CEG!~U zkfb!;f!2C`Uq$5A3VumlB@InN!NU0V+X2Lb#f76g2g6IYHF}3|j0KY8rsFr(xH;)d zq+Y@&7}u<6RdVixKa`3Pm2%jdjr`|TEcPRnDtO8J6cwjk6D!+9;KuK;2;s%~Xpk5r z<8_;yo8j06Yz}Lkh3Ugv6LW2A^Ld)a<0h|Ks3usA1*P&wyCInxcE(>GaLpu`I;O*~ z4DeXKHp>3-X*|l?_z8TR@Xwb9qF&G1flSERcMZr= z9G8bb!sbALl$>@~{#`o((SIFC+N|ZOD>E_%>u$6r@U2Ip%UomaV*TDeGehk9iYIi| z_Bcn<;(KSCAN|G7a1xThoqsg68BRZ8kXV0q$T+&5Bq!7N+n}Yb17cngnSuZDWz#^R> zb3zp@dFpLUp{&?5ZFcITzqhJd#L>k7HLBO|pl8-HB98aw)A5{#)q|spKBL>%xV_{n zhcr5Awb#fBtEMbsN(-tG#m6Ua90EX03-T&!%D!< z05sFv>27>MBn8z96udz(7R2xE`cuDmlfI4)xq-J%LUs0o29V1~uX*d?3vJ5Dam!gPR0HE-~{U&2m(-D^9``r0p|-fmJc~nE^0gOM01h;lcBL92Bqy@Rnxj_)vvY zriv_>Vuh7N50^-gA~{a@;f>ps`5oqoRA)X%%4!f(u`K;~OGtG*a}}UIbn2Vj54;K& z@P0i!SpIsr6|ppqH1p)BF;01Yf9?-RA@)P_ddaRx#;CA$bk?PtQZ)nS*<@uW2Ti!M zmDeF6a3shmHH7}+{glvRFW=E^t~eGe**L#AX0B|?WL2uvG|;pRn8lV8qAdNMnk?@$ zg|=^~_%^i^o2PP;!6>QSj6yYkj94M^vn&Tw+BNuhH%=mFs9izwVmORc&c$e*Y}+$! zESj|D)Ghud$_#S69x^q98_kLOI5}k56Sxv5^iozuO@WNv*q634ix=`AZ+i@kJF40g zkk-F&Q-dw*MfGA^UJ7u0@o{X25n3sXt`<2OCrVCA&Y2Fu%Kpl~%h z&ISXAx4zWaEcrpmjIO06sO-XTD6EA@DFcb&izt;ZY`tM|A``*CxzqjfC zyY`>0|E$ccf98KZegD_`|4(Uu+y5H@00{g)e+2!t{$IMbHfKmw(j0Ru9op>lh9_|^ zVg3E(&S??KnpTUfs2;QBYv%T`Y?9q~m~DuriGcR8GCsyj0w@EuZ1dXKf>;F&t2wXL zh8*74qaOh3DE;>iCk;tcdX-SP0hNJR-Hcj^gvPL{RbmQac&fF#S5la|!@h<^MLCAE z87IkhPro5m zrB|5JAehoR)J0QIQ)1+4dyt8rA%pQF8IZ6AdMMpd&B){6Z8@pFGrNCl;OKxxudzkE zjCX@V3AbrJSoO4HOfIn-U*n&$M(Y5yLG3u;UNbH-RViB}SJ4R9tSN0tP4X}BESeux zBB#P9Ve!S$#pX zox5dJ)u4CcgJcDddR_KT7^;NSd_{Zp!SnvCE@;?@#bi8N*0l5ZBlB1~ccojqNr#Ad z!xb{F6sUjs!fgpmegucXkavz--`jPRX%{f#fo#E4S{n1>_eu4Wiv83r(*+2mkLFTn zSB0MrYgtRtp+M`Q5k@t8ppI&J45Uw8QH*Sr=I;@DSnQ-En>FCWmZrRkXQb+} zu!@PYodmqb%^ZZ`P`>78Ar@^Q99?~~><-B^zDwbO@3g;)kLnO8q?y%~xYFlea&XQ^ zy^k4Rqii9+JSkBavYob+y?LV%pP!3sG*NPx`Ra@TYexXl8qWj}JQk?2) zLYmCZc6260)e)K~EUN;YS*I_|ghuMBb{O$&6AgDIjA0C33na zTVVyV?^^s(9JSZF7lpeqNLG(c3)pUhb?Kwz>ttqzm9#HY zb%q+9tloURi~`@&PYSadNTiR1mzN;A1oLGY#~>%kCStm`7>illakGt~B(_IJ-WPu% zcOur++=o-Z6W%*Lq+P7Ll~aW1Ap)}NMuIu<`4(&Hh;z%rH!}l6W-k^rJW~NG%exGqv-!2p8f?B>WE~LCrP>A5kQ%K17=v5@t zz*t!EeD8vlFfmsd9Ot)c9h=O{?DK(#XVj&>zAh`-krZYY>tn6ns}i33A%juXA;p-N zYsij%?WD~}QG99-kZ3yee5x97kIY5~_fzgNP;pYsy$OMGEiA9;+%`O9=j`6uyStiN zFy?Onj&r*5DY>%BB*SghKGbsCWT>$rfCUr1qL$Qmwz$;W(ZV{sKYdH|GE<7po5F46 z7H<^JAz2NfaO1WZoTkQElnDafx)@cyi-9OYp$02mg?657x|#%LIc@{$T%n!a3JohO z-NR~69gN1F?E)X=lM11|6%Vdz~aibHPJvq&>+Fx9SV0165QS0 z-Q6KTaEIVdaCZ$5oZ#;6u9LK+`*zQLx!w1^%)FWW-*>7`ZE8amYyZo(EExH5U3(BL z-$|#iHyI)y#yZ_=n(^*#+0Y`K zV-|nNSG}Dz20>6QE#H=7E+P%_Iq5ahx+dH2D2R9Bh(iwVy-&DDdo*yT&OZ{2#4R{j z_6WRcb-@^f8a{a9FKHYm1sI@=aPpl3PZ?@h5&{oB3`U8NfHD^(7>X>UA2pb>-z-D5 zQs7XKP!Wcsn8w_zjneT5ya@0e%kc?@hY*LkuML=`iHSw_y~=gM#(p*xVeUuLf)gfz#FMWk7BZaec0Yk&RGIG*;Fr z%5BD--eZe!3xRMK1KGswyjH6gTSwENtB4FmT2+g?F4N0(E#1*`%sx{XfwC?nsa5Ee zZgl=9Knb#IXv~;M`n7Apa=l5z7(5Wy?ZI~u*DL%=Jy-(1)<)z;8wuBG@Ca|I zTNRtwdNLVWD{zBx9BsBMSxO8s?U`_chnCT?pZ1D-s%3P5Z>1ny6=Xl#1Z`l?PHUXq zFby${OIWdpH56jx-kOh`Ue(|R*tb15R@fP&;0jsg^aKg@h! z7@f!Lt%SHxMH1_oI(I-S0G^&a%~BSP)u1(8-s=qIZ#lcbmE@HfWY-SO2txmC+gVA^ zE$mU{#_4oBj{0;Z!;B)_1wW>r)upyz+ef2jb6m@FyDjn}W_?1-`Au%p=vEbR)GHCK zEHovrm3L&@ZRb8A(9nB9VTw8T5tj8Ym7fC#ze?kteWB$t4a#Mp*!s$W{Yhe)BjyU} zlWDcpp(kmV4>MjQD@)<>JyIC>eXtyog%ni?&!_QMY6x%Qlut&4dVm9G*|rU0%*9`O zINxqs?1>P>Zr>}sp&5oU#~Pa#C)>7f_-L(?8BvUAk52PBtm?92m^13p(i7DS@tRFP ztk`B>-|}#1qTyaOwRcEODvQwL(;4nBiu`c?`%D| z_;y5Ey=Qp6llL5@XTvuaUSwf;nDu)2Kl(h^J~*Ernu__ zoR0VqcxTY`0mkLA?Y{LD8kY!4qf$Zr5)?k-Xm zT*dFpR&owV>SmHEoHVE$ysCF3^zZrkdMT?2Sn%no)qn|9l9eJgWb@xC7Xd~0LyU?% zD|m(mx6cY!@n!8^D^V8;L9DK!u{AJIOc@c?PoFd3%OeQw=P>Bk6z2xeFWD>e-Y&g` z9arnjE>D(FZHPtJHQYax7EO`mDH)@I8+h{c95Is@2|~G0%~s|q!I>Wzx}xV)v~(TU z*n~z9<}?f?&R_>LGX{BgSQ0=^4wr&Zp2%Y1VYP;yizwq@{y&{!36+eL|dvPg@8 zQ7T}$?E9sNwcK6KRH%)hb?5ub@>9JAM1znn2$B8{`#ia~Awj`V$!zXxK);z9i z>e-f;S>$cdCoXF8S*Y~eC=aIXoSR%5Tot(na*D)nV43#sw#luJN-HF%o#sW@NN$C> zyqLTbQ&{2T`~X-5R7}xbOtzYK7(hE|WhI-hWbDbzb%~o7#}Eb6mqb-xc9(eY1P;%A zh&aa}5kn|X(@o2hixQZfa?y25jK8XiLToBWFJ{jtkI^AqL{(ETjin?$?IQEpq}lbV znQ4u9X9?ile+#~8Wdm7W=*Pdl0{2mY-zY_^=S@<;3@alxAFEgeI@(=kd=1z=tQ39< zc4kP0%jlVN{L~vrV_d=EdC;^2PFMb2b@WVV^o48DuJBAQ;Hr)T)>FFhy|?~FyXpim zMLsPSt!{ll|CivO_(KXgGH?Y9@b)evwS?JoC>is-7_XGde;!ph7bJY4meH-eZ1*)N8Xy9OE zVnqGzU-eJ%h4%~$|D69cf3p9y^t7}Z~0%~|8xF-TmCtSpZzuJEo@yF16ilqr8nj$)d zbi$T>y)FIUceew6rek60#ESFBar1S+{5)Jf50;hUC4&_2-*q*8smbXyA@M2bdra1l&;eAG)u!i2G*1akd)wBvvqyC z8hBxgBOi7GG}nc2@w{MHvI~rFD+J&B;046tgL*j={-&S1UcOnnl+qAvFh>*exg6>t z3EMnhu5`U5riRdQ6BPFAMeUrAmlqrx0nwTuImzRi7o8QNu4$wKAjLQE`CB>yZ@qhn zlKZ-#29{v58iBG^8|`9H*)^zqEg1`=MdJ`s)3k_Ahgc%589&`EIt;!~KwiN{c$mZe zYvTWl{Qp~dpl|S>{m~_*p6Lw1#poEhU@1N6Q1o{ef z610K5(_PPbytn6(&d?D(NahqG@O0~{7%Fiu1&Oe5_MIOCNW|~>YZxIvnP$G9D11W4GwP33$Cju3}~>#*&QuZz&Lxd=5P2ABVV^# z7V;^hJ02^EIGs=-9!2pGjZO&nfYkI1cGlS&kf;>^Ck@WkS+k=|K9~Tid8@MoGE|z3 z+bHUzc9%Q-s$y@*mlK=7RC+p}@{M}q*b<-?-PX;tLJPKJ;5X>GiZXrTqZG%1rNlLQ zTN>L`L2uRF9o!p=NyWX^J4BlxqJ1Ca347`pgCg1-;Whf>6;$E4U z*9QRAo9J`UgJzB~bjzLsePQIJ-Vu<`#I@(s0}$*QRka8lMbP1yBEWkm{M@K2&B2EC zmMc`Y#$&j1abhtR+-SjjbBNNg`A&&%9jdO;RF!Ff_XHb1#cL&(aA4h|EG9>q958Es zu1w5@tJYWtR7UVp5R zEJD(n4i=5brWn)XH%bQ-$PrT5J`Z1lOb^D%^em9xr9!V}zz$P;TpSC6y0%~;jbeW{ z@BVx-!cZxm>s_6<;2SW!xg?HU_}TR5C6gveX-(jv=vkHK5mvIZVr2Na?7oIqk@Wd{ zin&1y)Y)ZtTdeEdzF$)2~1$>m@t~#AIYM?Xk*heJ>VW)5=kcVdtClrm^g z3PmTnp(|m9c!}DY4n;H0&RpzWqBBUSa^eE2fR?lL3iWiGblXKez}2_!6r|V2j5##d zljA&`*MrqR8%_+R?eS)WDyd0>)s5a}5!Qproe6_cAKEw_>wyfYVoR2!JeG(oCthET zj(LC)3LfN$y@tzX^TFZ(JC8y*Bkdq$OG6-Q@}Yj%;!qxi>%M#L*jMj2e zg6PI3bX!3g14$U-ePcLM;yPuo&}_f1P_<@Vd>7qV<&+K(z|ejD8|JAy18It2v{zQH zXfRLkFDvLl1yS2DmN+jM)^Vfz&`!b}5M zi|L3^?Q^=it(e{y(JFKEnF_HTh0US9jC7V~2XA@4g-+JJJ_D*GggOcmtKz}x6mD2Z zq|sFd*>}B2rR$y5i0&9rvEk|>vt`UFl|yJN)DC=#w1_)0`AA$X#MZuilDF8ADrIKx zkYt}dB|Kr9`MQ|5*k?#fDd)8vq)ORybdyiiCJ|owh^Xs!(Hn~(Ep_nUMSkpMZ47#nZTOd~k)mdbW zaS(t>T0bC@yhuzJ1Osj4Ky(3$bT+w_R}0+kQ8a3G*AD}~=m_x*R>TD|E-QfmNpyp4uM7Z97gpBW60h`Z z_3iT+1rLZ(*mlYH;Nn7IS^WJZ+`=6XTsf0fUG$e5ULa!}rAQ1~uBnEqKK5-tZiqh# zMF{M-U8Q|F8{oEBm*R0`P(qJ}U*lT)@O%nKLAGrlHyb$r4)$__PWL;T`2Pxj(f_m6 z`}{)7_VbVb!r%BC@jnCIkNp34!C#cWo%P>X7W}RFpONWL@jpE+;}8G;yWqF@-}!U= z|7&%dul|2k(%{q+ZB6n(!}U{1Df(?kI$p!ycmJ~gS4Fgw2F~x8p#=|CM43{_u8=$g z1yKM@0N$-CtJjukhKMksB=~AkOr=46Gd(&X%7%IISwyvainJrVoSHXw{wpng#-yRt z^C&EalCwtleSR2Zp1A&jd0UHe4&ikyZmAE)`c!KK5)PxbqGlGM>&)1j!9{P|r-Lu- zRh4BV)jmz&o_ppEe0+pIq7vi5O+>iI(I9T|+p^_U^(&~vosSE7Qaq|Y171r)L@@OU z1U~ur%oC;sUgv4LRy&LJo>mNDv|A!IfZc@?6jWUFz%Im>e4ks}pOFs|%InBzco1EM zDmU6FbIEV0jBMJ4H#BeQ-C`Lt?tBts89usnRfJw9jyA_$31`TvF6o}Jo5BT0li*fo zG2_{IS0pJH2U{Ii8q9s{In%>7S60!rl&x(A_Q5G%GuC^$`ipf3J9}rV4oqMW$pl@hm2^M>jFnE^cm@3ko+tfUA*vp#KQ|w*Cju z&{G-OnwkC!s^FXXKZZZ9|6rsA{5b#X``|bJ=K}$OHvZE3mH#b^w*(Qh(vh`y{+5Mn zE`T?^0{^i7%Q1OCy6j8-Pe9(Si-%iKrP^dt1jpoKa=Iw-GQadF1Az2x^z6H>mP?ZS zvSN^we!tGud6)3;%eRoTEnGe~UYqLVX}uPP$|`pI4$herB!aXw&5N$e4$DP7&bd@W zmZtpfAEXWlC!Crs7_YTX2|5irJEZoki0!Q>F>Dgp3AnJ8a7geuvcmWsvWrIwjme9! zdSx8%z#rR!{i_6?Rt`YBh~P<@kT2j!4hQ27g37mAS{hy{z3)rubt!+6MVF=PD(YGj zA+w4ZQtH172~REj9<7OMKDT;jgoHyOG-f`%QQ4`igs7J) z!w+w@!DP9GRH5QM`c9C$3*TdKv3J`NxUkNEIdRN>hQY9h?_i(H!7txGW~QSU7w zF)JdLEOqa4*u0zXRu(cXy@pvnB}?nSO!l9WH=31BPOQX`5b!4ithp+pC_To}z(SfV zk|3gbjIsldSuMnlouR)kgM|Ml;{P}J5BN{&#fqUP;1aB?*)T_gw%Ik<#y!JhQClZ1&= zpjNc@x@?tsJM(N$(}yYYm~=Q=(z;J!qa@bZ5>w`78(^yxjBq{^KQ;U` zmkh(U$H7*$6@YTuyLL@Tz2?Z687YYuT=c<+5ygo%LaA(ilpq8v<2^hC7~Lq}UUXhb zHKFs2Zu`z4yZ?y8c=>12lO-iVNg9)1z{w7G!o_)ky@Y{*c4=M-dq?ZYpItUSep8ts zm}+NwvWr`^OqAXgD~-w1EBEml{r$(Vm|e&#TWa3S%fc4FC^YEp)K9d9+c)kJdVSI4 zkIgotlMTYmxw?cUV6W%s-4`j{zF&yas9R4={8E9z!WBjM3 z|1KRfpRciBTEFtYZ?(a2kRoP=EX?F7R!wA@r(V#z-*^A)|3`>P_;ADd zkCC@%uc@MzO3v!9YtHgV8KZZ-l+f48EsZU&rRaKaxuzNMahd99I6T#*V=G6HOGV+< zxKrGaO}|rEY#qxC3(~T-OB{+v(W0ZQHhO8@I!b?R0Fb zW2*;-2LwoV1-CRYZM|) z=FN=dLz;C~T#9LpK|!x9_acems51&6gog~Q1ztr({;8MrwT3xPjsv)+bqeY2&XvU? zx(Qbo)SA?<_?MU}RF}DYZQm64EC@F|D-7yBC%mc*Z*>nu$I#N+MC}9#JQMl`6suom zUPea=SN;^D`SPrG%RFu}JhUKn6?yI&HLqIk#(p$+BsA2%e>)}}RaiM;ijm-@T5P!fWM2irNFIxpkNU-j<;src(O>cM6$6!jVkYGhAWad|@X#%< zCp;49C}nbVymKkqL{4rJ3f_<$(f3z=8iby{XkHNnde`&SM|fSpm|G)hJ#fT#e3+BT zaM$M@>9L(Qj?Q2!h6Hbuy$vwl3j^x2u1C8adG?Mbqsnd>h5?WuY!DZxtrw$We-(7! z1i*iQ7~Z&O-+Z+keMH46}Ma{y{^Y zBvjPw*@r`QOc%Y4LrgnKFN8-L&osR>1SFkh>S|Icb2doqi)yB(?OCI|6VnsM2~|JPv6lqp=c!XUuY1HQ%P-9o5qiM7$V)p;TAt zM5{jy)S%LTSvt6Ck+AiG`z9>R`R2?w&fm5!Dt2(I!+Tt6LDWS)*s(oFo>hzg(f#BGdJf*X(>DI5bSiX9~bYx z1e}BPzMO!$_I!Hl8$gAn0ZxD)Ff%za|9TA%Ki*fH(yj`Vq(h8h-or zg(}3vv^VxKcN@0*B|<<-sv7mbwhkmyy#@BQa~|{~K@2cFok+48#^f5j`>iml$%g3S z+@T8n%G{{MCwUlpGtvUz_sZ8WsUW7ba#ciNDKTe2m;^tLJEE(vpu+czV~THuIxJ}* zHbI0oqTh+}aizItIGNM~rTc6S3%}uQosWjys4c*umYq_Z`)LD<0h} zNiA3gUxrS{BWb|aE4G|@G4s-$T&`KHPfNi-3B1#n-YT1 zX7voUeTo^%>t@_{YDbjv{Dn(Mu|XrwAWz1GFpj4fZfgVYUw~o#ub75?*!a*ZWk9JE zt|wyDSiid`u+36&##~#POiFuQm4)6qDF|H-UZlCx+cAtKfY=8)lqB;%H?hz{j!Iyc71H357NUT zCJpo%Eb#O0_07e)sOGhS1?m$9B!UT=1Cn4~qXGdqfyW|nRA^|rM=W(F?;?0Br``>z z`2|~*h3OIcPbX-?=crif+m_3WDYj_Gob}0DViT*C%f(>mF3~ZM=%dT-@X}4>J%zP@ z?C3}4!9JNJwxJH58x3>L?6{p_2~!m>w&hOD6vUx{#_``MdYa0|X|V=Xi1X}5+&OTH z_WR=*_u2BlpVw*Cg!ZApDTpGkEK3+}lGWf*$EM9;305y=L=AjQ)I zs7i*|;OSn7%$sP#V`^gYxt2bMysm$E%SSBp>I)9#rnGU(x%}`KAy~hD5_FowBA)#v zJ(LcW6kK2$hof@!P?Nak>NhhYNWahcR`iDwOdtz;6s0K>EoCCuQRj(v>zhZl&G`HK z`sw1xkB#U=!LQul++`94QoWn`Ay@DoSMA(EBDb-?0xuODH{t^GO~~f%*<2 z^%a@oxPB6Ct56sYf#M3<+xv+Nm3%^(tN+h@yMqAIfrh_1c#QahZf-Z@G!JvXz60~} zvNBo;Dn)Q?wu4O-3807d*^Ia>SbpRs%@A)DpU=;hE`Q8g|Av12wElJ}M)f6r)ML`% z_J&Q-C^>yC|KyY!62{%W(26PT)!;TDO1nYRLUAW5MoR*=Ek8Zl&67KsWGC~aqltTC zn9NR#xfDy|4sCUgQb#B@jpe!VST83cN=QMY&adk9=2B^R>Y4beoM8RX^oBn7?j{=H zcl1ER@D<0KFlw6#55~9W$4=&8TiqZAr?DG=jK;|xW`Vds8xoT3D=|z-26G%1z4;Ph zi{P0rg~n%FAO#_Y9io%l&ybo~JkoHKOr4q89OfUHyg!UNc%V4UB)h0HjfFO`C^G^A zoX{KeGyo?aSaEQB4(e}1zB2%l`~<3eklY=9?cRp(e)U()v77-qLDe8svDhkW(b$#6 zv&a+b3UTF7HIL5!Q(4Bi)dPiyT;|gZ?(Hr{J?U0DrRD z7**y5kW>EvIVp1$!rBS%i#J*Id-|7Kl}K4+p;nJ7X>z1L91xj51giat&@ zito{vUyT{o4!!Kxno2CUM!Yb6SamXcBzXJQGn7Gz$Yk>iyCwK7Z9P)-e@fp=5HyJ;wj?>Oc&7 za|_}zU|KVF=xvpqa1k=$pIZ3wT`L2+7CfhEHhom(e1A-(L3r*|1*;P|)Pw{n-Q3qg zbCPP53M2d=Dbd#{mwXH+@Cp?#5Sj=uC4# zDrFnw(fV>XwZMglAyNbxYX2!@^259yc-4a!z0E^T?=Mk5Oe;}G$aap)|MUH_-$kn=2_znRn}VcTUS{VbzEW6mJ~;e z^lB^Wj~~f0o}IB#{9D#J>Zhha2sbaWmxDBS_9KrnymyzjBB00RUYIsj0X6}#$t&~* z`Z28OP++&t#rNVk)4_IFyRGBm$uh*1N5zk@%kN^jHg)5MmR)f!p&_fqNDi|xU?1_F3)=#Q48LlH zsE9@-A^u$ay=^yVKq<&oSY|ybGoz6`>e76$W%Q+e_wq#a8H6) zc*ON1Y@O>zClO_+?lx0OYpY>cJTr-;(9zZJD*qwmku8>rkJxyNum0M0kj9(OHwbVn z+R=Xl;#gn<@`A3r_e3ZG5{NB;KKw5Opa_M~HOVRH9Pk_Top-nS)xT)N75w^N!uu@9 zDw?`wM(|u&9wG}bKO)Jl3jY24zpjIA(VTmSGYa>%AzAf#VmC~y8gOf`t5#&MDOw|VC&ZR^<$Q*U z+dDB=Aa-erJA4{3&+EWp&SeRrL<%og4lqR^!cLL!L973?=AiS@PUUU)%F7!VMOoy_ z*H5<2tE7g%Dp^vXzU5^tIRgA1&zks@ui$14JbZBZ%lksRQX=&3CKUt_!%7^bXnnhy7b!%$!EXyc3fv%oU8{fzKAX5ojnV>(BpnBB#~@z6uuE=FJfCTTbz8vrb1B zd|!Q^Hb8|~J<280$&4+b%S?nvuXwg$gC?>$=Po$KV|7LAM%X2iPs^{f6d0$EKVmiUi_7@EnivKInuY+2_P)>P`~E)lS}+&>^Dl`d;A5Z z)g7p0$FJ?U6<#Zck%HI&P5Mg6!YoTA#K-dYIl7GFXzj#Rg)qduf_!hc@UxldX(d7vAJ-8Nd9ob-4PICBb;5&sMh{-4 zWMYZp{Tr!Q+Q}kwVqxMs$hNmbsyFJAAZ8?Bw=5o0@*!x6A_m$!;w7!~hh~oLkG!XF zT+IC%FjkIw8t1t#)$a1UD>0bn5h=+B>+yMXV}jRlF5P^CKW95#b*+k$<^!xcO~X4F zwt7-e@2sIQcw6hxvqIOs{w@EE(x`Y5XULR?Ro)4Ax`{2ATIe)5`?Ng1D4JP#O>Q=I z_T^XMY#bWD|D=TN`uzY7fXKe4o=t%9{I0tXAfO=#8LSYr4+AlB^gZ$ zSz-oBJq&qt-oD;c3&TUvcP^Bul`GE^^BLeq{QIz%LY-7h6R_omWHmY^>b8lKCUcAs zr7qMMOx%egn=F1?U?Jgn)6C%Y7>3)Fv#95R4roU$77V7Dz>#7Dn07AaLM!@?W> z7a9CSq((ixAy$^6NtuZsTx&&SE8*1^b|5jIZYC3uNry68EjlA91zuj~JCsp^6a?7Qs z{uHoS#Mn7K>-fNoG+D`a+-)kDmM-4knI#RiZii__t$V7D-XMgmBD9;jKPNi{)xdW z*h?eeIys^C`DbWh^2(3xN5td_)^n_#mSiU5P1tRYTZ~RGQod3o@EaovhSx9wrw#LF zSL;KGm$HiLNQU5oa*dJc#p?2Q=4zf&C(-2FEh{NY5qYFu>fc+7ngvbM+i$d?7bA7} zuZ&S-yNgNBR>Y+fsT8c_oE298#_V$$`;2mtD#(KBUHhSyC+UYN`&4M&p^dZ%UKGDW zyA@`r&iKVUgSl-hdg?!DLq{*bIz7%x%@Hic2KV9n_t+o4?R%7zo`Y8)uLFQ<-3_YY ztA9tQx(VyYP`)(Zy^^Ujr&P_F-u^~Rl=u+?yQq~mNxeRn2B*icTyS}FDE ztz1kyT+ALdvLm}ij$H_|Go}Z51!g!trOqO)nGbWi=uC1pqke7CsYFOT>}FAWFBPlO zNF=u4PfXPv$WNK9@^o`3HcU!sxsYfON_V@CGA zn8fNedwDJ{?VvYvQ`cIk_%R!^k5Ax@#%*g7*FDwN2tj@SfbND5o0*NC1?CHzT|~@S z>IXSF>3Kr@Xw~oN_hx=LJ1qeUQPSDJ1a1Sx!^ID39(OQFD5m&HRZfi7H6Y zHLGAf5VD^A-s!*7;}DyY0obWf@P4CN}BO$IoWSPLa z=T`5~wKMJTf6lOiOd5BsztUo{OtYF5&efWPMf{afaGXSJtW?c{@SaCVre|xjeZR&X=eU@8mi{+A ztZH(9{+_J&_$v+7#VwNRuAZEyb~Eb7NNO&Gv2v19pWlf|mDB)_1ci2m2|@9&0=XV` zlmTmAeayP2+USzwc2J9ysFMiCJEip-)}WWYh9j1WItx7b_wUt=<&eKlCP-Y4{OSXY zp4;$pz15h?Y!l#4R$a5)4NM$VYvMdkiAS)ae}{uxR3E=ivRCo{tD=FU^`z) z8Ql07#h`tmk%3hyL#*;Garz9ZEKah?+czprdvw{|$RDg%nAoMo2?77Cj3 zX60?xLK;c~h~Y)I>`TJ%1iNtJUMGusk)!D45BKLFrK6{ilV`N;P^bsvHUe*N>2$y2 z8;rJ>lO^2n4XF`DW*XPZhDaq2BN>%dGw{vFJ8^fkcarRSb{5kia{l_NSRrXAcLFEg zys`+{B*vT1f?vLWNHZ(mpP`to=uXHyCu{P=*mR)%>NKbJ!&#ktXAEF9SIr6|Py$QE z^^3SFBvJ}sdzrlHHT}s3xnNnI`SyfPp`_)Zv#pM$2km8`webtA8Cq2h9$5XSEILoz z8!b&GcIDNADe-CDxc!$1UbB8;dpEI0qRGuJSHKNWbDlBL;T-03Y6ivedN`BmCZDH} zN~HgIf6k?;&*Uqs7Sn}dB)-`CCMf_>UH4xzr)^!+!9L$DYYE#flMb3tq7hjY+^Z)* zENSi6-|v){8FG>@DnS>p(>vD>OLaWt5&+lq^w=xJiU=seWM&*1I}hUZ#>QoH8S zxVKzyWD~9?{jC4p{Ko(IN0kQ5kP!s+hzlH+hw>;Z;nL}MH+7}ZbFUH?G_uBZ6DMNR zi9Cc=TDQlx6^a^>^M$O36k7Dc>3Q2IN?Y*}p{$g*s{ItKTE098jx5D}$ji44!ak^| zg>O4y)46fiEMHP=?yhk=R682Udi6*-TmEu(y#4+>YmvTqbsf2<-i+1oM#2OH<+cBRbB zdH|YcHFNI1h(}tF#!ikUD0@2kg;0Ph8}E<~D!A)NnEiNo|GEL2M#v@{!)C1K`RNoL zE-c{k{s0{`akwP&C&M)U#b~UeVX~3oW*b{Z|msUry++W1EB17w3&Gi<5cBW9|m5! z-z@Izy0_sD5JtvC!u(9KcpAa}7+kHRe}ua&dnB2#UX?Ui4bB#HnkCi0_o~ z4h>kH-S3PU)%JQV(d*vyn7tbljn5yO&8Q#c=8=)C|5?dEyG{UPsR8NVdPuyou!jao zI|{L3c5c+8shb_O8zdu>A4n{hR*aEy1@rpb$q9Djn&%)iuR}uSg>b_eV!8&0 z;7~2;8&xYSc_aFhiijmF-4D5&G)x%z0L=pK)vo15U4i<;UT+5zDxd*Nn@FkW)Pn=o z3y4hqu4QWns&kAB*8?wsj5MHYJUAu2JB|9*o%nsdz7AUttVmbNSjQ=(b!BJRcESh0 zOR?Vm2ZPxoTk?5BVyvMBSaLTp?Twhz@)WV5L8SA0OShq3n*Q1bmqDS<5^!m~6vU$8vf9PY|2i^Us$_x#U2WU6gKKe|-D-u_-2lDwF>4 zEeu*c;hb-*`g!bt^**0PQG}QbV+nGFjV>Zs9co0RYjB#NWHJa+O)NAmX8KesigVtZeH!F#W=#^mTo>&w z&Hwl#Dp@qt5dp@|0`Xbl5x!Qr`oR(C*M5o@|A9J5M?y;gfT)c)S{DS-2^PSA^!oJG+OO^Q!`87_(T%`ar@_-)u-!U z-BFJ((f}PJnq?p(X(1c7F*|v(9#pnD#o_&N{FK7Ipug>y@$Ek=&p^{Z_yIT+@R-Bq z`#u)ospj*4(BEnUR8v2&HGVxE{~T5-gB@}ZPH+g-4hb5|M4=_e`vB`&Y7^7nN_=!^ zTJ9C|{mjqPE5jUjs6U5O;|+*v?2$7dpIo%o>(XnRbPtSAc3+H;XOx$%v^IBd7@`jA z4WR+i{uYs|c|?D*IrO}*QR4ry3ECkR9ug6?NTpye$GJR6LNbIMl)+pZF*x%QA z50m{G{Oj#G5@t_Y*BOIIvGEqcpMr;H^3LuWgL0>Jpn7sf(czUcsB%3M{z)gy)6G2{ z^X#mch600nAzduRcb|*Nw$lT~O%^qL#a~K?vkj2JbGL7aPT4>coXbttuoN%Ho|1%N zQK5ukoV(E?NWiGm4J@0YmJZ>fs15p&GAK?(&*SN4=wn1V8Nl!xeWFZd3 z#&_xFQG~3Qcv;iLXIiUuLPt1TfzgGBiPPzdZiKiw?=oM@z~A=w44J}EObe<+?5BR* zaIo6J`F7RUb-YR;8US4(upk1!2YPI$2LR(-jsR!bwz!}ykeT^cGU!|QEeGWH@ZLSl z`MvnT1$smf4dgvzua5Ssw;9DT_;>!azkK<+-Mtj7!ud}9Kfq)PoTmYcKu!^kfcG#lL1)93}G1G*Rpzlh2*r&p=?6m$g zQ#8rDu;9jg5q%$oGm3`4g6V~vsXkbrb(v2Hb7n7X7^Ij1;gxqTokh~xpwsf!=E|g3 zI+$4h#&eZ{x%h*>RkHS|>!E2D<7zX&9YtMrZlG&-U8d7q-1*EpLz3&Er^1)@Z-c(A ze9w0%s(lJ>TIGB4RNhB zcH$5%F*7l9KF$Jz{=@i=^WsK^K%5$|wkeq0(2Lmyt;u3upssGW zucNtUF#zXCQXheRf4I`yZZ-2^DTj^!5#7YEw5jiL{F~!68g(^EZx%)LSL1eO*S|{m z1ugOKn3R=AA=Yri-rTLF5c7h1XsN2q^#@6MzV2hF_q;zi7foUum6Ad9@9y#;C2^Iq zT2@_{V4Vn>K7t+2XNrJ=ubVv2KPNdOiPt(3Mps|d^E*9}UQeo6_B#gZl zKL-kdJtdDSXoVB5ic2Ha7!P)##_q-BC4IzNMmLoy3Qbvt#B;4xY_NNLrM>mMY$FXL z%Ag7k-s4D84tN*W%S4QO*MO+2P_qVujLSV_R)-h(KXmnl@fn6Dy1H7wJ3p{EC?d*VhPc7w}2pd1!_W;$5DpjV^UdY2$sG ze=aIw$?D4x2Id~UY^Ph=E|4E(R-_wHw{Z!&uu+@->eL}RXqqcS4^Mk`7*Kkzmd_kp z&T<@fYnHlZvIkxXU4e|)uhK(=hS%cgcLSbGbCx{K= z({ieAn5kXA@N^yPSo5&l=x{QD$7ROY4;OYo2mqJRDxs&R;SflW_KWHT6QmZks0YwZ zXXO4Mb)L@=NN!3F6VSpRw8~uI7J8{|GA*M_8+Z9=q4O0lU4(gPW*W+NG{HD8r?h8aMEf;i zF~HDUHMg~0(#Bu7Quf#jy_={5Lv`!u0mh@$b!}eTm(hY4GWI@r=;3;QMVu*Jln|(x zkzBe8GQVXgyim;W;<-T?3=gwvY-_v5kmmAOO{Vh~BTY7a!iJgQlFqU?}*+i?A zwMNY)6*25AObuJ}*Ow|`bkz7Z+qFx7cJ>YVl#4_^zOc~5N5s_#c{|{6B|`$hr)7kf z;X<!sc}~-llAmjpEacqSKaDRpzsH!`PzW zn;H)?(s45}4JSomEkKMe>yq92rW&ysrPzzdX)T1vyaSyu{@c?LrVFAc7iWm6c77Mqj~&W9cH;{M z1W(VO7j*t_r{1kWKzLxccaQ+Nn3qWBPCKG0Y~I3L4Fx*g@#LZ)5kH}0aUSM)(b1ISr+5_b#=ig+43JSt@X910n zU<1ER6#6eg0yAAeON=5|9?xf^bc7xXS|=O3gZhp-*v12Z#Vxfz3hp9q$ z2o{*>Z?~iHjiAHuJ+6Qs+Xj!><^pe!!Q(TQIBzqp;8b2d?tbZS6>8iOFPO48g2EfW zmR;_HH{iF;(4aHw8H-YTDn@nG#|^J_Y&qQnglzup#Bt&U5) z-%T0XINRVUGxBW=+?bQ){4{!*87;BrwJlNxR~_5UMSp8;Tvbe?x{B5{*b zfE+IrSL~QH$aGbot7?iIP!`ex7+wz}^M0krOtX`CLQC6;j!q-!qON6)wq?AM*#FAp zfAX$L+BjI0VVkl<`_ZN*^SAuivpD)ZLXqil39AQIdw`-?C1BPRjraxFfnBMHCyEk`QZIXQn@w8VX)6`|C9^OEnG&H>q)B1`p9!{TaK=BZ);skkH^ zy{U1wLw5XcVXD)N!QFMAE=wg67R1ICbIXFS`p#9kA7Z)nf?g0qE_i&2yb^fLD z`s;1CHm?5)AOhQeFLJm21!8KO^8xCdS(l;_FYa#S(@AEsJGSF_gCs$p7q9msxpAAm zrZ~dIZOm9$xlyI}GWd>4^E5eRy;olAq%Vm??zElJIlPD_vZtUsx*lAQ36X6GPsx#b z(+fu&E(RVqx(2lHZvVds{`!3Cd2V*_49^`F=!i2QNN3NdMtcdAn|~fHNg?6!5Gds9 z(8#}=A&|_r!q=w0q6Kt zr=9DANBW&d0Rev70TGT(%4=vrn`rSu^V2!tEVzo{LMSV06Px5Vn2Nj3-ND!Gl4r+Z zgYlU$5&Cim=hD+iP%q+JI0a5L42*cBvoO2)-0_R%Nk47~*O*C^Is@~F{QS08v(^t0XQC1vK`J2zJHyY2j zAWxfwp!`(A-Icyx6&FF}Z)4WH}?_m{0r+uG}K&H2u?fQWqr|Y2z`Ajyd(y-BI#I zC$2r^YnaQ2wV;RG%WwoF=;)5<^z%cuR58BKnBW^o@A&$}oKW(R2ClfOf&w4=nmxc& zeY9v&ZinRwWi7;`LJ(+H70bwQB&e+gv-^4~gep-3bJz0Dw~>#wL`&`K9stZ$K%zH- zFAxqnAb7Cg0VMJPFf|1pgN|+Xd4MEcpECOnKmky!dz&DJD-t(kv|+*k3g28MZvgJy z=S4y^{{C&D!R;+T@LV*IB>-6w{yffC{>-=1)X-!*1)d6lNZ??vF|5#*BlSs*#3Gz> zg{p-Z<6aNdsuU{#_af>|V%R1W&otQ?={9+V!9o{$K5NR+rTP5bidPN8A*}_XZqI0= zJbxL-Y?I_dw))~I5}P_FL~=zm(t1^gAg8W88*f6o<23yDiqG#TU+lq;_e7{*B)iARe|I?{LU6}pytPZtbl1~Pxy z+WFv{J<#sh?hy#U_P=YS11*8bfGn8b4bPytL6sHvHM1H%4`Oh0i1$*{q!Yg zlbreSbBnan77<&k#BF0PtZ=Ng4$^$p<6#`6c8E)WmV>{Bc8C7IH_w0% z|BZL57u0U@*$)c-3i<#sB#ZR#sa*Fnf_y;*&zaw^|KaeHMFl**V=bgm3qxJwF zj?qNnJNyvJk0?FE;}7t4<@OK|ybD6774)ahwM#Hy3C9D6xVPj(!pMbk`o4x{WC6z% zIZ+3sP7Qv^@!mn)DYAf~9EtBPGn+(}B*t27dT`V0Wj!vdjE7aTYffsjGcZTX^=}s% zz0p<4IUCEmGOPhFyf#1S6|olw(I!XQ`(f1eIoK)?Mt|ir9fsKKF42fn8IYrU0op zTHMy1{xx5Q!5-g`mlL7Rs|*P?!#+81UmJ&S22BTkO6UKqW{N+Of0LHIclWn!^m;j# zVZ|&pPAX8`5g9gl20i#}iGEiBUt!D`WjCn=+*BQ;moqCz!X3Ih(>vo!qB-wa{Q3dQeN<)1`%7*i^UlyrZ09qTB zxf|ko8rECi*iI^X(@(fX)yPdmNaf&hhN0FnS4ju8cuiv3azZyLmGbkJ5h9erhr*7( zG9wmo(Ya^2KeV(Gj`z*9`bJjw4%3AEYJbF#vGZfc1*4|v%~M{O8?y-)Zt~@?k++Ou zX((eIHM3oxT9ig!N<}FoyW6L6ozSteog`Neh|G)~LgHkIx2Vc;%m_YyhV#m|Bzg|m z!9~L-dMuVw9VVeSvVfVIUqonD7UanWrTzUZ`Xif()zx3+r44^*-CS2aB+&4S_FtnR ziX`t|@rI%vWH^(V>T#IZb~E4M(56JJ1LLdD)KZ!deEX`_9Hr>*fM)jvKUDK~WWfP- zR$1bEJFUTlm>^r)EB|%U^sT{PU5tp9N_U!$>AbP4$J)D2o1Ssr5qzvh9-QMv zkk*&hJIJRV9GDFpdxQNH;TUds1c<=*p99Q%&bR-QlXsD95I>0iIXQ{swVn#zu-Ci* zM&R?dMu0j;?q&NH#6?Vdi>($VC})Jx3Lh0)-y_PM+JMJ~CDb<>}n z#C<~v>jNXQ36+5S>W?F3&O#=#tkqZRvQ))A@9&U}$)#RlgAOfWS2F-FMiL`J@b6psy$CjYtD2|#T35s(XH1T;YG z^nb)W6g3;sdFnA^NYgqJ82|-&jY*!68vD8gN)96C7FH-`l_%9Iq%mgSiOuuxMWp_b z-i(c>b32PcQl~z`YUNrmP=ADmPyBXdoIfgnGZg`^K0V=}o0h-r`m4TO$bRW2wHj9x zTu(>D?j8+lR=2bO%ijO@{UKqbz_5oFmzRuj5+DH%*4o_$+D9>cu9{vhhc-pB?tiWjcc9iJ8rRuGe5^Yq8^ zY^ak0+uPgGx0xj3m!S}4U1{6}7yS&?Z-g2-igUULS%||8&ApzHpW;8kKkb+8LD&~x zoBw}eg*g$~0ht2JK;M*Kl^~|z|0yY@V^UDS#DpCk@txYKq%UB{QD9+Lr#}(2=?(x& z?Cn{g5%RNrXZzJWQAJV0_3N)vcswcSlxoc}5q^%Jclb?@4Q;|QdPTSqYefPJ@8me4 z)FmU~@B2t{+W$%E_7Jat+3*e5Z~TEJrkbpmW2BC5F2&)hYDKSNfhwTzSy@w?rKL@{ zZSj6RMSh>tN4h-7_phf6!Zqq@bR{Dp7lHInOy>RCK?fVpbNpEg{5N^~K(z3^;k;%z$tN@I`x*1 zYj@e3l~q(Er$=n~6HZ6epj`&}+mhap2N1yMAhS=-hVEU#=pzl6%34IYf`S>hvkk#j zX?c&tKa6h7q^AKlk&Wow7@mmdq<`4Bn z^eg)?7XX$$H@<*H7^b(K})I@*9^!Ju};U+%2O}wLP{)ts8ymW z?;6?LLl1)jxGtZaG|k@)-pAis#W`mOjGPhzJ5?}RlC!uf`D173Y`Z8>5pSl7{=41@ zxgn4>RHyjQ8$ZOtRQfJ-`2i`2b9k%A`ox@^w8t|x3N#9%H~KYA&?a^0yK)9G(#+5e zskHBEZx$^Nnk+C~*fX(%?wn+Ntq1gJ!>Xt;6DosvG!-AkSdxW@!SL!>yi{2bTgsUR zNn?(VymvU(Z0zgkl4n9^!lhx>HsB1$)kdrxmR&szTy)zyOIWqoH7(qH!7aD65*L^B z*7))dLcIq3_|J1w$LUX9hZ>hPBlIy znyH#OwcA<`e`F-nq(_Zo5`p`*h3GT5k*VIE!-Q3;wBY>hvUyHV=w;W^Cs(T}N?W-m z;kZ2N;-ZK@Dh`!Rg&DLYAJUQ(l2IM&IynQJH5Zu6flnYnUN*IRUooEM;K zrLbW|3%y{8okr)H>0lQ`Z8j;BmxqF!Lars@+yU*~38x!zu!Q}Yj3lTQ@cbC}EZ z^>@m7I$5oQHHAk}6;8`kwjsg})Y&#;bRl?fb}s+Dx=H5qqIa*^(Hx|eL#Qn_#!t40 zKbb-{D#HVKs}&~G5~7m?Qv8v|hKmw{cJsP}H(5{--AkzvrLQeYcvEq5ffJELC=SdS zuN&m|%dNN_AY~^M`Q!Z*Gd)@ZYYr03W!o&UA^k-`!`mP|S*9XfnObJNQ_U+3qRwUZ zg!Hpgx=)KN%%aVESkF8@|I{zjKyQKke*iN;%)gSsNRVZ=1!P49EibmA3q1b?f(P=0HA_jOTX)X864Oq>21Ar*|kaC?c5|r3M6Fz5WG7^ zzQx)bAGPrW4K@iUWRzohZlJR1d@D7)7nH!;Fv05hz*Sn(WK36;w!0j`K2EqM?E{r@ zj&ZN`(;YKRs=loa36Yw#y0Z>XA(SHUt$7?+51xmIRB~AwQG)KEl{?_3YOKPzTUQdb z438ca7VhBkYXi4unp@u(c*$Hk>Y&3GTv(~^Q%pe87-62ebuBHCs;IiX@X9YdMWfUO zW|m7lQh-k8>nL@ZQQ>ujW(Tc%pLWR7##r%k75x?djDop{mQsBob)z>E5zT-)+caqr z{4nasr_r%dIBtg!g^^l3q7u5RiikJX+CFh%{Kd4{p`5;$m;wUvZTlJABpJJ&d37qr zc@Kg!{mB|VvCR?77Aa5rwhv0xg_wIQ|?$(s%P&lF}(Yr##T~ zo@=V39;)1a$pD{R+(Q+5NRo~`kKI?wL9*Fudxyikn;Y!?d^bhPz{wBx-!eldqva}H z7{ND|AeZcg(WDX#bqlZz4IO4}et-pidOFWq63P?tjf!_j1^|Hlzmn*?@(b+8{uuu( z@gnR%+JMSWr^v*e>iLhfyjvVQ_5)gIpknjm`*n%_dglwSr~r#fB8B1@&4!G z*F5Dn`Ts&gXD}4s{;8T1LxX8^7em&e;nnY}-^c$gyWju!bKvgiLDtdHV@>ABv=Lsz z%Bg;w%3y#MxHj(sE~glx5EFRqdQ0YBs<1@6=5G&-xxlT1u885{4mpPm0R9s@yU_Q$Q%OpvhrEk`%cdik#)q& zVa%4aq-<4qd$-rF>08ud70Jce7$Mb&k=&D!PHY6G_L5~f;Y@=!=`qZzN5`Ftm?4+) znKf3I51f{l7YR*H`~%>H<=Kr0y7%Q$OHV3$A1(5{|AwOzu?dGKYHdr@IT|P^S?g{zv+K3 z?pFOnUrWF9f0GGbQ~s>VRd{*Buo_I5okC9x+3&00$N%LuZ^K7yyhfwS$H9Hw&{h`{ z`OGD_lmG|}8)`K(BId1wXRRGhPCi2QQ+@v=tq)+`w6xg6z_R`oPmJ?TAI0@f`Zce- z*82!7rc*%VxEInsLgrN(z?J6)kzY8CS$EL@)YKxFYi}2YL0S}+6k}$IkH-R(lFlfD zxlnB~awzW>Ij|Fi-MV5ffbk9*zPIP&YkbX3SmH+wsbGPSE^R4Z)=DyfR9zoGPo2wh(=_LLBrvVkJmmfn;42WZ2%=5lQurd+3D+M7MG22@e83X?wuClS&Jh=PvGb8}{l8J| z4%T8*CgQdq6tKB_Wl_D?kXigdf(jC&j=7oADI+(v(vnZw3g-?A6A!>nosZGKjHRI#GG4|fs4NiO?Ag?(x7%G2)BgxAH|y9^%>Dc zl>>&)30bz}NEp^C;PQSPw6flDHXbM6O-D=66Hy)?Pv{>_b)j~wE6h1(^j`CEoy)2l zj*tigY4uvzaf3L6gncZ9_l!V941374kD;QZTIIw$0RJkm;uBkR>)AZXu6@Tur_^8yBx5jpOe&tz&Rs(iI~)fK*cEmZ8ImpF|)8=}oRJ zKK3d)teAY_mm{TC*P2ENW-Q=-08?gCT!vake1nuAcDt@?kcbt`9@()8row>RN&W{sV6ode^m64$JUQZ7yGJ4R}O9(A6d z2Bc6{cr25&u-YhLGGqJo<7B-Nw>FiuTQPfIAd1feXIOd--3p_^K9zaH4^Hp9f$6)Z z*NM~wM1YrIoy8|DVHBJS@}LKM2lH zC#{=|!f8DD2wEXH`%L%ot7~e^uulHR*@1kFeY)x?)!u6WKTf#ZluQSv={3&Bk-b-D za7DzmY=%26dL4xC*|b${8hT;-)#BW(CkbwQu_Km+KH#IfO@+xV3%IrWbSyqa;h#U) zZ8tN-3n(q!Hi8`Nv$fH^5V;V+yAth}sBlR!v~+N)th_Gah@yCE#`r2S>**df^o{}D zr89GgAD&M#S+i7w{>!W5;Xxw!{0Bl6)qYP6V`m zYr&!2Re*Az7|D47SM+RISV-N$hlg&y^}X+42)$a|Aa4N|Y-2g!#K|2T?u5#~S4s2v zB*wi^fwvNWZQsW2+EP-rbt%q&Uie7h=0~BT^L*(@7og*(RO}VaL`5To7P16DkbVo9 zBO{H6E(tbI43=8!737x@h9J<&jZdtCLJm+`TEWcBLr`e$cpv^cF#;hAH9Ap@(MAq+ zgyDqYC8M1DDJma>92&6toChIWUI%obU>_4n5tUu2G40lVyU+cf0gWuMFHFs->uZ6$_-{yag zr0JAE*;~uaXWiwjg%m?b1*(i}3 zMWeF0&@nGdCSIPW!I%n#o@>a4Q3wO!$1`(@&prU|N-QmR#I34}NXcZ|`{Z*Z{o)~L z4vIc+-wr;;UPKRD%abg9Aei^BcCMc7Wzx2_#l^piEj{Gr5S#)%Z{>KrQ2186JVIh) zd(S7ZBW?3V4XBZ(s3{thrACqCT0jS>5jk*#4kRO#fgzHgob)`QMC9`Lh8{MD(Oy-? zqU*K#XaRBx@nd`#wOU?=A>|LH1D|N1_Q(XF6HTdZcidM#wpqQC8cW39o}PS1eU_|? zLAcRv(vZ`>lK!07G>~)()0dUtLk_HTIim%#J<5Z`sjSB){9<+*F_|Y%tB+2a_BO5% zGr$t{0Jm@*CJ7{uIfQWgpjLRuyfUcMi{6W`YIvzHVP4Qj^8xQxtCd85fGNU)`pt#Q zf588i|I)_pzlguK|9h|hvoJ6)|Jwik8Tb$B|6dpT-|=VipPqsFAJ=~jbWFeG|4+eh z_Wyf@4fSjO`})smiL~LE4AAv@4qV+^YG}to`Y7o4)$M3#@HOvV7j|f9UKvqnE-o(U zUyfh?2jQRdzmA2u{@)Dt@K5lc^FKWu9rHio|6lf>pM&rG56uGrU_yQ^{m%baaC1l1 zF8eVL<=^)DtW!Hb27eIo`|6H~MJi?%I5kM0+}?VHFYRkss;XHdVdR@N=dBXwB12Tq zkka|URdqF}nK;xD)I|;`-nyj3FI!)zGqVJLcqy$u0JFIs@6V|qtcja9Qk-vZlmDUg zi8CKnMcZ_mYSZLi=R>=JH>`T4QbnfItl4nv3e}2nu8Jl2GsOjx2fAh&?e;rZXxc-&c1%P4J?{T*3qgFRT%Hk2dw-8MB(JS+o*W#e^&F zCkE;YBHi>#I55;+Q#^8&PF}#~p_)q@SxEYosS-S;MX>^plY_ ziIAw5Czm4Y70QnWW=a*fY}JNicEktS35K?)9DT#poz*UYNEDP+((o&_ZCGll~IYtuK-G&yGn@p&ntp1@K~d!^giX1-aSb4@JBpuG~t(!_sOKc82lzM?~; zjipe4oey;RR$+z;565_9GuNU*K1&EDUKBVDah*r85A&tiW~OcygHZ;~>`6(vFJG}k zwSyrjo~d^%!;=)rpyhaHR+TF!o@AKGtEjNS? ztmMXIp?pTiECOteYTF1P>>Ok#aU&b#97K|a7v^{~&tusw1Vh}5H1u3bGCw|r82707 zsE-{6qv5khfO!r=Z6gls?bhRt%Qr~SA4(nM{}It%L<&X1t-MN~l?Un~XfaPT2^!*5eS_lz-0L{A7HgcEsP^2x@7{>94l8vJ(}Wk?$9og-vwFMTnMV+E)4m8*=q7z2B7) zK-`7Be%mpTWk@k0IU@wd=Sy6LBkku?$Upvk>-o*PERs0yw712W_qZI_Wen8`H8=s9 zM=EIK;$#5}45)e}69r{?hb_SPI+imPUI(>)YLqoJ#?>_NBbQW$3#_yEo0->&65~&Z zU#XpEr`n^R>bMKxSa0lI(Miw;dkolwMxWxWOc*+hJLGKF0Ge;ic%Kbdu1uw=&@~XQ{S!)-`Q zqYo3vKI`Ue=t8nk0dUo1SpvBU5YmXKMi{54M-9_tfk^Ts7b93PFbGapPKd6Og4>Gl z`EC)jK9kLWy;}EHBOv8IV3Dh`dCTvCq!#76kJWN<|D- zr{%%WhaFb2pANvHgq9-@_F{-q3BO^~t11>#B0OwueSr5|T%8sH&U0<08BT zb)mV(Yd7LvRG^BIl{1R1VJ;ZGJvt{W7Lh-ErY&)SuH(}6HKk->uzKJp zoTI=UR!^jN;EB|v+U*Yoxr7}nGSd(l`A~6H;gf|H4%IcdL-}WbFY4PdpYL`mC zgrL!~PK!M#*2vx)RZMFdtm3^+w`9Tm^T&;x9XV?XWNTez6OW%*KYS#5C4<}vlP^Ku z>2xN|)YNnoB-kzxx(M@v1ljWDZ0~4NU=A;3?#UC+a`?w`E{8BRqFUJ0QgSCf48a2@ z#5kVnOZ^rhP;Law&}Qy3Swxp!V@d*q6Y7Xo)gZIy)DbL)VvopT)OuSy#{86kVqEh_=YZD*p!n_YJOzJHP|g^B_dZi)+rE;HCwu}@m!07SI?d8Qg-8fe z!QsbYX9SWiuz#L>%;RQ?=w+`f&>AHN)*^xQj@ZqXZC%*tunEirvLS^TE!@mzue#}OW5Mvlk^aLYQ ze!)bJ3=|ojx>2C@Gy=pwi6(`5@ zg-zQ}n2e24hG-~qi6h6zvLjC?6)dDT$mn#@Zkno@$ErPGk>v)VO@Kr|!U8_U% zHi7TC^w~OzU1iGqGoZDWt<|qx&^>{7UH6CN#VAUSjNi0HlkZo=twH3fq=)Z(8H7*F zN5ZebOfJcQY!PMadVQV1SY@9(iLKDsxKdP5&Brg`)v7b7aX{9+Ld0(wF5 zkj4?M299z<DpdAz1-=h)Jv>ms=i9ii38wr*%!k9!4;655Es8LR z7=0^xI0hptA|XEY9I$S$N8{>=n|AsSI=%Izp-*@eTk-Oiw#pNnPwIpBdlWnU-d5pL zzgLHzj@ER?0;O$dQ&==y#5_(RJt`R<%uO}z4(9F2U2GvU)&(5V0n*@kFiu^lU8F>< z5S3Dd!I9?bj4xe z(bOe^uZ&~vH_a39d8+{P+k)e>_32*!bS3r&=qtKqVbqQtGBW6Yz{is*`BDGWdH&qF z1<(mweAVHc=cE@ec;z&_P4g_&ZU56zOECdKvfF;k(VI^+X-|r`%b=^Fw<(?mI=#Pg z?zwU@a(>TtB^t9003*^tImGElLCDI zJE1_?fNBZp_RX2Y3Yutz;9Or2zaNK3P+HOim>%(6TF#C40yqM$ub?r-L+EpvO8k$U zsLqHHwHy zu;L1SRA1+iKfj=x_?T+CgPK_+c5J&)LYS@m2bTiAfx6e1@dk%3O88_nP@;c;pz22=VvT=E031tQeN7{CQzLUd zO??XsTXPFrJ)1jd=Jd(60** zS`%`1{UZ?{h0;rb&?5>;Hn?Kt(+ai<1j*sgFja=r;PQ1lk~vmlyR07t?LGssf;Q*r z(x?R_dXz;+ByXUf2rXiqm^vaPr! zhT&xCs4r{nCid6bH05wM3>23ZpZgydo$DJS49aCE6C)ZWJbG9J>$%!fti{n=r4q6~ z@kH@N`AUBD1|+Xm{PP7f*e@M@0RUiswHg86hZh37AC^oJ??hcehkyy9p<{GiXs3q; zIR9|<^p5ps+V5EZSw~EVGgu%ArgI<|Se_FF))k$(9DRV_NyRba$x>o;fBOB6?vTsN z%KpT$OGiokCE(YW5uTpY!9cJonVwS*yN5)J$VJ~#4fGFEDU~V)DACe%clQ?zfdp-n z#Kx}WtdSM$kmrKbb!?ZZ1Gd&5so(!ToWtj4;N7(y;%nRQ{f~g(x1H0Io99V>qBZn3 z5dLJ*fV;AD4f2n#4xIg6x<9Osa(`@6)7DVWOz%F@E3W`Q+2^5vi~an$JJEs-{`Kqc zZ|6hYfBjL`7_mC~+{Ioscfbq5!!X(fw6q_G2CcIN%7YG8XgM)y1%kHzr7(Ip(~L)E zxX>7z`jBj)f7eC87D0Lq^VzEkrNVlc*Va(C+`&*eLPEMgc>CI(nKU>Z779=To0 zNa~$%0sWHyZU47>vUjWVnB+M+p{yuHh^Q}$qKNnEE=mMk6;@Z{kB;mL z2YE}2jcRcs7jJiuVfoMn+NL)JS_ych?w~+?7|CKXE!Z}cV|~~=bD_A0%`%`UBD3CB z<~(;GcD4(0&FF8E96P;%S7k49B$TIv<;AVC-@`Ety+$TH!%W_pj>h z7;(SlJ{EhTLQSkUlaE!&hNvXk_$-CNiECR}YTgi4MPq3z5ffu{biUTwLXgt{3T>bLKG4Y zAQCJJnQqZ?SZEkf95bRCTMe6F{6o4?A8*goDGd86kNKerme3(PpQl=by6KsSg6%2d zE7lkB{9ND}dxJzc670d@Pbpm=D>cDaS>+tPU8r?r5T`q<5BRhd!lCc#p#?d|kqxm} zoh{_&e~k)48MsP!8D1-^7Tq+DC(xg|{PJPHzH4BZ%llsAHxw8G8Z~ZP14ZJ}3$7AF zn6%py1}U_9K-p?i9|#Oyq@V(e>Anj@gH|7O`?#a_h438cQ zRE;Bs7G{`s1xvg{^cBcVm#(o#&EK!&uwL`2TVmmABR$zLxAH2Jwa{tZoExXmiKPd^ zdpB8!cxmb=C*$0IsvdOnYM$b7_#OI`>)FJINUfR-6Wc)=-rzo&H1P4K+}$g_ycq6T z4l6Gkp7+G%nAwQ}H9yMg)bkk!f~alb z;7R9e7DljnCO+!j6yJg(*gVW4JI2G2oMF+G#yAwJ)$-@X)s}`IdM`E+D8oi^4W~yw zY&I7s_V>WfVI&n%Tf`i`HS%Jsn4KRlSi8bAfHEKaGxq=I@?Y<6CHJ%Tf9~Ud(f?up z=a>JNpM>A`e|^8i0KW$?{Wtj^ogwban`I@YQ@_g!NZL!0f16G7`|6H~Nnyj#t#q)0 zi`QscbSk_z9)XJtd{LrWX8hQKw{BHlbT}@DoM8LQ);a+O(jAZ ztr?}Z+&_#0+i#u!Uxk0p|6fA<{CAxI`4j$UqN8K{RuyqqdqC4&>yTDU1VA4LxVTW)N&hsl%KXS_UZCvX1Pt zc{6c1F(Wtvh6jS@?p%n0a6Q!EPVaz>-!_&6*VbC{`Ib-E_`ZT~_vs8R=(JOr+|R4mkW<~Py)V#rn1kH|v(-Ci35 zJ+jeEOy0k6;fk}(+_3c;lO|<4!qufYLru~3t^#EvYM6Zgu-QLIYD+MX%WG8TQGp{5 zp7?7Gei~dsrceYrwvwp54W(OvTdY#iw^!~Cn|CkXH>VPh?jQFr-Z7BJ>GS*|ZTc$p zm$bBSJMOZILFF430-`=@$R)e z0moYxmHtO?9T&T=!AohkAes&6XoM9jI|8j+?FO-g(D35MK9sJEDO&b*XL7}G2(!w? zj&Ip8iwOy97%qj=m!;S;@1TF+pUA74-0jQdRDoHw1mfBYo<%*zN=-@|s+msC(Afg* zz+5WH@IiA+%Mudh!_1(Kly|)jQ5V_1%(#Nsj8^Eo?(eR8-n`(6uQ@mYG^&)07qf@qN z(u4GP$aWIJ0T(>vG48>U$a#O7v|@Z8{U&Xr2lhm7!Jsq%p5ihSrz zVL-;6WfKK^*i6TjSe@NN4m)q#TBe}d!c*xPV{X+7Xv+^w#y%?Qw*o?ez3hAl+W33d zaBw6DugP!rlGa2oC84;krlBa9d-1pVJ~e8^cQAA@9y>-dfE{iTxwp8i8R1I-?>BtX z?f@EKl0AYM;gJ74FrZzZdkS|qJiA|eeSe+*vngA0nkhW`xQBO5oa{->b1VK+Mq1Dx z=Yjhn{XDEdpRJFeW1ma!)G3heuM@@n2F7Q5^?CF)Fh0!BbbQWm2Gv=ZZPEEp*@+fByR&;v^RyZZgECM zwI?&IF@y#Rx|}0u`8?2&F6%R?jkYHoc+x>)dgR+Z^R!1(A1IYOz0~4mxT3$elrSo{ zY_%rf*<+&5ef+}x*mr&G_}a(&cnzN|!m{mZ@>S;_+$K+FZX|#e#L+KIr#DZ zPw3auN8j{+%Z?g8+!@~2IqFBQC#+&Ek`IUbeqY@&F-yM8e3lMz{tC^)1dD@#-IhKa zSdy`lKlU8NRJC42fIPW3gBtR%>wz^Rk(=+1?O&@nmC@hg7*k;!Hi5u?0Ksgf}GKR9S?{~}@ zE283&_@hqq3yF^PJ~GV>fBkF%qxJ%g@Z(-mD5AM242=>yDXF7F0JMV!s9V)%Y$KLiK{;Tn3yjgFE=xS!qp;QMyPaqwksQ)VRE$c(Z|hbAbJdZ{AUGAzd_Y)|_Qhf?$oJww%0f z9^)kU;mO>(vWi$dE^KH_PzpvMv7U>1e_+J5G#aohnBA2ipIvS}@rPmG594aJNQ8_H zEe|h6QpnuFAI$J(VHh%0*Q=9tJn0|JbTDF2%Z_p>kq|4+&5bvaM)5aiyk&E!6UY1r zLN|)~=^MfCo_A9Tgzi^r-m8_LweQme(Ik`?8&$F*?dIh~8s^1xqYyumy+}^dznv*;uUQu6iqZD*ve3vX zO&L_<9^}+WVWBROzmp0z)@I<1f#im9ys{mSxbiaSfsU7~WH{ums@7ZX?b=1}kSiuw z^BNRjfK12x^CyAwK9>(Bs4TcR>+6i3rvtrc25+l&ESYOQ0UbV1&SA*~v8B|*1>)Ff zt^?DOJ8sB7j;a}v?g@`VopI8n?;sh=%`@=A-~}_=MdGb<&T!!6ZD(?%v7+S-NO!zQ z?vk$Fw~+G>^@Lzw=?Hc}J$j(vgQWGGo~4MUxsV<{)&NSA0$-<9Pf7z9g&GpmFv_!A zym^s={7~#x?vdt;O62uOYGKaqY2d^(bULg8$!d=j&~B(sZOeR)w&@{+LWD9u-BN?6 z#J;ti9#?s&Od!{@PalZB!;Cp$Tron}m94viTen$U6OCR0U5uMCJ%TE(lYVRZEFg-U zJ4vU(je4>Wg<>50lq+BcuNPZ?+$?U zog)d2cHg(Vk%QEE#T^1aY_96Ml3v;<8EAjSgNpuOOu~-qZApFG)CgW@tfpvsbeS9`>a)8irHvke$9+|S2=S~yKv>!B3L5{gmbCWf(xMh}-f|IpZtiIX`2|`8+ z)jwq)p&7&v}bR&TVld58lEi|9p0<1$JTbr0$Hra%hkl@1SlS`_Qu4$M2b*M157o zLxp}>1usXNPmRK33uh26erf^|K@f=%>$bYg;I{gFWlmgK;2MgRG%`d}sThEhh5&LS zG#!{-_xj;8!%sIPuwN3TsDG!r@2}kd$Nit0)bboeehF`zZ+-BJNw>+9uwU@?@b9S( z_qh$umjDH9QdMjRrD;aFJOg+aJZxA09tC#adpdJBlqM^bk;on|T#E-rL&VU^l>Kt~ zxW*5o#RgBpeKBE^Owmhtfpa<(D<+q^@x97PqL$By3a-b`2mA1|j`Z&j_Nxx_1|R5G z9fpAEgZ8O0JqZsGaYk84CS-m8oZ;^u%urA7t%;sqxW1mAZH4@WG_3?3?TFN9m};@S zm>7j5-MplP)VR!;Z9|Ckv5WBeCp zhCkPT{uumq{eSeky8oM#(qHVqn_~s^`=$Q-@0tCAEPP>VPKSWr|84Of@n5WLR@e|< zaGt{hfPt-$Rxqk%&3MbL-jW1hV~2&@3dJTR(V-cJDT$TZeLZ&ZtReMaTCf6sOFir0 zf^dF%S%r>YWz5jlE)}=(LH0sk1r?c-=i=>_09A7t3>{m{=kgLc4C7`L@!YBIwWlu+ z`_~~GRYeELr*eIOzR#;2j-L(|n&Q76K0AJqHohKMGfEL^1uHPLw?WAbt`Ev*khlj~ z9YtdhJ2*c;Z#n`ZL&kvJRJNbqxx|q$w!LmJW-YBsdku@%gE+!tk=7xfza@A!JGLW@ z41Dw1{WXZ!ZfktC4S5urGc9?DMNp_~gQ`)a*~cVBBd6tc51R+QxRtz{Rm_h7-=CFV zzx3@Y!hj=ueNIN*^mZj$Rw3P^d&oo!G?}I+%$pvnQNIs3?8G74y;yq2`P;bUtP}G} z(^2uZwfM*Kk~I^jO>IkKz(a#I-wsKQ+Csj8gp?$DlCW{_knczn4+7hp9+kFzvKm3V zUrNvH{a{I8_{P$txmI>@f*n8l1TT5!;bY(zUkYT%vSW?R!8y`)=0M8el5lAqPNkBHmvmNU-5~9(<5biQ$3mmhecN3gklUg5$s-DtC;pP z%`P{nxZuBsT!x#Hoj8qx(Xc}%Wed(~W8XX#V;yUS4QA>=KbnEYGo8F|12Z%?Q4VTMh8|0G( zbXf4Bs^93mJE5$2w_H)U`9RZ8CVq0guFbgqRq{pbvnsq0Vu{x1CV;TV%KY;npj+WE zP*205tQ0)hs#;R=8e+RV{KSlgQ!6?l zCcz`isqxBi9(~ihP1F;jQD-JM5-)Dl$O2oKkNj`n5mIrB_9@!iNCx>c~?k>XCLFhwPhfzi@S0T;@6oJ znS0uNoUZ7jYTWBeH7jifPmR)!(>0y?`~(wV(DLyQ<~)Dm{{j5x^S_;wnW4pxiP7Jz8>8&tbws@n1p*>u{>bk}qeNZ% z{Zdh|8ZSAeuyDT98TaTfI$44wMqSMta1xK0|waiIMWXeB&8$(q37z2&Vyof z?x-d(|6J&*4wm*f~rXF5#)wBRNVTBVJeEo`q*)p4Ohbkn)SE5Sh8{E7IA`!Gvn@t;k`IR zC9@WaoUT1gXxlDj=77ZJGd#jhihB`P8_lSFdo{+PE%roIR+-2PCaW!E3Mnw220JW{ z<&<^SO#3;Rf$U=3LD~PqgCGM= z58)^Ib0mL++DUF#dj(@7Ol3MF#$~ z86XJEyOZ^f8Otna^}e`qbK~`fjYx_siLBeDBphCmvfD5Y$RCq8+Jw zD^CccMLQjxCBBlqKVlhb7FZ0d0C?ujwnIdK@TlVX8EB*!N1?ft6aIDUF7gINGxTZK~2kpT|nHp(nPQ9?H{2Ui@nu7 znBc3;T)7ywd?(Wrkc(Ss_OyL{QV{kjv!^|GS}*r1xmwD$sjT*^RSF^r`%}pPz8}}D z^W|t?3YcV`cd*~7JVgcz?@C$c zuf=|Biu-Apdlq>Ro|%_$u<@!8jI9XVH$?Od`#n?UjjFNgV?Y!RV}VjL@kPj&LvFJ# zAlyck3L}rNu_uW#fzcpbF$%DZXSKKYMd`Y4emwU%z{_0IK7%CqXjj2Vp`QaxFZWO^ z>|b7`ry&<$Dg@2GEmIR`0FOgSREPFHt=CBf_N}Ybddnx9ndqFhrdmC+Q!K$YJ*qc! zv7?lM)-8Lz95^&rH@D<>M|U0`3ST^I`rLC$_=3`0?lz$WAOWsLQ{Yg_IU?n$6De2i zew;+cH4d?s-ot53LdaGuFbPSg^)CzO&ng^Pp6sK5_8Z6~GTo0>ZWfmc z#N=z&@Ov$2O-wpdKkB-#&*Nt{-6kKnK?AvW;GMjY-LNbnp&+>BmI`(bg`m?hIR4zlj?HffFp*A?2-7tLFXLzI0esb@_Ce6&d zt*p$uL&fQrHHFCw*k&%>^Oa$6U~YW|&@IVG?8*g!+tZXmc@jo_WW3bg>>2_j2h_ zNw-!GqFK)@X%l=dn+-cZH4z8#>khr?UgllT#Ag_zaF`vQcUyt8d>DbT zDBwXgQ5#E3HGHa4cBvN4f_t!h#PFoZ%{28rC<k6=%D*iJCm9;k=I*NAq~4EJk3#M zpgkX!Y5xNPi17Vx zV23AH}@RthGBl@FXOV>w&TOaS@pPV4M` z(sA`Ofke25qNEc$r(_HiU15v~9eX`%&x6bB_|O$Ts1fI0>@nm^*;DY5rt4rF6K0Vqz(MG zuNFe76ztA73hwd(R95^l+5H!OV;HiFq2_a831C}Qy5+Gx77H27gcwo<9|kGC4p52+ zcHpfjz)T~8^cSU+8Zv4u6y24xJGk#>ky`vhjd7!72@9hsDPjhs)jligZ&YMGNETS* z-YJQ%NohsfJj21O-2GIfp_PA1*Ye+){BJ?me>krEv}8X#w&0{PeE@-6n$GovBC}-L z-x&ElgHn!RRQSQar6JCmd&Vb8nEPe6z$aodGlQv;_5de9*uSLnYbtKVYNa`#igsbk z19zZ;pv}5oe0<_}U&zDAF@ZL1IeeAiz2v*8)o>`d^Y|o4M=`&-DWa@6PN@@3J#T2aj$-)>`BbgX%#R z&9>~JKJBd-l-UWKkbldRf>@p+z|K#eL|EQVAcYKT#t+g^up|s>oBLXHC1;@t<{CxlETw}VZgzKu@dfH?Qqump$PJ*F7@ z!bd67K1)qO<+WvH<%{&hB&wvu-tMs0sEQ>sQsbv)*1c!B{cjJMvAhQz)e7m(PhT4B zD#po=>`egP>G4JS&v96*bGXBeH2Tf1!er7uz}PnBRzDgQrtl|0IDmlAe+@_r^dqOx zPmiV}BcyHCSHIC6Ku$!t2>38z&0*H>3E~vfBh$wK8{8+uKqrM|LStu2os;P-5Kks^ z@up3hySZXPB+#h;sIU_;x;NkgmIuh1d)_QmOy%wCOBaWVIg7G+LYcKT-D9&Wu&)V= zlp!Y#8ccHtU@rxT*Ut&~utVe;XlT>ym>=Q_BO_U}xC3B2&l00*Dro=>i#?@NvgOxw zc~-$(ldiGhj?6#0{e!9bfr;aG{o!| zwNzugikr3Z{S;8EN2D8~OAUf}?ywgA%oo8oNlys5iSwuEDrFRhR`q9U_-}Q4)9}>X zNHdqp%g~;`)*(32x+^6fHHHoH&F&Ta6kK4}f1KYW0|DXuwhp2M^sDz*bE~RUmB~$; z-xdG*1)gMZfXn#b?Jg)#?1`FTK!JTru6x&gYiF)XMW=1YkE$8SUoF-hL@XAG-NiD` zY)7MdSeHGZ(<> zPU*>WleqR|xT^2&@*I1^fB9b9f24m`=ZlQ2J!H`ugYQ6o=>ZmUIWChQ}vSk4l zCqwyOa;bPod8bLD`VrDjS|Yr}0D3}Y*XG^_LDE@4(xGcFqytZr1nK01TKuBy*9kVz zwgUY$I^}gJV4$)&Xo==RMl5=emqmT4nPJMl-K$Uwe?rs(9MFraCeSHWPxH z2=GfB8xL5~OShX+s>IK%cOI>%v zdu+1JlBa*3@2W@!3n9AlxHZg8g!z%PICw=^1X&a*W_Ai&tza3iy3KSI z%^q(oO}g{te0r={(C~7Ewcv`rGa*s}bqkF+YU9}A0tCaJwz)gQ5gg8h5)lqy5FDSd7GHjkWDGTmsG@moWRJnwsFjZ)ar5bpbaH znnk$)Y^h$eiN^(ZeXsr_fX%+UTnEXDVqL~W1N|bEv+_gr#~B^DoOFa{Z+F5MAOo7g zpFz?PoPPGu+V9;u@z>rO3iPYPA>Iw_nQ{=zrbHHE*9`*mpUfPHIe^e?2@ z{fly>iY7QV9tfI-N6m7qRO+U$1vW8asPj}= z=HLve2FX6n0+qGIcMQRn`Fvbt%B|o3pqtfimJ!TR3oYGyW_i^>8cG96GenZKbSMGA z$ku0kg7Xa2Hz@e?=@EZP{KE46jgxO-4p~r@$TI_0$Y1CYexcm8yiPDLsNZg6MzH2kC;~09zXZUVTsQml!Lm7jV`~KDX_CJDS{M3ejEIgwBM{U^A^jCEl zDgVbAY842G*y-15fA}TC{HWGy2h{X%dFm~6p|o8pzT~^D6Tjd25W8kHsEJ#WsA5)T z(}dSik`TW4y?O6zotOGm^9!x=D2F_xB%Qz;!oZB!XB8KKdrfQUC&uv25wI{21rA{` z$Y#4;Q1o6XnG6DS5)LAG&T2@zEsxX2mGNdhlEA$MI#sXNP8D?F%MZED=Lf>_Pv0zJ zaoFRbj?l>S)8n0a_{hkwNjV>nPa|kn#Ngr2?!RvO1{x!Iv2zk$W2*P(xve-}4-ALK zBqy!Sb7X39i?Y$CE*sBp^#c*EHK)e*6%s>Ww^m^9RC1dif5hd%pkEuBDB||UGhj|X z^&LCwc~=uJTn`+v!pVu36|>Z?X*TOfA5+CLLws1PHr_bx$&`xEUMKVhPmvpj){iHp z+E?C=X~}=Uhawz-2d*sVOahrNb;6+Yi?UweN_IQG(p?uEJc6&ii%T;9ndcM|LF2qj zCOMwF^QFJ))gDnJ(z`>f`_F>g_BGwFOOYmln6lP!iPejz2RD@5-E}C*(FDRR@;`JPM zV5IMsYChuj&eLfQo8nSYdLc%56uJmpY&O}ggY~E`7`u!iwYWI|o=2>G2K6|)^Lp5D z()K^#WPCK!>b8meh-mVB3dyY!lcCQB!5d7o87+J%2M4VC`du9no@Mso=H@(THUPc& zSU8p=NZBmL6ayZ$e)|HV$8=Zf6ay_u~$y3S9Pe5!*d8xw`*j5KU-MHyI%2? zb>xl$V^x9zzPHnp502Gy=eh1Y+oQ+FL-hg63jnK2k~Z^^nw`f{7Qao z7}+`eb~fw?oh*N6o2j7{w;eV*_rPPw6Q~36oG_QyyBi<21G@SN9?@-e zH3FMMxAq2I`Z~7s%vb2>?2BaNsdgmHQ$+BMS6lNllr=cY8e}rgnx6q85vZY~IS(c1!0n zx?>9F%5YXh8plFSe1sVhu8O$9rUIeT7C9g;SXDI4s9|~te5a+I=O39EKG>Y9FSB?bc-3`-lq)25r&0&Bsgqt0No+1!>CUX!H>^DtEE!a;Bt zIa-_H$tu>xpvC#9^CY4r3AIY7E>gndf)U|u?^_hOQZ|KGzFV#sf0^>_p}57 z$1REDM0`e@tp);N70g6~{ClXOmsOBE7OuERBq$n!F^LsgSdmFuaD4Bx71DS*$YQy~>n)K_50Dl?2IB=jpr z@3e=y-wT|JIL{fdF4jN3?p!Q7?kj70f4M6vx}WWED$8|!fINVcY*LB2nYWte(!R(F6W_ zOhh_}5;qX)c1^tfOxt1Q#i5-DIsf?@jijg=3%sSqNd1^4&vHJ5OKhKYJa9aGYo8@ICU3%i2z5RxK|+T|HPoa|ELgq1UX( z$D4jacP>a^G;=h%ZuKH0C|dL8=JWC?uS|hnLZ5hnKj=_Ye)kle>uQaFep0DT7da@M z-t;0#YhO3zH~BF$w7z=^>XfFJ(uafHdo1 z$10If`&Bu}9yS*G)1zE{l0YESuEaqN1nEdCEa}1^)lE4bN|ltfnb>enYpQ}5g?2KQ z1EI=%^}DcDCD!;t3C5JTZ<8T$4bp62quACQ$3ls$v(B)JB(|cDa=9|^%t|;~*-pa{ zlS`x4U6UUJygQ|2!b*(h6;u_xz1nVg zFDc)hfZ^yxp>kjsQUJ^?n5Ba{GDQucz6`at6Dl#wBezwNG@HaLU+y}#Me-?zIpb@- zUQmXpg`!wbf?703e#xyGEj3hX`zIbFN`pw+krWg)*+?^GNy!e%_)x0b(3v+GZ)M-I z(mvP=^rTMpazrK8R#{PMke6eVy08sS&X^e~L*PzXSy9G+p~Nx!(qH{j8~EkuSVUo= zCbw9bDpA&JdvbwBMf!aqOQS4Kg*0Yv5o%%lDUzxIboQKt$j8D?n_x;KVE@k%5d|mM zGQ~#8O^gA{@w^#wL*t;~WAT#OU;X6h6APmxP8D^189f4k$pG}XQc&7O`5lQg5<7tP z-gj3_<4x5pPv#vgquZBr9tYo!=hyW*d=c2HOs>V7MXB8Vs7|w{x30a)#=k^9ISzAv z$}|t2@TRf+hB@Ab-U*scfBl7`F|NSxe zYy6)d>*v21l7QYY|K|UNnY@U0tT81|mP?m5BCD&J^N^nZx5aYxW`X| za7Tr;*B-~Xtq~x3$3L$mDJ}IS1c#dW^398DJ_>4d*oJ!$l}|6Vc0m%Tp+hPK5H3u6 zwAu&(K5oGFOc)ZROQiAchzv%5K%%Vlmo&$*!8URD>V2l3Og-CLbCDa53KxdceH8Wb z#QO@-;k3a;2Z{3cb7eA#Xu!a-)mMB;z22j@Z33@IDfQ&nu-H^=^gx z!BZaXxG%BQGei7j1o(`^u8Y;G;{&Z{rflvT?k96T-KQ)~I2lM3@lk7@0>>Q_N15cAU+n) z0C8W+SO76adFNVWu0+48&^&4}jHi}Gt~c2LTpWHe173Bs(;bx>B>A$?0>3yoxqf+K ztovKh*?}SQe%|e%j6LeRQF**jN?i5n69x1ost3ta+S4iD7}p4icJxQ1!ARVgNjrB} zV=g7M-U>B#N4Xq9QBx}f@|hcnjQYwzvAD%+`5lIL=1G~cj+_bP19W3XdGpN`&uhXBAnT7pN z`u`F5C+Pq454xWzA^&@Nz(3Ug8ULRCOiZkQ#{c|d@K^m`?ECSXyT)Jke}@ZJdw|3| zhj-z@kjCwJE^f%#nbXz(C)@%n;ha(ajRz@V(J~-1?;_ z(HS~8K-;>RSOKgZ9dv*G!}re|^{q{8{SuI|5P5%>q=pNWy>@5et2 z6WgEq{~v?D?*AnC5gPEF3ffYASB`ukkx{QQu*=r;UT|SpQo3+ zEId5pP2eZx{d!lhL>^{^y+E-|H=uY}+*D8|a){g#@6Jbx(jv^1X8{CK^tU)*k9*c3 zRB7WgrLB)n1?#-Lrc0#D$la5v_zk76PZ&tclAJq4z;~VJ=`N?jIG^^nefu-fpnUh$h$75t zswVi1nWehM7-gd&6o%sY0pjm1aCgMWd}F1s#*qh@Y{pF08rZ!WWwf861l2m{XImJ~ zU9|LaVQ(Z+1;;7C?<{<9E6~%RZ%)iexY|hrwT5Wln4)Ly#>x+9cl;_)d#r|F4ZQStU4>HsHEMTcRSJ!AM_9K8prkVjF!Vi0fP zkFzILA`}443j#|ffED*ILeebfqkpbIDpv2vnDnYtAcWOWqOqkNP>y2Yqs&eS;A)?& zEsrLy_p^kY+y{fSPeC_`fVy#yzR z;A+;RGfoIY%Z!p@+u>*6OZyf_S9F%seoB2hw-OP-0+JTWD9g!w7PZJxeVckKKU*ej zGB2F?>0BOXUaM8G85ZqG=EG&4lo9j1qYpgEyDqqgRgE*5)`wwW`KfkJ$gIS-uM^FL z6o`Yz1$OOf9{FIOHQT0&z*D6&+-H0oX=Yd2SX!F#t^AucGZEIo5AMK-@%#-{zH z$reDalO2L}uMbk5zm$q;@dkn_eb1pC?y-H#mpx_EOXrr&TgKk82ASsK27aK1)R1wLvC4Kw}a6XpLa++N5sz&T2j{ye6d;sY+1}RqA@7 zU1`nrPOzY9rz($D>~(dg;Dx0h;^o;(A~LA`Ya*%gEvk&Gx1Y>8anw0pUqv;p7?n~x zmAr=NIlkU};DR=|8D>S zg8nTA%wOjJTdC>M7TN&3QBmJZzbJL?jG{sEzb*bF{)4vc3ImGQMpbA%JIR}m;R(Gn z6njF3D8L32Q4aBH9E||(AoFFPtaR)q8TFD>>f3??t&M1h==AAb7eUhG2bOPKcI2PO z;}oDhOi$wa%zA0IBFKE=@&b&g(!m3z;iEe9>7y35bo`VXc%|)!VFI6h_sV94A>!Ng z9l+AmO1N>X-erkC)a@nNkpT%6S0Kg@FIBdAfffjuiO2FiM5ExP7IUoYq5{7*bDN0E z97+}dsKbR`71hzs^irr1voWRVeFMNO)xkPVUYi$?jU!8uDgrd2)Yn>rW?Rqgl)Ee@ z5#8bPZEp!u29y<1%G`tPtOJ2N=tRN&MDnH(xoj%T<>i$*y5i4ZYwk4INO=tZ^BwYmD;ma`&(4PiXF!zrm(7^~}L_8wq0+gKN-AiWgT8 zZno_wTFpAScTIVeQZr753>4UIHpMSs_Q=bguSMJ=KT591#%^4!alm!F1tchP8Js2& z!&12uJ&&ScCzv7VUB9Do!KNfhdy|U$ZJqb-G$iJ1OZz19ED~vMK>ciev$9WM^ zD|TmOXNqDjN{JuNo6XAPwx}s@LKoT*n@PK&R_RBgdq|$}{4mhu?Fzn4!7LM*2M@9T zm+?>7|1I_1Y@8hFex#}V?-_vp0sm)aWBdF3e@rY4f7*Zk82p9*gC76^p<(=T{f6l` z{(lmTABYK_^N^`=I_O*{DTEwjAn~`wzw>`JO`8=q6mJ=CureAu|2dV6lN@PFU`-7@ zu;~g-1xq0$jD+`^mL&41B^;UYubq7#C?pb*O}yU@JA88;-)eE~h#u-7a2t(9H;^Ib z8=zJRlP9X36?%+rJANjFRzzFNO%XOwMq~+G8!mI{($#vsKH`lFJe)burQ_2gusMA6 z`KWXM(st}}c&=N;r;~emh@qX#aiAoZv@?6R@w$IXv`Z?8V$#{AMJM`s28kN|c3 zBY`dHWZ!`TXI-AgfL<;Xs0JK>Xip?3KAn=!f}K}#EzLQS%FmcOlhF@(z=)L{@Ybhn z@f%RhG~sEi)AkV8QS$9%oc(m8y2Q1nAG+2V(fu$omnhV}-dGg&X))+hlpQJs>+upDnk;GUnTRk7o8##rzmR#y;F;EMm&q93F%RTl$ z+4$rByDZVeUi3sx)4(@9a(8cR^E-e*$eSbLbU+`9LAFW@&j-5KW@wS#m#ZZ@#@=ub zW;)wyacFhO<-+%nu|(1JK&!%J@0j26KPX!=un*DMQW_SBiq0wMA9liiVkfQ${}6{p z706A6El4@a?>^YiNs^8SYri5)xFB1min4M{D`CHor)u3~jc{yINlV!{S(a!-Qt0}n zhDVzaFEMbJ$^^&w-WwyH8!L7zZjgvmh_8c_?kw6}i)-f%jM!&P7&8eGq=SG3({gQ^ zIz~{al->}p37)q#5>T>`NYL84wX-mK)OLcluq(EHa7uB$3Dr%pZ|Z}am6jad&Tzlq zDKQ~NoxUBdrd#-qv9EM5=T)_F9q@ z^m7YJ6G-Lcwi*k}+`FL!u3Qv{^?hGtOV8>9umuh&C<6z_9(%$(uWiFT+wG!RRGm#Q z#_5K6T(j&JI#?<+QyrgDRY(*~U(+`|7v7wmjGavanpqJxTmmpA9N~}$O-6ukvM4^A z7a!LtGz}~yB5^Zlx2TKv8!2EFi0d*i zGa-5e2d7nNE{Sr!br4?cdN{x>aA_wsQ-qRDN7n{X0AS|DVb9PY>C9{FyA}{I_x%%? zAx-u|x^3UkkD<|8_kS+FqePgDmZ$3kAT>r?_z9~q9kv^rxl??#L32nbd_v*34+V9E{uV)5g#?;el0alOH&DgC9Z@&_oeV?Ot#NbiVu?Hgfui;YA6{vZXjKm^H*5W2 z*-@bMrliVx)9eW*ypff}LtYH8kH)4hdF^9&wjhHo;~9+lR)pz?CZCj?bZ?`>Ml5DB zr;z4Ni@0I|ZYm)j&uHSXskBjLhWXqN zc%YohfF@z56>)W^q)m>WP9J1$^kN=ZRC4`u_Tl_{rxISVo1T-X1TB^PuL?OWzC08S zDjEA92D$gona3EY)cR8%kjG#uXH`y%8~d%Q&mEDM_K~IoUx%-Ew&F>+CL7LLaUr*s z?UYp1iw{cNGp1j;hs;L4NrH^vp1rVc$sARP4?UjD5y#}P}FeuJLbtTLkNB&;8@orwoyjE4Ww2MzI)WHMUrP`B+$<&9%$&lPLqGhFz5n$GAH2# zX9ZJO^5x6jBaud^6Y}5x#`^Ei{GWfW z|NhV8pP>IAu>Q;Z_v^omEKGmO|9=Sny8ink$C~snmw%Q2M?jh4-$}lh=b>F(WT|A- zw1vKx`P<^I86W6|#m1x~_eMrPi_wnI$X6?iNzjZ-?NiZ}jEd8ai%Ek)krt8!Bp#8X zqdTA~6&@7sC!%}`NCX1Rgfl5#E7()DGy{pyVvhj*i9a6yJpb1>GW?Yj{G08+Z0rnw zAODw`ot5R!@&AY5FXJEf6$ps+xBVY~8UI{?`?x(lBn$%Ev^Og0+%;nj zTiao$@sjfa_0Wt<97nte;d9b%s*J+{hnH#A^w(Q(B0?xQVFr@j=v6Hr4|Fxpxa<>d zT^*|NkF>TmZHw9`=$lRG=pgn2-X-wuo+Oc;RB8@-QgN3lmS%m-LG5kJ$D3m|!!tRpN~u#?E`_L^TOY*sV&DOFBnvh{;>+ zyI;&~o(657in)nHKaj|T&(Xh7BtdX?Wf_6xv6jJ|Kdb};35BHh6#3=2>9Ih>sK#8g zgn%!}*{d@MIZM{*-ZgL}elzCKrAJG4*;PW{FpEKW*~_Q8+lWt7ju>I2pe+-YkD+7~ zTo1=$&@>yT@DlgvTLGO7%Hht5C*_R?*b>pY8^Km&!G+x4ZJ@1N_4G zIqC0uLe=vJv1#mHWW;GnLlD0dY2Lo~CvXVis-99N)tn|&;i>5yG(9nLZBvM5OG~navHM5ROD#2lMe6307Y zH_jxlsMM%Xf+S1m3z${Ug8bM?CvaE?kTffP=EvvjRFx%o#^t@*HoHFEkj0#!{MJ$k z81KY=9+hyG74EFpp3OKshN|)YWZVSH3Eb+ z9B0n#aiaT0L!5d~h=LJ*V@`ELziH3io=C-cAxv`84amfvKC@<(My=3HXGFx6ML4M( z=@s_$Jl2;(xF)mc^*0-&epQ8UTr?zZbh~9*AkfLERC2HF(QG=BnG&cC<4gw7%+4{j z2S$WPQP-FQG+I~=#@pHZ0NagN))v{Bb45FiVYFn3hTUL%Zyq8w>a!NVuHr(>A9pd} zGhrz@H>WoyTn z_v2A9Qh3By=!#E$^#`I~&PIV_Yq7jEEr|Heth%AC(r6|J8M4dn>kF!)4ym#cus;f@ zM;sUytS^^Ic6CSvYTWgU-XIyhQw7SOxbkUzI$B$EGWhhhWf{F+&f@*fCyuKYyHL6t z5@B|!kXJ4=9%gQBfKKdYg0iyA27DIVT!Em7F`I1z$yx6)OdQ16a6p(wL2-2bAqn2Y zhSQJ_7sMpnk#0@yrgC4p4As{B>h_}&M&}BYQd*u^Zftw<{%LLUcnOA+C^-U(YdI)A zAbvCd+bL*NJGwrJLw&wkLbcjTW}(~({|ywZ7u7xhZ0Y4ww=;1Y9Ip=soj5mQu!g)a znB3J_FOdwB)&*TnW)sh2FiNQ+&w|Lyp z@Sv*7%~ZSN1z=0Wc1Oh7uZg_8z5;k9qwrF5i18hW z_qRMYB^Asi=45;Eb4fLhR#;i!kbdX6{cPiRgy|wFH4bxRTw{eZd>i)~{4F_jw&4g( zdo1K+i(^F+Z18JRd%^lqCCbql&KaoRAZ8hilQE4l`C&7{%HnLE231lrG&?TIniw?v z7)cczmv*HSEW0pU{B*m^Vtf*LklisH&L$UP(CIctWXVD2kqp4It+KR0$L)AvL>W4x z54JG&&)f}?fgiPjfz4D2tzm$})T#9ChDFPxZyg@wP?$7w1X(x>;JZ*K7>ZP#lG@Tx zHy6+RxT(o$xp8?1htlgtCJZ%aoIQ!jaR(#O=giK_K2o^Li#Kf!*1!7lmv;$+5vli` zDaa6lsYy3_BA8uN(fKA@p3JwiFq^?p!3M+!K?TOFCnJL;Fc*&!iAg~=gR&=*O3VS+ zCmf{m+P}&b&DS&7KVn@?r^tabouh3F0AQffs3Kt=!PVgVF*k?xkzF9JC!`!(Pv+vG zM@O>lT5D2epw|Oj;`1`!>anXvkC_sLEeb7Ze^Qf@t`1GN3SEUWE^3v>aMBt268N@> z$cO29n_j*^VVeYf>8Q9BRR4=pC5f|}bJ0G36MIvnA$RzP+rA^F1(j-M-At!aX59>7 zVa7OZHC~083dqJKUYq+Qbgg&adVvWLm=%{_f&$}30{Ys|2XfB`02?2^|CD8-w@7u0 z(FnilFsKfic@!s1Q2~>GC89?_L<8__jaDjmh@ZxPD#g2O5Yd`g0mb7#7AbV5{D#b@ zlA9#AZ#rbIkk!aK@wWPdW6Wu%XG+N zhfeG&0h@)|L^n$*d!(3FkS zdt>buQZBm5myw>w$LlaI!y|g~ZD}IzdFy!c6)VFNoM{3DYeEK69eVf;@|{qKO7)SE z541z zG1&k|t3a7+l`W-L1ILdmJnmK?+d=k5BIkt@5<21+>%q{sO}Q{Bpa zgd(n3x(9>IMIq%KveLFMScV}0+TCLtEhn=z%mSyLc84($FtYy6KtbE+XQM?GGBS9D*E#g@TAv4g61`;enN&qs-lvV_#JReP1K(dMo6OMX=?=T8!m)T47$J|VLp+$i#^SQ#>S zVO8cpKrUSkm!IWKeFk?ETcwd(>8|ca52>8>DB8Ki;vXSS-GaU(>>}-e(JHY(hSGU+ zR20Bt+ABAcd05N3Go;$zT}n9F23cS(eDF$Kn#58ZtTA}g*|=aWZ&d3RDA`d-w@GnuF-yf|I#SZIs9k{c8*zd zsLW^v=iMq3yt-=EY&svh^ssSJuyds8*t0m|7nlgH^EVp`J_ZHK+w;HBK?8PL!F=`K{}vZE9uEjLQ_5DOY8!{H zf9%B$JK6ZZ{NVQAU9Nv~ySQQK|MI<^oy@Hq>8;G2j2-l?i0mAUi9G-QR-VW}-_X+3 z!PeQvh|bW~%GQCKh*XS8j7^M-2gdvVP4fId@BbS(80#AuIyhS!=<5FCZs_f7O#icJ zz<(D1V_{00f-1nSmF0)?7_u_zuDZ(?mX{&i2A!z3(veuQ5?20r_?%Y$q`1bt6y5zr8F;QCX3ipLzlRny2;uJN)zf|9f!yI|20Hi^BgCwEsWx zpYflA<$sL-u`#m#SN!i^gMZY2&;CoY{=NMV{-1_dfgyc7665@u$$_=YhHnlIb@-3! z|116z{3Uq*#($R=#PYwcYWO$RCBiRL>ZJfeXo53r)XMubfcTcAU?!a3Ma4e3d)7_4l z&>ngGz&W67yKtP*VY=Oa-hXr$754G$7Iq*Z&-f|i6@JBpq3R*7hKKEMwrlL7GeSxO z?+fCZfr$43%g2VfC`?dk{t=3$K}F1YyNZP5tC0r0Dj}L0Dh!#P zQO!n#G3`>drs>7MK&^s2krn`d9R7*qf$xIg2a42wX7$(3LtyoT>;q#&qy=ROc6t2u zg#2E?Pd}lIuewu`t}@Cc=AbcJ!slD|_e=TT7!&__{+sN;BM>ROxsQxpGx!+$#ev;L3y ze{9UG|CRsuufad&|GdBCzg4~X2mj6WApeMaVi|UnV*FAZ%c*(4tG)S;>i;YLL;fXX zP#}Np$DvyPUM;|O5>q_aNc6 zZU8q^VcZ8q3-|qPi2V6{&7eBxt1j}rFaM5Nx$Zky`T460*KSQrP50xIM_pU2OOqVJ zN{=%V1Plwv5M6>46p8=q@B8{Mv*4e@KhJ+_TLW{e{|Bpo|2h9z|0nyOg_Y&M?Eila z{=xsTf3J@7H~ztYMW^B29eUvmb5bY|Bld}GU}s$F|ETVk6&=fG10n<$d_GBqr$8nI z^H4O2ybF?pKfs+{uhx=ENPLyEmO@sn97p6!}McL&d74xV25+(Zb0l!x`>M`(pZ z0JPlaV}FzCq;~!tt(L<^lIj}Ngr4IB!t;aTYH36(zC>z2O{*lG{2v-V#dS3NBV#Fw zeBEUzYaTu9G0vRZWI57_rT5*ar`kzEIY$ejfAM4g{|f$j{yQ2v*f9NX+5P_=|F`^S zVPa-v|DV?XnVJ9V`>%fu{yYDH6CZ(qOA!A3}gp?K3R!4$_B!P~E#7IhZBj8JN;pp$j=r9=^bnqi62G$jgQg+ql^L_^Oprc&hK;*Vv)s1Ug+6lUB((kK{kq!eZ{2N5*w`d3l zBeH;ZMF_7@Pzx{!~@R8LFu`?|LVQBPw&C}>7qmp55SVCx=YGNe`8B+Gb}=yk!$=mBb6MS2c;VP0+xsMLZqX>2t0IVL^&)mS)GKKAFOG|~#>vmZSV)vR&5;fct>4C;!^^d)4*wmMTAU)()fEW>hULeK8 z{9FpR8YD*jhzgq>)KB{?fwCXYyZYq6JD{5T0h)I2CQF>$p9&^-M{!7uv9}8b_nnv3 zzz#eIy~p^Q8eW7+aW+5-UUsoxOUM>(aS?g<3k!d+f%Fcf26}j{v1wq}Kl!|JOSCQc z3WjX@SK@U+kd#48n8nLb`gO6NvRDP2udD{}Rn$S$$k{P+67d-wAX~t6_%Tr%wVgXa z#*H-B)#f^B5&Ap&A^Iu019Ttt7WECal84i`Y+63e93+tp#t01bhn*MY*lw0W^c>HW zkCbIZHiic?oORebPz{34)(T82yfDqMhnXkQu;5Ict8PvpFRUWQ6zj0PvQg@q&EnT! z&Q?!dbT@o7r0=pov%oFFSMV(C8|+==6YM7BBkm^;qhOaVt?oLt0%np3k|dIJ+?3y*UpW~qwiuHglPXguQ$15MQ#ez9{C-e1WBpG+ zdJw8Ul%k>AJ<@dCCqI*>lt_iqg9w~6n)Au49D2l$0T@HrKPD2(507RwX)#4HPO+@9 zST_mXD8WD9yKX=#K<-JZKwO#9xI%*?z-wO56*~;hy}JI$>DTin8Ke}1evEaE|A|DA zi&st8h}ZPT?cdb(Xy{qfRn7$var!U%Q~vDxnH9)POi`z)u&$7yaGeI5=0H0`%QER{ zE^Mx39&n0$nsIt?${!U?n=+XbRT9-6@pSXO=!4VS1I7UU0!GV2(zEE#>rWM$ z6k>~8h=XMe?++Hj6e=XS8=M{F8!RMQ(O20+j>p$OLEbpw9)-k;#!5WNewabgFvu+6 zRn-1T7@SuvG$$;w$2r<=RBPl`gjkeaWFaannmLp(L@dgmkf?~1V4>(>c!yew+Gc+Q zeP!?-WND9p(j{7j1Fh1Xs%%+^Ab>B1M-?z`n4Dl?Zb36l9YF1qB9knf>Yh}da!-X#%}Q;L$@@K?vYBwC z@*V}OhCWYH*gL%Q6(z+xrQ z`8A6%sLKR!0aSe?wtF=IssE|{BzR`|$@+2MIo&qNIF&XawYom4xOPy=R?T0tR-%$B z>Ms)zK43Qg_Qz$xZz1e~{L*WQ$OcE2T#VfJ(}u+;TjSFLzZ|2ZqpGBPxl*;UqnSL0 zTPRX4G%b76Vj4UX8$qT-xFjTH7~&KHxs{URXKB*JkmG3MYB516CnnX%(Ynz_#Nm{} zv)H8lqyk(NZL^gbhC91@i~e#adx=YGOi9d7nE(qw^uJ%xj_}b_nNuf6wIze ze@rX_FO_!@#zuwUL`%%m%&Em(EiNM(t%WQp1%vZwS`_IM^o@+Go#FS+4(tw@pVl7R zF;@_$5vJj4pd3&Q(Y3KIk&KZoVURIhQ4N8hv175*ahO1pVI%Pvz^~JPW!9XRVlDs~ z17`wH@XmFER@f)xG;GQ#QCy0*Qkt9Rmb*S)Ek!Mz$*n!ZyNPWwB8XYR6e;5Y?Xc@3 zej=`E-71X1e(9^Yg8ulCtE>N&#SXM(4@nx!)=jWPm7*3#XF&HWKK^m7NZMXJBoJ9dqk}$u=$5ra zkN?WF_0Y^7>}9N5tBy#!Rx;Gc1u)2Y$jwB(;z4wHFz+Z;wLiksGK@5bwZ4)je8*M1 zDKEg5NoNxvU0ZaL;%@BPq8Y=9>7r?-*O^5zcUnxabmAG^s(>x9af>X^j3 zl-`;K=Ri_HhEUQ`N`*6pHx_3WlfPVhb=ZvBiq#&a!p@Z(Ho`QtG7RKonCRq&R}K>;n-O9F!fqqb$)jdc2e}(1oDBUlJ273xQlwX z@X4yhz41RiH{M;ET&+)SwZ40Eu2nq- z`Kk)laH4cY3@RI;e3~f)-4XhHdiDLuFnd*cS%!2PtNrD{;pyXxCw)Y>Nz#x=xIPV7 z1I(}X>jx4=+(FhN4x*|Fw$4li<4YE)d1xy?4Veh1{tR;tT&y82G3uyUTpye?ezOy} zDSA2CrA53z4nh9_35?wqI%Y~QJ3 znlF-UK3wDFX(YXko5aOAXhnj89ssr=c>vKeJh3-|si3}TC@D>D&THN`hTN_$h0`&@ z@PRbkXy%Is?bpuTXopM}Kd)R-`hyA*h26!TMI8Y4lf$1D16h$PgJ~OGl~f?J_PVLJ z_;WX#?#`h=qabX)@DIjs3G$m~sCvaNRWY^KH zg2ld;9~8G50fGgE`ccb53AZjns$|DgAZv|W z{htp_XVsc~t#&WqX@9G(K!mbu1uzU`&sbms9r#oAenISo)CTzF8pcYJK(1-w>^?E} zw9DI$=QPg$It?CjcqDn9_Q3Fl@hp5i@;IYjN;`3LCUw4urbjT8ted7d3;cLH8GM+& zgJDUtph3@6JRkBDH|4kLY+8AZh#U3T1K{$pRu`$X+2b~HgU)#C^Gp)w zCWGQi`;5UsVgPFs4%FO=f~S?Fm?tdP$#~Ly6NW*PL}Bh|1r!1tLtgf z7#vz%Ib?Y>0O>~G2au=562}6lGjwSNC>Z?wDGXzISTuD|9!x}KHC+%&Xk3w{=IEf0EIk3NsE4ShuLhK&Hjk0S+>L#P70 zmfaC>Hf1dJ>2Oc8qVqNlY{B)>I(W{BgC0B&>LnR3VP6)XX&yR;BQ&shSM?igy=|{) z6&kdIwFB0IdAnu1_^xL_evhQDs&@NYFY~9CDhr#BA_zRks}qP2xO_ZSWD8hFQhc&v zh+@sK^-1GLx%V3mSRnWc0e%$nnBQ>D2dc2^u*;@b2Wfxyqo9(~uSL|4oKmx2T|C}P z-fGTg)K%nH+zcaf&zZH)6Egy}-zm5xV6Pc?F03wL60#?o7o2sKIbi+}0=N_Gh0#-6 z^9Ij0v`oq|B%v#%$KdI%Z!CWl?s+`8&%8-zRPyJxnLfl$-GH;xzh^_AMB9Zv&zp>n75iVBBpqEp$0@62v;f^CG+8QHD2YL@FhR z8kLp5pk&Rb*<_>GaUr94T00{)+BZ%;`QW4m#RtLQ6e!#4hV15`?iusFiH+*OR7A~1 zi(eHC0rsl}vmtt+NRU^amSzQEHBd?4FNOEv5@(9W=b~bfeU8Xha?2~ZA4l9YUZNqz ztj5_1FZap!_0mzaWmdp*8)<$~Lr#fsby3pQjC7#f3l%XH;=1GjT~JUHYbWN&yOY&Hn^`~%p}T@@pZYq&}W{!1saHQ2r#+w}=n@CM-J z7SS--4FDUl;7;b&Q1QQr^;bt#D_pl?ug$Ubk@NBSOzfAjcZ1f`jJz^!PF>fx{#h-y zpm{$99vb@0)oy+&)~r~W^J{}7^^P_#_qxcWA+#mvZRZ#hCCagVe-APxhSrN&07pU7gJc{C?1f2+R>75q$yQCJHTHZAtmFhI2xWe!kpf%u_8adE<1)dc%;3 z?B}g=gEg2pV;EU3n$qDDnklJ;WcS@(2VkQOk9)eqf>Vm?VokVXvCV)FmAipgjptCj za8Tyw=dQd-H3_0#&x&qS97fOP^NeL;pd!=^9-@jzuq)LOJA9c1;Md-wgIutWnBnhx z1-aRJJ4bH!a9JHrtiRcodn=FhcLu+B<9YVE32RKUfjxe zsup~*`EeO*0@Ji!Rt2-wPAFAHlG1$rtX-v?L|cwV;TtdR^`lg{E` zGVZX>I3-k2d;(kos{G!s#F@KcWLZuUxmv6sq!OJLPR!TW!2YP2MhX7(Y57^^%C=#R`J(!3#T%-kv7cm*g16}{LJ=qU~8;gRLIg5dzkBoCf zy-10&oa%mLqd!L27H;RDv6E8=!%KG>o(yxUnskj8hTl4hiWWKtMWxf~bL!oI#{hqX z7N^GI0VYEC<)UbsD6CwvJazmMhD&3qBa)Xcb7LeQRAm)u16To0T85l(p6Js1RFm>6YyiId25SbWXKCNPV+l#w!mlCiSz;V$p8p}M3Ht^52Wee+`{_~BA7#i1_LO{i&kN#B8!qacT!QzUoY`xlSgv)NZldxnQ#ATiwFQ0nlPgx`J@0a;ldA*%uk zd@4Ltq(h+zq944|+~v$ULg9+#G&7QCOTGoCn@wDpTIwOu)7u#chz7s5iN#xQXsUaE z^px|f77TWI%N+Le&!>y^H>9*Kavw^)CG3r_#+%xnjp}QeJh7-(!4_iYV zcwv%%*TsO83*>m(wE5g;>jzn&`F90md9%vV@ zxY(*(ma<*8HFuTz%DEN!IBG-;Shizi_y33^Nfw*|eV;f(yO5y1wGxchrE#|HsJY8eh7J-JqcUzUTRsARJ=Ajd^?1l?X4ibnHcC3A0}+6g8nRj zNw-XtQ)bBNRK$&*3FoDhI6qrU$GGn1t7rn9IFk?7-0gl0rIo7LT5TtHqFV% z5}+vK{>{h^yC|@Tw@-p_8WCk1(i;m`Y3q(TAt^Y?0>45*ek3qb--Dl=7*121fe6MR z?9i%Q6LAC&B)mR&zO4aqW*hJzDf*Yahh$WMeB%8^z^r4CmcC`{mr5kUR4s}a>J5ZX z)YoXc>rXUL2J;3633^H_#_iq>!HA(Cy_bX1+`EldupMv^lzxLL67U?WzYiu5QiOVH zO^h=H;_6+S<4qEDy`%5RUE@((5q5LL@La{k0CidFUEPieFxD@0{TY zsq-@I8HQhTxw*0^ckY}*|aw?S;!*;#_Ia%TzI~**qVCQwekKaDhP6*o7Oq~9sX#T^WB^P zQtu5+=^%AlrfV8sP(FP>rAjmIvQUz8gD7pKPWwRmb9FmG0n7fjVb*-p0j+s zngHUQXFa550|yBSDJi=xgcJ!0Zd~9RF)xZ%nuzEp5wt$AaVuf!8q&HH4Q`>sp8y}{ z;Uw_5q@-EnaTnHez_E9Ce8tl*%L(q3bu^2?s@iSx%w@-M&A9@<9R; zwyDTlny?B7cl#b1gdqdrz8{sGpp??O2TCOHsN%vjpb)HNRO7-5DryQ!&z+{|uenFx z)tjPlXY6~#c)K;;Q{B4qgo@_#A}j_Z!ms$t|#iAC8gD zCXLzM!imku>R=euxCaW0%FDmz4CV|d@$O9M$nsG~ckWzECEw~+C!JeyuB$PoA$=E<)msxb*!D5zQ+|?vuQPhZl(^21s%~Ei-o_Ry*_${-|j4K8b9*z zW|&GfgSi78ji0aAvoa?SRfbIjDIqL#=Sf7 z*XF7=kbyRpMX(EchwlA8MimydxrC#38zw)e2FehiGMB_p$v&Qu`r*i7$Ooj^bn-BN{}w1~g-AG(*qB5+cS|3&E#07C!>n zV`LI5=KT2+pH^5?EI}{oiS>XB-WC6G=d=3FbnP4Tg%WVU1@q2z?>C2diND@gG52RP zhbFe3}8Qaos`j{O?bYRuI-XvLZ{M^8Ooz8*lsy;m{!zM0j!C+XvFbaGHdCwr%`gB+GV%IDL&s# zmtDC$r2b@T9E%0r|CXssnb)04;|XKI1aKW@E68z6%pyaEk~a<>y>FFw--Y8t&!-b*(&9;0w`=!9Qyj-DHXUWuqr_oypH=paH}7yp`arb$iDJL`p5P6kSWg*=1= z5T8w)$5+5kaw*Jsu>mX-Uo*K4ejD{2Iw00qeYayJfsTClz`;ytS`rZ;$WM&d)OeTP z`lj$&>!&0)GX^`pR1cgw&_$6v9#u^{My53HUx5JY@f5JOVLtI36mWHBa5mj^KiZJXISllLy~VQ*z{UhoPl^82^&uoyID++)wNWa z8pFtWG3XwQv(}FCCErRMsjD8cP4gjwt*R2R^py?081Dat%H5=_UhsdAOCxuqfPFe`zHd&8%@Gk4M)(1l`gEZ~*#PG1@B?GI-tc{P==;O* z2+M-T)1{7+owGuJCdEtjtFHHi+6a?E?00bXp4)svpGGA3;N}k**~-sG(!>xoDJ0E! zx3$W5wjfKBPY+mXj;Et>>AqxEN)Xk;Q^ry2TH#`zvpx})lTy?k|3eiq*w zP1djNQS#@_kR#-Wux`FGpi{mX`Q)`cm1j*U6`Au?sSelID*wPAga<)Wo=j`vh%{2| z1Gvy8U3+eG#P*zbOEg1lfxS^*Bh8f<|Mk1H2?r-S6Jn%nmCOcPg z`zn$RBNt2->lCfGdK1}H`7w(Q0SDNsv(zqj$N8n;L8*Ns0D`o zUnbH*E~2RUlYr?Bjf(-Gq1|r1V&?vUBuLRHt%@|x)WXl^H2@1R58JQ(w+A-zc}A5Y z!ZX|u#1PjG3+@PZQu1fb1RQSty}FPuE-l*ijira~yATo4hFL2^)4yUllocpJF)|dP*&AmuWvX0s7y`OZntO?Fm@Uj-l z6^?T-D_W6qg<2L*e6T|iboKP3=X3(CVrdzZdx#35lX9yagLhwyuezNycC`{ zIYNytm8NfFprW!@6<-<2%wf6Q2%?D(4`?H%jrB+i3} z^BkodY17@`HI*yY0W(N;IH*SyJH)5;#5|6RcNK#^^RbnEYPXmJg9T&STy9jo!H!s` z%vufwypjSy$!EyNs@I{FJbrz#SI=Lyl$}>=*BGmIS<9#LHvP07`2OOjuY|8c4+|Ly z?Jj?b^vH?Ui6qjB4U5lR$nV|z^@Ia1Qo4(+ji8%i;z~W4@y(q=kS<2fQ?MyfxlJ6Cql*RZY9JcGE5<{zEd!@4atJ*3yLse8K(M`^1&oH1XGm5#80% z-H`(2?-0;|k$cfvV75+G`2Aepi4*79f$}b<-a1CK2h88~Un5ILwtOvwnhq!v zvwP5k$pTEjBP6p_5f}Y|^D)%?+~3KKgGEs|eUc<}@c>hZKcXAZ;4#+Y^%k;@+Yx&; zUFU6;z_mq~giW~c%v)h=ruEwGqS=@aMkUaIQ|6fFg4mUez86Ovbrgr9&${ap8%ZSo zWFCb??%T_XWX{uV2P;Z}Ko#t`O1HYX*h#5&YG)l-6VHe@yegu-?HM;=T%nv!D9V=_ z^lcPQn&G-j!jJz7N(~ulRlwH)=GaIm-Xdrp$D^wA<^TjuVSBON@Vw2}T|jajg7 z^CAg8O&vcITZHyVLc7#CyJSkI7@<<2)z>R!ngy$Rr5NCDIP_@Cx~Zi+R185@R+8vK z4@_H63K7osCxqjCnVOHlsnhN`51z#S#nHx38H-K8CnbgC<=k-s?+hxO4$EBMf2mm^ zwK_=qc34-rX^$kTi~bg%(ZY&t+5qrk!&bw}WxJ=6$L$IFz}({X_tDZ(ysLiJ|sLD{A@=8!;gj5ggcbGRhAv;&N(_}UrGl^CnG*j5ZOUm zx2^u^PV)fHU~y@v=A<`>KUwrEzk#cfnb(uzPBO_5g3tHenpL)AZ|mt3GvwCs zm*(P%<%j)j^y`Ze<9Sx% z(bL+$D)!X~HV8MhiH0YR0bHIpW*2yO3o;Pu11+WO>w)L+w(Z?6OQYvgzfKapbTEF= zhKI)*mIEzIFxML6Jrx>wdpXPuJ-)cv9e?PUGHx}Eo|~rRRF->U&5hPW2gDcH^Sh3url?^P zX)b(06SwuQc34Q+{I$Iz85ja!L8_nld0$9FgG9GTLJqZa?V9VPvNwn&VI*T)MS#Kb z=#|0~q~s=}k%^z$HQH&n*hvZwY_FXOlgb5W7wnCgNOFzU|H6@E#-jD zdffi;+o*4Uq7w5rlY$fKHlo3PCPMM|IyZ+I^v=maArITGks@ATd4Ke@20)!_I%eb4 z|6pjFTImecx6*v43*A6Ywqw(q&kJLHK1h7Er@=GP2CFivsymC@RFG)DH2VHyEy}lb z*O|l}WY=OzE^|?y&y~I1nBGYLMB*{>xvsMr#cOAv_treuT?fuK2ql02_H3H*&bV6x zyIP|1Dy&M*ES>HOf+y@wf5@EWUCKzGLTr|b1+3Ca^$6p~uJQz1j;$BqY)&yJvpjVNBHPK@ zq!$#vP~OCOmxBPMUn~aRMy{4~yxc+rTVQj;{wqyP_Rz0B{jlBNOX?brFtWZhdd2$G z$exxizYQ(%d{BlH&*qEK@Ttq70nAREE3&YYYbYV4X(|G_E zg|ihYS4_2n5eYC|RC_NLJom6(5CPv?Ha=DY23CgJnU*xMFDzKv+Xw@xdA+Yn?ZCvk z_*W@*jKK73ylS1h)#yc7UCQ&!s7Y_JWMvMza;*Y~IPE+#M$32xbjKkUjimVad{dX! zF^Cm;kTNwbRl$bwkf&73e4E_Oe-i1>>WjpG5sXoeZUg!_TKjqZ>(;DmC*NW(es9<` z8mbvo$vCdl#)h7d9fW31@f+ET#TpvD=}m6s!WPo21s2t^lgsu_V`gS(@kx4Q*u2N` z_D`oDW5Raw%*i_`GY&gOH+3=(>8v_+H8aMul4YAQ^rh2stl$(X3A_6iU?f^Q8x0Q$ ziBOKRt!@DDwHa)rB481Bf@4|a5*PvzYtbkTq9OKd7mQ7f&FHLT>yXke2A_VK-B#mh zXXoVlvorsIRa}soa4sxLVAP~c+Bv{DcmQgA$LY-eA?AEef-;G)X5RU;=L^)%Xcm1lY>E-AF6 z?T5B0qk@iDyUJ)|TE)F_Ax-;eczx!;?K5;tSNJ2lRhlic8XXh&dwH?N;GEwwmWf^c zN}Zm53Ht??DfoeI`_;7FrK<)COBQa8AxTON4F*c31JJ99u>Mr@P{H?rZ5mPUvZ_X( zGM?@MQ#B=s-hj#GHu)$c1HF)%dN}omz|2?>JwHERds&#Za^p`g-hm|`ws9ljR$+Z7 zXDYguSb)^4PU8Z#svL*`CbPdM6OT<=kg$=>V*aiK=Yf@jMW6geaSj_LmEEwhphEb& zAtecq+Z1Ri$sQBm90$HYOrwH(JjkJSU}m<2ZiZ-mLOK+tk~;3|Wt(hah2pzC^g?H| zq-^!Ax`8h2mQ-h~jl`>-Ur$nrO?&6oGgc!QsFVH6H^9cFw`as|AnTo5-EFhn)f%l* zzE^IL!Ueu!Q2NP~10+``;&ou-YS#U%_*t;YfNSgr=DdD8d0|#eiL;!c>-)phP^Fbu zW~M+@Yt$TNPW8)zO5{eX$f8vH>D>|{Vz*=&XcmMV$~!8=)3V6XT{MAk^EtYxjLJwD z^gV%dgr+ehH%!J4PY(lHwZ+l^4*0ubK!tOL;xv@pb&vJ@v52eNcOcp(4zZj-*8?71 zN)WaHCNEmrC`x_+cyW=QpkPk-2Q$B86WNi@t5U4vTAI2<)EFz0O;qZd+=SRCEO|Sq zW1~D{zM$~WpGUYbC{H`rK&KunasuLE-$UB<5+iG1CHBq*{zrIHtuMPN&1d=B26&20kP78Ew--L)d za)Bw#c3r+$Hc#QekD-8oM|VCJ_Ok01+v|Ft2HM9-)Q#>iWpuo6#r=GT6OX|E>_Zga+>~#;o_JbZip0Qy|Y*Q`48aa;6A45i;N)@u5C68@@)_| zZk{xpU$bt$*y!O$wNn`vK9H_`CFh#KzG}LEX7$c=bQR6^FouVxEFXfftau*~Hn$I* z2k{Bi`=npHe8bm9O>+n*`jwB__#jT5ymuVp{2^=F?bkfAB0#^+KZfY`u9Y~g+UaB%<}1Gupah9+d~oXlE}L`( zA_i$igo*S1-5VSzNawN-j`f9+qwVMo7|ez6juv%k7Yhqs6#98rhc$C(Yt5&3?~GoS ziIJe_skQ+d2y*-EsiTQVlYH&ZaLF|MT^G+7nXc_?F{$pNYW3l^Etcs-_b6nOb~Ut~ zF_t@t5^mGBIeFoq!@MK&p1D3EM(;_uCn4K;(8{^Of&M%8a+9ww{Nvylg-wDuOw*W3 z`co*Rqvvh6#@lP^kX}!}_+*#(9F@?xQ%9fk-D_(xKFy*7`^T>wgTU6c7LrW1keH!I z1lRLbi;8$a!N$2*3HPE!qf!(z{eWM@{wbIlJJPgmffqhkLsT;D-P!4r^i=!2vH)RG zytykUM}67rLa#!3fBRl(n_~^eu~QKhJ`p|6V!+P8L~}p0skzvnY&~E5oR62i+56Hl zf)dw|*e`hlZ;t^lvwBWO_5{jpW%U_x4UE*%L}6HpV1_C_1^fDoh)kKF&rTl0lBL79 zuS(RM2R(rg{b;uygTOdJ_z}^KZR6dt1bj_(rr!1D<zvnS<81u*;GIr zLRsplZk88E(H0ATX-?_vRtkX|eCVb<)Ky|L@B=F?x`->4*G@ zsu}ZCjJ=tAu~=IxCX^vKp2m3Ptm0j9IUov!tHOJb&saNG+lgxvrcz0UsLWPJowt|x z^VWCyxaAVZ%l$aSn?5v$uBgtZ6w-E8-l|*kQE3Em?)Qslg%HAm-)*i7-V4%V&-lUH zYs}FsO=r%J=ix(}HujqGi?D9pcDaW`(#lNNn6S+O=){N`mshoMF@t9@+Y}Kdp+5QMrFCU-LEphTBr1ZHKG0k<#kf05c#y;nGb-^a#-?&ZX0FNr^b6 zb8>mkny$)S$wH(NCsT=Ygrq}^UBL8;qG4CK^3}~I3xsJ^;@Sv7(Si6nfWrCkD5nxu zc{R7KARvIxB(oq9Zet<(v;@~YpYUugQ=CK&n%o-Gt7dr79!yKS149)n1g~Ud<2c_u zG!_z~A?Bs=$58>Jg25teJtudPRRcTI!s$(C)#jU`ht@PqmwbQ(;oZ5+)3EA4rMQL? zHeG36jrmpUm}uWGpA^H=Bu27|rj8*aO06+JdTp9p z5$soTN9LD-n#-(7|7dGqpv&Hp%tK5Ta1&@VyG;=uYSRW_CfM(aPoVw&d~HMG7#oU% zLsj$eODa!33XzS2Aa=ihAy|a=6cc~w(B$lBA#cm)c;Le!>O`S(|6rl($MZ_~XoRUu zD(z0lIX3jbwZGiKjS~_Hxke(g86&GMOM^wPt7eT(3)5OrN5xo!oLUP~wq;Jvcwc9)E@mg? z8Z0WrpqDjQyA^V{`i8|v zKga~4hcE5QOSzbsh_zGLP=9dRfh#IoB_7;S4NGhJ2s=Zj0b)JQFjZN zva30MBJHY0AJf}k0NXG4rvj(snfh2I>ekcZ z)y~kOqWy_3fZ_O^k{wGvIBvZJ6hA^S$mxir*E0C)EQkUoY%1}QLT{j(0KgW*zzZR5 z2+7fvEOed{ysj@w@=*D;+~f6QuQn+fF7(xn-(2ppN4k5*gwJ873YQxJDy^M8&W~UE zIf1Eu-{D>%!mqdkoIpI{XB@a#oO8bvSVU%u5#UXeQ^uY#3yK$f zqz2GY451}B{4EhgbC`qQZ-}7r-DBvvUXrGy* zm-ubUHm!*1%+TMi*YGattkaaha6l+Dq!2Q8iE(6N?&$RGY~$woMLX2f@b-0nzshyYE(#!-mTj-tE-M4~YSuL;QDo)O1i-Ez<@ zmi~Y?LN$I#s{7OokEmb3G_A(5we?YCdNDm#Q$gr7O>i zM(tAupd?@@M~qi%q+I8Y2f+2D(lq2B`YxWkK1hIiVwTp9nxroObV%Ac$0?1POB+b0 zdHh(Tr##DC2{9FM$vn8>`VXCybuR1OVT2>go8lV1$CK@*+w(sy!HWRJ1WJXvcxml%)>y zSk!keH%H=(LKkK0yP$MTgPN{Vl~_#~rseqI{b!91GUx*)W) zYVq)$5_B`$*`>{;_VzR#nBLyD@j)`>jehEbSfIR0%6gIR>LLz20ZM zQb-$3THmv)n4Dq5_a#;V4qf|dW;Avw4_i<^7*{ij#7SW9mNs5UTfOU2>0bS9mZ1fc zpv2z}Z2)NZROjufow}N`h5bpPax1B5Dp{C&jey}~G`)IeurvksSO<|%oZ3r3KwjwC zgrjbkn`zktV;wq3@KB6JZ>lm}_J05mK=8k{X4c*!U(elfVy$)Dao68tbeo*6!x|vk z*O9No8$Q>gS$1;U87a>MX)E9FsBSLrx=8^FrGKhM+~@)On;rrK-;wU){x zmb78l+A-}=ne89UeM45OvU?o9d%1nSQd^`(oG=72(Bp}k@*k$q4)Oz5&KH)H7-%;g z?rx^BmaSK!{>aq^7G{2%;uOxz!p8FUaI=> z*#xRFd>3@*@u*bDS7gl9RERJJm7UT2eOK!?3H3`k{$a!B&7?sSxwhGqh5Kr>mI|$S zSS|rSB`KoVi)1h%lb=r0vuB}8hT!!l1u#o4o9aC?lA0MkLnR`n5;4?Dl#+X6Us+@$ zRlcx->pf}E$#zS6HxbpCTb4YfQj)1XZT7Z({SlS|lkX>w@vvS{)Mk?_aVWY)NcHCB zl^Ze>*gH9>U=9xzYpY)mlQe|}yY>8xpe}X1WAI3^h%$=SDz^eYS}p?It00V=nq^EG zs^I7@G8IjPlqowDmH9JX z{AHQTji1L6lD|i^^V9Qo6>JoVy8Q#3wU(lsGvxs{d=skHS+P?#J=h+XAv%+ zi_sK2jY&t9@0ho4ULf$PV>CtQ#8=B!IioE8ftafTmW$A!UU5aNmi-O!KjKk>g(n;O z5V2P{RpH*3VEVAuY2zg>GTKTouE0~rjFO^q^za^Gr9rjZvl8k&Q&~S%usYD6wZkro zbh=S={|bnAt;zH$$B(MMA96$FcKV7axz1fWg3??uG5?H5M2wds6;+4MiMD*)A8w47 zBS=b-0c!zlZl3MgXuH3{_*#Da?Z^L7fdFWf@oQGI@1IiMpN#gnT0iZ7vi~HE*xw8o z(tZYN0AKgpxrq*| z7%j=nBy>vMI0ZzXP8-zJ6N&SygOg4)x6uD9w@Vz@IT!wpSWI-|fAJ8-h`WfW{S06{ z@DcyYD!Yg5!}@)dQJHIUcfZ*e|1WwauFqGLkfkwcVVPo=9|r;AU%ulPFhh3VCRQLP z;CjpR%qI^-JdY3bdb@k0MyK)@E}C~rR8)`dC*?zHx9Oc4ONQBkNBlne^lUKQ_v;%$Djxx zt1m?mJCUf6iJ_L{_)v4hSE+6zN>!dK{!>k(RTFZI56SgV+-SA#FbnBW zf?jvi*UIAOspGX&Occ&#$%dGdRsKx?$u-S$7S`d_FH*GN_A>ypJ6t-xHN%0rU2kHx zfiE8IpJrVETC#nWPHz~At6C?kQ&-280o`9Zw;k0DBx zta9e!LK7wTGBA)A5<72t_0?5|NX^RXa=BU`jU~8foNR1yw6m*gY-wa~B=uo?jw`I4 z26LawM^R?lmqQpuulE+Xl5{j|VV*ni3+`mL2y>TEeVhR5$lTUsOh77Ulth}vseEM>}nsWw}(9}*_# zL!2uNB0IU9Ptu{~rY^%N$HUvf|M|oaG@R5R#hQacNneMLtPwjFUlWv=IoRcNN=?tS z(W4n`~2-_Q^KSvbsyJ~r7h%ItP_JbqORpm8mhutFcsP#X{Ll%qAO8ms5b1V znMXmD?kkKMpjXj8T0(F1$yvTep=EDn33@eKK$A%_G$hPw=RA8P(mTc3cq@;tm2Lm3 z8Y)t+aS!gPp#vJ|{|>krjM>QMc2!kgOcitYfBd8iB_@`wg5+s^IccoAJ>X7w%9ZwB zbX>@xqoIwZy#YLsW!rU;T8re?1469A!#J2pTSe)Jitjq#WMFN&4G^qbhGW9L%>>MM zI2q#*0Z=G{2-UaEwQux96SG7^wR&Qm*g$1tdS3h*N_E%rZbR{OMxR+ZJHdfCNo}Om z=A(=Cjy&vFYfbv6G5?2*cM211S++*IY`e>@F55P`Y}>YN+qP}nwr$(Gs}KIOdf&(S zGQZ4>h>3$K-I~t$`9C%@6j}fT;o2t%1~(74K(TR4c^eO zd?(7RHr@{6hv`)>k)w+iVTd$X?IG4iGKayHC_sYN4qLO5&#;^F-CS?bwJv(?ZnKzP zz<*&ULe4XzP$#Z7*?ldOhyEUa6Q~hRg)tsU?=Z{I*GzS))d;RC#OQ~v) zWApa7=w#tJc15i^J=4Be)JeF?2bhNBOyYrrQ~;q-9HoS0I{uhEa(xPNaz`P270g;f z=RS??eW;B5sG&;9MLUs$wvs<1V^Id;a$9 zH}Gd%DN!RLaU0QA|-2bZZvSS)?dr-e<+T0OZZRvnSAh1e=s zm}l*1aH9_*Sy@?$WNI$24_0^8=W>Z}TVJjmLUr!G=XzjWR znpImi2?>yJxvBs}#F@dw;d+PbT@eD@6LKr^rxCloE{iW4Tn>)p-Eg?qSo>u;@j%$i zj?a)neU9rU%gZuG+EJ;N!Y}j_H*&Ex6n?;Es?+VI-l@uAWp|_a8SJ!^i!g!Z;m6z4 z)nSoEk)4^X{@9lG7q@0dT2dBMFr#L3Jp+UDrSuqoy66<6oEy@NmiCfh=VJf>&(X^c zNCK11QJ^Q67UvtQ^P?Ym%Ak^QI7Z3oZq84&<}+Q8n%lSkcS*X`LsYyKEq{ApZJp~1 zfIEMVWqo#Hb7t~R_A>tvx@e`;+hg_4@z0EW{N^^jmK<1~8_WZXj)w2&DQi4syHKSi z?Pg~g$}Q^rYNoy%<(wcE`J#&mmwl-|xV$yo`Mf$99l_1o*J~R4gT3lnx5aipF;trv zK3ZwsW91r1DxO4DzSYvD`-fuPrJA2e2cd#dt6CrCNp& zh1#oRoF*J@EUrvNEAWYv+eQ1U^Q}27>c;5UoRn!q6Gwp35iqd0CAiDhtVRapCg+*b zjF;9G1`;xi6=vY(UrHMcn>pw1z22Zt8LUm(;HMn#183424Fl}vfZG4Mihtxz88J5$ zsowi(8CKu*i)YjJvoj(h;_cyd|N0t^{pFOI=r+eky@IV)zeZwcSNi?3 z0Fs%X z=+l;di?pUv3R5`C=rAkX0VR>=^Ixt_-$clXsrX(>y^H0CXa&)XmdGT9@We1E0tD< z%S;a6qg>AnA2v7&3NfylM^sE5X~YDh1JU^Mr8qTW=$)QGu1C{Ul%}pkcP^3Xg>)`P zA%U!^mYrQA<}omKkTj`mc=WK5Yy#Qa%#!^;XTE)-ZTmyD^GE(<*W@DoZlaYsfT*6b1s35`?M?YFj z$&Tdko)Ds#sg{~Y&{N$S+a-eC>h^8ysi|hFHB5 z;pdlfy*pI*6)6l@@^s@Ob)BuP&p$XN1kd9$lK{coQgC+;;>nZ z_wa^%{Yzv?EO-i|_kqYW8T+-7%|)lou@CdWRA8X$vM!g%MX#IbN+Pd6s5mRF?FFf5 z!;}96&zU5c=HHbjVO|bY(;nl!cFwM{nW^H>C482mipYLlL?9#IGrc~lj$BcHH($jSJ9eoD1Z_2 zTrKJ;CCxa~m1EtT89Z)&)^I=e_CM95L!w!RI_j&6o5lJ&jyKxD)U~q(;zGnjd$6YR z;zI-l@dBWQWI0(&(8!4fHaeP4D2T}e)yH%En|@T?1;@=qd+kF6zLl5%EVI*r)$8Is z(Us!J7u!+voSYG;W6*JvkDG%O*WsToxf*als+m-22I1eGXJ52LG@e_m>QfA23Wn))a+WB}^y5SozECo?rd!ajb6kL^BSQ+_*IEoU00F;=W%{cM zLY$`^;v)3#F0&R5Aeo~M~ixxpk%03kYD0AtajqtWU12BZB6|J5qT^}V^VN&RhPYWfQ`d^ds~ zHkc3|{KbPCYw<_5MbP-+*rAf&Gl^1;2zd8k?c>V07V^8))11rD5Py4=~iy0VGth5!rT zFVsO0^v3x9+CPQ29%|dC{5MTkLh|{9OM4Z-37|RA8R3UKjK)x-Cigql|@{TPxoaABZ79nb|*fhsCnfmiwm;QA(QEE1i7kbBoE zXruqCGpHf@sL&8ap8u0}iiwHYq-JG#-5*IRebr&&uP`f0GI`Sa|Nk5U&tA0<%Bmlt zHy9RsPJWfrXDXC*GzA&i3?n%O1&7y1i!f6C;Y$rP z4DQ6=B@zhWE${D7K7Y_&rJcP!JploMr_s@$p%YU#fx>=+%~4jHo)2vYl0KpKf4fv6 zghG7lO@M(-GRzMF#YRyZ0l}J=B@1LETg|{DRNy%5XMcyK ze01J>YZfxR5!2!q5emdpZ)2F}UcD?l|1yUS`l>CWXl=25YS(?{;|zzgpOZtpD&m|f z&RWC3{As>pKqQl*4vefx3JTiU(Q(9_qS$Iu4jQ9-|os&^W9-yNPUxb@*WtrKcXRsp3_|M zJDFu+Vd(xki4I?2ys>dmw?a8n=6G=l2_XW65?xVvl%!DuybvY^>lE;yA2$g!MhJGd zCymf&wgYzoS`5W-vO<1_eY?Td1I5M`-+9YdhJ-XcMa1Q~Ncc;DM@Jm1`2p?fXc3&E z!qn+o6t_Emgtf#!Nf}f9GThSJm||jL;(zH8gss0_ ziEIrLMOe4tVL&<5qtGr~=otenCd1~fe2w(gt+F_FSLNwEtQ zO`mP=9tg*Q>3~dSZrV#AbpHKNK^tK=Y;SWK4(^FDhzBV>X$Pl$x8Rd5>8TVCxqA*X6S$JNX z+1c4$Z*{6Snhjcol~l=R!;Ws~_lO8AQL4}*4V(;iS0KXCX_nM$t4c!RLoo-#m`XZj zcSwZbj89@?=hO-+opV`_OBw!ts#SdDCHA~pJ+B!)&Q;zwEarhwE3%AbrY4_IZZ_Cz zZ?-y}D?5Cs0jQ_cj8tIy*L1=kP+^Am>4djozA4QwEhenkKa?cL#6+Y3s69A>u)G7d z#7QJU;|Yn)}0Y9FVpHH=WNHfZD%+0>j%=S5uK{b+`h9@$>KA>b4eI$Cp?c z>N~P*;c%h3nhSnu&^Zqx=&e$jpo+cRZZcCJ z6H%?f*L{@tPjuP_%y^y<1yuM<&Q+_aUh-2tnw>ElxwQ|((0O5ZF`R+bz3<)m)A3h_ ziY$9?9o+@Jrq?S`Wfz{Au3C;S`uC4Ebe{}KQR&1LjdMucZ!rqq?AY^F;h8K)R?T+TUAcpUT*g*Dkyb&Tr;#^J7jnjRQecD zejfz zCia(_apwNA3Nj%(TF&=87~Cfmj&R}f5Tf}%spof6&*^+|w^nh>uckX(J!^wecNJkd zgMsypme|zV#290v-?)o1DOiTd9n;&}JUl$#Y$pnnz8K7Jf|JBlmuT80R~k--mZokRizb^ zeO1%@A`)+p52~10@Q#KC(hYCO=o$?)!rKG}4QzzmK!+j>6G;>3Mk9G`3ev)Cjr0wb zd`aiJCniIB{%s>_;GGN|kYIhYDV8IQ5mv#e!xYT>fFKQD1UhD-A%4K)`#a=^{(}{y zKy49(4-MX2gukSJEMY!=5(%II);+Nl2{t0BbjrVW?0~WKCi0*8Q_zv9g?QLfBY{~i z970&akfi=2l_2OjgeMO6`!+3MuZ#eqDf#UyKa$o#N zp~6|F)v^7`#B8P)7Yy>q4XpGxUw4X(U|c#&j78=gqb6*c znhba}`-;PqWm|^B6*FUUPzWA^$vBp9!U`7o*8=71Q|Ngfp1dQ|67GR2tmds4i4CF1^xo(B+QGB{^hUP zXQPj$@zd;=cICzV(ZkN%RC&My+!s@cy?qhYbY885yaapF2j0i>ES|k(Z*pKRY%Dp>B@NsrOcJJJ|& zbhNZl1^|?{73WvLm5SF#IY55*+hg`NUs`mRmwYkTg4U}iKBLiEHUb?`VaD4lS6jin za(Xm9$RBN1kGB{vR+rap$Dl=8vx}#TXZP+`GWVX!|M=Azf{Y!s&bU87fENs_2Tt;I z;bAqv1t_R8%uc`#c{C=T-=L7|%yf6Oh@v&gGm(|~a}P*l@;9a@*TmV5-_+56$xME6-3vsUBQhS{UgmW`Bx@$~?26LzKUN4A< zo`mRYs3q!rVQ{u zoyUkDpBVg{>7y8zPdQR=?9Er6y?9li3#yCkL?>fNtKJI|kZev=2ZW#rlIjp#oyc;GnRt`{{V+EqRsl1|UoZj~QPAp&6A zaihJP#NcbzS*%(}8_zQ{7vY0ATxDHefESf*B9dV!4Pb0ULsA8Z^X)mZfP?Z*oQHw;A^?w-F_0=L+w(LOTD$h z#*#(P*<|JJYsw<_M;DEceqv!6>dVs-{0>ygwYYSq^~P(X_VmeWQR(x;V=23v@}m5G zVsz({$E|yruEihVk@Ts4f9`HQvbG=iFKjPK{J}|vAr&m+0}T2q@rz8Hx)`sYlL9t? z_M=z|2EO-6)6a;%*&k_`YCAD5{+ld#3mc$RtX=CyO+#UAB|p7dSptgN_p(cP$w?+9 zF6E{mgFu+1$>x@p?bX&x5?f=)%*>>RC|5$6eWv|j-SWL@%Ic9C+h9pjVXCse+2DFo z<8vLiKIiC*5WbX?!p-Ml;RPB&F$)1sorW8CX1t!@6DL7Ddm({z?NV~x2^VlueC)-N z-PwHqq9+*vj7IJ1dZp&l?P0tAo!Wow|e)tiinZ5BydvE&0x|7n_3{!gfbD6&#^8UX-i3z}knI7N9 z9t#Vek1Wa;8YiWqz`qV2I!X2h+0e1QjLcL~?2=9Eo@U;9y($fe|^Gc!U9s|DY**gc#Y7nXFrY3ihr>1A&}6&om7daKi*KL++Vx@eo0yU zMJmuna>m#bT$+&4$BR`uuK&@LpC$TuH#_Ii9&nqdqUfq<`{(ey*EV$~kEvMC6|qD4 zm${Wi`pxLjsrNLrD(#0(d#d(t?$3T^D%?}%lr3t&`KJP4XTk~LoG?<5RMSudT@K|d z?rJDqXX$n$xCDxfGVw{002CNBb0Ys(%SFBC%V_UhpF20N(%3*I(c=T9N3d%!jNdc>&V*zf!MCTMZZnpQC=8 zA;A}^vs+5*jifBK8M-L)03r+BreKSf9U0>HPZ*oLyjfGjWPj-a!wZG(!gU>4SH8Kv zqc-M!VGU&$sDdLRldd1WdYE*wj$6;(?I`@i31&!a&K632%c;6jH}k~w^~L!F>HXzR z>q!0~C>0Tv0RszuDJj0p#4O2?xXczRva+-FABH5fjmRlxaAOC2=1Mfcv1*FIZ*^Y& zq1RRrDXwyc-IFgc_kd-;bV~Lhc)gYF`NjdVO3f%Gi`3NLz{| zXAWBLxiQXUt8=#N+ZCKhKTf(X-<7Y79{b`3vvL+Uk2&US#XqTatl~RV$XA=ha4)@7|G9frq>Zu)j|aql`~N4_4P-J61(ePe78uU z(4^3JMypU4zP|RG?U(!{v;qcPU!~RC=v@l3mqIS`YO4oJ!JIAE8zk!!Ce)yz(3z}M z%*)AXR+^@tMn~HkoYw;}!OD?o(bqd4?3=43f#VRxnoqOMJw*pppY^JRwL0vs%q%qC zURzjcXsTIXSo^U+VW56~>qajrRU1+TO=RbK-4DMgW@DmTo(%I=tCF9O6yYXM zsg}RR^L=!0*5BRJc{P6U&HV=XQ{w5c17?MU#exBNt{6qJgD8v{LALvq8}QJi(+X|H zUvBrJO3O(?lc{?hPmKs zv1nn2{)$g&yE_vk+*>MvpZ%1PJM8^J&O4<%nQ#&g%u_G%>Krxk3^_CIo2s-Zo;X;+ z@|>EVTK)|;y9?FG4Pi*vKhcOfYpyAKaY24!Nas1>$v6PmBvNhv*(@|o!?;vNZ{MHL z4L#Y`&}BMZR?FCE-!JEdaaQ(E*gs2ES~19E|7u$^cYg>pEC060&M@mNd(HX8{|6){ zB%a~;8;8Ea`}&li7d_I>%~g}}ONCP~_Eot-7bie1Xx0wz3tN-3;Pl`XBrDYB&FcFk z{tys4Kno(5*9lZ3CqP#G%HQHq1*6zhfsvFER8%2>G3cpCtmXK&h2)4EKA8Jo@;UA!$*zs__>6wM^I9zSUJB{eyQ;Knp)@n6 zjD#i4S|HGxB(EPYGVP?m<8^)8)j|LQ0+t{Z>(O0p_0C%J>?pJiuLL=g+1FC0PQ1&E za`i-JpQ4|T=xJsYJ84|sxYU~*Eh|;jAkhA%mB`x1%Xs%@vb|=;XpCiR*uw1-q>_!C zaOns6+5iISjS|Yi6*wi*0P~3enB|+{s3`PRP9V@+dnB(B;LDwo_uu!UvuOcRO3(GB z_oEA@!x|ad7&ni-3u%XL5@nR<^hAr`Jom#nX{$A2o$crHJv$p$Vmw)8Po!ei<0>Kl za0m)PUVP;~dpd&}6csTd$QC3ifaWn-8+WV^c{1av5E+j5urQrQ_m?POEla>A?4Z-K zoejS*H&;r+3(IT1@TI`a@ZYX6smaM07*9YSkX4CGSz;wl+9gWF2B+ESjuK^6N1NLBEGnsse5X>TlI1fL|yO5Ho?zE9(U-0hv9*#`e`?J5@ zcE)Zh&OXgsLF+Rc^VWWs=Kvwh&LZfB1Dc)YQ+pXDmjr{YN2rxD=ezxbfcK;J$9+#0 z-@3Dm-fsLf7g%uEYHL~po^<j89N%%~$JYxY0S*%a&UmR-16=ZH)9w=m}ye(e>UlZI`;SwxJKj zY;<;+SHt?3Mcz#FCEbRT@JtNTA9OQxgOre+aHUBNc8|Xz*Bcpo_5OG!6(A%KP$9r@ z%=oS?+Yo4gG!IJ@cnYZ@_{)F{MT;-N%c2_F!;vGQ&e2k9nrO*3bOa{NhW#C1soiqe zs=)h8D?8iD8v6^3=F4@fb>n++aVadp0`d-q%>)a@FQW`p_Z1Ayln zG&Y0nZdlBXimH}T$+LW4+S=3t3tW4YZtVve_6VgSxgi`g*y$;&<$Wt>s+!|GwCY$?H-tF31 z8Zeaxqx;*#YCYQ2(w6g9#d}};EL_5FyOA{3+3{-H7i05NI=0=Ny0BhZ5RW&F^rhS< zm9lf^*;^_Ps3OS;)`+&7r4GYa-Uygb4YMs6>TL3#0=J7Ngw0Md>k)!2=uHA^A)PV= zWXczu6`1@Sh9o~i1)nbl(G4`PizH?`j{r-bJvy!M^rS&kW}B(H#I#$Urz#cPx5u{) zwf!JE4?~Oc$k=^9FLqmq9{V0qb$)n-FvAxf8^hm3W-;OU+Hm{P)=| zM&{wo+pYl5q#63-w@Ieb`u6m|;?LfSZ_?lxvth8r(J~ZTfi)*A+MN9Or4x%K-5G;R z#ozzHT)91f`^lqPm9D&|j6PHLXFP=Yem6CPM_@M6#n+)L?7Pgm>7&a(m=M!*F5oka z4~hlLNt_BVAdm%+4HYeZWCH=lNSED1n85Uh8~6Wt*6@)e$1&Zs^ZkUmU@T1jdNZ`m z;Z#oH_d+D}(lqs5 z>r7%Jsj-gRE!syAo-+ut0Z)|!uaG5Eb{S_U(%l=0tI)e{Wa-kvF*fdz zdG%C-$NwbRvmxG#=D003a2SmO8Vy6s04+lnyDr)(b7E~yp)8YZ`4KC>d@RIfD|YpL zxqUx>;V3RKt-Vm4`Z(r(Zy5C(u2~B*xRKA@{*|yT6-STdPu(3EphX!gdW*UW1r8P1 zAK9u907Fs|&{jL9FGAy`c{ZEV+Kil)`cD_0cCH;)yyHS=tw{C@vOb9&0$CZDu`Jso zpSRIk)0PwMJX*8G*a>|Pwdm$Xd1l+v%HD5=4iPUL}4>-371IyEtrqmc^Hb#WaOJM7CE!&Zl&<$q%cmZ zH1c|5O|c2=AHlX{4ysjZMQJX?bFhE>E-x_B8yGH!jR48Y0zbk>n=^RSa~7h`9nwJ+ z@Nd%B&`4FnBQ?arsyGbXpQhh!v00Fg=En^y+*1@v&2m6F=Y@Ox)b#?rZ zU)bU<>L+i_)N_@}?;1%6YSI8uA4eWWx>gC^CbBE#q0khUlgf?;U21kF*#GQ6nLkGf zD2YEt3I5F!b~$k7z+CQi9a0IX-=s1GlsedjcwzPgOvLAPx(OyMK8vBCI83Hg50hYu zJ;z2LAXzb07RsV^zBZ+z;!w9vdo+=q**U&c4!ZFOm6O1(IM;V|UHMDFbff3DZm5vm zU1FVK)g8~dK=m2<;2^5Fu5qGMA|w<}f1z&TKt|h%M!lxoSxRbxy71756oveq=ws0w zy}ItJ<>IB5VkxY~r6#v)fQZO%`7eIL?H$L1z}j-;Bm+vel-3P-JGc&w{)(D|B<_q= zv0wkaMOYtJ(0{;*>UU03%&`vQRT6;laIc(>q$Ddwl_C`;`cdq$opqWW-!9ra9{EJO zoQpJ(DH(ZdmS<(dRo&6u=OEg?li*OM{4*WNwt^#0#Ia`l=cX4KHZrw?hF5bs zUqJw$lCs=%%{1fJ-rfG?1&}ITiiCHMlq@SEuGUR6v8y{NDxv?Nd^?{{wJH?(3)^go ztCqT^{Ch>x!VDnb9{N?`#7Ji?ix6;lUAG<9jiLkdaL(S4ukMs5oCcM0V8G}Kqy6o} zy&W!knOZ4L{t)*2*cYg3`tLXDJ??j_?8f}ydERlG#r?A85GK)_Rp5q1wAL_*I{weg z1Z#YNWSP%mOMTE%uc8@oqUMI?1L?t*RJjw`T=uUBmV<|` zLd#3fR*7Nq23;11ilAQ_XNdz}*EFYhlVkLH$kz8ev(>?J1u9*wMAh^2TDL!SQgOBe z#tdv^3F8Xkq7e_DZ9CpVbg$uFC zx*RqA%}6AWYskRzlF3eXQTl5?Ih&e1U)hL4KN`^M9QH1Wu$Xc+(V@74==^~j7lvWb z9ni?gXuSHDcdVgnJ^9_3d;LEb5ekql!aoRcjSkSlLXU4_hoyn%NBgs~Y&U4M5x6T` zfEL|PO0hvHE{(u%l{&2ao0VeEzCBr*e)jVBchT`2i?D1)a$)@P)^LErp^zj!28t_@ z*C*?mj?#*ll-1EtB{ttWoXUsh4$-k}aNRj7r>KTMlV6Z!gDd+b`*S*y9pDt$=xWV( zTgpb~!+RTy`nNmUTDY`T+5l|Xx~s;{E$7d8t2vwH{Uqn>Mg5d}pWUb=)G4TX1<*#r zEuEu&V)%BGrwgHQR4VOetgL>$`1AM`ud}C$wsq8nYGtxhHkW`tC%c;TM%DK#zhB`8 z{YDL9Mk&_r+&l%lHidpvOqiVIg|!k33$x{Xw$BrCt33;jQ(D%6X*$|qnlK#7954)E z+Jn`A5?-%G-Td;6m>s)c;|UZDglHfWuu%$(r5hnu|5*40y^0l$KMrUE*wPUnqlxAG zbcdUmmF+3_0@jipJCOz>9jnQtb&mjD5vQw-exGlfh|JR)Z?v8i_HwI>im3jI>oT|v zj4}`BXHx_cyEo=@s$b!Rqd>haG$q`psNz!*rJSfh3W+Q_Lvfmt;m^&;)SQo?;t^5crU zkNnu6HU&wAKG^o+5+s!R(U*E{p2C> z@PurxGu)}52farPw^&0rY&PN`$bfWD^p2j2xxw1Pt38H4hY#+nGz|fy*Q}IZR)hld zdaUri#98c}6O`R-L!`28Kx8A9(yHqzXv%R9TP76+7tzx60)=}mmXFT~aP7k~h2xJy zas008*o1{kTZo|Ws^%E^P^jw3alG{^;{9pp3#Awt~CK8?VD%vc)OYnI4 zwl@E3qlKa#uQ6a6mjIy4_l`h^7!uGoym>o=%3YrU3Rg2qg?U6_k*|6|WVf%TLzbtA z#7cIF&I?lySA#pjfn&B^OS_79luqD~BGWccaIW>samIr5`{l%KkDMnJIKY&W&E@Rv zuu)&sDUKG>?&W{A0BLlsdiv9iV$C!IQ?|0izcoMlknGC{jZ_&S1vXhx^_RF?Y-Eli z8~O|-ETm2vcGaX06`FGU7FLobogmn8^6YPAn9x+PsBW&dgq6>r>2Mg&pGs{Gtx0e& z>2ZaiPgjMPB8=QH799O0xwXAAefa#x+d0UzG*nLqdfhnGj6=Ln;`{2=j~4t%ZAEu3 zn-9`=xro$v!uRksr*iI`}E=TSjcdz0z}Oe|iHWUb zI5VC@JWOj2=LD!%9_yefO$Lt(DZdSMv8(}ke5vfG8B*s$ z$rN>Om521-8_7am3_%*3sRAZDsS=Stqhi%TC-za<#}h>*ckjVOd(7-iE)QmsvRZr{ zn7E8rdK{HZ8n3&n(6&6(Bws4m9j>f&CqhN#mqXUZU|s{Cad-~z)tk>vmbL`%Qa5V! zL7V2y%!`>WnrZ{j>ttU1(dsV_0lCKH5D)xa{h~R>%7284&41~8{r*{BR#0+t)Oogq z+gR%LQIob^D{*W^G6Vy+##<@oJuT3fDAeluoTUVmy=2Mm)Ewhcn1UtC!ItM+)ljxd zJsTCQL+xy}-TvH?)^H?XR%vds(o|XN8^wv?lz=}US4Mhpe849WBH46hVzn5VUZ-ec zS-A!zG~Cp?_Jz>ccy?5*|G1}VI%7FgfeYse^uGVpIlO_j!%ANePs^-?8cySWaPxbJ z61p<8k(;M_2R}RGl~lF{)!2on)E_8&h8hqw{7M4|MZnaQEk zX%PlCRaBHn20UMYAK{HrNlMthGDIP#XSZzQHSOD4srMIg@^;%PUJUS{KFOWlXiv!) z#zknEEyBcL_B7v;d?~7?^eabJ=6JAqNr-7dp-95~O`paBbx|TEGF_B${`_FN70LwA zFgbS3iFZSQ)TgsQ?ggm3FLQug8{ z&&5+qZ)lxOeNHH~-KcWwW>D3+R_)1cSO5E;%p3?w zo+5ro_XtB}<;gn9xw;7niyu{q94=RxwkoPNu(I|obBf{Ah?t8JS$LU_xsl!~=Kh~h zQ;~0;z3Au7cD}T8sttpqO*3uZCWxioOo7ZFDSdC*}k18y4*~rx~cI++CM4Uc=jBfHd4r+Bj@UE zXo=YitoKTJJ{f;BH=>4JBR{QrK<4uHV5F*Z%Est&=?&R}ynb}!$}oN)SucWHS$ZGm zl}>Ls$w`5lFRtqrVK!sU_w6RSNT7b&AA00Xl(~|C7#j% z4M6h0ykt4BRtzMCjC?iyRp({ zg+CECEW*G+Z_U0;MZ;_~T~kx=--Jmv-heFatJR5-$^>PG=I4*SW)`y>itP|Za-SpA zi5Xfd7SX!5-u%Xs6rF88U-y=WI!Hr#Tm)n}fC3K#-0V7AU~g1zZ>aSRWYqY9dKx;r zCZB)xfe_SYahsSQojdAr5qjd7_Sskh?>i-dQwZwy&CixUW0qKGOyKzr!IxB3jZH*6 zJccN&y1e(rLI$^t30K$E)HNuWakE)y)-h^-yH35)Yz@U2dy3Tluddz)67c6k6}OET zc#CXCk#J>|5fz!v8(3L$l955FDM8BR&^!bEY&=Gcfy>(4o86jPtD3922hZF%m$2Gd z=ji~?gmwkI)j)(TTpK@!Yf!7`n*RkT2z2Q3P{??Vx;PvR3~7DN0vJmyFA{`8xu*P8 z=ix$fSo1Hdyi-(@DeKQYw2~fc_XQH~7gwIq`?If5Tjk+B4hi++O3Jx!GMv z5XtNh$qCYFUBv)KCIMiH_O6NgC`nPV)w5v!7DE*2?E-9I8_ZaX;_NQYBj1!0rxTO8 z5?K25$)8e7m<*yhbimLPn#?b**D&%eQPy)P8 z9q}1o(-gj%_T+y-&+0hU)(l`G_g33B@5ubEZj9rl;v$6o(p3f41j#Kdg-8xH0YMAb zsg46B9UVms)4_oJk0FV5;Fq+<9KY=T&b_QA*td$>$P3cS zcigWZw(1?ZZQNZy*EiF6)yE7dFL9h#@z_<~jI2#fLD>&ZJ`|npPWJhwql9&)x*x*^ z2x)XIYvhM5*+BiZI41ZRmnwkdARTmY@MQ(M>GHDdWzPI@{FAXAGr7eMr2Q(~jPAUG zY_`!iw>LN-EH@>C>l2GS4)bO~82j|t)Wd3Bw>bQivj~egWhJVr7O6UhT~y6U31w&R z3&xxM@-Xt2v))%%J}={4lF9#&?1KOb!(}z@@gb`KQKMF@ir1rP5U9lW7|!kx^!}^? zM!!nVRb+`I5%ixdR%WXuA$oCvHO}YPl0}juuAfLiGtwTN?7D4PrI+(CObWF+ zw&hq@TWJ0=BWF_+p8$&_DJZrjyqZ;%)sj=A*7G#L;h}V;%}+gs=vN!X(#Zh9b>pEgW6x7< z;j2Q(g~s1peFi?HN!@S&%MS)^?l#Vin_iw3jAf!es8=RhW zWM*2JOGeofS`a`|$Pt1;M-|13N3_T4u7wwfn4J4>>z|}l= zsN01P-eM;;s;`@d#jx>FK!&?;!HOI>IKZ+fb(k7jUV73_8-TyMqGX^6#^3&9-s%xy zrXnDIXJ=@%;Eb)*Lu#zdTxdF_c(HMhoB$O`mbg?WS%9|y-NVce{EAI?zcN8l30IX` zs`SIl4~8W-|NfZfiy8jws1i0-s@A1^|A3L6om@gC#a@rI74f8_DP}nr2tRgRo|nc5 zDp)V$ z;0m4F(=qBj4GE3#U0F+dTz@aolGi>N}8gvQgoS!vW1)c%%Vo);{m9GvdjAReYI(*5Q4ShNOI7HRv%bE$b!m zwu|()hMH*R4FA5uuQU*(_eN$CnWqvltUOSoW5F-g4`z^&rfl> z*Hg!P82^SvMu)-_j~v8RVngJ+k}&!?wlki?0y!yEGNUM(WYsnqk~(Wu0JDg=NOPJK zNkF*$kqLhh4AK15_{8{Mf(TS^`J#dkJZF%t`F!Qx5g+xI z(&cUFtd>3ye;MBq>4)jMTKAE-tRW1gm&;ej&m>TuU`2SQX>?%?MR`r3WqwXCncVX7 z@#A^glW|Zwkv7S+0pY;Z4&!i^i{x~xO*yTq8+{R#*7IYg$ynCP(9~Zz*G%8$Ec``R z^+o2cmMlh_D(cIr#szQ`sAa2$pfv&hqKZXzlWjO<_6|-cg~VZrYYsiZLNz6+`C>)K(F%rnO*ubryoZI2VitIoXI*khCWbG`Q;jW9%KnBip)Y;g0Q&JGRpu zTOHfBZCf4NPCB-&j%~AI+s@bho_p>&InVv^)vv00>e;o{+I!74<{V?r`Sg9o;{w(s zTJp=91~|Nf6EUcP$%Zj}nafW7@nW&SS{9UIJA1k0M)g5ur&R*InS~w5y!XlG1;ytI zmFkyYZ}px+5Te-h6Zm&&Sm^G=W=cHL7@8C*&`FsyKnGtiX-NP2+vlbi~(CTwI(((Eipn5~{=Xd&=px7K8IU zBNug#XUb?%HFfrx>3enfXZNb7*{KVTy@bXtxZBHN2ltpz{3+p1r+|>-qOBO?&H6p@ z*mg&U&Q9Zy*+qq^2(&|}g1$iNDycPg>*tK$pj}KI^K}gS%J$l$;1+U;9aoG5$p{)) zjw8sr;c;c>`ve}3nPsJ*Ha}E33)YLc+Ko%i%u2IxmKN8KsO1|Ug6_5+t#PiFwB&~% zElf6Jz`;6VQ-8pRld~Vv#LSGn#q{=!aEr@JC}0kB{JzBCjK>gHiJQt>?NNlhq{*u* zUE9pc%F4h1RLg9Yve-j#Tq$G&+JKYmRY;>nq8%b!MFC96fmjI3vUW#fdaeOa9qT%i z_-%vBdLqGcf4DzYo+w;Ip>JktMz+;0M@(V-BK#)4-H7r#;#oo(JW&N=&kNSKd@nVX znJ>V`@>^sQ$&=}sixB@L005x!3JSVE(`CA2xt82%7^>@a6Injw!9^WhwH(x$X~*#J zmbwHaR3{`TwmO||ZEek(btOUMmsiq-)O7^VWJY$hg+{!L-EtZqpzfrUj`zMwT2K_$I*WnrZQBTia$Y|R`(px%$o!?Zeg-!sqr zifr2tJ8XgPlLNiRW7o1+Wuahw7DjAQOAA(fb!Mh%8nY$uTZ7da7IPL4gyl;|sLrrz z;g~SHr51$Em;ZEQMDc<7?$bXvKR-V+xo_+y#Ioeb`2c$R?qXi4vRFlT9cwomMyi4#SzU z%|t+-KtTQfC2!OW5&#)M=D!h@J2E{LLGRhF#EKp>LGi6P#Hs z(3Y}k`EvE!<8~VZh;g!H3{rAqHqNoTcXrwrKB!|L8O3aZ{A*_1I>3_XU1zjCIN%7_ zTtvigZ7e=8uiUq|_V?50$IKS5=bA_aTXAWmqJH(;z)|~CgXW4_v&3<-F~VC5QMp~q zs=8!sj%nD9PM{G~|40mZSIx0J?Rjz&UJM*TFLp84jgs|7hUlF5D1vei(Rp; z=l1hCX^Jh2>0)q)J5QLYn;-qv)Z(-wKj^ z_id^a?NoPVv!WVWKk7&oN==xalD{OA#^dnXS#-3@p|hv)Fbs9>O?0GU;Tu^C`nFNM zHJ;DNUxqGOKOJ*pWxUOZT*D#;m=%uiMeuM-g9@&FX;!Ba!_yQv*qrSSK|%IkO%fqF6=xp_>6$ynpDH@nFm4od~$?h$145=uZp(bZai^jw6A@BDVK<}tVGYa zt94DL>B`^;z2 zat8tJ#A^Gq4DXu-Z6~sLzNtC>rLBNp!RBF|7nhlgsfYrQfOS@P*dyif``RN5Hf|m0 zh4!N%9o>w90rHKKJ(tfIejP*OJed5;#zz z>dpJ?H1j{a^}BiK&nheNxAU z$E=qj)-q6zThw9N_$T6_0<(1kF|F&y(mAmgZ z3^QhS!})k~Yo#(FBd{*!X;N*>oh4O}(Qp;1z~Y0oEEXjEy1tHmN7{?K+MyeQ&t}&U z^vmlI$teg^f;BBU+NG;M+Y6y0z#m8i(`|OIu~!<_@UY_!sP}xM?Cpl!Qfu1M5)ub4 ze+oJUi3I*gi?q(OUH_#1%(-|#>>RuS&`V8FEf8ewk;@}3lF?)Q+cYR3nf!p9-&4Z( ziR5DR<{=nw&^%5AW@vn?syaK)B6oTiz+fT6keN?*I9o<*NHG@ElF>)amxJpXq*2_k z#S6D1nXVvW$>6ydh}k9)?!N=Rq+x#>F)LE#Y>8^WHVA%0u3=z5t#Epln#T{`p3XNO zj~P&w=cS5^1ixLkFvXJ)@ge#p26-Mb!#NO+xqW!ZR?^9LGhJO#!9Dee%$HbiUXdYf z0;M}G@Cvu$pNgt-Z^7fFk4*Jl#Og+lBY5I;1q{hBOS1JZ$=*A{ z&RH8m->|~o+T7%!P=TI%@Tqf7|CIOfv5b2(!SMXOd%0z0T;j>`8-oY`^PT0R{s30$ zZ2-{9(fF9*0M$t7T}}q0N8*pN%;Rl#C&vmutIt9c3C@{p?NbBe-gt}X=own4+hXo! zi;vdfd!RA&3~ipzcen&8^n^)xXm-9mgzgIaA@o$sij9`i<|15hr-^n}MbyMwFNoew z2i5lX#M9OBv8>L3hmbBAj14Z6lU0-CXff*qw;|@RNQ=4|n+PK=nf-D~f0CT4#uwcQ ze##XV=duh?QhJA5KmtjvG=s!cMe`RII1c6a1L~G2;-NB18aF1Gd8Qo^Zsj5~Rw!M= z-{FFu=ui>{ zl3QMBd1SogilSyWo1ckm<(mr^(Ql{oZhGFFu$-Kn-UtfMcW`x`JJ(hx9qs~)j@EpP zzuwP+$2OZ7$KHTQdAW=d{XSFC5KUSjr3Rm@_Y%r#y*+p;CYbrZC{tsr6#9zJ5k1-B zvD${$>k0}{8e~m6c370?vBuyp{c#s|l*&}Rbl#V_bN!p-+ADw|cX2a1Usv0&Rs(v3 zb-8*rIxLB~b}~y!46#Scx5H2d_u^yKNfIuUlTl%oomVOzLL-U%b?SwjCY8qmf97ClP%IdxGMm$Vf;sz>7^MCkh1Y>~@YaPFSd8-%G9Ot53`0 zun!Rth1wd?xm~NABk`SLR=iaRR5jfgP`2#lJ$gX>=J6aG$t9)WVS-0~)-)Wb9JK6= z#^jQI$I$>zqZNnOqHE*g#cEXNHq>MM3L%Noyt++ZivO^jVaRQ#OOK4*s%zbZ$4J;k z!NxD=o#LCH0L1z}({VkkuvGj@Fa~)44cxHs zeckimYH&xIB?IO-E`-Te8K$*@j2sKs^lFGE*lNr2i&J-IRKO^&Vf-308X+mc z+2l(cBzg0eFSYl5+$jy?^b`(7B=dCrn*IxFNszq2ica)!kAT-riP_LH2u@gxJ(tN? z&p_SISzy&-6{FjyB8MpHQInObUC|2n9%b3vFIkVDoTfKP;5&}LfvvCHyRB)|aZ)q0 zJri*K2#ut!cR~mz@p4DGdx}|HI-9pgK$it^Jd_%iTHIIv;gDM$KJ4xaW+aa+m9gA9 zOvFsRQCbB{URFUHF(#q4f6Q%LIoTulY3cF#5VzCbfDPxf7LWT{)(?_}l=$6Qo1*(~ zvaaExUYfFA?StV0Lg}~V>bwRuI@Vjoi>IaRrqzyScM6WC%r0kp8!==TgQKIcXP=jrA^+YMr0VUf;7w7PZQD}^2}t|* zVDO1q30esInC(Lihae}NQYYu80&@O(v?5ZLabnU#-BADIgTUsC)%PtsYrV!KLXiH) z?O=;KMK+#-QvJZ$KM76G)yXn1DAc?^HkHyNKWsNOuntkx8pyFPSdI>uoK+vK%HEDK z?~s7W_uw-cQk zD-dj#vOwlK0MBR7XKqJ#{^Nq;RMjPJScLY`l1JVB(e8k8A1dr6d#CUG!TCyY;dKKYquzS?7*pN_@nYn{fM?6Ll_g+N{$-8puq%eN@#o6(tp5lS zk|>mTwqI`{YB8o%SLVx)-_L)CZwu!=t~lTew!=C9QB+)^WI!(PY6rz<(syWK#wEnN zxOanh?Qf0Z5in5}+7OR4n`xv`scj^&i4YKY#T>o5>MnF}^q68^XAB4D-sF1g_*A8Q zJ*zp>h;N2N`U0D~0#iJmAYc~F7Z~OqJxhpve1QqgVGdzHxr zuYU>xU6eo$ddsz$z-D+6kR%X@plF;b?mExHQ*akL$%dfWSS4ry>IThoPI1b&{@h&Y&0%Jw+GJ18)Y-n0UK? zDSuDc33{}oN`I;xASCp%q1E%8Y{=eR^AE1~zIlH=W+*1#SKA^&jwai%JL;+?=m+JN zJR~sT+`#4uz855Yd3-$$SVDZVJMM4Im*hcb=mGxHO^j3j=on<~J+Q7(+y_aAj-1#= zdp0;pH39{d^-RH7Lab;(^9)3BDEY*3=Vx)uJX_W>TkfeINakW~`>%;@M#FUv1*In$LETNF{A-4}M5p;K=x#GP_Y{$q*momJlWeB9=3}9_mLt~^~F3W(Gk%pWLyEP*mFZ7HzoVRf)x3OeA1m$s@LZTf}=`j7!k{O-( zYIYwJqk1lle$M87yY+Z+`s}3@4*dW&$^Br)K%|emIo11f(l)IF>|5B6yMVbi`#qPz z&oMfpdgY9d_mwmDhy@AsjJD}~om*h7trMiUnRpZKeDqpv-cyvHC77F&kgRwa>JCezOdV3#;VXg8jem7-Z z9>>rombPY31v4XkD03`1>9WuQzk)N1_ABYA|Eh|M8(}*m;=*8d zZu=+bW;oqZWSL*IP=Ryx3Fszu3TOB14@-XL#GVF=S}ESu3-O3aoQa84+@)LDH@^?s zjUla|+q>2_&kTZE{!%>6sI_kpVoC1Q=!DwFNYUGP+`@(MSk zv^r!w#(%J8_V*1#!K%}nnWWl^d}CDfx09ZJj`)*Oz-%=X1x0JBya&N?|1R+66CHSI z!pM;&V|{_7aT*dz|7|>VhKZTA#XBFOP7g;+=UbgQfL0`SqyuZkTZo6!^y;Ay2GlqB z)I}TdQ_At`3(FaYC%fr_8Eabb=`eGw`y}ROYv{`A#i{Y?KrLUAl?5PrlIZXz6k$wq zKDTI5M2p*@tdpm6|NDHn#HU$ICY%$|l_|u-?i`EgX}4L2#qf-F3vD5*rwYYdJ`t#b z#k4C(Y@di%)9vZz3IX(Dq`5MRT?qZOVux^gI>20zbQX6FU9Y!kos40QZ!r!dXg-_s zc7O97?r~ADe9R)N!E9ygOl_!J@pXe&Bkj12DgrrtCaabcq5i9qS)sHtW0&< zE-raz2>t^0+j3cV@QA$uf~}>S$}oL->s%F@^~B+-lCWRe58~0`GB(c7DU%6bH9>}# zP$@dhyT4u4I$5m(S#q{%d>;6U!`v50{O*uR8@v~}J^eFXzBO?ag18zAYFb{jnP3+$ z!o78}lD~F;0s&5QdEGL`BZK;#AHFVsSYN{Er*Akbi-F@o*1fBf)Qt;q9*9PU;Av)T zZI57KGq9@GS}Whuu7L|G4d#B4KmgL&TC1~jXW5k`|2VhNAN5lPsFo6F&(A<7oYquF zM$^QAIn(PH(V)nT<>DyxPAN22G-Mwli2K+tai_QMr=5 zQrN92a`M^T90H)@J5T~cw&!aP-p-Q`$3V0Ib`OnUT;G~%C?J;UgOP$3Q`S&17nKqJcUGTEeR%{d_*_38-#o;}Zm*LOzytf{`do zX(n*osEtZc23z%h387T-RJOs|GfH^A)ss&4y^XWkfV%}9jvgU~SVF4KoDR$x3$0pD zzE*CL3Vhn>X2a$@ID4RkcIUyjvkluzuZP^U_7w{i=o$io{<(l6Y$+N`#h@SugQqXe zR?J^g!{!B{IbYy2X<#!fM&^c<5EyrG7vd+*c^SaVAA9F{IGs=fah&F@&b5ZnnTu*O z?&Q1Cc#zpvItuaesh6z9`2#u)@W;V9;V-oybFQ0L;&ik*#(mC1Qh?5^f*gd$av*kp z0_c)N)x;tR??OB=zU>z(PJ&Be!3AsAL*JouLB_{X!i%-a-F_uyQmCx1^W#>|(#EBq zZE<&Y*KXnD*3ChExy!v1DRq~vhQT9tTI5vEe_G2X)*G_m-}7Kw{mhP$+T)*n)<<3K zEB)tG5(UPx5e#Huf@5J*4i75tp*I;BlBr zU+l&km_)3h4hgIhiM9Sk8<>R3{FP{2gdMOvJUr^-{45c`q-k6IIz;f^B5g7LWfkbV zGU6W6+s-6oALTrlA>Kjw19<-}+78PwQx&8&c}q(Rdu#%6T~a8&kOpblEEBVmQWCU3 zx$Dnq^+0&ZRTokJt(qD$5d9WFprK)C?_w_hf{HDm_6Ce)+7 z#Y&FN*P!%a8K)^pkh8f6e*5m1JaOsrGIs0>%BZ&uE?dnSz+!fDrBFJK`n76cD16@}lIX<5g8cma@^UylfeT0|=0^{1 zYOC4VSpzz)Vp(~45Ef(q�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 z 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

  • T0s@#-y5=2q@aauu0!bvF7YQE( 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Ì}YH#Sp1y3d|70!o{xpv3mrXGd_rhMtyzc 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�N_TnyxG1A3Oe?WJ@f+cK6*Od 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 JhO__(AOIZNx>*1K diff --git a/rhodecode/tests/functional/test_admin_gists.py b/rhodecode/tests/functional/test_admin_gists.py new file mode 100644 --- /dev/null +++ b/rhodecode/tests/functional/test_admin_gists.py @@ -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('

    Public gist
    ') + + 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('
    Private gist
    ') + + 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('
    Public gist
    ') + + 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('
    Public gist
    ') + + 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)) diff --git a/rhodecode/tests/functional/test_admin_notifications.py b/rhodecode/tests/functional/test_admin_notifications.py --- a/rhodecode/tests/functional/test_admin_notifications.py +++ b/rhodecode/tests/functional/test_admin_notifications.py @@ -3,6 +3,7 @@ from rhodecode.model.db import Notificat 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 @@ class TestNotificationsController(TestCo 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 @@ class TestNotificationsController(TestCo 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 @@ class TestNotificationsController(TestCo 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) diff --git a/rhodecode/tests/functional/test_admin_repos.py b/rhodecode/tests/functional/test_admin_repos.py --- a/rhodecode/tests/functional/test_admin_repos.py +++ b/rhodecode/tests/functional/test_admin_repos.py @@ -47,7 +47,7 @@ class TestAdminReposController(TestContr % (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 @@ class TestAdminReposController(TestContr u'Created repository
    %s' % (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 @@ class TestAdminReposController(TestContr 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 @@ class TestAdminReposController(TestContr 'Created repository %s' % (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 @@ class TestAdminReposController(TestContr 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 @@ class TestAdminReposController(TestContr % (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 @@ class TestAdminReposController(TestContr % (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 @@ class TestAdminReposController(TestContr 'Created repository %s' % (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 @@ class TestAdminReposController(TestContr 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 @@ class TestAdminReposController(TestContr 'Created repository %s' % (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 @@ class TestAdminReposController(TestContr 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) diff --git a/rhodecode/tests/functional/test_admin_settings.py b/rhodecode/tests/functional/test_admin_settings.py --- a/rhodecode/tests/functional/test_admin_settings.py +++ b/rhodecode/tests/functional/test_admin_settings.py @@ -6,6 +6,7 @@ from rhodecode.tests import * 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 @@ class TestAdminSettingsController(TestCo 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 @@ class TestAdminSettingsController(TestCo 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() diff --git a/rhodecode/tests/functional/test_admin_users.py b/rhodecode/tests/functional/test_admin_users.py --- a/rhodecode/tests/functional/test_admin_users.py +++ b/rhodecode/tests/functional/test_admin_users.py @@ -39,7 +39,7 @@ class TestAdminUsersController(TestContr 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 @@ class TestAdminUsersController(TestContr response.mustcontain("""An email address must contain a single @""") 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 @@ class TestAdminUsersController(TestContr 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 @@ class TestAdminUsersController(TestContr 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)) diff --git a/rhodecode/tests/functional/test_admin_users_groups.py b/rhodecode/tests/functional/test_admin_users_groups.py --- a/rhodecode/tests/functional/test_admin_users_groups.py +++ b/rhodecode/tests/functional/test_admin_users_groups.py @@ -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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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 @@ class TestAdminUsersGroupsController(Tes 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() diff --git a/rhodecode/tests/functional/test_branches.py b/rhodecode/tests/functional/test_branches.py --- a/rhodecode/tests/functional/test_branches.py +++ b/rhodecode/tests/functional/test_branches.py @@ -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("""default""" % HG_REPO) - response.mustcontain("""git""" % HG_REPO) - response.mustcontain("""web""" % HG_REPO) + response.mustcontain("""default""" % HG_REPO) + + # closed branches + response.mustcontain("""git [closed]<""" % HG_REPO) + response.mustcontain("""web [closed]""" % 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("""master""" % GIT_REPO) diff --git a/rhodecode/tests/functional/test_changelog.py b/rhodecode/tests/functional/test_changelog.py --- a/rhodecode/tests/functional/test_changelog.py +++ b/rhodecode/tests/functional/test_changelog.py @@ -11,23 +11,15 @@ class TestChangelogController(TestContro response.mustcontain('''id="chg_20" class="container tablerow1"''') response.mustcontain( """""" ) - + #rev 640: code garden response.mustcontain( - """r154:5e204e7583b9""" + """r640:0a4e54a44604""" ) - - response.mustcontain("""Small update at simplevcs app""") - -# response.mustcontain( -# """
    3
    """ -# ) + response.mustcontain("""code garden""") def test_index_pagination_hg(self): self.log_user() @@ -48,29 +40,15 @@ class TestChangelogController(TestContro # Test response after pagination... response.mustcontain( """""" ) response.mustcontain( - """r64:46ad32a4f974""" + """r539:22baf968d547""" ) -# response.mustcontain( -# """
    21
    """ -# ) -# -# response.mustcontain( -# """""" -# """46ad32a4f974""" % HG_REPO -# ) - def test_index_git(self): self.log_user() response = self.app.get(url(controller='changelog', action='index', @@ -124,3 +102,52 @@ class TestChangelogController(TestContro response.mustcontain( """r515:636ed213f2f1""" ) + + 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') diff --git a/rhodecode/tests/functional/test_changeset_comments.py b/rhodecode/tests/functional/test_changeset_comments.py --- a/rhodecode/tests/functional/test_changeset_comments.py +++ b/rhodecode/tests/functional/test_changeset_comments.py @@ -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() diff --git a/rhodecode/tests/functional/test_compare.py b/rhodecode/tests/functional/test_compare.py --- a/rhodecode/tests/functional/test_compare.py +++ b/rhodecode/tests/functional/test_compare.py @@ -16,13 +16,17 @@ def _commit_change(repo, filename, conte _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 @@ class TestCompareController(TestControll 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 @@ class TestCompareController(TestControll 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 @@ class TestCompareController(TestControll 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' diff --git a/rhodecode/tests/functional/test_compare_local.py b/rhodecode/tests/functional/test_compare_local.py --- a/rhodecode/tests/functional/test_compare_local.py +++ b/rhodecode/tests/functional/test_compare_local.py @@ -10,16 +10,17 @@ class TestCompareController(TestControll 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 -> %s@%s' % (HG_REPO, tag1, HG_REPO, tag2)) + ## outgoing changesets between tags response.mustcontain('''r112:c5ddebc06eaa''' % HG_REPO) response.mustcontain('''r115:70d4cef8a376''' % HG_REPO) @@ -54,7 +55,7 @@ class TestCompareController(TestControll org_ref=tag1, other_ref_type="tag", other_ref=tag2, - )) + ), status=200) response.mustcontain('%s@%s -> %s@%s' % (GIT_REPO, tag1, GIT_REPO, tag2)) ## outgoing changesets between tags diff --git a/rhodecode/tests/functional/test_files.py b/rhodecode/tests/functional/test_files.py --- a/rhodecode/tests/functional/test_files.py +++ b/rhodecode/tests/functional/test_files.py @@ -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 @@ class TestFilesController(TestController revision='tip', f_path='/')) # Test response... - response.mustcontain('docs') - response.mustcontain('tests') - response.mustcontain('vcs') - response.mustcontain('.hgignore') - response.mustcontain('MANIFEST.in') + response.mustcontain('docs') + response.mustcontain('vcs') + response.mustcontain('.gitignore') + response.mustcontain('.hgignore') + response.mustcontain('.hgtags') + response.mustcontain('.travis.yml') + response.mustcontain('MANIFEST.in') + response.mustcontain('README.rst') + response.mustcontain('run_test_and_report.sh') + response.mustcontain('setup.cfg') + response.mustcontain('setup.py') + response.mustcontain('test_and_report.sh') + response.mustcontain('tox.ini') def test_index_revision(self): self.log_user() @@ -79,7 +91,7 @@ class TestFilesController(TestController 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("""
    Partially implemented #16. filecontent/commit message/author/node name are safe_unicode now. @@ -100,7 +112,41 @@ removed extra unicode conversion in diff extra_environ={'HTTP_X_PARTIAL_XHR': '1'},) #test or history response.mustcontain(""" - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -135,16 +181,23 @@ removed extra unicode conversion in diff - - - + + - - - - - + + + + + + + + + + + + + """) @@ -167,8 +220,42 @@ removed extra unicode conversion in diff annotate=True), extra_environ={'HTTP_X_PARTIAL_XHR': '1'}) - response.mustcontain(""" - + response.mustcontain(""" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -203,16 +290,23 @@ removed extra unicode conversion in diff - - - + + - - - - - + + + + + + + + + + + + + """) def test_file_annotation_git(self): @@ -352,26 +446,289 @@ removed extra unicode conversion in diff ) 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) diff --git a/rhodecode/tests/functional/test_home.py b/rhodecode/tests/functional/test_home.py --- a/rhodecode/tests/functional/test_home.py +++ b/rhodecode/tests/functional/test_home.py @@ -17,23 +17,26 @@ class TestHomeController(TestController) 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("""""") - response.mustcontain("""""") + response.mustcontain(r"""""") + response.mustcontain(r"""""") - response.mustcontain( -"""r173:27cd5cce30c9""" -) + 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 @@ merge" class="tooltip" href="/vcs_test_h 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 @@ merge" class="tooltip" href="/vcs_test_h 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 @@ merge" class="tooltip" href="/vcs_test_h 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() diff --git a/rhodecode/tests/functional/test_journal.py b/rhodecode/tests/functional/test_journal.py --- a/rhodecode/tests/functional/test_journal.py +++ b/rhodecode/tests/functional/test_journal.py @@ -14,10 +14,10 @@ class TestJournalController(TestControll 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() # diff --git a/rhodecode/tests/functional/test_login.py b/rhodecode/tests/functional/test_login.py --- a/rhodecode/tests/functional/test_login.py +++ b/rhodecode/tests/functional/test_login.py @@ -5,15 +5,16 @@ from rhodecode.lib.utils2 import generat 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 @@ class TestLoginController(TestController 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 @@ class TestLoginController(TestController 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'), diff --git a/rhodecode/tests/functional/test_search.py b/rhodecode/tests/functional/test_search.py --- a/rhodecode/tests/functional/test_search.py +++ b/rhodecode/tests/functional/test_search.py @@ -25,14 +25,14 @@ class TestSearchController(TestControlle 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 @@ class TestSearchController(TestControlle {'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 @@ class TestSearchController(TestControlle {'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') diff --git a/rhodecode/tests/functional/test_shortlog.py b/rhodecode/tests/functional/test_shortlog.py deleted file mode 100644 --- a/rhodecode/tests/functional/test_shortlog.py +++ /dev/null @@ -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') diff --git a/rhodecode/tests/functional/test_summary.py b/rhodecode/tests/functional/test_summary.py --- a/rhodecode/tests/functional/test_summary.py +++ b/rhodecode/tests/functional/test_summary.py @@ -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 @@ class TestSummaryController(TestControll #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 @@ class TestSummaryController(TestControll 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() diff --git a/rhodecode/tests/functional/test_tags.py b/rhodecode/tests/functional/test_tags.py --- a/rhodecode/tests/functional/test_tags.py +++ b/rhodecode/tests/functional/test_tags.py @@ -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("""tip""" % HG_REPO) - response.mustcontain("""0.1.4""" % HG_REPO) - response.mustcontain("""0.1.3""" % HG_REPO) - response.mustcontain("""0.1.2""" % HG_REPO) - response.mustcontain("""0.1.1""" % HG_REPO) + response.mustcontain("""tip""" % HG_REPO) + response.mustcontain("""v0.2.0""" % HG_REPO) + response.mustcontain("""v0.1.11""" % HG_REPO) + response.mustcontain("""v0.1.10""" % HG_REPO) + response.mustcontain("""v0.1.9""" % HG_REPO) + response.mustcontain("""v0.1.8""" % HG_REPO) + response.mustcontain("""v0.1.7""" % HG_REPO) + response.mustcontain("""v0.1.6""" % HG_REPO) + response.mustcontain("""v0.1.5""" % HG_REPO) + response.mustcontain("""v0.1.4""" % HG_REPO) + response.mustcontain("""v0.1.3""" % HG_REPO) + response.mustcontain("""v0.1.2""" % HG_REPO) + response.mustcontain("""v0.1.1""" % 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("""v0.2.2""" % GIT_REPO) + response.mustcontain("""v0.2.1""" % GIT_REPO) + response.mustcontain("""v0.2.0""" % GIT_REPO) + response.mustcontain("""v0.1.11""" % GIT_REPO) + response.mustcontain("""v0.1.10""" % GIT_REPO) + response.mustcontain("""v0.1.9""" % GIT_REPO) + response.mustcontain("""v0.1.8""" % GIT_REPO) + response.mustcontain("""v0.1.7""" % GIT_REPO) + response.mustcontain("""v0.1.6""" % GIT_REPO) + response.mustcontain("""v0.1.5""" % GIT_REPO) + response.mustcontain("""v0.1.4""" % GIT_REPO) + response.mustcontain("""v0.1.3""" % GIT_REPO) + response.mustcontain("""v0.1.2""" % GIT_REPO) + response.mustcontain("""v0.1.1""" % GIT_REPO) diff --git a/rhodecode/tests/models/common.py b/rhodecode/tests/models/common.py --- a/rhodecode/tests/models/common.py +++ b/rhodecode/tests/models/common.py @@ -1,6 +1,3 @@ -import os -import unittest -import functools from rhodecode.tests import * from rhodecode.tests.fixture import Fixture diff --git a/rhodecode/tests/models/test_diff_parsers.py b/rhodecode/tests/models/test_diff_parsers.py --- a/rhodecode/tests/models/test_diff_parsers.py +++ b/rhodecode/tests/models/test_diff_parsers.py @@ -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) diff --git a/rhodecode/tests/models/test_notifications.py b/rhodecode/tests/models/test_notifications.py --- a/rhodecode/tests/models/test_notifications.py +++ b/rhodecode/tests/models/test_notifications.py @@ -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.meta import Session from rhodecode.model.notification import NotificationModel -class TestNotifications(unittest.TestCase): +class TestNotifications(BaseTestCase): def __init__(self, methodName='runTest'): Session.remove() diff --git a/rhodecode/tests/models/test_permissions.py b/rhodecode/tests/models/test_permissions.py --- a/rhodecode/tests/models/test_permissions.py +++ b/rhodecode/tests/models/test_permissions.py @@ -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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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 @@ class TestPermissions(unittest.TestCase) 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) diff --git a/rhodecode/tests/models/test_repos.py b/rhodecode/tests/models/test_repos.py --- a/rhodecode/tests/models/test_repos.py +++ b/rhodecode/tests/models/test_repos.py @@ -1,5 +1,3 @@ -import os -import unittest from rhodecode.tests import * from rhodecode.model.meta import Session @@ -11,7 +9,7 @@ from rhodecode.lib.exceptions import Att fixture = Fixture() -class TestRepos(unittest.TestCase): +class TestRepos(BaseTestCase): def setUp(self): pass diff --git a/rhodecode/tests/models/test_repos_groups.py b/rhodecode/tests/models/test_repos_groups.py --- a/rhodecode/tests/models/test_repos_groups.py +++ b/rhodecode/tests/models/test_repos_groups.py @@ -1,5 +1,4 @@ import os -import unittest from sqlalchemy.exc import IntegrityError from rhodecode.tests import * @@ -34,7 +33,7 @@ def _update_repo(name, **kwargs): return r -class TestReposGroups(unittest.TestCase): +class TestReposGroups(BaseTestCase): def setUp(self): self.g1 = fixture.create_group('test1', skip_if_exists=True) diff --git a/rhodecode/tests/models/test_user_permissions_on_groups.py b/rhodecode/tests/models/test_user_permissions_on_groups.py --- a/rhodecode/tests/models/test_user_permissions_on_groups.py +++ b/rhodecode/tests/models/test_user_permissions_on_groups.py @@ -1,5 +1,3 @@ -import os -import unittest import functools from rhodecode.tests import * @@ -10,7 +8,6 @@ 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.repo import RepoModel test_u1_id = None @@ -28,7 +25,8 @@ def permissions_setup_func(group_name='g 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() diff --git a/rhodecode/tests/models/test_users.py b/rhodecode/tests/models/test_users.py --- a/rhodecode/tests/models/test_users.py +++ b/rhodecode/tests/models/test_users.py @@ -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.user import UserMod 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 @@ class TestUser(unittest.TestCase): 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 @@ class TestUser(unittest.TestCase): Session().commit() -class TestUsers(unittest.TestCase): +class TestUsers(BaseTestCase): def __init__(self, methodName='runTest'): super(TestUsers, self).__init__(methodName=methodName) diff --git a/rhodecode/tests/models/test_users_group_permissions_on_groups.py b/rhodecode/tests/models/test_users_group_permissions_on_groups.py --- a/rhodecode/tests/models/test_users_group_permissions_on_groups.py +++ b/rhodecode/tests/models/test_users_group_permissions_on_groups.py @@ -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 @@ def permissions_setup_func(group_name='g 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 @@ def setup_module(): 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) diff --git a/rhodecode/tests/other/__init__.py b/rhodecode/tests/other/__init__.py new file mode 100644 diff --git a/rhodecode/tests/test_libs.py b/rhodecode/tests/other/test_libs.py rename from rhodecode/tests/test_libs.py rename to rhodecode/tests/other/test_libs.py --- a/rhodecode/tests/test_libs.py +++ b/rhodecode/tests/other/test_libs.py @@ -23,7 +23,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . from __future__ import with_statement -import unittest import datetime import hashlib import mock @@ -64,7 +63,7 @@ TEST_URLS += [ ] -class TestLibs(unittest.TestCase): +class TestLibs(BaseTestCase): @parameterized.expand(TEST_URLS) def test_uri_filter(self, test_url, expected, expected_creds): @@ -173,9 +172,9 @@ class TestLibs(unittest.TestCase): def fake_conf(**kwargs): from pylons import config - config['app_conf'] = {} - config['app_conf']['use_gravatar'] = True - config['app_conf'].update(kwargs) + config = {} + config['use_gravatar'] = True + config.update(kwargs) return config class fake_url(): @@ -185,31 +184,31 @@ class TestLibs(unittest.TestCase): with mock.patch('pylons.url', fake_url): fake = fake_conf(alternative_gravatar_url='http://test.com/{email}') - with mock.patch('pylons.config', fake): + 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('pylons.config', fake): + 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('pylons.config', fake): + 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('pylons.config', fake): + 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('pylons.config', fake): + 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) diff --git a/rhodecode/tests/test_validators.py b/rhodecode/tests/other/test_validators.py rename from rhodecode/tests/test_validators.py rename to rhodecode/tests/other/test_validators.py --- a/rhodecode/tests/test_validators.py +++ b/rhodecode/tests/other/test_validators.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -import unittest import formencode from rhodecode.tests import * @@ -9,12 +8,14 @@ from rhodecode.model.users_group import 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 +from rhodecode.tests.fixture import Fixture + +fixture = Fixture() -class TestReposGroups(unittest.TestCase): +class TestReposGroups(BaseTestCase): def setUp(self): pass @@ -55,11 +56,11 @@ class TestReposGroups(unittest.TestCase) 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() + 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 != None + assert gr.users_group_id is not None validator = v.ValidUserGroup(edit=True, old_data={'users_group_id': gr2.users_group_id}) @@ -69,7 +70,7 @@ class TestReposGroups(unittest.TestCase) self.assertRaises(formencode.Invalid, validator.to_python, 'TEST') UserGroupModel().delete(gr) UserGroupModel().delete(gr2) - Session.commit() + Session().commit() def test_ValidReposGroup(self): validator = v.ValidReposGroup() diff --git a/rhodecode/tests/scripts/test_vcs_operations.py b/rhodecode/tests/other/test_vcs_operations.py rename from rhodecode/tests/scripts/test_vcs_operations.py rename to rhodecode/tests/other/test_vcs_operations.py --- a/rhodecode/tests/scripts/test_vcs_operations.py +++ b/rhodecode/tests/other/test_vcs_operations.py @@ -151,7 +151,7 @@ def set_anonymous_access(enable=True): # TESTS #============================================================================== -class TestVCSOperations(unittest.TestCase): +class TestVCSOperations(BaseTestCase): @classmethod def setup_class(cls): diff --git a/rhodecode/tests/scripts/test_concurency.py b/rhodecode/tests/scripts/test_concurency.py --- a/rhodecode/tests/scripts/test_concurency.py +++ b/rhodecode/tests/scripts/test_concurency.py @@ -161,7 +161,7 @@ def test_clone_with_credentials(no_error 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 @@ if __name__ == '__main__': seq=seq, backend=backend) print 'time taken %.3f' % (time.time() - s) except Exception, e: - raise sys.exit('stop on %s' % e) diff --git a/rhodecode/tests/vcs/__init__.py b/rhodecode/tests/vcs/__init__.py --- a/rhodecode/tests/vcs/__init__.py +++ b/rhodecode/tests/vcs/__init__.py @@ -19,10 +19,10 @@ function at ``tests/__init__.py``. .. _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 @@ def setup_package(): '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 @@ def setup_package(): 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() diff --git a/rhodecode/tests/vcs/base.py b/rhodecode/tests/vcs/base.py --- a/rhodecode/tests/vcs/base.py +++ b/rhodecode/tests/vcs/base.py @@ -3,14 +3,13 @@ Module providing backend independent mix 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 @@ class BackendTestMixin(object): 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', []): diff --git a/rhodecode/tests/vcs/conf.py b/rhodecode/tests/vcs/conf.py --- a/rhodecode/tests/vcs/conf.py +++ b/rhodecode/tests/vcs/conf.py @@ -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 * diff --git a/rhodecode/tests/vcs/test_archives.py b/rhodecode/tests/vcs/test_archives.py --- a/rhodecode/tests/vcs/test_archives.py +++ b/rhodecode/tests/vcs/test_archives.py @@ -6,8 +6,8 @@ import zipfile 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 diff --git a/rhodecode/tests/vcs/test_branches.py b/rhodecode/tests/vcs/test_branches.py --- a/rhodecode/tests/vcs/test_branches.py +++ b/rhodecode/tests/vcs/test_branches.py @@ -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): diff --git a/rhodecode/tests/vcs/test_changesets.py b/rhodecode/tests/vcs/test_changesets.py --- a/rhodecode/tests/vcs/test_changesets.py +++ b/rhodecode/tests/vcs/test_changesets.py @@ -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 @@ class ChangesetsTestCaseMixin(BackendTes 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 @@ class ChangesetsTestCaseMixin(BackendTes 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 @@ class ChangesetsChangesTestCaseMixin(Bac '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 @@ class ChangesetsChangesTestCaseMixin(Bac 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 @@ class ChangesetsChangesTestCaseMixin(Bac 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: diff --git a/rhodecode/tests/vcs/test_filenodes_unicode_path.py b/rhodecode/tests/vcs/test_filenodes_unicode_path.py --- a/rhodecode/tests/vcs/test_filenodes_unicode_path.py +++ b/rhodecode/tests/vcs/test_filenodes_unicode_path.py @@ -5,8 +5,8 @@ from __future__ import with_statement 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): diff --git a/rhodecode/tests/vcs/test_getitem.py b/rhodecode/tests/vcs/test_getitem.py --- a/rhodecode/tests/vcs/test_getitem.py +++ b/rhodecode/tests/vcs/test_getitem.py @@ -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 diff --git a/rhodecode/tests/vcs/test_getslice.py b/rhodecode/tests/vcs/test_getslice.py --- a/rhodecode/tests/vcs/test_getslice.py +++ b/rhodecode/tests/vcs/test_getslice.py @@ -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 diff --git a/rhodecode/tests/vcs/test_git.py b/rhodecode/tests/vcs/test_git.py --- a/rhodecode/tests/vcs/test_git.py +++ b/rhodecode/tests/vcs/test_git.py @@ -8,7 +8,7 @@ from rhodecode.lib.vcs.exceptions import 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 @@ class GitChangesetTest(unittest.TestCase .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 @@ class GitChangesetTest(unittest.TestCase 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 diff --git a/rhodecode/tests/vcs/test_hg.py b/rhodecode/tests/vcs/test_hg.py --- a/rhodecode/tests/vcs/test_hg.py +++ b/rhodecode/tests/vcs/test_hg.py @@ -4,13 +4,13 @@ import os 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 @@ class MercurialRepositoryTest(unittest.T #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(): diff --git a/rhodecode/tests/vcs/test_inmemchangesets.py b/rhodecode/tests/vcs/test_inmemchangesets.py --- a/rhodecode/tests/vcs/test_inmemchangesets.py +++ b/rhodecode/tests/vcs/test_inmemchangesets.py @@ -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.exceptions import 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 @@ class InMemoryChangesetTestMixin(object) 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 @@ class InMemoryChangesetTestMixin(object) 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') diff --git a/rhodecode/tests/vcs/test_repository.py b/rhodecode/tests/vcs/test_repository.py --- a/rhodecode/tests/vcs/test_repository.py +++ b/rhodecode/tests/vcs/test_repository.py @@ -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 @@ class RepositoryBaseTest(BackendTestMixi 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): diff --git a/rhodecode/tests/vcs/test_tags.py b/rhodecode/tests/vcs/test_tags.py --- a/rhodecode/tests/vcs/test_tags.py +++ b/rhodecode/tests/vcs/test_tags.py @@ -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 diff --git a/rhodecode/tests/vcs/test_utils.py b/rhodecode/tests/vcs/test_utils.py --- a/rhodecode/tests/vcs/test_utils.py +++ b/rhodecode/tests/vcs/test_utils.py @@ -18,7 +18,7 @@ from rhodecode.lib.vcs.utils import auth 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): diff --git a/rhodecode/tests/vcs/test_vcs.py b/rhodecode/tests/vcs/test_vcs.py --- a/rhodecode/tests/vcs/test_vcs.py +++ b/rhodecode/tests/vcs/test_vcs.py @@ -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): diff --git a/rhodecode/tests/vcs/test_workdirs.py b/rhodecode/tests/vcs/test_workdirs.py --- a/rhodecode/tests/vcs/test_workdirs.py +++ b/rhodecode/tests/vcs/test_workdirs.py @@ -3,8 +3,8 @@ from __future__ import with_statement 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 @@ class WorkdirTestCaseMixin(BackendTestMi 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 @@ class WorkdirTestCaseMixin(BackendTestMi 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. diff --git a/setup.cfg b/setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -23,7 +23,9 @@ statistics = true [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 @@ build-dir = docs/_build all_files = 1 [upload_sphinx] -upload-dir = docs/_build/html \ No newline at end of file +upload-dir = docs/_build/html diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -30,10 +30,10 @@ callback = lambda V: ('.'.join(map(str, # 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 @@ if sys.version_info < (2, 7): 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 @@ setup( 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 @@ setup( 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 """, diff --git a/test.ini b/test.ini --- a/test.ini +++ b/test.ini @@ -47,7 +47,7 @@ threads = 5 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 @@ lang = en 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