Changeset - d6ac3baaa15a
[Not reviewed]
Merge default
0 24 0
Marcin Kuzminski - 13 years ago 2012-09-28 23:28:10
marcin@python-works.com
merged beta into stable
13 files changed:
0 comments (0 inline, 0 general)
CONTRIBUTORS
Show inline comments
 
List of contributors to RhodeCode project:
 
    Marcin Kuźmiński <marcin@python-works.com>
 
    Lukasz Balcerzak <lukaszbalcerzak@gmail.com>
 
    Jason Harris <jason@jasonfharris.com>
 
    Thayne Harbaugh  <thayne@fusionio.com>
 
    cejones <>
 
    Thomas Waldmann <tw-public@gmx.de>
 
    Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>
 
    Dmitri Kuznetsov <>
 
    Jared Bunting <jared.bunting@peachjean.com>
 
    Steve Romanow <slestak989@gmail.com>
 
    Augosto Hermann <augusto.herrmann@planejamento.gov.br>    
 
    Ankit Solanki <ankit.solanki@gmail.com>    
 
    Liad Shani <liadff@gmail.com>
 
    Les Peabody <lpeabody@gmail.com>
 
    Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
 
    Matt Zuba <matt.zuba@goodwillaz.org>
 
    Aras Pranckevicius <aras@unity3d.com>
 
    Tony Bussieres <t.bussieres@gmail.com>
 
    Erwin Kroon <e.kroon@smartmetersolutions.nl>
 
    nansenat16 <nansenat16@null.tw>
 
    Vincent Duvert <vincent@duvert.net>
 
    Takumi IINO <trot.thunder@gmail.com>
 
    Indra Talip <indra.talip@gmail.com>
 
    James Rhodes <jrhodes@redpointsoftware.com.au>
 
    Dominik Ruf <dominikruf@gmail.com>
 
    xpol <xpolife@gmail.com>
 
\ No newline at end of file
 
    xpol <xpolife@gmail.com>
 
    Vincent Caron <vcaron@bearstech.com>
 
    Zachary Auclair <zach101@gmail.com>
 
    Stefan Engel <mail@engel-stefan.de>
development.ini
Show inline comments
 
################################################################################
 
################################################################################
 
# RhodeCode - Pylons environment configuration                                 #
 
#                                                                              # 
 
# The %(here)s variable will be replaced with the parent directory of this file#
 
################################################################################
 

	
 
[DEFAULT]
 
debug = true
 
pdebug = false
 
################################################################################
 
## Uncomment and replace with the address which should receive                ## 
 
## any error reports after application crash                                  ##
 
## Additionally those settings will be used by RhodeCode mailing system       ##
 
################################################################################
 
#email_to = admin@localhost
 
#error_email_from = paste_error@localhost
 
#app_email_from = rhodecode-noreply@localhost
 
#error_message =
 
#email_prefix = [RhodeCode]
 

	
 
#smtp_server = mail.server.com
 
#smtp_username = 
 
#smtp_password = 
 
#smtp_port = 
 
#smtp_use_tls = false
 
#smtp_use_ssl = true
 
# Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
 
#smtp_auth = 
 

	
 
[server:main]
 
##nr of 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
 
use = egg:waitress#main
 
host = 0.0.0.0
 
port = 5000
 

	
 
[filter:proxy-prefix]
 
# prefix middleware for rc
 
use = egg:PasteDeploy#prefix
 
prefix = /<your-prefix>
 

	
 
[app:main]
 
use = egg:rhodecode
 
#filter-with = proxy-prefix
 
full_stack = true
 
static_files = true
 
# Optional Languages
 
# en, fr, ja, pt_BR, zh_CN, zh_TW
 
lang = en
 
cache_dir = %(here)s/data
 
index_dir = %(here)s/data/index
 
app_instance_uuid = rc-develop
 
cut_off_limit = 256000
 
force_https = false
 
commit_parse_limit = 25
 
use_gravatar = true
 

	
 
## alternative_gravatar_url allows you to use your own avatar server application
 
## the following parts of the URL will be replaced
 
## {email}        user email
 
## {md5email}     md5 hash of the user email (like at gravatar.com)
 
## {size}         size of the image that is expected from the server application
 
## {scheme}       http/https from RhodeCode server
 
## {netloc}       network location from RhodeCode server
 
#alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
 
#alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
 

	
 
container_auth_enabled = false
 
proxypass_auth_enabled = false
 
default_encoding = utf8
 

	
 
## overwrite schema of clone url
 
## available vars:
 
## scheme - http/https
 
## user - current user
 
## pass - password 
 
## netloc - network location
 
## path - usually repo_name
 

	
 
#clone_uri = {scheme}://{user}{pass}{netloc}{path}
 

	
 
## issue tracking mapping for commits messages
 
## comment out issue_pat, issue_server, issue_prefix to enable
 

	
 
## pattern to get the issues from commit messages
 
## default one used here is #<numbers> with a regex passive group for `#`
 
## {id} will be all groups matched from this pattern
 

	
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## fetched from the regex and {repo} is replaced with full repository name
 
## including groups {repo_name} is replaced with just name of repo
 

	
 
issue_server_link = https://myissueserver.com/{repo}/issue/{id}
 

	
 
## prefix to add to link to indicate it's an url
 
## #314 will be replaced by <issue_prefix><id>
 

	
 
issue_prefix = #
 

	
 
## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 
## multiple patterns, to other issues server, wiki or others
 
## below an example how to create a wiki pattern 
 
#  #wiki-some-id -> https://mywiki.com/some-id
 

	
 
#issue_pat_wiki = (?:wiki-)(.+)
 
#issue_server_link_wiki = https://mywiki.com/{id}
 
#issue_prefix_wiki = WIKI-
 

	
 

	
 
## instance-id prefix
 
## a prefix key for this instance used for cache invalidation when running 
 
## multiple instances of rhodecode, make sure it's globally unique for 
 
## all running rhodecode instances. Leave empty if you don't use it
 
instance_id = 
 

	
 
## alternative return HTTP header for failed authentication. Default HTTP
 
## response is 401 HTTPUnauthorized. Currently HG clients have troubles with 
 
## handling that. Set this variable to 403 to return HTTPForbidden
 
auth_ret_code =
 

	
 
####################################
 
###        CELERY CONFIG        ####
 
####################################
 
use_celery = false
 
broker.host = localhost
 
broker.vhost = rabbitmqhost
 
broker.port = 5672
 
broker.user = rabbitmq
 
broker.password = qweqwe
 

	
 
celery.imports = rhodecode.lib.celerylib.tasks
 

	
 
celery.result.backend = amqp
 
celery.result.dburi = amqp://
 
celery.result.serialier = json
 

	
 
#celery.send.task.error.emails = true
 
#celery.amqp.task.result.expires = 18000
 

	
 
celeryd.concurrency = 2
 
#celeryd.log.file = celeryd.log
 
celeryd.log.level = debug
 
celeryd.max.tasks.per.child = 1
 

	
 
#tasks will never be sent to the queue, but executed locally instead.
 
celery.always.eager = false
 

	
 
####################################
 
###         BEAKER CACHE        ####
 
####################################
 
beaker.cache.data_dir=%(here)s/data/cache/data
 
beaker.cache.lock_dir=%(here)s/data/cache/lock
 

	
 
beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
 

	
 
beaker.cache.super_short_term.type=memory
 
beaker.cache.super_short_term.expire=10
 
beaker.cache.super_short_term.key_length = 256
 

	
 
beaker.cache.short_term.type=memory
 
beaker.cache.short_term.expire=60
 
beaker.cache.short_term.key_length = 256
 

	
 
beaker.cache.long_term.type=memory
 
beaker.cache.long_term.expire=36000
 
beaker.cache.long_term.key_length = 256
 

	
 
beaker.cache.sql_cache_short.type=memory
 
beaker.cache.sql_cache_short.expire=10
 
beaker.cache.sql_cache_short.key_length = 256
 

	
 
beaker.cache.sql_cache_med.type=memory
 
beaker.cache.sql_cache_med.expire=360
 
beaker.cache.sql_cache_med.key_length = 256
 

	
 
beaker.cache.sql_cache_long.type=file
 
beaker.cache.sql_cache_long.expire=3600
 
beaker.cache.sql_cache_long.key_length = 256
 

	
 
####################################
 
###       BEAKER SESSION        ####
 
####################################
 
## Type of storage used for the session, current types are 
 
## dbm, file, memcached, database, and memory. 
 
## The storage uses the Container API 
 
## that is also used by the cache system.
 

	
 
## db session ##
 
#beaker.session.type = ext:database
 
#beaker.session.sa.url = postgresql://postgres:qwe@localhost/rhodecode
 
#beaker.session.table_name = db_session 
 

	
 
## encrypted cookie client side session, good for many instances ##
 
#beaker.session.type = cookie
 

	
 
## file based cookies (default) ##
 
#beaker.session.type = file
 

	
 

	
 
beaker.session.key = rhodecode
 
## secure cookie requires AES python libraries ##
 
#beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
 
#beaker.session.validate_key = 9712sds2212c--zxc123
 
## sets session as invalid if it haven't been accessed for given amount of time
 
beaker.session.timeout = 2592000
 
beaker.session.httponly = true
 
#beaker.session.cookie_path = /<your-prefix>
 

	
 
## uncomment for https secure cookie ##
 
beaker.session.secure = false
 

	
 
## auto save the session to not to use .save() ##
 
beaker.session.auto = False
 

	
 
## default cookie expiration time in seconds `true` expire at browser close ##
 
#beaker.session.cookie_expires = 3600
 

	
 

	
 
################################################################################
 
## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
 
## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
 
## execute malicious code after an exception is raised.                       ##
 
################################################################################
 
#set debug = false
 

	
 
##################################
 
###       LOGVIEW CONFIG       ###
 
##################################
 
logview.sqlalchemy = #faa
 
logview.pylons.templating = #bfb
 
logview.pylons.util = #eee
 

	
 
#########################################################
 
### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
 
#########################################################
 
#sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
 
sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
 
sqlalchemy.db1.echo = false
 
sqlalchemy.db1.pool_recycle = 3600
 
sqlalchemy.db1.convert_unicode = true
 

	
 
################################
 
### LOGGING CONFIGURATION   ####
 
################################
 
[loggers]
 
keys = root, routes, rhodecode, sqlalchemy, beaker, templates, whoosh_indexer
 

	
 
[handlers]
 
keys = console, console_sql
 

	
 
[formatters]
 
keys = generic, color_formatter, color_formatter_sql
 

	
 
#############
 
## LOGGERS ##
 
#############
 
[logger_root]
 
level = NOTSET
 
handlers = console
 

	
 
[logger_routes]
 
level = DEBUG
 
handlers = 
 
qualname = routes.middleware
 
# "level = DEBUG" logs the route matched and routing variables.
 
propagate = 1
 

	
 
[logger_beaker]
 
level = DEBUG
 
handlers = 
 
qualname = beaker.container
 
propagate = 1
 

	
 
[logger_templates]
 
level = INFO
 
handlers = 
 
qualname = pylons.templating
 
propagate = 1
 

	
 
[logger_rhodecode]
 
level = DEBUG
 
handlers = 
 
qualname = rhodecode
 
propagate = 1
 

	
 
[logger_sqlalchemy]
 
level = INFO
 
handlers = console_sql
 
qualname = sqlalchemy.engine
 
propagate = 0
 

	
 
[logger_whoosh_indexer]
 
level = DEBUG
 
handlers = 
 
qualname = whoosh_indexer
 
propagate = 1
 

	
 
##############
 
## HANDLERS ##
 
##############
 

	
docs/changelog.rst
Show inline comments
 
.. _changelog:
 

	
 
=========
 
Changelog
 
=========
 

	
 

	
 
1.4.3 (**2012-09-28**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- #558 Added config file to hooks extra data
 
- bumped mercurial version to 2.3.1
 
- #518 added possibility of specifying multiple patterns for issues
 

	
 
fixes
 
+++++
 

	
 
- fixed #570 explicit users group permissions can overwrite owner permissions
 
- fixed #578 set proper PATH with current Python for Git
 
  hooks to execute within same Python as RhodeCode 
 
- fixed issue with Git bare repos that ends with .git in name
 

	
 
1.4.2 (**2012-09-12**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- added option to menu to quick lock/unlock repository for users that have
 
  write access to
 
- Implemented permissions for writing to repo
 
  groups. Now only write access to group allows to create a repostiory
 
  within that group
 
- #565 Add support for {netloc} and {scheme} to alternative_gravatar_url
 
- updated translation for zh_CN 
 

	
 
fixes
 
+++++
 

	
 
- fixed visual permissions check on repos groups inside groups
 
- fixed issues with non-ascii search terms in search, and indexers
 
- fixed parsing of page number in GET parameters
 
- fixed issues with generating pull-request overview for repos with
 
  bookmarks and tags, also preview doesn't loose chosen revision from
 
  select dropdown
 

	
 
1.4.1 (**2012-09-07**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- always put a comment about code-review status change even if user send
 
  empty data 
 
- modified_on column saves repository update and it's going to be used
 
  later for light version of main page ref #500
 
- pull request notifications send much nicer emails with details about pull
 
  request
 
- #551 show breadcrumbs in summary view for repositories inside a group
 

	
 
fixes
 
+++++
 

	
 
- fixed migrations of permissions that can lead to inconsistency.
 
  Some users sent feedback that after upgrading from older versions issues 
 
  with updating default permissions occurred. RhodeCode detects that now and
 
  resets default user permission to initial state if there is a need for that.
 
  Also forces users to set the default value for new forking permission. 
 
- #535 improved apache wsgi example configuration in docs
 
- fixes #550 mercurial repositories comparision failed when origin repo had
 
  additional not-common changesets
 
- fixed status of code-review in preview windows of pull request
 
- git forks were not initialized at bare repos
 
- fixes #555 fixes issues with comparing non-related repositories
 
- fixes #557 follower counter always counts up
 
- fixed issue #560 require push ssl checkbox wasn't shown when option was
 
  enabled
 
- fixed #559
 
- fixed issue #559 fixed bug in routing that mapped repo names with <name>_<num> in name as
 
  if it was a request to url by repository ID
 

	
 
1.4.0 (**2012-09-03**)
 
----------------------
 

	
 
news
 
++++
 
 
 
- new codereview system
 
- email map, allowing users to have multiple email addresses mapped into
 
  their accounts
 
- improved git-hook system. Now all actions for git are logged into journal
 
  including pushed revisions, user and IP address
 
- changed setup-app into setup-rhodecode and added default options to it.
 
- new git repos are created as bare now by default
 
- #464 added links to groups in permission box
 
- #465 mentions autocomplete inside comments boxes
 
- #469 added --update-only option to whoosh to re-index only given list
 
  of repos in index 
 
- rhodecode-api CLI client
 
- new git http protocol replaced buggy dulwich implementation.
 
  Now based on pygrack & gitweb
 
- Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and 
 
  reformated based on user suggestions. Additional rss/atom feeds for user
 
  journal
 
- various i18n improvements
 
- #478 permissions overview for admin in user edit view
 
- File view now displays small gravatars off all authors of given file
 
- Implemented landing revisions. Each repository will get landing_rev attribute
 
  that defines 'default' revision/branch for generating readme files
 
- Implemented #509, RhodeCode enforces SSL for push/pulling if requested at 
 
  earliest possible call.
 
- Import remote svn repositories to mercurial using hgsubversion.
 
- Fixed #508 RhodeCode now has a option to explicitly set forking permissions
 
- RhodeCode can use alternative server for generating avatar icons
 
- implemented repositories locking. Pull locks, push unlocks. Also can be done
 
  via API calls
 
- #538 form for permissions can handle multiple users at once 
 

	
 
fixes
 
+++++
 

	
 
- improved translations
 
- fixes issue #455 Creating an archive generates an exception on Windows
 
- fixes #448 Download ZIP archive keeps file in /tmp open and results 
 
  in out of disk space
 
- fixes issue #454 Search results under Windows include proceeding
 
  backslash
 
- fixed issue #450. Rhodecode no longer will crash when bad revision is
 
  present in journal data.
 
- fix for issue #417, git execution was broken on windows for certain
 
  commands.
 
- fixed #413. Don't disable .git directory for bare repos on deleting
 
- fixed issue #459. Changed the way of obtaining logger in reindex task.
 
- fixed #453 added ID field in whoosh SCHEMA that solves the issue of
 
  reindexing modified files
 
- fixed #481 rhodecode emails are sent without Date header 
 
- fixed #458 wrong count when no repos are present
 
- fixed issue #492 missing `\ No newline at end of file` test at the end of 
 
  new chunk in html diff
 
- full text search now works also for commit messages
 

	
 
1.3.6 (**2012-05-17**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- chinese traditional translation
 
- changed setup-app into setup-rhodecode and added arguments for auto-setup 
 
  mode that doesn't need user interaction 
 

	
 
fixes
 
+++++
 

	
 
- fixed no scm found warning
 
- fixed __future__ import error on rcextensions
 
- made simplejson required lib for speedup on JSON encoding
 
- fixes #449 bad regex could get more than revisions from parsing history
 
- don't clear DB session when CELERY_EAGER is turned ON
 

	
 
1.3.5 (**2012-05-10**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- use ext_json for json module
 
- unified annotation view with file source view
 
- notification improvements, better inbox + css
 
- #419 don't strip passwords for login forms, make rhodecode 
 
  more compatible with LDAP servers
 
- Added HTTP_X_FORWARDED_FOR as another method of extracting 
 
  IP for pull/push logs. - moved all to base controller  
 
- #415: Adding comment to changeset causes reload. 
 
  Comments are now added via ajax and doesn't reload the page
 
- #374 LDAP config is discarded when LDAP can't be activated
 
- limited push/pull operations are now logged for git in the journal
 
- bumped mercurial to 2.2.X series
 
- added support for displaying submodules in file-browser
 
- #421 added bookmarks in changelog view
 

	
 
fixes
 
+++++
 

	
 
- fixed dev-version marker for stable when served from source codes
 
- fixed missing permission checks on show forks page
 
- #418 cast to unicode fixes in notification objects
 
- #426 fixed mention extracting regex
 
- fixed remote-pulling for git remotes remopositories
 
- fixed #434: Error when accessing files or changesets of a git repository 
 
  with submodules
 
- fixed issue with empty APIKEYS for users after registration ref. #438
 
- fixed issue with getting README files from git repositories
 

	
 
1.3.4 (**2012-03-28**)
 
----------------------
 

	
 
news
 
++++
 

	
 
- Whoosh logging is now controlled by the .ini files logging setup
 
- added clone-url into edit form on /settings page
 
- added help text into repo add/edit forms
 
- created rcextensions module with additional mappings (ref #322) and
 
  post push/pull/create repo hooks callbacks
 
- implemented #377 Users view for his own permissions on account page
 
- #399 added inheritance of permissions for users group on repos groups
 
- #401 repository group is automatically pre-selected when adding repos 
 
  inside a repository group
 
- added alternative HTTP 403 response when client failed to authenticate. Helps 
 
  solving issues with Mercurial and LDAP
 
- #402 removed group prefix from repository name when listing repositories 
 
  inside a group
 
- added gravatars into permission view and permissions autocomplete
production.ini
Show inline comments
 
################################################################################
 
################################################################################
 
# RhodeCode - Pylons environment configuration                                 #
 
#                                                                              # 
 
# The %(here)s variable will be replaced with the parent directory of this file#
 
################################################################################
 

	
 
[DEFAULT]
 
debug = true
 
pdebug = false
 
################################################################################
 
## Uncomment and replace with the address which should receive                ## 
 
## any error reports after application crash                                  ##
 
## Additionally those settings will be used by RhodeCode mailing system       ##
 
################################################################################
 
#email_to = admin@localhost
 
#error_email_from = paste_error@localhost
 
#app_email_from = rhodecode-noreply@localhost
 
#error_message =
 
#email_prefix = [RhodeCode]
 

	
 
#smtp_server = mail.server.com
 
#smtp_username = 
 
#smtp_password = 
 
#smtp_port = 
 
#smtp_use_tls = false
 
#smtp_use_ssl = true
 
# Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
 
#smtp_auth = 
 

	
 
[server:main]
 
##nr of 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
 
use = egg:waitress#main
 
host = 127.0.0.1
 
port = 8001
 

	
 
[filter:proxy-prefix]
 
# prefix middleware for rc
 
use = egg:PasteDeploy#prefix
 
prefix = /<your-prefix>
 

	
 
[app:main]
 
use = egg:rhodecode
 
#filter-with = proxy-prefix
 
full_stack = true
 
static_files = true
 
# Optional Languages
 
# en, fr, ja, pt_BR, zh_CN, zh_TW
 
lang = en
 
cache_dir = %(here)s/data
 
index_dir = %(here)s/data/index
 
app_instance_uuid = rc-production
 
cut_off_limit = 256000
 
force_https = false
 
commit_parse_limit = 50
 
use_gravatar = true
 

	
 
## alternative_gravatar_url allows you to use your own avatar server application
 
## the following parts of the URL will be replaced
 
## {email}        user email
 
## {md5email}     md5 hash of the user email (like at gravatar.com)
 
## {size}         size of the image that is expected from the server application
 
## {scheme}       http/https from RhodeCode server
 
## {netloc}       network location from RhodeCode server
 
#alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
 
#alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
 

	
 
container_auth_enabled = false
 
proxypass_auth_enabled = false
 
default_encoding = utf8
 

	
 
## overwrite schema of clone url
 
## available vars:
 
## scheme - http/https
 
## user - current user
 
## pass - password 
 
## netloc - network location
 
## path - usually repo_name
 

	
 
#clone_uri = {scheme}://{user}{pass}{netloc}{path}
 

	
 
## issue tracking mapping for commits messages
 
## comment out issue_pat, issue_server, issue_prefix to enable
 

	
 
## pattern to get the issues from commit messages
 
## default one used here is #<numbers> with a regex passive group for `#`
 
## {id} will be all groups matched from this pattern
 

	
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## fetched from the regex and {repo} is replaced with full repository name
 
## including groups {repo_name} is replaced with just name of repo
 

	
 
issue_server_link = https://myissueserver.com/{repo}/issue/{id}
 

	
 
## prefix to add to link to indicate it's an url
 
## #314 will be replaced by <issue_prefix><id>
 

	
 
issue_prefix = #
 

	
 
## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 
## multiple patterns, to other issues server, wiki or others
 
## below an example how to create a wiki pattern 
 
#  #wiki-some-id -> https://mywiki.com/some-id
 

	
 
#issue_pat_wiki = (?:wiki-)(.+)
 
#issue_server_link_wiki = https://mywiki.com/{id}
 
#issue_prefix_wiki = WIKI-
 

	
 

	
 
## instance-id prefix
 
## a prefix key for this instance used for cache invalidation when running 
 
## multiple instances of rhodecode, make sure it's globally unique for 
 
## all running rhodecode instances. Leave empty if you don't use it
 
instance_id = 
 

	
 
## alternative return HTTP header for failed authentication. Default HTTP
 
## response is 401 HTTPUnauthorized. Currently HG clients have troubles with 
 
## handling that. Set this variable to 403 to return HTTPForbidden
 
auth_ret_code =
 

	
 
####################################
 
###        CELERY CONFIG        ####
 
####################################
 
use_celery = false
 
broker.host = localhost
 
broker.vhost = rabbitmqhost
 
broker.port = 5672
 
broker.user = rabbitmq
 
broker.password = qweqwe
 

	
 
celery.imports = rhodecode.lib.celerylib.tasks
 

	
 
celery.result.backend = amqp
 
celery.result.dburi = amqp://
 
celery.result.serialier = json
 

	
 
#celery.send.task.error.emails = true
 
#celery.amqp.task.result.expires = 18000
 

	
 
celeryd.concurrency = 2
 
#celeryd.log.file = celeryd.log
 
celeryd.log.level = debug
 
celeryd.max.tasks.per.child = 1
 

	
 
#tasks will never be sent to the queue, but executed locally instead.
 
celery.always.eager = false
 

	
 
####################################
 
###         BEAKER CACHE        ####
 
####################################
 
beaker.cache.data_dir=%(here)s/data/cache/data
 
beaker.cache.lock_dir=%(here)s/data/cache/lock
 

	
 
beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
 

	
 
beaker.cache.super_short_term.type=memory
 
beaker.cache.super_short_term.expire=10
 
beaker.cache.super_short_term.key_length = 256
 

	
 
beaker.cache.short_term.type=memory
 
beaker.cache.short_term.expire=60
 
beaker.cache.short_term.key_length = 256
 

	
 
beaker.cache.long_term.type=memory
 
beaker.cache.long_term.expire=36000
 
beaker.cache.long_term.key_length = 256
 

	
 
beaker.cache.sql_cache_short.type=memory
 
beaker.cache.sql_cache_short.expire=10
 
beaker.cache.sql_cache_short.key_length = 256
 

	
 
beaker.cache.sql_cache_med.type=memory
 
beaker.cache.sql_cache_med.expire=360
 
beaker.cache.sql_cache_med.key_length = 256
 

	
 
beaker.cache.sql_cache_long.type=file
 
beaker.cache.sql_cache_long.expire=3600
 
beaker.cache.sql_cache_long.key_length = 256
 

	
 
####################################
 
###       BEAKER SESSION        ####
 
####################################
 
## Type of storage used for the session, current types are 
 
## dbm, file, memcached, database, and memory. 
 
## The storage uses the Container API 
 
## that is also used by the cache system.
 

	
 
## db session ##
 
#beaker.session.type = ext:database
 
#beaker.session.sa.url = postgresql://postgres:qwe@localhost/rhodecode
 
#beaker.session.table_name = db_session 
 

	
 
## encrypted cookie client side session, good for many instances ##
 
#beaker.session.type = cookie
 

	
 
## file based cookies (default) ##
 
#beaker.session.type = file
 

	
 

	
 
beaker.session.key = rhodecode
 
## secure cookie requires AES python libraries ##
 
#beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
 
#beaker.session.validate_key = 9712sds2212c--zxc123
 
## sets session as invalid if it haven't been accessed for given amount of time
 
beaker.session.timeout = 2592000
 
beaker.session.httponly = true
 
#beaker.session.cookie_path = /<your-prefix>
 

	
 
## uncomment for https secure cookie ##
 
beaker.session.secure = false
 

	
 
## auto save the session to not to use .save() ##
 
beaker.session.auto = False
 

	
 
## default cookie expiration time in seconds `true` expire at browser close ##
 
#beaker.session.cookie_expires = 3600
 

	
 

	
 
################################################################################
 
## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
 
## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
 
## execute malicious code after an exception is raised.                       ##
 
################################################################################
 
set debug = false
 

	
 
##################################
 
###       LOGVIEW CONFIG       ###
 
##################################
 
logview.sqlalchemy = #faa
 
logview.pylons.templating = #bfb
 
logview.pylons.util = #eee
 

	
 
#########################################################
 
### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
 
#########################################################
 
#sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
 
sqlalchemy.db1.url = postgresql://postgres:qwe@localhost/rhodecode
 
sqlalchemy.db1.echo = false
 
sqlalchemy.db1.pool_recycle = 3600
 
sqlalchemy.db1.convert_unicode = true
 

	
 
################################
 
### LOGGING CONFIGURATION   ####
 
################################
 
[loggers]
 
keys = root, routes, rhodecode, sqlalchemy, beaker, templates, whoosh_indexer
 

	
 
[handlers]
 
keys = console, console_sql
 

	
 
[formatters]
 
keys = generic, color_formatter, color_formatter_sql
 

	
 
#############
 
## LOGGERS ##
 
#############
 
[logger_root]
 
level = NOTSET
 
handlers = console
 

	
 
[logger_routes]
 
level = DEBUG
 
handlers = 
 
qualname = routes.middleware
 
# "level = DEBUG" logs the route matched and routing variables.
 
propagate = 1
 

	
 
[logger_beaker]
 
level = DEBUG
 
handlers = 
 
qualname = beaker.container
 
propagate = 1
 

	
 
[logger_templates]
 
level = INFO
 
handlers = 
 
qualname = pylons.templating
 
propagate = 1
 

	
 
[logger_rhodecode]
 
level = DEBUG
 
handlers = 
 
qualname = rhodecode
 
propagate = 1
 

	
 
[logger_sqlalchemy]
 
level = INFO
 
handlers = console_sql
 
qualname = sqlalchemy.engine
 
propagate = 0
 

	
 
[logger_whoosh_indexer]
 
level = DEBUG
 
handlers = 
 
qualname = whoosh_indexer
 
propagate = 1
 

	
 
##############
 
## HANDLERS ##
 
##############
 

	
rhodecode/__init__.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.__init__
 
    ~~~~~~~~~~~~~~~~~~
 

	
 
    RhodeCode, a web based repository management based on pylons
 
    versioning implementation: http://www.python.org/dev/peps/pep-0386/
 

	
 
    :created_on: Apr 9, 2010
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
import sys
 
import platform
 

	
 
VERSION = (1, 4, 2)
 
VERSION = (1, 4, 3)
 

	
 
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__ = 7  # 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
 

	
 

	
 
BACKENDS = {
 
    'hg': 'Mercurial repository',
 
    'git': 'Git repository',
 
}
 

	
 
CELERY_ON = False
 
CELERY_EAGER = False
 

	
 
# link to config for pylons
 
CONFIG = {}
 

	
 
# Linked module for extensions
 
EXTENSIONS = {}
rhodecode/config/deployment.ini_tmpl
Show inline comments
 
################################################################################
 
################################################################################
 
# RhodeCode - Pylons environment configuration                                 #
 
#                                                                              # 
 
# The %(here)s variable will be replaced with the parent directory of this file#
 
################################################################################
 

	
 
[DEFAULT]
 
debug = true
 
pdebug = false
 
################################################################################
 
## Uncomment and replace with the address which should receive                ## 
 
## any error reports after application crash                                  ##
 
## Additionally those settings will be used by RhodeCode mailing system       ##
 
################################################################################
 
#email_to = admin@localhost
 
#error_email_from = paste_error@localhost
 
#app_email_from = rhodecode-noreply@localhost
 
#error_message =
 
#email_prefix = [RhodeCode]
 

	
 
#smtp_server = mail.server.com
 
#smtp_username = 
 
#smtp_password = 
 
#smtp_port = 
 
#smtp_use_tls = false
 
#smtp_use_ssl = true
 
# Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
 
#smtp_auth = 
 

	
 
[server:main]
 
##nr of 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
 
use = egg:waitress#main
 
host = 127.0.0.1
 
port = 5000
 

	
 
[filter:proxy-prefix]
 
# prefix middleware for rc
 
use = egg:PasteDeploy#prefix
 
prefix = /<your-prefix>
 

	
 
[app:main]
 
use = egg:rhodecode
 
#filter-with = proxy-prefix
 
full_stack = true
 
static_files = true
 
# Optional Languages
 
# en, fr, ja, pt_BR, zh_CN, zh_TW
 
lang = en
 
cache_dir = %(here)s/data
 
index_dir = %(here)s/data/index
 
app_instance_uuid = ${app_instance_uuid}
 
cut_off_limit = 256000
 
force_https = false
 
commit_parse_limit = 50
 
use_gravatar = true
 

	
 
## alternative_gravatar_url allows you to use your own avatar server application
 
## the following parts of the URL will be replaced
 
## {email}        user email
 
## {md5email}     md5 hash of the user email (like at gravatar.com)
 
## {size}         size of the image that is expected from the server application
 
## {scheme}       http/https from RhodeCode server
 
## {netloc}       network location from RhodeCode server
 
#alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size}
 
#alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size}
 

	
 
container_auth_enabled = false
 
proxypass_auth_enabled = false
 
default_encoding = utf8
 

	
 
## overwrite schema of clone url
 
## available vars:
 
## scheme - http/https
 
## user - current user
 
## pass - password 
 
## netloc - network location
 
## path - usually repo_name
 

	
 
#clone_uri = {scheme}://{user}{pass}{netloc}{path}
 

	
 
## issue tracking mapping for commits messages
 
## comment out issue_pat, issue_server, issue_prefix to enable
 

	
 
## pattern to get the issues from commit messages
 
## default one used here is #<numbers> with a regex passive group for `#`
 
## {id} will be all groups matched from this pattern
 

	
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## fetched from the regex and {repo} is replaced with full repository name
 
## including groups {repo_name} is replaced with just name of repo
 

	
 
issue_server_link = https://myissueserver.com/{repo}/issue/{id}
 

	
 
## prefix to add to link to indicate it's an url
 
## #314 will be replaced by <issue_prefix><id>
 

	
 
issue_prefix = #
 

	
 
## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 
## multiple patterns, to other issues server, wiki or others
 
## below an example how to create a wiki pattern 
 
#  #wiki-some-id -> https://mywiki.com/some-id
 

	
 
#issue_pat_wiki = (?:wiki-)(.+)
 
#issue_server_link_wiki = https://mywiki.com/{id}
 
#issue_prefix_wiki = WIKI-
 

	
 

	
 
## instance-id prefix
 
## a prefix key for this instance used for cache invalidation when running 
 
## multiple instances of rhodecode, make sure it's globally unique for 
 
## all running rhodecode instances. Leave empty if you don't use it
 
instance_id = 
 

	
 
## alternative return HTTP header for failed authentication. Default HTTP
 
## response is 401 HTTPUnauthorized. Currently HG clients have troubles with 
 
## handling that. Set this variable to 403 to return HTTPForbidden
 
auth_ret_code =
 

	
 
####################################
 
###        CELERY CONFIG        ####
 
####################################
 
use_celery = false
 
broker.host = localhost
 
broker.vhost = rabbitmqhost
 
broker.port = 5672
 
broker.user = rabbitmq
 
broker.password = qweqwe
 

	
 
celery.imports = rhodecode.lib.celerylib.tasks
 

	
 
celery.result.backend = amqp
 
celery.result.dburi = amqp://
 
celery.result.serialier = json
 

	
 
#celery.send.task.error.emails = true
 
#celery.amqp.task.result.expires = 18000
 

	
 
celeryd.concurrency = 2
 
#celeryd.log.file = celeryd.log
 
celeryd.log.level = debug
 
celeryd.max.tasks.per.child = 1
 

	
 
#tasks will never be sent to the queue, but executed locally instead.
 
celery.always.eager = false
 

	
 
####################################
 
###         BEAKER CACHE        ####
 
####################################
 
beaker.cache.data_dir=%(here)s/data/cache/data
 
beaker.cache.lock_dir=%(here)s/data/cache/lock
 

	
 
beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
 

	
 
beaker.cache.super_short_term.type=memory
 
beaker.cache.super_short_term.expire=10
 
beaker.cache.super_short_term.key_length = 256
 

	
 
beaker.cache.short_term.type=memory
 
beaker.cache.short_term.expire=60
 
beaker.cache.short_term.key_length = 256
 

	
 
beaker.cache.long_term.type=memory
 
beaker.cache.long_term.expire=36000
 
beaker.cache.long_term.key_length = 256
 

	
 
beaker.cache.sql_cache_short.type=memory
 
beaker.cache.sql_cache_short.expire=10
 
beaker.cache.sql_cache_short.key_length = 256
 

	
 
beaker.cache.sql_cache_med.type=memory
 
beaker.cache.sql_cache_med.expire=360
 
beaker.cache.sql_cache_med.key_length = 256
 

	
 
beaker.cache.sql_cache_long.type=file
 
beaker.cache.sql_cache_long.expire=3600
 
beaker.cache.sql_cache_long.key_length = 256
 

	
 
####################################
 
###       BEAKER SESSION        ####
 
####################################
 
## Type of storage used for the session, current types are 
 
## dbm, file, memcached, database, and memory. 
 
## The storage uses the Container API 
 
## that is also used by the cache system.
 

	
 
## db session ##
 
#beaker.session.type = ext:database
 
#beaker.session.sa.url = postgresql://postgres:qwe@localhost/rhodecode
 
#beaker.session.table_name = db_session 
 

	
 
## encrypted cookie client side session, good for many instances ##
 
#beaker.session.type = cookie
 

	
 
## file based cookies (default) ##
 
#beaker.session.type = file
 

	
 

	
 
beaker.session.key = rhodecode
 
## secure cookie requires AES python libraries ##
 
#beaker.session.encrypt_key = g654dcno0-9873jhgfreyu
 
#beaker.session.validate_key = 9712sds2212c--zxc123
 
## sets session as invalid if it haven't been accessed for given amount of time
 
beaker.session.timeout = 2592000
 
beaker.session.httponly = true
 
#beaker.session.cookie_path = /<your-prefix>
 

	
 
## uncomment for https secure cookie ##
 
beaker.session.secure = false
 

	
 
## auto save the session to not to use .save() ##
 
beaker.session.auto = False
 

	
 
## default cookie expiration time in seconds `true` expire at browser close ##
 
#beaker.session.cookie_expires = 3600
 

	
 

	
 
################################################################################
 
## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
 
## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
 
## execute malicious code after an exception is raised.                       ##
 
################################################################################
 
set debug = false
 

	
 
##################################
 
###       LOGVIEW CONFIG       ###
 
##################################
 
logview.sqlalchemy = #faa
 
logview.pylons.templating = #bfb
 
logview.pylons.util = #eee
 

	
 
#########################################################
 
### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
 
#########################################################
 

	
 
# SQLITE [default]
 
sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
 
 
 
# POSTGRESQL
 
# sqlalchemy.db1.url = postgresql://user:pass@localhost/rhodecode
 

	
 
# MySQL
 
# sqlalchemy.db1.url = mysql://user:pass@localhost/rhodecode
 

	
 
# see sqlalchemy docs for others
 

	
 
sqlalchemy.db1.echo = false
 
sqlalchemy.db1.pool_recycle = 3600
 
sqlalchemy.db1.convert_unicode = true
 

	
 
################################
 
### LOGGING CONFIGURATION   ####
 
################################
 
[loggers]
 
keys = root, routes, rhodecode, sqlalchemy, beaker, templates, whoosh_indexer
 

	
 
[handlers]
 
keys = console, console_sql
 

	
 
[formatters]
 
keys = generic, color_formatter, color_formatter_sql
 

	
 
#############
 
## LOGGERS ##
 
#############
 
[logger_root]
 
level = NOTSET
 
handlers = console
 

	
 
[logger_routes]
 
level = DEBUG
 
handlers = 
 
qualname = routes.middleware
 
# "level = DEBUG" logs the route matched and routing variables.
 
propagate = 1
 

	
 
[logger_beaker]
 
level = DEBUG
 
handlers = 
 
qualname = beaker.container
 
propagate = 1
 

	
 
[logger_templates]
 
level = INFO
 
handlers = 
 
qualname = pylons.templating
 
propagate = 1
 

	
 
[logger_rhodecode]
 
level = DEBUG
 
handlers = 
 
qualname = rhodecode
 
propagate = 1
 

	
 
[logger_sqlalchemy]
 
level = INFO
 
handlers = console_sql
 
qualname = sqlalchemy.engine
 
propagate = 0
 

	
rhodecode/controllers/pullrequests.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.controllers.pullrequests
 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
    pull requests controller for rhodecode for initializing pull requests
 

	
 
    :created_on: May 7, 2012
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
import logging
 
import traceback
 
import formencode
 

	
 
from webob.exc import HTTPNotFound, HTTPForbidden
 
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.i18n.translation import _
 
from pylons.decorators import jsonify
 

	
 
from rhodecode.lib.compat import json
 
from rhodecode.lib.base import BaseRepoController, render
 
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
 
    NotAnonymous
 
from rhodecode.lib import helpers as h
 
from rhodecode.lib import diffs
 
from rhodecode.lib.utils import action_logger
 
from rhodecode.model.db import User, 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 rhodecode.lib.vcs.exceptions import EmptyRepositoryError
 

	
 
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):
 
        hist_l = []
 

	
 
        branches_group = ([('branch:%s:%s' % (k, v), k) for
 
                         k, v in repo.branches.iteritems()], _("Branches"))
 
        bookmarks_group = ([('book:%s:%s' % (k, v), k) for
 
                         k, v in repo.bookmarks.iteritems()], _("Bookmarks"))
 
        tags_group = ([('tag:%s:%s' % (k, v), k) for
 
                         k, v in repo.tags.iteritems()], _("Tags"))
 

	
 
        hist_l.append(bookmarks_group)
 
        hist_l.append(branches_group)
 
        hist_l.append(tags_group)
 

	
 
        return hist_l
 

	
 
    def _get_default_rev(self, repo):
 
        """
 
        Get's default revision to do compare on pull request
 

	
 
        :param repo:
 
        """
 
        repo = repo.scm_instance
 
        if 'default' in repo.branches:
 
            return 'default'
 
        else:
 
            #if repo doesn't have default branch return first found
 
            return repo.branches.keys()[0]
 

	
 
    def show_all(self, repo_name):
 
        c.pull_requests = PullRequestModel().get_all(repo_name)
 
        c.repo_name = repo_name
 
        return render('/pullrequests/pullrequest_show_all.html')
 

	
 
    @NotAnonymous()
 
    def index(self):
 
        org_repo = c.rhodecode_db_repo
 

	
 
        if org_repo.scm_instance.alias != 'hg':
 
            log.error('Review not available for GIT REPOS')
 
            raise HTTPNotFound
 

	
 
        try:
 
            org_repo.scm_instance.get_changeset()
 
        except EmptyRepositoryError, e:
 
            h.flash(h.literal(_('There are no changesets yet')),
 
                    category='warning')
 
            redirect(url('summary_home', repo_name=org_repo.repo_name))
 

	
 
        other_repos_info = {}
 

	
 
        c.org_refs = self._get_repo_refs(c.rhodecode_repo)
 
        c.org_repos = []
 
        c.other_repos = []
 
        c.org_repos.append((org_repo.repo_name, '%s/%s' % (
 
                                org_repo.user.username, c.repo_name))
 
                           )
 

	
 
        # add org repo to other so we can open pull request agains itself
 
        c.other_repos.extend(c.org_repos)
 

	
 
        c.default_pull_request = org_repo.repo_name  # repo name pre-selected
 
        c.default_pull_request_rev = self._get_default_rev(org_repo)  # revision pre-selected
 
        c.default_revs = self._get_repo_refs(org_repo.scm_instance)
 
        #add orginal repo
 
        other_repos_info[org_repo.repo_name] = {
 
            'gravatar': h.gravatar_url(org_repo.user.email, 24),
 
            'description': org_repo.description,
 
            'revs': h.select('other_ref', '', c.default_revs, class_='refs')
 
        }
 

	
 
        #gather forks and add to this list
 
        for fork in org_repo.forks:
 
            c.other_repos.append((fork.repo_name, '%s/%s' % (
 
                                    fork.user.username, fork.repo_name))
 
                                 )
 
            other_repos_info[fork.repo_name] = {
 
                'gravatar': h.gravatar_url(fork.user.email, 24),
 
                'description': fork.description,
 
                'revs': h.select('other_ref', '',
 
                                 self._get_repo_refs(fork.scm_instance),
 
                                 class_='refs')
 
            }
 
        #add parents of this fork also
 
        if org_repo.parent:
 
            c.default_pull_request = org_repo.parent.repo_name
 
            c.default_pull_request_rev = self._get_default_rev(org_repo.parent)
 
            c.default_revs = self._get_repo_refs(org_repo.parent.scm_instance)
 
            c.other_repos.append((org_repo.parent.repo_name, '%s/%s' % (
 
                                        org_repo.parent.user.username,
 
                                        org_repo.parent.repo_name))
 
                                     )
 
            other_repos_info[org_repo.parent.repo_name] = {
 
                'gravatar': h.gravatar_url(org_repo.parent.user.email, 24),
 
                'description': org_repo.parent.description,
 
                'revs': h.select('other_ref', '',
 
                                 self._get_repo_refs(org_repo.parent.scm_instance),
 
                                 class_='refs')
 
            }
 

	
 
        c.other_repos_info = json.dumps(other_repos_info)
 
        c.review_members = [org_repo.user]
 
        return render('/pullrequests/pullrequest.html')
 

	
 
    @NotAnonymous()
 
    def create(self, repo_name):
 
        try:
 
            _form = PullRequestForm()().to_python(request.POST)
 
        except formencode.Invalid, errors:
 
            log.error(traceback.format_exc())
 
            if errors.error_dict.get('revisions'):
 
                msg = 'Revisions: %s' % errors.error_dict['revisions']
 
            elif errors.error_dict.get('pullrequest_title'):
 
                msg = _('Pull request requires a title with min. 3 chars')
 
            else:
 
                msg = _('error during creation of pull request')
 

	
 
            h.flash(msg, 'error')
 
            return redirect(url('pullrequest_home', repo_name=repo_name))
 

	
 
        org_repo = _form['org_repo']
 
        org_ref = _form['org_ref']
 
        other_repo = _form['other_repo']
 
        other_ref = _form['other_ref']
 
        revisions = _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,
 
                other_ref, revisions, reviewers, title, description
 
            )
 
            Session().commit()
 
            h.flash(_('Successfully opened new pull request'),
 
                    category='success')
 
        except Exception:
 
            h.flash(_('Error occurred during sending pull request'),
 
                    category='error')
 
            log.error(traceback.format_exc())
 
            return redirect(url('pullrequest_home', repo_name=repo_name))
 

	
 
        return redirect(url('pullrequest_show', repo_name=other_repo,
 
                            pull_request_id=pull_request.pull_request_id))
 

	
 
    @NotAnonymous()
 
    @jsonify
 
    def update(self, repo_name, pull_request_id):
 
        pull_request = PullRequest.get_or_404(pull_request_id)
 
        if pull_request.is_closed():
 
            raise HTTPForbidden()
 
        #only owner or admin can update it
 
        owner = pull_request.author.user_id == c.rhodecode_user.user_id
 
        if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
 
            reviewers_ids = map(int, filter(lambda v: v not in [None, ''],
 
                       request.POST.get('reviewers_ids', '').split(',')))
 

	
 
            PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
 
            Session.commit()
 
            return True
 
        raise HTTPForbidden()
 

	
 
    @NotAnonymous()
 
    @jsonify
 
    def delete(self, repo_name, pull_request_id):
 
        pull_request = PullRequest.get_or_404(pull_request_id)
 
        #only owner can delete it !
 
        if pull_request.author.user_id == c.rhodecode_user.user_id:
 
            PullRequestModel().delete(pull_request)
 
            Session().commit()
 
            h.flash(_('Successfully deleted pull request'),
 
                    category='success')
 
            return redirect(url('admin_settings_my_account'))
 
        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 = pull_request.other_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 book 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.cs_ranges, discovery_data = PullRequestModel().get_compare_data(
 
                                       org_repo, org_ref, other_repo, other_ref
 
                                      )
 

	
 
        c.statuses = org_repo.statuses([x.raw_id for x in c.cs_ranges])
 
        # defines that we need hidden inputs with changesets
 
        c.as_form = request.GET.get('as_form', False)
 

	
 
        c.org_ref = org_ref[1]
 
        c.other_ref = other_ref[1]
 
        # diff needs to have swapped org with other to generate proper diff
 
        _diff = diffs.differ(other_repo, other_ref, org_repo, org_ref,
 
                             discovery_data)
 
        diff_processor = diffs.DiffProcessor(_diff, format='gitdiff')
 
        _parsed = diff_processor.prepare()
 

	
 
        c.files = []
 
        c.changes = {}
 

	
 
        for f in _parsed:
 
            fid = h.FID('', f['filename'])
 
            c.files.append([fid, f['operation'], f['filename'], f['stats']])
 
            diff = diff_processor.as_html(enable_comments=enable_comments,
 
                                          diff_lines=[f])
 
            c.changes[fid] = [f['operation'], f['filename'], diff]
 

	
 
    def show(self, repo_name, pull_request_id):
 
        repo_model = RepoModel()
 
        c.users_array = repo_model.get_users_js()
 
        c.users_groups_array = repo_model.get_users_groups_js()
 
        c.pull_request = PullRequest.get_or_404(pull_request_id)
 
        c.target_repo = c.pull_request.org_repo.repo_name
 

	
 
        cc_model = ChangesetCommentsModel()
 
        cs_model = ChangesetStatusModel()
 
        _cs_statuses = cs_model.get_statuses(c.pull_request.org_repo,
 
                                            pull_request=c.pull_request,
 
                                            with_revisions=True)
rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.mo
Show inline comments
 
binary diff not shown
rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po
Show inline comments
 
# Chinese (China) translations for RhodeCode.
 
# Copyright (C) 2011 ORGANIZATION
 
# This file is distributed under the same license as the RhodeCode project.
 
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
 
# mikespook <mikespook@gmail.com>, 2012.
 
# xpol <xpolife@gmail.com>, 2012.
 
msgid ""
 
msgstr ""
 
"Project-Id-Version: RhodeCode 1.2.0\n"
 
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 
"POT-Creation-Date: 2012-09-02 20:30+0200\n"
 
"PO-Revision-Date: 2012-09-19 13:27+0800\n"
 
"POT-Creation-Date: 2012-09-21 14:39+0800\n"
 
"PO-Revision-Date: 2012-09-21 15:20+0800\n"
 
"Last-Translator: xpol <xpolife@gmail.com>\n"
 
"Language-Team: mikespook\n"
 
"Plural-Forms: nplurals=1; plural=0;\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"
 
"X-Generator: Poedit 1.5.3\n"
 
"X-Poedit-Basepath: E:\\home\\rhodecode\n"
 
"X-Poedit-SourceCharset: UTF-8\n"
 

	
 
#: rhodecode/controllers/changelog.py:94
 

	
 
#: rhodecode/controllers/changelog.py:95
 
msgid "All Branches"
 
msgstr "所有分支"
 

	
 
#: rhodecode/controllers/changeset.py:83
 
msgid "show white space"
 
msgstr "显示空白字符"
 

	
 
#: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97
 
msgid "ignore white space"
 
msgstr "忽略空白字符"
 

	
 
#: rhodecode/controllers/changeset.py:157
 
#, python-format
 
msgid "%s line context"
 
msgstr "%s 行上下文"
 

	
 
#: rhodecode/controllers/changeset.py:333
 
#: rhodecode/controllers/changeset.py:348 rhodecode/lib/diffs.py:70
 
#: rhodecode/controllers/changeset.py:348 rhodecode/lib/diffs.py:71
 
msgid "binary file"
 
msgstr "二进制文件"
 

	
 
#: rhodecode/controllers/changeset.py:408
 
#: rhodecode/controllers/changeset.py:381
 
#: rhodecode/controllers/pullrequests.py:368
 
#, python-format
 
#| msgid "Last change"
 
msgid "Status change -> %s"
 
msgstr "状态改变 -> %s"
 

	
 
#: rhodecode/controllers/changeset.py:412
 
msgid ""
 
"Changing status on a changeset associated witha closed pull request is not "
 
"allowed"
 
msgstr "不允许修改已关闭拉取请求的修订集状态"
 

	
 
#: rhodecode/controllers/compare.py:69
 
#: rhodecode/controllers/compare.py:72
 
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:49
 
#, python-format
 
msgid "Changes on %s repository"
 
msgstr "%s 库的修改"
 

	
 
#: rhodecode/controllers/feed.py:50
 
#, python-format
 
msgid "%s %s feed"
 
msgstr "%s %s 订阅"
 

	
 
#: rhodecode/controllers/feed.py:75
 
#: rhodecode/controllers/feed.py:67
 
#: rhodecode/templates/changeset/changeset.html:119
 
msgid "Changeset was too big and was cut off..."
 
msgstr "修订集太大已被截断......"
 

	
 
#: rhodecode/controllers/feed.py:81
 
msgid "commited on"
 
msgstr "提交于"
 

	
 
#: rhodecode/controllers/files.py:84
 
msgid "click here to add new file"
 
msgstr "点击此处添加新文件"
 

	
 
#: rhodecode/controllers/files.py:85
 
#, python-format
 
msgid "There are no files yet %s"
 
msgstr "还没有文件 %s"
 

	
 
#: rhodecode/controllers/files.py:239 rhodecode/controllers/files.py:299
 
#, python-format
 
msgid "This repository is has been locked by %s on %s"
 
msgstr "版本库由 %s 于 %s 锁定"
 

	
 
#: rhodecode/controllers/files.py:266
 
#, python-format
 
msgid "Edited %s via RhodeCode"
 
msgstr "通过 RhodeCode 修改了 %s"
 

	
 
#: rhodecode/controllers/files.py:271
 
msgid "No changes"
 
msgstr "无变更"
 

	
 
#: rhodecode/controllers/files.py:282 rhodecode/controllers/files.py:346
 
#, python-format
 
msgid "Successfully committed to %s"
 
msgstr "成功提交到 %s"
 

	
 
#: rhodecode/controllers/files.py:287 rhodecode/controllers/files.py:352
 
msgid "Error occurred during commit"
 
msgstr "提交时发生错误"
 

	
 
#: rhodecode/controllers/files.py:318
 
#, python-format
 
msgid "Added %s via RhodeCode"
 
msgstr "通过 RhodeCode 添加了 %s"
 

	
 
#: rhodecode/controllers/files.py:332
 
msgid "No content"
 
msgstr "无内容"
 

	
 
#: rhodecode/controllers/files.py:336
 
msgid "No filename"
 
msgstr "无文件名"
 

	
 
#: rhodecode/controllers/files.py:378
 
msgid "downloads disabled"
 
msgstr "禁止下载"
 

	
 
#: rhodecode/controllers/files.py:389
 
#, python-format
 
msgid "Unknown revision %s"
 
msgstr "未知版本 %s"
 

	
 
#: rhodecode/controllers/files.py:391
 
msgid "Empty repository"
 
msgstr "空版本库"
 

	
 
#: rhodecode/controllers/files.py:393
 
msgid "Unknown archive type"
 
msgstr "未知包类型"
 

	
 
#: rhodecode/controllers/files.py:494
 
#: rhodecode/templates/changeset/changeset_range.html:13
 
#: rhodecode/templates/changeset/changeset_range.html:31
 
msgid "Changesets"
 
msgstr "修订集"
 

	
 
#: rhodecode/controllers/files.py:495 rhodecode/controllers/pullrequests.py:72
 
#: rhodecode/controllers/summary.py:232 rhodecode/model/scm.py:543
 
#: rhodecode/controllers/summary.py:234 rhodecode/model/scm.py:543
 
msgid "Branches"
 
msgstr "分支"
 

	
 
#: rhodecode/controllers/files.py:496 rhodecode/controllers/pullrequests.py:76
 
#: rhodecode/controllers/summary.py:233 rhodecode/model/scm.py:554
 
#: rhodecode/controllers/summary.py:235 rhodecode/model/scm.py:554
 
msgid "Tags"
 
msgstr "标签"
 

	
 
#: rhodecode/controllers/forks.py:73 rhodecode/controllers/admin/repos.py:90
 
#: rhodecode/controllers/forks.py:74 rhodecode/controllers/admin/repos.py:90
 
#, 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 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 RhodeCode "
 
"以重新扫描版本库"
 

	
 
#: rhodecode/controllers/forks.py:133 rhodecode/controllers/settings.py:72
 
#: rhodecode/controllers/forks.py:134 rhodecode/controllers/settings.py:73
 
#, python-format
 
msgid ""
 
"%s repository is not mapped to db perhaps it was created or renamed from the "
 
"file system please run the application again in order to rescan repositories"
 
msgstr ""
 
" 版本库 %s 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 "
 
"RhodeCode 以重新扫描版本库"
 

	
 
#: rhodecode/controllers/forks.py:167
 
#: rhodecode/controllers/forks.py:168
 
#, python-format
 
msgid "forked %s repository as %s"
 
msgstr "版本库 %s 被分支到 %s"
 

	
 
#: rhodecode/controllers/forks.py:181
 
#: rhodecode/controllers/forks.py:182
 
#, python-format
 
msgid "An error occurred during repository forking %s"
 
msgstr "在分支版本库 %s 的时候发生错误"
 

	
 
#: rhodecode/controllers/journal.py:202 rhodecode/controllers/journal.py:239
 
#: rhodecode/controllers/journal.py:203 rhodecode/controllers/journal.py:240
 
msgid "public journal"
 
msgstr "公共日志"
 

	
 
#: rhodecode/controllers/journal.py:206 rhodecode/controllers/journal.py:243
 
#: rhodecode/templates/base/base.html:220
 
#: rhodecode/controllers/journal.py:207 rhodecode/controllers/journal.py:244
 
#: rhodecode/templates/base/base.html:229
 
msgid "journal"
 
msgstr "日志"
 

	
 
#: rhodecode/controllers/login.py:143
 
msgid "You have successfully registered into rhodecode"
 
msgstr "成功注册到 rhodecode"
 

	
 
#: rhodecode/controllers/login.py:164
 
msgid "Your password reset link was sent"
 
msgstr "密码重置链接已经发送"
 

	
 
#: rhodecode/controllers/login.py:184
 
msgid ""
 
"Your password reset was successful, new password has been sent to your email"
 
msgstr "密码已经成功重置,新密码已经发送到你的邮箱"
 

	
 
#: rhodecode/controllers/pullrequests.py:74 rhodecode/model/scm.py:549
 
msgid "Bookmarks"
 
msgstr "书签"
 

	
 
#: rhodecode/controllers/pullrequests.py:158
 
#: rhodecode/controllers/pullrequests.py:174
 
msgid "Pull request requires a title with min. 3 chars"
 
msgstr "拉取请求的标题至少 3 个字符"
 

	
 
#: rhodecode/controllers/pullrequests.py:160
 
#: rhodecode/controllers/pullrequests.py:176
 
msgid "error during creation of pull request"
 
msgstr "提交拉取请求时发生错误"
 

	
 
#: rhodecode/controllers/pullrequests.py:181
 
#: rhodecode/controllers/pullrequests.py:197
 
msgid "Successfully opened new pull request"
 
msgstr "成功提交拉取请求"
 

	
 
#: rhodecode/controllers/pullrequests.py:184
 
#: rhodecode/controllers/pullrequests.py:200
 
msgid "Error occurred during sending pull request"
 
msgstr "提交拉取请求时发生错误"
 

	
 
#: rhodecode/controllers/pullrequests.py:217
 
#: rhodecode/controllers/pullrequests.py:233
 
msgid "Successfully deleted pull request"
 
msgstr "成功删除拉取请求"
 

	
 
#: rhodecode/controllers/search.py:131
 
#: rhodecode/controllers/search.py:132
 
msgid "Invalid search query. Try quoting it."
 
msgstr "错误的搜索。请尝试用引号包含它。"
 

	
 
#: rhodecode/controllers/search.py:136
 
#: rhodecode/controllers/search.py:137
 
msgid "There is no index to search in. Please run whoosh indexer"
 
msgstr "没有索引用于搜索。请运行 whoosh 索引器"
 

	
 
#: rhodecode/controllers/search.py:140
 
#: rhodecode/controllers/search.py:141
 
msgid "An error occurred during this search operation"
 
msgstr "在搜索操作中发生异常"
 

	
 
#: rhodecode/controllers/settings.py:107
 
#: rhodecode/controllers/settings.py:108
 
#: rhodecode/controllers/admin/repos.py:266
 
#, python-format
 
msgid "Repository %s updated successfully"
 
msgstr "版本库 %s 成功更新"
 

	
 
#: rhodecode/controllers/settings.py:125
 
#: rhodecode/controllers/settings.py:126
 
#: rhodecode/controllers/admin/repos.py:284
 
#, python-format
 
msgid "error occurred during update of repository %s"
 
msgstr "在更新版本库 %s 的时候发生错误"
 

	
 
#: rhodecode/controllers/settings.py:143
 
#: rhodecode/controllers/settings.py:144
 
#: rhodecode/controllers/admin/repos.py:302
 
#, python-format
 
msgid ""
 
"%s repository is not mapped to db perhaps it was moved or renamed  from the "
 
"filesystem please run the application again in order to rescan repositories"
 
msgstr ""
 
"版本库 %s 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 RhodeCode "
 
"以重新扫描版本库"
 

	
 
#: rhodecode/controllers/settings.py:155
 
#: rhodecode/controllers/settings.py:156
 
#: rhodecode/controllers/admin/repos.py:314
 
#, python-format
 
msgid "deleted repository %s"
 
msgstr "已经删除版本库 %s"
 

	
 
#: rhodecode/controllers/settings.py:159
 
#: rhodecode/controllers/settings.py:160
 
#: rhodecode/controllers/admin/repos.py:324
 
#: rhodecode/controllers/admin/repos.py:330
 
#, python-format
 
msgid "An error occurred during deletion of %s"
 
msgstr "在删除 %s 的时候发生错误"
 

	
 
#: rhodecode/controllers/settings.py:179
 
#| msgid "unlock"
 
msgid "unlocked"
 
msgstr "未锁"
 

	
 
#: rhodecode/controllers/settings.py:182
 
#| msgid "unlock"
 
msgid "locked"
 
msgstr "已锁"
 

	
 
#: rhodecode/controllers/settings.py:184
 
#, python-format
 
#| msgid "forked %s repository as %s"
 
msgid "Repository has been %s"
 
msgstr "版本库已经 %s"
 

	
 
#: rhodecode/controllers/settings.py:188
 
#: rhodecode/controllers/admin/repos.py:422
 
msgid "An error occurred during unlocking"
 
msgstr "解锁时发生错误"
 

	
 
#: rhodecode/controllers/summary.py:138
 
msgid "No data loaded yet"
 
msgstr "数据未加载"
 

	
 
#: rhodecode/controllers/summary.py:142
 
#: rhodecode/templates/summary/summary.html:148
 
msgid "Statistics are disabled for this repository"
 
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 "LDAP 连接上的 START_TLS"
 

	
 
#: rhodecode/controllers/admin/ldap_settings.py:126
 
msgid "Ldap settings updated successfully"
 
msgstr "LDAP 设置已经成功更新"
 

	
 
#: rhodecode/controllers/admin/ldap_settings.py:130
 
msgid "Unable to activate ldap. The \"python-ldap\" library is missing."
 
msgstr "无法启用 LDAP。缺失“python-ldap”库。"
 

	
 
#: rhodecode/controllers/admin/ldap_settings.py:147
 
msgid "error occurred during update of ldap settings"
 
msgstr "更新 LDAP 设置时发生错误"
 

	
 
#: rhodecode/controllers/admin/permissions.py:59
 
msgid "None"
 
msgstr "无"
 

	
 
#: rhodecode/controllers/admin/permissions.py:60
 
msgid "Read"
 
msgstr "读"
 

	
 
#: rhodecode/controllers/admin/permissions.py:61
 
msgid "Write"
 
msgstr "写"
 

	
 
#: rhodecode/controllers/admin/permissions.py:62
 
#: rhodecode/templates/admin/ldap/ldap.html:9
 
#: rhodecode/templates/admin/permissions/permissions.html:9
 
#: rhodecode/templates/admin/repos/repo_add.html:9
 
#: rhodecode/templates/admin/repos/repo_edit.html:9
 
#: rhodecode/templates/admin/repos/repos.html:9
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:8
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:8
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
 
#: 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:122
 
#: rhodecode/templates/admin/users/users.html:9
 
#: 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:197
 
#: rhodecode/templates/base/base.html:337
 
#: rhodecode/templates/base/base.html:339
 
#: rhodecode/templates/base/base.html:341
 
#: rhodecode/templates/base/base.html:346
 
#: rhodecode/templates/base/base.html:348
 
#: rhodecode/templates/base/base.html:350
 
msgid "Admin"
 
msgstr "管理"
 

	
 
#: rhodecode/controllers/admin/permissions.py:65
 
msgid "disabled"
 
msgstr "禁用"
 

	
 
#: rhodecode/controllers/admin/permissions.py:67
 
msgid "allowed with manual account activation"
 
msgstr "允许手工启用帐号"
 

	
 
#: rhodecode/controllers/admin/permissions.py:69
 
msgid "allowed with automatic account activation"
 
msgstr "允许自动启用帐号"
 

	
 
#: rhodecode/controllers/admin/permissions.py:71
 
#: rhodecode/controllers/admin/permissions.py:74
 
msgid "Disabled"
 
msgstr "停用"
 

	
 
#: rhodecode/controllers/admin/permissions.py:72
 
#: rhodecode/controllers/admin/permissions.py:75
 
msgid "Enabled"
 
msgstr "启用"
 

	
 
#: rhodecode/controllers/admin/permissions.py:116
 
msgid "Default permissions updated successfully"
 
msgstr "成功更新默认权限"
 

	
 
#: rhodecode/controllers/admin/permissions.py:130
 
msgid "error occurred during update of permissions"
 
msgstr "更新权限时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:123
 
msgid "--REMOVE FORK--"
 
msgstr "-- 移除分支 --"
 

	
 
#: rhodecode/controllers/admin/repos.py:192
 
#, python-format
 
msgid "created repository %s from %s"
 
msgstr "新版本库 %s 基于 %s 建立。"
 

	
 
#: rhodecode/controllers/admin/repos.py:196
 
#, python-format
 
msgid "created repository %s"
 
msgstr "建立版本库 %s"
 

	
 
#: rhodecode/controllers/admin/repos.py:227
 
#, python-format
 
msgid "error occurred during creation of repository %s"
 
msgstr "创建版本库时发生错误 %s"
 

	
 
#: rhodecode/controllers/admin/repos.py:319
 
#, python-format
 
msgid "Cannot delete %s it still contains attached forks"
 
msgstr "无法删除 %s 因为它还有其他分支版本库"
 

	
 
#: rhodecode/controllers/admin/repos.py:348
 
msgid "An error occurred during deletion of repository user"
 
msgstr "删除版本库用户时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:367
 
msgid "An error occurred during deletion of repository users groups"
 
msgstr "删除版本库用户组时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:385
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "删除版本库统计时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:402
 
msgid "An error occurred during cache invalidation"
 
msgstr "清除缓存时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:422
 
msgid "An error occurred during unlocking"
 
msgstr "解锁时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:442
 
msgid "Updated repository visibility in public journal"
 
msgstr "成功更新在公共日志中的可见性"
 

	
 
#: rhodecode/controllers/admin/repos.py:446
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "设置版本库到公共日志时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:451 rhodecode/model/validators.py:299
 
#: rhodecode/controllers/admin/repos.py:451 rhodecode/model/validators.py:300
 
msgid "Token mismatch"
 
msgstr "令牌不匹配"
 

	
 
#: rhodecode/controllers/admin/repos.py:464
 
msgid "Pulled from remote location"
 
msgstr "成功拉取自远程路径"
 

	
 
#: rhodecode/controllers/admin/repos.py:466
 
msgid "An error occurred during pull from remote location"
 
msgstr "从远程路径拉取时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos.py:482
 
msgid "Nothing"
 
msgstr "无"
 

	
 
#: rhodecode/controllers/admin/repos.py:484
 
#, python-format
 
msgid "Marked repo %s as fork of %s"
 
msgstr "成功将版本库 %s 标记为从 %s 分支"
 

	
 
#: rhodecode/controllers/admin/repos.py:488
 
msgid "An error occurred during this operation"
 
msgstr "在搜索操作中发生错误"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:116
 
#: rhodecode/controllers/admin/repos_groups.py:117
 
#, python-format
 
msgid "created repos group %s"
 
msgstr "建立版本库组 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:129
 
#: rhodecode/controllers/admin/repos_groups.py:130
 
#, python-format
 
msgid "error occurred during creation of repos group %s"
 
msgstr "创建版本库组时发生错误 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:163
 
#: rhodecode/controllers/admin/repos_groups.py:164
 
#, python-format
 
msgid "updated repos group %s"
 
msgstr "更新版本库组 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:176
 
#: rhodecode/controllers/admin/repos_groups.py:177
 
#, python-format
 
msgid "error occurred during update of repos group %s"
 
msgstr "更新版本库组时发生错误 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:194
 
#: rhodecode/controllers/admin/repos_groups.py:195
 
#, python-format
 
msgid "This group contains %s repositores and cannot be deleted"
 
msgstr "这个组内有 %s 个版本库因而无法删除"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:202
 
#: rhodecode/controllers/admin/repos_groups.py:203
 
#, python-format
 
msgid "removed repos group %s"
 
msgstr "移除版本库组 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:208
 
#: rhodecode/controllers/admin/repos_groups.py:209
 
msgid "Cannot delete this group it still contains subgroups"
 
msgstr "不能删除包含子组的组"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:213
 
#: rhodecode/controllers/admin/repos_groups.py:218
 
#: rhodecode/controllers/admin/repos_groups.py:214
 
#: rhodecode/controllers/admin/repos_groups.py:219
 
#, python-format
 
msgid "error occurred during deletion of repos group %s"
 
msgstr "删除版本库组时发生错误 %s"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:238
 
#: rhodecode/controllers/admin/repos_groups.py:240
 
msgid "An error occurred during deletion of group user"
 
msgstr "删除组用户时发生错误"
 

	
 
#: rhodecode/controllers/admin/repos_groups.py:258
 
#: rhodecode/controllers/admin/repos_groups.py:261
 
msgid "An error occurred during deletion of group users groups"
 
msgstr "删除版本库组的用户组时发生错误"
 

	
 
#: rhodecode/controllers/admin/settings.py:121
 
#: rhodecode/controllers/admin/settings.py:122
 
#, python-format
 
msgid "Repositories successfully rescanned added: %s,removed: %s"
 
msgstr "重新扫描版本库成功,增加 %s, 移除 %s"
 

	
 
#: rhodecode/controllers/admin/settings.py:129
 
#: rhodecode/controllers/admin/settings.py:130
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh 重新索引任务调度"
 

	
 
#: rhodecode/controllers/admin/settings.py:160
 
#: rhodecode/controllers/admin/settings.py:161
 
msgid "Updated application settings"
 
msgstr "更新应用设置"
 

	
 
#: rhodecode/controllers/admin/settings.py:164
 
#: rhodecode/controllers/admin/settings.py:275
 
#: rhodecode/controllers/admin/settings.py:165
 
#: rhodecode/controllers/admin/settings.py:293
 
msgid "error occurred during updating application settings"
 
msgstr "更新设置时发生错误"
 

	
 
#: rhodecode/controllers/admin/settings.py:200
 
#: rhodecode/controllers/admin/settings.py:201
 
msgid "Updated visualisation settings"
 
msgstr "成功更新可视化设置"
 

	
 
#: rhodecode/controllers/admin/settings.py:205
 
#: rhodecode/controllers/admin/settings.py:206
 
msgid "error occurred during updating visualisation settings"
 
msgstr "更新可视化设置时发生错误"
 

	
 
#: rhodecode/controllers/admin/settings.py:271
 
#: rhodecode/controllers/admin/settings.py:289
 
msgid "Updated VCS settings"
 
msgstr "成功更新版本控制系统设置"
 

	
 
#: rhodecode/controllers/admin/settings.py:285
 
#: rhodecode/controllers/admin/settings.py:303
 
msgid "Added new hook"
 
msgstr "新建钩子"
 

	
 
#: rhodecode/controllers/admin/settings.py:297
 
#: rhodecode/controllers/admin/settings.py:315
 
msgid "Updated hooks"
 
msgstr "更新钩子"
 

	
 
#: rhodecode/controllers/admin/settings.py:301
 
#: rhodecode/controllers/admin/settings.py:319
 
msgid "error occurred during hook creation"
 
msgstr "创建钩子时发生错误"
 

	
 
#: rhodecode/controllers/admin/settings.py:320
 
#: rhodecode/controllers/admin/settings.py:338
 
msgid "Email task created"
 
msgstr "已创建电子邮件任务"
 

	
 
#: rhodecode/controllers/admin/settings.py:375
 
#: rhodecode/controllers/admin/settings.py:393
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr "由于是系统帐号,无法编辑该用户"
 

	
 
#: rhodecode/controllers/admin/settings.py:406
 
#: rhodecode/controllers/admin/settings.py:424
 
msgid "Your account was updated successfully"
 
msgstr "你的帐号已经更新完成"
 

	
 
#: rhodecode/controllers/admin/settings.py:421
 
#: rhodecode/controllers/admin/settings.py:439
 
#: rhodecode/controllers/admin/users.py:191
 
#, python-format
 
msgid "error occurred during update of user %s"
 
msgstr "更新用户 %s 时发生错误"
 

	
 
#: rhodecode/controllers/admin/users.py:130
 
#, python-format
 
msgid "created user %s"
 
msgstr "创建用户 %s"
 

	
 
#: rhodecode/controllers/admin/users.py:142
 
#, python-format
 
msgid "error occurred during creation of user %s"
 
msgstr "创建用户 %s 时发生错误"
 

	
 
#: rhodecode/controllers/admin/users.py:171
 
msgid "User updated successfully"
 
msgstr "用户更新成功"
 

	
 
#: rhodecode/controllers/admin/users.py:207
 
msgid "successfully deleted user"
 
msgstr "用户删除成功"
 

	
 
#: rhodecode/controllers/admin/users.py:212
 
msgid "An error occurred during deletion of user"
 
msgstr "删除用户时发生错误"
 

	
 
#: rhodecode/controllers/admin/users.py:226
 
msgid "You can't edit this user"
 
msgstr "无法编辑该用户"
 

	
 
#: rhodecode/controllers/admin/users.py:266
 
msgid "Granted 'repository create' permission to user"
 
msgstr "已授予用户‘创建版本库’的权限"
 

	
 
#: rhodecode/controllers/admin/users.py:271
 
msgid "Revoked 'repository create' permission to user"
 
msgstr "已撤销用户‘创建版本库’的权限"
 

	
 
#: rhodecode/controllers/admin/users.py:277
 
msgid "Granted 'repository fork' permission to user"
 
msgstr "成功授予了用户“分支版本库”权限"
 

	
 
#: rhodecode/controllers/admin/users.py:282
 
msgid "Revoked 'repository fork' permission to user"
 
msgstr "成功撤销用户“分支版本库”权限"
 

	
 
#: rhodecode/controllers/admin/users.py:288
 
#: rhodecode/controllers/admin/users_groups.py:255
 
msgid "An error occurred during permissions saving"
 
msgstr "保存权限时发生错误"
 

	
 
#: rhodecode/controllers/admin/users.py:303
 
#, python-format
 
msgid "Added email %s to user"
 
msgstr "已为用户添加电子邮件 %s"
 

	
 
#: rhodecode/controllers/admin/users.py:309
 
msgid "An error occurred during email saving"
 
msgstr "保存电子邮件时发生错误"
 

	
 
#: rhodecode/controllers/admin/users.py:319
 
msgid "Removed email from user"
 
msgstr "成功删除用户电子邮件"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:84
 
#, python-format
 
msgid "created users group %s"
 
msgstr "建立用户组 %s"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:95
 
#, python-format
 
msgid "error occurred during creation of users group %s"
 
msgstr "创建用户组 %s 时发生错误"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:135
 
#, python-format
 
msgid "updated users group %s"
 
msgstr "更新用户组 %s"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:157
 
#, python-format
 
msgid "error occurred during update of users group %s"
 
msgstr "更新用户组 %s 时发生错误"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:174
 
msgid "successfully deleted users group"
 
msgstr "删除用户组成功"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:179
 
msgid "An error occurred during deletion of users group"
 
msgstr "删除用户组时发生错误"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:233
 
msgid "Granted 'repository create' permission to users group"
 
msgstr "已授予用户组‘创建版本库’的权限"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:238
 
msgid "Revoked 'repository create' permission to users group"
 
msgstr "已撤销用户组‘创建版本库’的权限"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:244
 
msgid "Granted 'repository fork' permission to users group"
 
msgstr "已授予用户组‘分支版本库’的权限"
 

	
 
#: rhodecode/controllers/admin/users_groups.py:249
 
msgid "Revoked 'repository fork' permission to users group"
 
msgstr "已撤销用户组‘分支版本库’的权限"
 

	
 
#: rhodecode/lib/auth.py:499
 
msgid "You need to be a registered user to perform this action"
 
msgstr "必须是注册用户才能进行此操作"
 

	
 
#: rhodecode/lib/auth.py:540
 
msgid "You need to be a signed in to view this page"
 
msgstr "必须登录才能访问该页面"
 

	
 
#: rhodecode/lib/diffs.py:86
 
#: rhodecode/lib/diffs.py:87
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr "修订集因过大而被截断,可查看原始修订集作为替代"
 

	
 
#: rhodecode/lib/diffs.py:96
 
#: rhodecode/lib/diffs.py:97
 
msgid "No changes detected"
 
msgstr "未发现差异"
 

	
 
#: rhodecode/lib/helpers.py:372
 
#: rhodecode/lib/helpers.py:373
 
#, python-format
 
msgid "%a, %d %b %Y %H:%M:%S"
 
msgstr "%Y/%b/%d %H:%M:%S %a"
 

	
 
#: rhodecode/lib/helpers.py:484
 
#: rhodecode/lib/helpers.py:485
 
msgid "True"
 
msgstr "是"
 

	
 
#: rhodecode/lib/helpers.py:488
 
#: rhodecode/lib/helpers.py:489
 
msgid "False"
 
msgstr "否"
 

	
 
#: rhodecode/lib/helpers.py:532
 
#: rhodecode/lib/helpers.py:533
 
msgid "Changeset not found"
 
msgstr "未找到修订集"
 

	
 
#: rhodecode/lib/helpers.py:555
 
#: rhodecode/lib/helpers.py:556
 
#, python-format
 
msgid "Show all combined changesets %s->%s"
 
msgstr "显示合并的修订集 %s->%s"
 

	
 
#: rhodecode/lib/helpers.py:561
 
#: rhodecode/lib/helpers.py:562
 
msgid "compare view"
 
msgstr "比较显示"
 

	
 
#: rhodecode/lib/helpers.py:581
 
#: rhodecode/lib/helpers.py:582
 
msgid "and"
 
msgstr "还有"
 

	
 
#: rhodecode/lib/helpers.py:582
 
#: rhodecode/lib/helpers.py:583
 
#, python-format
 
msgid "%s more"
 
msgstr "%s 个"
 

	
 
#: rhodecode/lib/helpers.py:583
 
#: rhodecode/lib/helpers.py:584
 
#: rhodecode/templates/changelog/changelog.html:48
 
msgid "revisions"
 
msgstr "修订"
 

	
 
#: rhodecode/lib/helpers.py:606
 
#: rhodecode/lib/helpers.py:607
 
msgid "fork name "
 
msgstr "分支名称"
 

	
 
#: rhodecode/lib/helpers.py:620
 
#: rhodecode/lib/helpers.py:621
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:4
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:12
 
#, python-format
 
msgid "Pull request #%s"
 
msgstr "拉取请求 #%s"
 

	
 
#: rhodecode/lib/helpers.py:626
 
#: rhodecode/lib/helpers.py:627
 
msgid "[deleted] repository"
 
msgstr "[删除] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:628 rhodecode/lib/helpers.py:638
 
#: rhodecode/lib/helpers.py:629 rhodecode/lib/helpers.py:639
 
msgid "[created] repository"
 
msgstr "[创建] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:630
 
#: rhodecode/lib/helpers.py:631
 
msgid "[created] repository as fork"
 
msgstr "[创建] 分支版本库"
 

	
 
#: rhodecode/lib/helpers.py:632 rhodecode/lib/helpers.py:640
 
#: rhodecode/lib/helpers.py:633 rhodecode/lib/helpers.py:641
 
msgid "[forked] repository"
 
msgstr "[分支] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:634 rhodecode/lib/helpers.py:642
 
#: rhodecode/lib/helpers.py:635 rhodecode/lib/helpers.py:643
 
msgid "[updated] repository"
 
msgstr "[更新] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:636
 
#: rhodecode/lib/helpers.py:637
 
msgid "[delete] repository"
 
msgstr "[删除] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:644
 
#: rhodecode/lib/helpers.py:645
 
msgid "[created] user"
 
msgstr "[创建] 用户"
 

	
 
#: rhodecode/lib/helpers.py:646
 
#: rhodecode/lib/helpers.py:647
 
msgid "[updated] user"
 
msgstr "[更新] 用户"
 

	
 
#: rhodecode/lib/helpers.py:648
 
#: rhodecode/lib/helpers.py:649
 
msgid "[created] users group"
 
msgstr "[创建] 用户组"
 

	
 
#: rhodecode/lib/helpers.py:650
 
#: rhodecode/lib/helpers.py:651
 
msgid "[updated] users group"
 
msgstr "[更新] 用户组"
 

	
 
#: rhodecode/lib/helpers.py:652
 
#: rhodecode/lib/helpers.py:653
 
msgid "[commented] on revision in repository"
 
msgstr "[评论] 了版本库中的修订"
 

	
 
#: rhodecode/lib/helpers.py:654
 
#: rhodecode/lib/helpers.py:655
 
msgid "[commented] on pull request for"
 
msgstr "[评论] 拉取请求"
 

	
 
#: rhodecode/lib/helpers.py:656
 
#: rhodecode/lib/helpers.py:657
 
msgid "[closed] pull request for"
 
msgstr "[关闭] 拉取请求"
 

	
 
#: rhodecode/lib/helpers.py:658
 
#: rhodecode/lib/helpers.py:659
 
msgid "[pushed] into"
 
msgstr "[推送] 到"
 

	
 
#: rhodecode/lib/helpers.py:660
 
#: rhodecode/lib/helpers.py:661
 
msgid "[committed via RhodeCode] into repository"
 
msgstr "[通过 RhodeCode 提交] 到版本库"
 

	
 
#: rhodecode/lib/helpers.py:662
 
#: rhodecode/lib/helpers.py:663
 
msgid "[pulled from remote] into repository"
 
msgstr "[远程拉取] 到版本库"
 

	
 
#: rhodecode/lib/helpers.py:664
 
#: rhodecode/lib/helpers.py:665
 
msgid "[pulled] from"
 
msgstr "[拉取] 自"
 

	
 
#: rhodecode/lib/helpers.py:666
 
#: rhodecode/lib/helpers.py:667
 
msgid "[started following] repository"
 
msgstr "[开始关注] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:668
 
#: rhodecode/lib/helpers.py:669
 
msgid "[stopped following] repository"
 
msgstr "[停止关注] 版本库"
 

	
 
#: rhodecode/lib/helpers.py:840
 
#: rhodecode/lib/helpers.py:845
 
#, python-format
 
msgid " and %s more"
 
msgstr "还有 %s 个"
 

	
 
#: rhodecode/lib/helpers.py:844
 
#: rhodecode/lib/helpers.py:849
 
msgid "No Files"
 
msgstr "没有文件"
 

	
 
#: rhodecode/lib/utils2.py:335
 
#: rhodecode/lib/utils2.py:352
 
#, python-format
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d 年"
 

	
 
#: rhodecode/lib/utils2.py:336
 
#: rhodecode/lib/utils2.py:353
 
#, python-format
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d 月"
 

	
 
#: rhodecode/lib/utils2.py:337
 
#: rhodecode/lib/utils2.py:354
 
#, python-format
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d 天"
 

	
 
#: rhodecode/lib/utils2.py:338
 
#: rhodecode/lib/utils2.py:355
 
#, python-format
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d 小时"
 

	
 
#: rhodecode/lib/utils2.py:339
 
#: rhodecode/lib/utils2.py:356
 
#, python-format
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d 分钟"
 

	
 
#: rhodecode/lib/utils2.py:340
 
#: rhodecode/lib/utils2.py:357
 
#, python-format
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d 秒"
 

	
 
#: rhodecode/lib/utils2.py:355
 
#: rhodecode/lib/utils2.py:372
 
#, python-format
 
msgid "%s ago"
 
msgstr "%s 之前"
 

	
 
#: rhodecode/lib/utils2.py:357
 
#: rhodecode/lib/utils2.py:374
 
#, python-format
 
msgid "%s and %s ago"
 
msgstr "%s 零 %s 之前"
 

	
 
#: rhodecode/lib/utils2.py:360
 
#: rhodecode/lib/utils2.py:377
 
msgid "just now"
 
msgstr "刚才"
 

	
 
#: rhodecode/lib/celerylib/tasks.py:269
 
msgid "password reset link"
 
msgstr "密码重置链接"
 

	
 
#: rhodecode/model/comment.py:110
 
#, python-format
 
msgid "on line %s"
 
msgstr "在 %s 行"
 

	
 
#: rhodecode/model/comment.py:157
 
#: rhodecode/model/comment.py:173
 
msgid "[Mention]"
 
msgstr "[提及]"
 

	
 
#: rhodecode/model/db.py:1140
 
#: rhodecode/model/db.py:1164
 
msgid "Repository no access"
 
msgstr "无版本库访问权限"
 

	
 
#: rhodecode/model/db.py:1141
 
#: rhodecode/model/db.py:1165
 
msgid "Repository read access"
 
msgstr "版本库读取权限"
 

	
 
#: rhodecode/model/db.py:1142
 
#: rhodecode/model/db.py:1166
 
msgid "Repository write access"
 
msgstr "版本库写入权限"
 

	
 
#: rhodecode/model/db.py:1143
 
#: rhodecode/model/db.py:1167
 
msgid "Repository admin access"
 
msgstr "版本库管理权限"
 

	
 
#: rhodecode/model/db.py:1145
 
#: rhodecode/model/db.py:1169
 
msgid "Repositories Group no access"
 
msgstr "无版本库组访问权限"
 

	
 
#: rhodecode/model/db.py:1146
 
#: rhodecode/model/db.py:1170
 
msgid "Repositories Group read access"
 
msgstr "版本库组读取权限"
 

	
 
#: rhodecode/model/db.py:1147
 
#: rhodecode/model/db.py:1171
 
msgid "Repositories Group write access"
 
msgstr "版本库组写入"
 

	
 
#: rhodecode/model/db.py:1148
 
#: rhodecode/model/db.py:1172
 
msgid "Repositories Group admin access"
 
msgstr "版本库组管理权限"
 

	
 
#: rhodecode/model/db.py:1150
 
#: rhodecode/model/db.py:1174
 
msgid "RhodeCode Administrator"
 
msgstr "RhodeCode 管理员"
 

	
 
#: rhodecode/model/db.py:1151
 
#: rhodecode/model/db.py:1175
 
msgid "Repository creation disabled"
 
msgstr "禁用创建版本库"
 

	
 
#: rhodecode/model/db.py:1152
 
#: rhodecode/model/db.py:1176
 
msgid "Repository creation enabled"
 
msgstr "允许创建版本库"
 

	
 
#: rhodecode/model/db.py:1153
 
#: rhodecode/model/db.py:1177
 
msgid "Repository forking disabled"
 
msgstr "禁用分支 版本库"
 

	
 
#: rhodecode/model/db.py:1154
 
#: rhodecode/model/db.py:1178
 
msgid "Repository forking enabled"
 
msgstr "允许分支版本库"
 

	
 
#: rhodecode/model/db.py:1155
 
#: rhodecode/model/db.py:1179
 
msgid "Register disabled"
 
msgstr "禁用注册"
 

	
 
#: rhodecode/model/db.py:1156
 
#: rhodecode/model/db.py:1180
 
msgid "Register new user with RhodeCode with manual activation"
 
msgstr "用手动激活注册新用户"
 

	
 
#: rhodecode/model/db.py:1159
 
#: rhodecode/model/db.py:1183
 
msgid "Register new user with RhodeCode with auto activation"
 
msgstr "用自动激活注册新用户"
 

	
 
#: rhodecode/model/db.py:1579
 
#: rhodecode/model/db.py:1611
 
msgid "Not Reviewed"
 
msgstr "未检视"
 

	
 
#: rhodecode/model/db.py:1580
 
#: rhodecode/model/db.py:1612
 
msgid "Approved"
 
msgstr "已批准"
 

	
 
#: rhodecode/model/db.py:1581
 
#: rhodecode/model/db.py:1613
 
msgid "Rejected"
 
msgstr "驳回"
 

	
 
#: rhodecode/model/db.py:1582
 
#: rhodecode/model/db.py:1614
 
msgid "Under Review"
 
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:220
 
msgid "commented on commit"
 
msgstr "评论了评论"
 

	
 
#: rhodecode/model/notification.py:221
 
msgid "sent message"
 
msgstr "发送信息"
 

	
 
#: rhodecode/model/notification.py:222
 
msgid "mentioned you"
 
msgstr "提到了你"
 

	
 
#: rhodecode/model/notification.py:223
 
msgid "registered in RhodeCode"
 
msgstr "注册到 RhodeCode"
 

	
 
#: rhodecode/model/notification.py:224
 
msgid "opened new pull request"
 
msgstr "创建新的拉取请求"
 

	
 
#: rhodecode/model/notification.py:225
 
msgid "commented on pull request"
 
msgstr "评论了拉取请求"
 

	
 
#: rhodecode/model/pull_request.py:84
 
#: rhodecode/model/pull_request.py:89
 
#, python-format
 
msgid "%(user)s wants you to review pull request #%(pr_id)s"
 
msgstr "%(user)s 想要你检视拉取请求 #%(pr_id)s"
 

	
 
#: rhodecode/model/scm.py:535
 
msgid "latest tip"
 
msgstr "最后 tip 版本"
 

	
 
#: rhodecode/model/user.py:230
 
msgid "new user registration"
 
msgstr "[RhodeCode] 新用户注册"
 

	
 
#: rhodecode/model/user.py:255 rhodecode/model/user.py:277
 
#: rhodecode/model/user.py:299
 
msgid "You can't Edit this user since it's crucial for entire application"
 
msgstr "由于是系统帐号,无法编辑该用户"
 

	
 
#: rhodecode/model/user.py:323
 
msgid "You can't remove this user since it's crucial for entire application"
 
msgstr "由于是系统帐号,无法删除该用户"
 

	
 
#: rhodecode/model/user.py:329
 
#, 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/validators.py:35 rhodecode/model/validators.py:36
 
#: rhodecode/model/validators.py:36 rhodecode/model/validators.py:37
 
msgid "Value cannot be an empty list"
 
msgstr "值不能为空"
 

	
 
#: rhodecode/model/validators.py:82
 
#: rhodecode/model/validators.py:83
 
#, python-format
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "用户名称 %(username)s 已经存在"
 

	
 
#: rhodecode/model/validators.py:84
 
#: rhodecode/model/validators.py:85
 
#, python-format
 
msgid "Username \"%(username)s\" is forbidden"
 
msgstr "不允许用户名 \"%(username)s\""
 

	
 
#: rhodecode/model/validators.py:86
 
#: rhodecode/model/validators.py:87
 
msgid ""
 
"Username may only contain alphanumeric characters underscores, periods or "
 
"dashes and must begin with alphanumeric character"
 
msgstr ""
 
"只能使用字母、数字、下划线、小数点或减号作为用户名,且必须由数字或字母开头"
 

	
 
#: rhodecode/model/validators.py:114
 
#: rhodecode/model/validators.py:115
 
#, python-format
 
msgid "Username %(username)s is not valid"
 
msgstr "用户名称 %(username)s 无效"
 

	
 
#: rhodecode/model/validators.py:133
 
#: rhodecode/model/validators.py:134
 
msgid "Invalid users group name"
 
msgstr "无效的用户组名"
 

	
 
#: rhodecode/model/validators.py:134
 
#: rhodecode/model/validators.py:135
 
#, python-format
 
msgid "Users group \"%(usersgroup)s\" already exists"
 
msgstr "用户组 \"%(usersgroup)s\" 已经存在"
 

	
 
#: rhodecode/model/validators.py:136
 
#: rhodecode/model/validators.py:137
 
msgid ""
 
"users group name may only contain  alphanumeric characters underscores, "
 
"periods or dashes and must begin with alphanumeric character"
 
msgstr ""
 
"只能使用字母、数字、下划线、小数点或减号作为用户组名,且必须由数字或字母开头"
 

	
 
#: rhodecode/model/validators.py:174
 
#: rhodecode/model/validators.py:175
 
msgid "Cannot assign this group as parent"
 
msgstr "不能将这个组作为 parent"
 

	
 
#: rhodecode/model/validators.py:175
 
#: rhodecode/model/validators.py:176
 
#, python-format
 
msgid "Group \"%(group_name)s\" already exists"
 
msgstr "组 \"%(group_name)s\" 已经存在"
 

	
 
#: rhodecode/model/validators.py:177
 
#: rhodecode/model/validators.py:178
 
#, python-format
 
msgid "Repository with name \"%(group_name)s\" already exists"
 
msgstr "已经存在名为 \"%(group_name)s\" 的版本库"
 

	
 
#: rhodecode/model/validators.py:235
 
#: rhodecode/model/validators.py:236
 
msgid "Invalid characters (non-ascii) in password"
 
msgstr "密码含有无效(非ASCII)字符"
 

	
 
#: rhodecode/model/validators.py:250
 
#: rhodecode/model/validators.py:251
 
msgid "Passwords do not match"
 
msgstr "密码不符"
 

	
 
#: rhodecode/model/validators.py:267
 
#: rhodecode/model/validators.py:268
 
msgid "invalid password"
 
msgstr "无效密码"
 

	
 
#: rhodecode/model/validators.py:268
 
#: rhodecode/model/validators.py:269
 
msgid "invalid user name"
 
msgstr "无效用户名"
 

	
 
#: rhodecode/model/validators.py:269
 
#: rhodecode/model/validators.py:270
 
msgid "Your account is disabled"
 
msgstr "该帐号已被禁用"
 

	
 
#: rhodecode/model/validators.py:313
 
#: rhodecode/model/validators.py:314
 
#, python-format
 
msgid "Repository name %(repo)s is disallowed"
 
msgstr "版本库名称不能为 %(repo)s"
 

	
 
#: rhodecode/model/validators.py:315
 
#: rhodecode/model/validators.py:316
 
#, python-format
 
msgid "Repository named %(repo)s already exists"
 
msgstr "已经存在版本库 %(repo)s"
 

	
 
#: rhodecode/model/validators.py:316
 
#: rhodecode/model/validators.py:317
 
#, python-format
 
msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 
msgstr "版本库组 \"%(group)s\" 中已经存在版本库 \"%(repo)s\""
 

	
 
#: rhodecode/model/validators.py:318
 
#: rhodecode/model/validators.py:319
 
#, python-format
 
msgid "Repositories group with name \"%(repo)s\" already exists"
 
msgstr "已经存在名为 \"%(repo)s\" 的版本库组"
 

	
 
#: rhodecode/model/validators.py:431
 
#: rhodecode/model/validators.py:432
 
msgid "invalid clone url"
 
msgstr "无效的克隆地址"
 

	
 
#: rhodecode/model/validators.py:432
 
#: rhodecode/model/validators.py:433
 
msgid "Invalid clone url, provide a valid clone http(s)/svn+http(s) url"
 
msgstr "无效的克隆地址,提供一个有效的克隆 http(s) 或 svn+http(s) 地址"
 

	
 
#: rhodecode/model/validators.py:457
 
#: rhodecode/model/validators.py:458
 
msgid "Fork have to be the same type as parent"
 
msgstr "分支必须使用和父版本库相同的类型"
 

	
 
#: rhodecode/model/validators.py:478
 
#: rhodecode/model/validators.py:473
 
#| msgid "You don't have permission to view this page"
 
msgid "You don't have permissions to create repository in this group"
 
msgstr "没有在这个组里面创建版本库的权限"
 

	
 
#: rhodecode/model/validators.py:498
 
msgid "This username or users group name is not valid"
 
msgstr "用户或用户组名称无效"
 

	
 
#: rhodecode/model/validators.py:562
 
#: rhodecode/model/validators.py:582
 
msgid "This is not a valid path"
 
msgstr "不是一个合法的路径"
 

	
 
#: rhodecode/model/validators.py:577
 
#: rhodecode/model/validators.py:597
 
msgid "This e-mail address is already taken"
 
msgstr "该邮件地址已被使用"
 

	
 
#: rhodecode/model/validators.py:597
 
#: rhodecode/model/validators.py:617
 
#, python-format
 
msgid "e-mail \"%(email)s\" does not exist."
 
msgstr "邮件地址  \"%(email)s\" 不存在"
 

	
 
#: rhodecode/model/validators.py:634
 
#: rhodecode/model/validators.py:654
 
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:653
 
#: rhodecode/model/validators.py:673
 
#, python-format
 
msgid "Revisions %(revs)s are already part of pull request or have set status"
 
msgstr "修订 %(revs)s 已经包含在拉取请求中或者或者已经设置状态"
 

	
 
#: rhodecode/templates/index.html:3
 
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:10
 
#: rhodecode/templates/branches/branches.html:9
 
#: rhodecode/templates/journal/journal.html:40
 
#: rhodecode/templates/tags/tags.html:10
 
msgid "quick filter..."
 
msgstr "快速过滤..."
 

	
 
#: rhodecode/templates/index_base.html:6
 
#: rhodecode/templates/admin/repos/repos.html:9
 
#: rhodecode/templates/base/base.html:221
 
#: rhodecode/templates/base/base.html:230
 
msgid "repositories"
 
msgstr "个版本库"
 
msgstr "版本库"
 

	
 
#: rhodecode/templates/index_base.html:13
 
#: rhodecode/templates/index_base.html:15
 
#: rhodecode/templates/admin/repos/repos.html:21
 
msgid "ADD REPOSITORY"
 
msgstr "新建版本库"
 

	
 
#: rhodecode/templates/index_base.html:29
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:32
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:33
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:32
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:33
 
msgid "Group name"
 
msgstr "组名"
 

	
 
#: rhodecode/templates/index_base.html:30
 
#: rhodecode/templates/index_base.html:71
 
#: rhodecode/templates/index_base.html:142
 
#: rhodecode/templates/index_base.html:168
 
#: rhodecode/templates/admin/repos/repo_add_base.html:56
 
#: rhodecode/templates/admin/repos/repo_edit.html:75
 
#: rhodecode/templates/admin/repos/repos.html:72
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:41
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:41
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:34
 
#: rhodecode/templates/forks/fork.html:59
 
#: rhodecode/templates/settings/repo_settings.html:66
 
#: rhodecode/templates/summary/summary.html:105
 
msgid "Description"
 
msgstr "描述"
 

	
 
#: rhodecode/templates/index_base.html:40
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46
 
msgid "Repositories group"
 
msgstr "版本库组"
 

	
 
#: rhodecode/templates/index_base.html:70
 
#: rhodecode/templates/index_base.html:166
 
#: rhodecode/templates/admin/repos/repo_add_base.html:9
 
#: rhodecode/templates/admin/repos/repo_edit.html:32
 
#: rhodecode/templates/admin/repos/repos.html:70
 
#: rhodecode/templates/admin/users/user_edit.html:192
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:59
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:157
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:193
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:6
 
#: rhodecode/templates/bookmarks/bookmarks.html:36
 
#: rhodecode/templates/bookmarks/bookmarks_data.html:6
 
#: rhodecode/templates/branches/branches.html:51
 
#: rhodecode/templates/files/files_browser.html:47
 
#: rhodecode/templates/journal/journal.html:59
 
#: rhodecode/templates/journal/journal.html:107
 
#: rhodecode/templates/journal/journal.html:186
 
#: rhodecode/templates/settings/repo_settings.html:31
 
#: rhodecode/templates/summary/summary.html:43
 
#: rhodecode/templates/summary/summary.html:123
 
#: rhodecode/templates/tags/tags.html:36
 
#: rhodecode/templates/tags/tags_data.html:6
 
msgid "Name"
 
msgstr "名称"
 

	
 
#: rhodecode/templates/index_base.html:72
 
msgid "Last change"
 
msgstr "最后修改"
 

	
 
#: rhodecode/templates/index_base.html:73
 
#: rhodecode/templates/index_base.html:171
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:159
 
#: rhodecode/templates/journal/journal.html:188
 
msgid "Tip"
 
msgstr "Tip"
 

	
 
#: rhodecode/templates/index_base.html:74
 
#: rhodecode/templates/index_base.html:173
 
#: rhodecode/templates/admin/repos/repo_edit.html:121
 
#: rhodecode/templates/admin/repos/repos.html:73
 
msgid "Owner"
 
msgstr "所有者"
 

	
 
#: rhodecode/templates/index_base.html:75
 
#: rhodecode/templates/summary/summary.html:48
 
#: rhodecode/templates/summary/summary.html:51
 
msgid "RSS"
 
msgstr "RSS"
 

	
 
#: rhodecode/templates/index_base.html:76
 
msgid "Atom"
 
msgstr "Atom"
 

	
 
#: rhodecode/templates/index_base.html:110
 
#: rhodecode/templates/index_base.html:112
 
#, python-format
 
msgid "Subscribe to %s rss feed"
 
msgstr "订阅 %s 的 RSS"
 

	
 
#: rhodecode/templates/index_base.html:117
 
#: rhodecode/templates/index_base.html:119
 
#, python-format
 
msgid "Subscribe to %s atom feed"
 
msgstr "订阅 %s 的 Atom"
 

	
 
#: rhodecode/templates/index_base.html:140
 
msgid "Group Name"
 
msgstr "组名"
 

	
 
#: rhodecode/templates/index_base.html:158
 
#: rhodecode/templates/index_base.html:198
 
#: rhodecode/templates/admin/repos/repos.html:94
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:179
 
#: rhodecode/templates/admin/users/users.html:107
 
#: rhodecode/templates/bookmarks/bookmarks.html:60
 
#: rhodecode/templates/branches/branches.html:77
 
#: rhodecode/templates/journal/journal.html:211
 
#: rhodecode/templates/tags/tags.html:60
 
msgid "Click to sort ascending"
 
msgstr "点击以升序排列"
 

	
 
#: rhodecode/templates/index_base.html:159
 
#: rhodecode/templates/index_base.html:199
 
#: rhodecode/templates/admin/repos/repos.html:95
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:180
 
#: rhodecode/templates/admin/users/users.html:108
 
#: rhodecode/templates/bookmarks/bookmarks.html:61
 
#: rhodecode/templates/branches/branches.html:78
 
#: rhodecode/templates/journal/journal.html:212
 
#: rhodecode/templates/tags/tags.html:61
 
msgid "Click to sort descending"
 
msgstr "点击以降序排列"
 

	
 
#: rhodecode/templates/index_base.html:169
 
msgid "Last Change"
 
msgstr "最后修改"
 

	
 
#: rhodecode/templates/index_base.html:200
 
#: rhodecode/templates/admin/repos/repos.html:96
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:181
 
#: rhodecode/templates/admin/users/users.html:109
 
#: rhodecode/templates/bookmarks/bookmarks.html:62
 
#: rhodecode/templates/branches/branches.html:79
 
#: rhodecode/templates/journal/journal.html:213
 
#: rhodecode/templates/tags/tags.html:62
 
msgid "No records found."
 
msgstr "没有找到记录"
 

	
 
#: rhodecode/templates/index_base.html:201
 
#: rhodecode/templates/admin/repos/repos.html:97
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:182
 
#: rhodecode/templates/admin/users/users.html:110
 
#: rhodecode/templates/bookmarks/bookmarks.html:63
 
#: rhodecode/templates/branches/branches.html:80
 
#: rhodecode/templates/journal/journal.html:214
 
#: rhodecode/templates/tags/tags.html:63
 
msgid "Data error."
 
msgstr "数据错误"
 

	
 
#: rhodecode/templates/index_base.html:202
 
#: rhodecode/templates/admin/repos/repos.html:98
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:183
 
#: rhodecode/templates/admin/users/users.html:111
 
#: rhodecode/templates/bookmarks/bookmarks.html:64
 
#: rhodecode/templates/branches/branches.html:81
 
#: rhodecode/templates/journal/journal.html:215
 
#: rhodecode/templates/tags/tags.html:64
 
msgid "Loading..."
 
msgstr "载入中..."
 

	
 
#: rhodecode/templates/login.html:5 rhodecode/templates/login.html:54
 
msgid "Sign In"
 
msgstr "登录"
 

	
 
#: rhodecode/templates/login.html:21
 
msgid "Sign In to"
 
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:50
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:26
 
#: rhodecode/templates/base/base.html:83
 
#: rhodecode/templates/summary/summary.html:122
 
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:92
 
msgid "Password"
 
msgstr "密码"
 

	
 
#: rhodecode/templates/login.html:50
 
msgid "Remember me"
 
msgstr "记住密码"
 

	
 
#: rhodecode/templates/login.html:60
 
msgid "Forgot your password ?"
 
msgstr "忘记了密码?"
 

	
 
#: rhodecode/templates/login.html:63 rhodecode/templates/base/base.html:103
 
msgid "Don't have an account ?"
 
msgstr "还没有帐号?"
 

	
 
#: rhodecode/templates/password_reset.html:5
 
msgid "Reset your password"
 
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 "密码重置地址已经发送到邮件"
 

	
 
#: 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:86
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:53
 
msgid "First Name"
 
msgstr "名"
 

	
 
#: rhodecode/templates/register.html:56
 
#: rhodecode/templates/admin/users/user_add.html:68
 
#: rhodecode/templates/admin/users/user_edit.html:95
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:62
 
msgid "Last Name"
 
msgstr "姓"
 

	
 
#: rhodecode/templates/register.html:65
 
#: rhodecode/templates/admin/users/user_add.html:77
 
#: rhodecode/templates/admin/users/user_edit.html:104
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:71
 
#: rhodecode/templates/summary/summary.html:124
 
msgid "Email"
 
msgstr "电子邮件"
 

	
 
#: 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:11
 
#: rhodecode/templates/admin/repos/repo_add_base.html:65
 
#: rhodecode/templates/admin/repos/repo_edit.html:85
 
#: rhodecode/templates/settings/repo_settings.html:76
 
msgid "Private repository"
 
msgstr "私有版本库"
 

	
 
#: rhodecode/templates/repo_switcher_list.html:16
 
msgid "Public repository"
 
msgstr "公共版本库"
 

	
 
#: rhodecode/templates/switch_to_list.html:3
 
#: rhodecode/templates/branches/branches.html:14
 
msgid "branches"
 
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:15
 
#: rhodecode/templates/shortlog/shortlog_data.html:10
 
#: rhodecode/templates/tags/tags.html:15
 
msgid "tags"
 
msgstr "标签"
 

	
 
#: rhodecode/templates/switch_to_list.html:22
 
#: rhodecode/templates/tags/tags_data.html:33
 
msgid "There are no tags yet"
 
msgstr "没有任何标签"
 

	
 
#: rhodecode/templates/switch_to_list.html:28
 
#: rhodecode/templates/bookmarks/bookmarks.html:15
 
msgid "bookmarks"
 
msgstr "书签"
 

	
 
#: rhodecode/templates/switch_to_list.html:35
 
#: rhodecode/templates/bookmarks/bookmarks_data.html:32
 
msgid "There are no bookmarks yet"
 
msgstr "无书签"
 

	
 
#: rhodecode/templates/admin/admin.html:5
 
#: rhodecode/templates/admin/admin.html:9
 
msgid "Admin journal"
 
msgstr "管理员日志"
 
msgstr "系统日志"
 

	
 
#: rhodecode/templates/admin/admin_log.html:6
 
#: rhodecode/templates/admin/repos/repos.html:74
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:8
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:9
 
#: rhodecode/templates/journal/journal.html:61
 
#: rhodecode/templates/journal/journal.html:62
 
msgid "Action"
 
msgstr "操作"
 

	
 
#: rhodecode/templates/admin/admin_log.html:7
 
msgid "Repository"
 
msgstr "版本库"
 

	
 
#: rhodecode/templates/admin/admin_log.html:8
 
#: rhodecode/templates/bookmarks/bookmarks.html:37
 
#: rhodecode/templates/bookmarks/bookmarks_data.html:7
 
#: rhodecode/templates/branches/branches.html:52
 
#: rhodecode/templates/tags/tags.html:37
 
#: 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:53
 
msgid "No actions yet"
 
msgstr "无操作"
 

	
 
#: rhodecode/templates/admin/ldap/ldap.html:5
 
msgid "LDAP administration"
 
msgstr "LDAP 管理员"
 

	
 
#: rhodecode/templates/admin/ldap/ldap.html:11
 
msgid "Ldap"
 
msgstr "LDAP"
 

	
 
#: 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 "电子邮件属性"
 

	
 
#: rhodecode/templates/admin/ldap/ldap.html:89
 
#: rhodecode/templates/admin/repos/repo_edit.html:141
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:74
 
#: rhodecode/templates/admin/settings/hooks.html:73
 
#: rhodecode/templates/admin/users/user_edit.html:129
 
#: rhodecode/templates/admin/users/user_edit.html:174
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:79
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:135
 
#: rhodecode/templates/settings/repo_settings.html:93
 
msgid "Save"
 
msgstr "保存"
 

	
 
#: 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/base/base.html:254
 
#: rhodecode/templates/base/base.html:256
 
#: rhodecode/templates/base/base.html:263
 
#: rhodecode/templates/base/base.html:265
 
msgid "Pull requests"
 
msgstr "拉取请求"
 

	
 
#: 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
 
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:134
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:58
 
#: rhodecode/templates/admin/users/user_edit.html:139
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:100
 
#: rhodecode/templates/settings/repo_settings.html:86
 
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:41
 
msgid "Repository permission"
 
msgstr "版本库权限"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:49
 
msgid ""
 
"All default permissions on each repository will be reset to choosen "
 
"permission, note that all custom default permission on repositories will be "
 
"lost"
 
msgstr ""
 
"所有版本库的默认权限将被重置到选择的权限,所有版本库的自定义权限将被丢弃"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:50
 
msgid "overwrite existing settings"
 
msgstr "覆盖已有设置"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:55
 
msgid "Registration"
 
msgstr "注册"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:63
 
msgid "Repository creation"
 
msgstr "建立版本库"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:71
 
msgid "Repository forking"
 
msgstr "版本库分支"
 

	
 
#: rhodecode/templates/admin/permissions/permissions.html:78
 
#: rhodecode/templates/admin/repos/repo_edit.html:241
 
#: rhodecode/templates/admin/repos/repo_edit.html:255
 
msgid "set"
 
msgstr "设置"
 

	
 
#: rhodecode/templates/admin/repos/repo_add.html:5
 
#: rhodecode/templates/admin/repos/repo_add_create_repository.html:5
 
msgid "Add repository"
 
msgstr "添加版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_add.html:11
 
#: rhodecode/templates/admin/repos/repo_edit.html:11
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:10
 
msgid "Repositories"
 
msgstr "版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_add.html:13
 
msgid "add new"
 
msgstr "新建"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:20
 
#: rhodecode/templates/summary/summary.html:95
 
#: rhodecode/templates/summary/summary.html:96
 
msgid "Clone from"
 
msgstr "克隆自"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:24
 
#: rhodecode/templates/admin/repos/repo_edit.html:44
 
#: rhodecode/templates/settings/repo_settings.html:43
 
msgid "Optional http[s] url from which repository should be cloned."
 
msgstr "可选的,指定版本库应该从哪个 http[s] 地址克隆。"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:29
 
#: rhodecode/templates/admin/repos/repo_edit.html:49
 
#: rhodecode/templates/admin/repos_groups/repos_groups.html:4
 
#: rhodecode/templates/forks/fork.html:50
 
#: rhodecode/templates/settings/repo_settings.html:48
 
msgid "Repository group"
 
msgstr "版本库组"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:33
 
#: rhodecode/templates/forks/fork.html:54
 
msgid "Optionaly select a group to put this repository into."
 
msgstr "可选的,选择一个组将版本库放到其中"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:38
 
#: rhodecode/templates/admin/repos/repo_edit.html:58
 
msgid "Type"
 
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:66
 
#: rhodecode/templates/forks/fork.html:41
 
#: rhodecode/templates/settings/repo_settings.html:57
 
msgid "Landing revision"
 
msgstr "默认修订"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:51
 
#: rhodecode/templates/admin/repos/repo_edit.html:70
 
#: rhodecode/templates/forks/fork.html:45
 
#: rhodecode/templates/settings/repo_settings.html:61
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "文件浏览、下载、whoosh和readme的默认修订版本"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:60
 
#: rhodecode/templates/admin/repos/repo_edit.html:79
 
#: rhodecode/templates/forks/fork.html:63
 
#: rhodecode/templates/settings/repo_settings.html:70
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr "保持简短。用 README 文件来写更长的描述。"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:69
 
#: rhodecode/templates/admin/repos/repo_edit.html:89
 
#: rhodecode/templates/forks/fork.html:72
 
#: rhodecode/templates/settings/repo_settings.html:80
 
msgid ""
 
"Private repositories are only visible to people explicitly added as "
 
"collaborators."
 
msgstr "私有版本库只对显示添加的合作者可见。"
 
msgstr "私有版本库只对成员可见。"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_base.html:73
 
msgid "add"
 
msgstr "新建"
 

	
 
#: rhodecode/templates/admin/repos/repo_add_create_repository.html:9
 
msgid "add new repository"
 
msgstr "新建版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:5
 
msgid "Edit repository"
 
msgstr "编辑版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:13
 
#: rhodecode/templates/admin/users/user_edit.html:13
 
#: rhodecode/templates/admin/users/user_edit.html:224
 
#: rhodecode/templates/admin/users/user_edit.html:226
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:28
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:13
 
#: rhodecode/templates/files/files_source.html:44
 
#: rhodecode/templates/journal/journal.html:81
 
msgid "edit"
 
msgstr "编辑"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:40
 
#: rhodecode/templates/settings/repo_settings.html:39
 
msgid "Clone uri"
 
msgstr "克隆地址"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:53
 
#: rhodecode/templates/settings/repo_settings.html:52
 
msgid "Optional select a group to put this repository into."
 
msgstr "可选的,选择一个组将版本库放到其中"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:94
 
msgid "Enable statistics"
 
msgstr "启用统计"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:98
 
msgid "Enable statistics window on summary page."
 
msgstr "启用概况页的统计窗口"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:103
 
msgid "Enable downloads"
 
msgstr "启用下载"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:107
 
msgid "Enable download menu on summary page."
 
msgstr "启用概况页的下载菜单"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:112
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:66
 
msgid "Enable locking"
 
msgstr "启用锁定"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:116
 
msgid "Enable lock-by-pulling on repository."
 
msgstr "启用版本库的拉取锁定"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:126
 
msgid "Change owner of this repository."
 
msgstr "修改这个版本库的所有者"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:142
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:75
 
#: rhodecode/templates/admin/settings/settings.html:113
 
#: rhodecode/templates/admin/settings/settings.html:168
 
#: rhodecode/templates/admin/settings/settings.html:258
 
#: rhodecode/templates/admin/users/user_edit.html:130
 
#: rhodecode/templates/admin/users/user_edit.html:175
 
#: rhodecode/templates/admin/users/user_edit.html:278
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:80
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:136
 
#: rhodecode/templates/files/files_add.html:82
 
#: rhodecode/templates/files/files_edit.html:68
 
#: rhodecode/templates/pullrequests/pullrequest.html:124
 
#: rhodecode/templates/settings/repo_settings.html:94
 
msgid "Reset"
 
msgstr "重置"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:152
 
msgid "Administration"
 
msgstr "管理"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:155
 
msgid "Statistics"
 
msgstr "统计"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:159
 
msgid "Reset current statistics"
 
msgstr "重置统计"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:159
 
msgid "Confirm to remove current statistics"
 
msgstr "确认移除当前统计"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:162
 
msgid "Fetched to rev"
 
msgstr "获取到修订"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:163
 
msgid "Stats gathered"
 
msgstr "已收集的统计"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:171
 
msgid "Remote"
 
msgstr "远程"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:175
 
msgid "Pull changes from remote location"
 
msgstr "从远程路径拉取修订集"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:175
 
msgid "Confirm to pull changes from remote side"
 
msgstr "确认从远程拉取修订集"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:186
 
msgid "Cache"
 
msgstr "缓存"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:190
 
msgid "Invalidate repository cache"
 
msgstr "清除版本库缓存"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:190
 
msgid "Confirm to invalidate repository cache"
 
msgstr "确认清除版本库缓存"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:195
 
#: rhodecode/templates/base/base.html:318
 
#: rhodecode/templates/base/base.html:320
 
#: rhodecode/templates/base/base.html:322
 
#: rhodecode/templates/admin/repos/repo_edit.html:193
 
msgid ""
 
"Manually invalidate cache for this repository. On first access repository "
 
"will be cached again"
 
msgstr "手动清除版本库缓存。之后第一次访问的时候将重建缓存"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:198
 
msgid "List of cached values"
 
msgstr "缓存数据列表"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:209
 
#: rhodecode/templates/base/base.html:327
 
#: rhodecode/templates/base/base.html:329
 
#: rhodecode/templates/base/base.html:331
 
msgid "Public journal"
 
msgstr "公共日志"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:201
 
#: rhodecode/templates/admin/repos/repo_edit.html:215
 
msgid "Remove from public journal"
 
msgstr "从公共日志删除"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:203
 
#: rhodecode/templates/admin/repos/repo_edit.html:217
 
msgid "Add to public journal"
 
msgstr "添加到公共日志"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:208
 
#: rhodecode/templates/admin/repos/repo_edit.html:222
 
msgid ""
 
"All actions made on this repository will be accessible to everyone in public "
 
"journal"
 
msgstr "任何人都可以在公共日志上看到这个版本库上的所有动作"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:215
 
#: rhodecode/templates/admin/repos/repo_edit.html:229
 
msgid "Locking"
 
msgstr "锁定"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:220
 
#: rhodecode/templates/admin/repos/repo_edit.html:234
 
msgid "Unlock locked repo"
 
msgstr "解锁版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:220
 
#: rhodecode/templates/admin/repos/repo_edit.html:234
 
msgid "Confirm to unlock repository"
 
msgstr "确认解锁版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:223
 
#: rhodecode/templates/admin/repos/repo_edit.html:237
 
msgid "lock repo"
 
msgstr "锁定版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:223
 
#: rhodecode/templates/admin/repos/repo_edit.html:237
 
msgid "Confirm to lock repository"
 
msgstr "确认锁定版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:224
 
#: rhodecode/templates/admin/repos/repo_edit.html:238
 
msgid "Repository is not locked"
 
msgstr "版本库未锁定"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:229
 
#: rhodecode/templates/admin/repos/repo_edit.html:243
 
msgid ""
 
"Force locking on repository. Works only when anonymous access is disabled"
 
msgstr "强制锁定版本库。只有在禁止匿名访问时候才有效"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:236
 
#: rhodecode/templates/admin/repos/repo_edit.html:250
 
msgid "Set as fork of"
 
msgstr "设置 fork 自"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:245
 
#: rhodecode/templates/admin/repos/repo_edit.html:259
 
msgid "Manually set this repository as a fork of another from the list"
 
msgstr "从列表中手动设置这个版本库 fork 自另一版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:251
 
#: rhodecode/templates/admin/repos/repo_edit.html:265
 
#: rhodecode/templates/changeset/changeset_file_comment.html:26
 
msgid "Delete"
 
msgstr "删除"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:255
 
#: rhodecode/templates/admin/repos/repo_edit.html:269
 
msgid "Remove this repository"
 
msgstr "删除版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:255
 
#: rhodecode/templates/admin/repos/repo_edit.html:269
 
#: rhodecode/templates/journal/journal.html:84
 
msgid "Confirm to delete this repository"
 
msgstr "确认删除版本库"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit.html:259
 
#: rhodecode/templates/admin/repos/repo_edit.html:273
 
msgid ""
 
"This repository will be renamed in a special way in order to be unaccesible "
 
"for RhodeCode and VCS systems.\n"
 
"                         If you need fully delete it from filesystem please "
 
"do it manually"
 
msgstr ""
 
"这个版本库将以特殊的方式重命名这样 RhodeCode 和版本控制系统将不能访问它。\n"
 
"                         如果需要从文件系统完全删除,你需要手动操作"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:3
 
#: rhodecode/templates/admin/repos_groups/repos_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
 
msgid "read"
 
msgstr "读"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:5
 
#: rhodecode/templates/admin/repos_groups/repos_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/users.html:85
 
#: rhodecode/templates/base/base.html:217
 
#: rhodecode/templates/base/base.html:226
 
msgid "admin"
 
msgstr "管理员"
 
msgstr "管理"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:7
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:7
 
msgid "member"
 
msgstr "成员"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:16
 
#: rhodecode/templates/data_table/_dt_elements.html:67
 
#: rhodecode/templates/journal/journal.html:132
 
#: rhodecode/templates/summary/summary.html:76
 
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:18
 
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:23
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:42
 
msgid "revoke"
 
msgstr "移除"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:83
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:67
 
msgid "Add another member"
 
msgstr "添加成员"
 

	
 
#: rhodecode/templates/admin/repos/repo_edit_perms.html:97
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:81
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:87
 
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:96
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:103
 
msgid "Failed to remove users group"
 
msgstr "删除用户组失败"
 

	
 
#: rhodecode/templates/admin/repos/repos.html:5
 
msgid "Repositories administration"
 
msgstr "版本库管理员"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups.html:8
 
msgid "Groups"
 
msgstr "组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups.html:12
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:73
 
msgid "apply to children"
 
msgstr "应用到成员"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:74
 
msgid ""
 
"Set or revoke permission to all children of that group, including "
 
"repositories and other groups"
 
msgstr "授予或者撤销权限所有组成员,包括子组和子版本库"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups.html:9
 
#: rhodecode/templates/base/base.html:122
 
#: rhodecode/templates/base/base.html:309
 
#: rhodecode/templates/base/base.html:311
 
#: rhodecode/templates/base/base.html:313
 
#: rhodecode/templates/bookmarks/bookmarks.html:11
 
#: rhodecode/templates/branches/branches.html:10
 
#: rhodecode/templates/changelog/changelog.html:10
 
#: rhodecode/templates/changeset/changeset.html:10
 
#: rhodecode/templates/changeset/changeset_range.html:9
 
#: rhodecode/templates/compare/compare_diff.html:9
 
#: rhodecode/templates/files/file_diff.html:8
 
#: rhodecode/templates/files/files.html:8
 
#: rhodecode/templates/files/files_add.html:15
 
#: rhodecode/templates/files/files_edit.html:15
 
#: rhodecode/templates/followers/followers.html:9
 
#: rhodecode/templates/forks/fork.html:9
 
#: rhodecode/templates/forks/forks.html:9
 
#: rhodecode/templates/pullrequests/pullrequest.html:8
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:8
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:8
 
#: rhodecode/templates/settings/repo_settings.html:9
 
#: rhodecode/templates/shortlog/shortlog.html:10
 
#: rhodecode/templates/summary/summary.html:8
 
#: rhodecode/templates/tags/tags.html:11
 
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 repos group"
 
msgstr "添加版本库组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:10
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:10
 
msgid "Repos groups"
 
msgstr "版本库组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:12
 
msgid "add new repos group"
 
msgstr "添加新版本库组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:50
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:50
 
msgid "Group parent"
 
msgstr "上级组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_add.html:58
 
#: rhodecode/templates/admin/users/user_add.html:94
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:49
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:90
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:113
 
msgid "save"
 
msgstr "保存"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:5
 
msgid "Edit repos group"
 
msgstr "编辑版本库组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:12
 
msgid "edit repos group"
 
msgstr "编辑版本库组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:70
 
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 "Repositories groups administration"
 
msgstr "版本库管理员"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:22
 
msgid "ADD NEW GROUP"
 
msgstr "添加组"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35
 
msgid "Number of toplevel repositories"
 
msgstr "顶层版本库数量"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36
 
#: rhodecode/templates/admin/users/users.html:87
 
#: rhodecode/templates/admin/users_groups/users_groups.html:35
 
msgid "action"
 
msgstr "操作"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54
 
#: rhodecode/templates/admin/users/user_edit.html:255
 
#: rhodecode/templates/admin/users_groups/users_groups.html:44
 
#: rhodecode/templates/data_table/_dt_elements.html:7
 
#: rhodecode/templates/data_table/_dt_elements.html:103
 
msgid "delete"
 
msgstr "删除"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54
 
#, python-format
 
msgid "Confirm to delete this group: %s"
 
msgstr "确认删除该版本库组: %s"
 

	
 
#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:62
 
msgid "There are no repositories groups yet"
 
msgstr "没有版本库组"
 

	
 
#: rhodecode/templates/admin/settings/hooks.html:5
 
#: rhodecode/templates/admin/settings/settings.html:5
 
msgid "Settings administration"
 
msgstr "设置管理员"
 
msgstr "系统设置"
 

	
 
#: rhodecode/templates/admin/settings/hooks.html:9
 
#: rhodecode/templates/admin/settings/settings.html:9
 
#: rhodecode/templates/settings/repo_settings.html:13
 
msgid "Settings"
 
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:24
 
msgid "Remap and rescan repositories"
 
msgstr "重新扫描并映射版本库"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:32
 
msgid "rescan option"
 
msgstr "重新扫描选项"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:38
 
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:39
 
msgid "destroy old data"
 
msgstr "清理旧数据"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:41
 
msgid ""
 
"Rescan repositories location for new repositories. Also deletes obsolete if "
 
"`destroy` flag is checked "
 
msgstr ""
 
"重新扫描版本库路径以发现新版本库。 同时删除过时的,如果设置有 `destroy` 标志"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:46
 
msgid "Rescan repositories"
 
msgstr "重新扫描版本库"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:52
 
msgid "Whoosh indexing"
 
msgstr "Whoosh 索引"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:60
 
msgid "index build option"
 
msgstr "构建索引选项"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:65
 
msgid "build from scratch"
 
msgstr "重新建立"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:71
 
msgid "Reindex"
 
msgstr "重新索引"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:77
 
msgid "Global application settings"
 
msgstr "全局设置"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:86
 
msgid "Application name"
 
msgstr "应用名称"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:95
 
msgid "Realm text"
 
msgstr "Realm text"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:104
 
msgid "GA code"
 
msgstr "GA code"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:112
 
#: rhodecode/templates/admin/settings/settings.html:167
 
#: rhodecode/templates/admin/settings/settings.html:257
 
msgid "Save settings"
 
msgstr "保存设置"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:119
 
msgid "Visualisation settings"
 
msgstr "可视化设置"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:128
 
msgid "Icons"
 
msgstr "图标"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:133
 
msgid "Show public repo icon on repositories"
 
msgstr "显示公共版本库图标"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:137
 
msgid "Show private repo icon on repositories"
 
msgstr "显示私有版本库图标"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:144
 
msgid "Meta-Tagging"
 
msgstr "元标记"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:149
 
msgid "Stylify recognised metatags:"
 
msgstr "样式化识别的元标记"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:176
 
msgid "VCS settings"
 
msgstr "版本控制系统设置"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:185
 
msgid "Web"
 
msgstr "网络"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:190
 
msgid "require ssl for vcs operations"
 
msgstr "要求使用 SSL进行版本控制系统操作"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:192
 
msgid ""
 
"RhodeCode will require SSL for pushing or pulling. If SSL is missing it will "
 
"return HTTP Error 406: Not Acceptable"
 
msgstr ""
 
"勾选后 RhodeCode 将要求使用 SSL 进行推送和拉取。如果没有使用 SSL 将返回 HTTP "
 
"406错误:Not Acceptable"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:198
 
msgid "Hooks"
 
msgstr "钩子"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:203
 
msgid "Update repository after push (hg update)"
 
msgstr "推送后更新版本库(hg update)"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:207
 
msgid "Show repository size after push"
 
msgstr "推送后显示版本库大小"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:211
 
msgid "Log user push commands"
 
msgstr "记录用户推送命令"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:215
 
msgid "Log user pull commands"
 
msgstr "记录用户拉取命令"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:219
 
msgid "advanced setup"
 
msgstr "高级设置"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:224
 
msgid "Mercurial Extensions"
 
msgstr "Mercurial 扩展"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:229
 
msgid "largefiles extensions"
 
msgstr "大文件扩展"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:233
 
msgid "hgsubversion extensions"
 
msgstr "hgsubversion 扩展"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:235
 
msgid ""
 
"Requires hgsubversion library installed. Allows clonning from svn remote "
 
"locations"
 
msgstr " 允许从远程 svn 地址克隆。需要安装 hgsubversion 库"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:245
 
msgid "Repositories location"
 
msgstr "版本库路径"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:250
 
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:251
 
#: rhodecode/templates/base/base.html:218
 
msgid "unlock"
 
msgstr "解锁"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:252
 
msgid ""
 
"Location where repositories are stored. After changing this value a restart, "
 
"and rescan is required"
 
msgstr "版本库存储路径。 修改后需要重启和重新扫描"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:272
 
msgid "Test Email"
 
msgstr "测试邮件"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:280
 
msgid "Email to"
 
msgstr "发送到"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:288
 
msgid "Send"
 
msgstr "发送"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:294
 
msgid "System Info and Packages"
 
msgstr "系统和软件包信息"
 

	
 
#: rhodecode/templates/admin/settings/settings.html:297
 
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
 
msgid "Users"
 
msgstr "用户"
 

	
 
#: rhodecode/templates/admin/users/user_add.html:12
 
msgid "add new user"
 
msgstr "添加新用户"
 

	
 
#: rhodecode/templates/admin/users/user_add.html:50
 
msgid "Password confirmation"
 
msgstr "确认密码"
 

	
 
#: rhodecode/templates/admin/users/user_add.html:86
 
#: rhodecode/templates/admin/users/user_edit.html:113
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:41
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:42
 
msgid "Active"
 
msgstr "启用"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:5
 
msgid "Edit user"
 
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:59
 
msgid "LDAP DN"
 
msgstr "LDAP DN"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:68
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:35
 
msgid "New password"
 
msgstr "新密码"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:77
 
#: rhodecode/templates/admin/users/user_edit_my_account_form.html:44
 
msgid "New password confirmation"
 
msgstr "确认新密码"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:147
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:108
 
msgid "Inherit default permissions"
 
msgstr "继承默认权限"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:152
 
#: 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 "勾选以从 %s 继承权限设置。 勾选后下面的选项将不起作用"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:158
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:119
 
msgid "Create repositories"
 
msgstr "创建版本库"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:166
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:127
 
msgid "Fork repositories"
 
msgstr "分支版本库"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:186
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:22
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:39
 
msgid "Nothing here yet"
 
msgstr "无条目"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:193
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:60
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:194
 
msgid "Permission"
 
msgstr "权限"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:194
 
msgid "Edit Permission"
 
msgstr "编辑权限"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:243
 
msgid "Email addresses"
 
msgstr "邮件地址"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:256
 
#, python-format
 
msgid "Confirm to delete this email: %s"
 
msgstr "确认删除邮件地址: %s"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:270
 
msgid "New email address"
 
msgstr "增加邮件地址"
 

	
 
#: rhodecode/templates/admin/users/user_edit.html:277
 
msgid "Add"
 
msgstr "增加"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account.html:5
 
#: rhodecode/templates/base/base.html:124
 
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:41
 
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.html:45
 
msgid "Add repo"
 
msgstr "新建版本库"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2
 
msgid "Opened by me"
 
msgstr "我创建的"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:10
 
#, python-format
 
msgid "Pull request #%s opened on %s"
 
msgstr "拉取请求 #%s 创建于 %s"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:15
 
msgid "Confirm to delete this pull request"
 
msgstr "确认删除拉取请求"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:26
 
msgid "I participate in"
 
msgstr "我参与的"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:33
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:30
 
#, python-format
 
msgid "Pull request #%s opened by %s on %s"
 
msgstr "拉取请求 #%s 由 %s 创建于 %s"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:7
 
#: rhodecode/templates/bookmarks/bookmarks.html:40
 
#: rhodecode/templates/bookmarks/bookmarks_data.html:9
 
#: rhodecode/templates/branches/branches.html:55
 
#: rhodecode/templates/journal/journal.html:60
 
#: rhodecode/templates/tags/tags.html:40
 
#: rhodecode/templates/tags/tags_data.html:9
 
msgid "Revision"
 
msgstr "修订"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:28
 
#: rhodecode/templates/journal/journal.html:81
 
msgid "private"
 
msgstr "私有"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:31
 
#: rhodecode/templates/data_table/_dt_elements.html:7
 
#, python-format
 
msgid "Confirm to delete this repository: %s"
 
msgstr "确认删除版本库: %s"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:38
 
#: rhodecode/templates/journal/journal.html:94
 
msgid "No repositories yet"
 
msgstr "没有任何版本库"
 

	
 
#: rhodecode/templates/admin/users/user_edit_my_account_repos.html:40
 
#: rhodecode/templates/journal/journal.html:96
 
msgid "create one now"
 
msgstr "创建一个"
 

	
 
#: rhodecode/templates/admin/users/users.html:5
 
msgid "Users administration"
 
msgstr "用户管理员"
 

	
 
#: rhodecode/templates/admin/users/users.html:9
 
#: rhodecode/templates/base/base.html:223
 
#: rhodecode/templates/base/base.html:232
 
msgid "users"
 
msgstr "用户"
 

	
 
#: rhodecode/templates/admin/users/users.html:23
 
msgid "ADD NEW USER"
 
msgstr "添加用户"
 

	
 
#: rhodecode/templates/admin/users/users.html:77
 
msgid "username"
 
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/users.html:84
 
#: rhodecode/templates/admin/users_groups/users_groups.html:34
 
msgid "active"
 
msgstr "启用"
 

	
 
#: rhodecode/templates/admin/users/users.html:86
 
#: rhodecode/templates/base/base.html:226
 
#: rhodecode/templates/base/base.html:235
 
msgid "ldap"
 
msgstr "LDAP"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:5
 
msgid "Add users group"
 
msgstr "添加用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:10
 
#: rhodecode/templates/admin/users_groups/users_groups.html:9
 
msgid "Users groups"
 
msgstr "用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_add.html:12
 
msgid "add new users group"
 
msgstr "添加新用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:5
 
msgid "Edit users group"
 
msgstr "编辑用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:11
 
msgid "UsersGroups"
 
msgstr "用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:50
 
msgid "Members"
 
msgstr "成员"
 

	
 
#: rhodecode/templates/admin/users_groups/users_group_edit.html:58
 
msgid "Choosen 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:146
 
msgid "Group members"
 
msgstr "拥护者成员"
 

	
 
#: rhodecode/templates/admin/users_groups/users_groups.html:5
 
msgid "Users groups administration"
 
msgstr "用户组管理"
 

	
 
#: rhodecode/templates/admin/users_groups/users_groups.html:23
 
msgid "ADD NEW USER GROUP"
 
msgstr "添加新用户组"
 

	
 
#: rhodecode/templates/admin/users_groups/users_groups.html:32
 
msgid "group name"
 
msgstr "组名"
 

	
 
#: rhodecode/templates/admin/users_groups/users_groups.html:33
 
#: rhodecode/templates/base/root.html:46
 
msgid "members"
 
msgstr "成员"
 

	
 
#: rhodecode/templates/admin/users_groups/users_groups.html:45
 
#, python-format
 
msgid "Confirm to delete this users group: %s"
 
msgstr "确认删除该组: %s"
 

	
 
#: rhodecode/templates/base/base.html:41
 
msgid "Submit a bug"
 
msgstr "提交 bug"
 

	
 
#: rhodecode/templates/base/base.html:77
 
msgid "Login to your account"
 
msgstr "登录"
 

	
 
#: rhodecode/templates/base/base.html:100
 
msgid "Forgot password ?"
 
msgstr "忘记密码?"
 

	
 
#: rhodecode/templates/base/base.html:107
 
msgid "Log In"
 
msgstr "登录"
 

	
 
#: rhodecode/templates/base/base.html:118
 
msgid "Inbox"
 
msgstr "收件箱"
 

	
 
#: rhodecode/templates/base/base.html:122
 
#: rhodecode/templates/base/base.html:300
 
#: rhodecode/templates/base/base.html:302
 
#: rhodecode/templates/base/base.html:304
 
#: rhodecode/templates/bookmarks/bookmarks.html:11
 
#: rhodecode/templates/branches/branches.html:10
 
#: rhodecode/templates/changelog/changelog.html:10
 
#: rhodecode/templates/changeset/changeset.html:10
 
#: rhodecode/templates/changeset/changeset_range.html:9
 
#: rhodecode/templates/compare/compare_diff.html:9
 
#: rhodecode/templates/files/file_diff.html:8
 
#: rhodecode/templates/files/files.html:8
 
#: rhodecode/templates/files/files_add.html:15
 
#: rhodecode/templates/files/files_edit.html:15
 
#: rhodecode/templates/followers/followers.html:9
 
#: rhodecode/templates/forks/fork.html:9
 
#: rhodecode/templates/forks/forks.html:9
 
#: rhodecode/templates/pullrequests/pullrequest.html:8
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:8
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:8
 
#: rhodecode/templates/settings/repo_settings.html:9
 
#: rhodecode/templates/shortlog/shortlog.html:10
 
#: rhodecode/templates/summary/summary.html:8
 
#: rhodecode/templates/tags/tags.html:11
 
msgid "Home"
 
msgstr "首页"
 

	
 
#: rhodecode/templates/base/base.html:123
 
#: rhodecode/templates/base/base.html:309
 
#: rhodecode/templates/base/base.html:311
 
#: rhodecode/templates/base/base.html:313
 
#: rhodecode/templates/base/base.html:318
 
#: rhodecode/templates/base/base.html:320
 
#: rhodecode/templates/base/base.html:322
 
#: rhodecode/templates/journal/journal.html:4
 
#: rhodecode/templates/journal/journal.html:21
 
#: rhodecode/templates/journal/public_journal.html:4
 
msgid "Journal"
 
msgstr "日志"
 

	
 
#: rhodecode/templates/base/base.html:125
 
msgid "Log Out"
 
msgstr "退出"
 

	
 
#: rhodecode/templates/base/base.html:144
 
msgid "Switch repository"
 
msgstr "切换版本库"
 

	
 
#: rhodecode/templates/base/base.html:146
 
msgid "Products"
 
msgstr "产品"
 

	
 
#: rhodecode/templates/base/base.html:152
 
#: rhodecode/templates/base/base.html:182
 
msgid "loading..."
 
msgstr "载入中..."
 

	
 
#: rhodecode/templates/base/base.html:158
 
#: rhodecode/templates/base/base.html:160
 
#: rhodecode/templates/base/base.html:162
 
#: rhodecode/templates/data_table/_dt_elements.html:15
 
#: rhodecode/templates/data_table/_dt_elements.html:17
 
#: rhodecode/templates/data_table/_dt_elements.html:19
 
msgid "Summary"
 
msgstr "概况"
 

	
 
#: rhodecode/templates/base/base.html:166
 
#: rhodecode/templates/base/base.html:168
 
#: rhodecode/templates/base/base.html:170
 
#: rhodecode/templates/changelog/changelog.html:15
 
#: rhodecode/templates/data_table/_dt_elements.html:23
 
#: rhodecode/templates/data_table/_dt_elements.html:25
 
#: rhodecode/templates/data_table/_dt_elements.html:27
 
msgid "Changelog"
 
msgstr "修订记录"
 

	
 
#: rhodecode/templates/base/base.html:175
 
#: rhodecode/templates/base/base.html:177
 
#: rhodecode/templates/base/base.html:179
 
msgid "Switch to"
 
msgstr "切换到"
 

	
 
#: rhodecode/templates/base/base.html:186
 
#: rhodecode/templates/base/base.html:188
 
#: rhodecode/templates/base/base.html:190
 
#: rhodecode/templates/data_table/_dt_elements.html:31
 
#: rhodecode/templates/data_table/_dt_elements.html:33
 
#: rhodecode/templates/data_table/_dt_elements.html:35
 
msgid "Files"
 
msgstr "浏览"
 

	
 
#: rhodecode/templates/base/base.html:195
 
#: rhodecode/templates/base/base.html:199
 
msgid "Options"
 
msgstr "选项"
 

	
 
#: rhodecode/templates/base/base.html:204
 
#: rhodecode/templates/base/base.html:206
 
#: rhodecode/templates/base/base.html:227
 
msgid "settings"
 
msgstr "设置"
 

	
 
#: rhodecode/templates/base/base.html:209
 
#| msgid "Repository creation"
 
msgid "repository settings"
 
msgstr "版本库设置"
 

	
 
#: rhodecode/templates/base/base.html:210
 
#: rhodecode/templates/data_table/_dt_elements.html:80
 
#: rhodecode/templates/forks/fork.html:13
 
msgid "fork"
 
msgstr "分支"
 

	
 
#: rhodecode/templates/base/base.html:211
 
#: rhodecode/templates/base/base.html:212
 
#: rhodecode/templates/changelog/changelog.html:40
 
msgid "Open new pull request"
 
msgstr "新建拉取请求"
 

	
 
#: rhodecode/templates/base/base.html:213
 
#: rhodecode/templates/base/base.html:214
 
msgid "search"
 
msgstr "搜索"
 

	
 
#: rhodecode/templates/base/base.html:222
 
#: rhodecode/templates/base/base.html:220
 
#| msgid "unlock"
 
msgid "lock"
 
msgstr "锁定"
 

	
 
#: rhodecode/templates/base/base.html:231
 
msgid "repositories groups"
 
msgstr "版本库组"
 

	
 
#: rhodecode/templates/base/base.html:224
 
#: rhodecode/templates/base/base.html:233
 
msgid "users groups"
 
msgstr "用户组"
 

	
 
#: rhodecode/templates/base/base.html:225
 
#: rhodecode/templates/base/base.html:234
 
msgid "permissions"
 
msgstr "权限"
 

	
 
#: rhodecode/templates/base/base.html:238
 
#: rhodecode/templates/base/base.html:240
 
#: rhodecode/templates/base/base.html:236
 
msgid "settings"
 
msgstr "设置"
 

	
 
#: rhodecode/templates/base/base.html:247
 
#: rhodecode/templates/base/base.html:249
 
msgid "Followers"
 
msgstr "关注者"
 

	
 
#: rhodecode/templates/base/base.html:246
 
#: rhodecode/templates/base/base.html:248
 
#: rhodecode/templates/base/base.html:255
 
#: rhodecode/templates/base/base.html:257
 
msgid "Forks"
 
msgstr "分支"
 

	
 
#: rhodecode/templates/base/base.html:327
 
#: rhodecode/templates/base/base.html:329
 
#: rhodecode/templates/base/base.html:331
 
#: rhodecode/templates/base/base.html:336
 
#: rhodecode/templates/base/base.html:338
 
#: rhodecode/templates/base/base.html:340
 
#: rhodecode/templates/search/search.html:52
 
msgid "Search"
 
msgstr "搜索"
 

	
 
#: rhodecode/templates/base/root.html:42
 
msgid "add another comment"
 
msgstr "添加新的评论"
 

	
 
#: rhodecode/templates/base/root.html:43
 
#: rhodecode/templates/journal/journal.html:120
 
#: rhodecode/templates/summary/summary.html:57
 
msgid "Stop following this repository"
 
msgstr "停止关注该版本库"
 

	
 
#: rhodecode/templates/base/root.html:44
 
#: rhodecode/templates/summary/summary.html:61
 
msgid "Start following this repository"
 
msgstr "开始关注该版本库"
 

	
 
#: rhodecode/templates/base/root.html:45
 
msgid "Group"
 
msgstr "组"
 

	
 
#: rhodecode/templates/base/root.html:47
 
msgid "search truncated"
 
msgstr "搜索被截断"
 

	
 
#: rhodecode/templates/base/root.html:48
 
msgid "no matching files"
 
msgstr "没有符合的文件"
 

	
 
#: rhodecode/templates/bookmarks/bookmarks.html:5
 
#, python-format
 
msgid "%s Bookmarks"
 
msgstr "%s 书签"
 

	
 
#: rhodecode/templates/bookmarks/bookmarks.html:39
 
#: rhodecode/templates/bookmarks/bookmarks_data.html:8
 
#: rhodecode/templates/branches/branches.html:54
 
#: rhodecode/templates/tags/tags.html:39
 
#: rhodecode/templates/tags/tags_data.html:8
 
msgid "Author"
 
msgstr "作者"
 

	
 
#: rhodecode/templates/branches/branches.html:5
 
#, python-format
 
msgid "%s Branches"
 
msgstr "%s 分支"
 

	
 
#: rhodecode/templates/branches/branches.html:29
 
msgid "Compare branches"
 
msgstr "比较分支"
 

	
 
#: rhodecode/templates/branches/branches.html:57
 
#: rhodecode/templates/compare/compare_diff.html:5
 
#: rhodecode/templates/compare/compare_diff.html:13
 
msgid "Compare"
 
msgstr "比较显示"
 

	
 
#: rhodecode/templates/branches/branches_data.html:6
 
msgid "name"
 
msgstr "名称"
 

	
 
#: rhodecode/templates/branches/branches_data.html:7
 
msgid "date"
 
msgstr "日期"
 

	
 
#: rhodecode/templates/branches/branches_data.html:8
 
#: rhodecode/templates/shortlog/shortlog_data.html:8
 
msgid "author"
 
msgstr "作者"
 

	
 
#: rhodecode/templates/branches/branches_data.html:9
 
#: rhodecode/templates/shortlog/shortlog_data.html:5
 
msgid "revision"
 
msgstr "修订"
 

	
 
#: rhodecode/templates/branches/branches_data.html:10
 
msgid "compare"
 
msgstr "比较显示"
 

	
 
#: rhodecode/templates/changelog/changelog.html:6
 
#, python-format
 
msgid "%s Changelog"
 
msgstr "%s 修订记录"
 

	
 
#: rhodecode/templates/changelog/changelog.html:15
 
#, python-format
 
msgid "showing %d out of %d revision"
 
msgid_plural "showing %d out of %d revisions"
 
msgstr[0] "显示 %2d 中的 %1d 个版本"
 

	
 
#: rhodecode/templates/changelog/changelog.html:37
 
#: rhodecode/templates/forks/forks_data.html:19
 
#, python-format
 
msgid "compare fork with %s"
 
msgstr "与 %s 比较"
 

	
 
#: rhodecode/templates/changelog/changelog.html:37
 
#: rhodecode/templates/forks/forks_data.html:21
 
msgid "Compare fork"
 
msgstr "比较分支"
 

	
 
#: rhodecode/templates/changelog/changelog.html:46
 
msgid "Show"
 
msgstr "显示"
 

	
 
#: rhodecode/templates/changelog/changelog.html:72
 
#: rhodecode/templates/summary/summary.html:364
 
msgid "show more"
 
msgstr "显示更多"
 

	
 
#: rhodecode/templates/changelog/changelog.html:76
 
msgid "Affected number of files, click to show more details"
 
msgstr "影响的文件数,点击显示详细信息"
 

	
 
#: rhodecode/templates/changelog/changelog.html:89
 
#: rhodecode/templates/changeset/changeset.html:38
 
#: rhodecode/templates/changeset/changeset_file_comment.html:20
 
#: rhodecode/templates/changeset/changeset_range.html:46
 
msgid "Changeset status"
 
msgstr "修订集状态"
 

	
 
#: rhodecode/templates/changelog/changelog.html:92
 
msgid "Click to open associated pull request"
 
msgstr "点击建立相关的拉取请求"
 

	
 
#: rhodecode/templates/changelog/changelog.html:102
 
#: rhodecode/templates/changeset/changeset.html:78
 
msgid "Parent"
 
msgstr "父版本"
 

	
 
#: rhodecode/templates/changelog/changelog.html:108
 
#: rhodecode/templates/changeset/changeset.html:84
 
msgid "No parents"
 
msgstr "无父版本"
 

	
 
#: rhodecode/templates/changelog/changelog.html:113
 
#: rhodecode/templates/changeset/changeset.html:88
 
msgid "merge"
 
msgstr "合并"
 

	
 
#: rhodecode/templates/changelog/changelog.html:116
 
#: rhodecode/templates/changeset/changeset.html:91
 
#: rhodecode/templates/files/files.html:29
 
#: rhodecode/templates/files/files_add.html:33
 
#: rhodecode/templates/files/files_edit.html:33
 
#: rhodecode/templates/shortlog/shortlog_data.html:9
 
msgid "branch"
 
msgstr "分支"
 

	
 
#: rhodecode/templates/changelog/changelog.html:122
 
msgid "bookmark"
 
msgstr "书签"
 

	
 
#: rhodecode/templates/changelog/changelog.html:128
 
#: rhodecode/templates/changeset/changeset.html:96
 
msgid "tag"
 
msgstr "标签"
 

	
 
#: rhodecode/templates/changelog/changelog.html:164
 
msgid "Show selected changes __S -> __E"
 
msgstr "显示选定的修订集 __S -> __E"
 

	
 
#: rhodecode/templates/changelog/changelog.html:255
 
msgid "There are no changes yet"
 
msgstr "没有任何变更"
 

	
 
#: rhodecode/templates/changelog/changelog_details.html:4
 
#: rhodecode/templates/changeset/changeset.html:66
 
msgid "removed"
 
msgstr "移除"
 

	
 
#: rhodecode/templates/changelog/changelog_details.html:5
 
#: rhodecode/templates/changeset/changeset.html:67
 
msgid "changed"
 
msgstr "修改"
 

	
 
#: rhodecode/templates/changelog/changelog_details.html:6
 
#: rhodecode/templates/changeset/changeset.html:68
 
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:70
 
#: rhodecode/templates/changeset/changeset.html:71
 
#: rhodecode/templates/changeset/changeset.html:72
 
#, python-format
 
msgid "affected %s files"
 
msgstr "影响 %s 文件"
 

	
 
#: rhodecode/templates/changeset/changeset.html:6
 
#, python-format
 
msgid "%s Changeset"
 
msgstr "%s 修订集"
 

	
 
#: rhodecode/templates/changeset/changeset.html:14
 
msgid "Changeset"
 
msgstr "修订集"
 

	
 
#: rhodecode/templates/changeset/changeset.html:43
 
#: rhodecode/templates/changeset/diff_block.html:20
 
msgid "raw diff"
 
msgstr "原始 diff"
 

	
 
#: rhodecode/templates/changeset/changeset.html:44
 
#: rhodecode/templates/changeset/diff_block.html:21
 
msgid "download diff"
 
msgstr "下载 diff"
 

	
 
#: rhodecode/templates/changeset/changeset.html:48
 
#: rhodecode/templates/changeset/changeset_file_comment.html:82
 
#, python-format
 
msgid "%d comment"
 
msgid_plural "%d comments"
 
msgstr[0] "%d 条评论"
 

	
 
#: rhodecode/templates/changeset/changeset.html:48
 
#: rhodecode/templates/changeset/changeset_file_comment.html:82
 
#, python-format
 
msgid "(%d inline)"
 
msgid_plural "(%d inline)"
 
msgstr[0] "(%d 内嵌)"
 

	
 
#: rhodecode/templates/changeset/changeset.html:103
 
#, python-format
 
msgid "%s files affected with %s insertions and %s deletions:"
 
msgstr "%s 个文件受影响包括 %s 行插入和 %s 行删除:"
 

	
 
#: rhodecode/templates/changeset/changeset.html:119
 
msgid "Changeset was too big and was cut off..."
 
msgstr "修订集太大已被截断......"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:42
 
msgid "Submitting..."
 
msgstr "提交中……"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:45
 
msgid "Commenting on line {1}."
 
msgstr "在 {1} 行上评论"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:46
 
#: rhodecode/templates/changeset/changeset_file_comment.html:121
 
#, python-format
 
msgid "Comments parsed using %s syntax with %s support."
 
msgstr "评论使用 %s 语法并支持 %s"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:48
 
#: rhodecode/templates/changeset/changeset_file_comment.html:123
 
msgid ""
 
"Use @username inside this text to send notification to this RhodeCode user"
 
msgstr "在文本中使用 @用户名 以发送通知到该 RhodeCode 用户"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:59
 
#: rhodecode/templates/changeset/changeset_file_comment.html:138
 
msgid "Comment"
 
msgstr "评论"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:60
 
#: rhodecode/templates/changeset/changeset_file_comment.html:71
 
msgid "Hide"
 
msgstr "影藏"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:67
 
msgid "You need to be logged in to comment."
 
msgstr "必须登录才能评论"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:67
 
msgid "Login now"
 
msgstr "现在登陆"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:118
 
msgid "Leave a comment"
 
msgstr "发表评论"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:124
 
msgid "Check this to change current status of code-review for this changeset"
 
msgstr "勾选以改变这个修订集的代码审查状态"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:124
 
msgid "change status"
 
msgstr "改变状态"
 

	
 
#: rhodecode/templates/changeset/changeset_file_comment.html:140
 
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:29
 
#: rhodecode/templates/compare/compare_diff.html:29
 
msgid "Compare View"
 
msgstr "比较显示"
 

	
 
#: rhodecode/templates/changeset/changeset_range.html:54
 
#: rhodecode/templates/compare/compare_diff.html:41
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:69
 
msgid "Files affected"
 
msgstr "影响文件"
 

	
 
#: rhodecode/templates/changeset/diff_block.html:19
 
msgid "diff"
 
msgstr "差别"
 

	
 
#: rhodecode/templates/changeset/diff_block.html:27
 
msgid "show inline comments"
 
msgstr "显示内嵌评论"
 

	
 
#: rhodecode/templates/compare/compare_cs.html:5
 
msgid "No changesets"
 
msgstr "无修订"
 

	
 
#: rhodecode/templates/compare/compare_diff.html:37
 
msgid "Outgoing changesets"
 
msgstr "传出修订集"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:39
 
#: rhodecode/templates/data_table/_dt_elements.html:41
 
#: rhodecode/templates/data_table/_dt_elements.html:43
 
msgid "Fork"
 
msgstr "分支"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:60
 
#: rhodecode/templates/journal/journal.html:126
 
#: rhodecode/templates/summary/summary.html:68
 
msgid "Mercurial repository"
 
msgstr "Mercurial 版本库"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:62
 
#: rhodecode/templates/journal/journal.html:128
 
#: rhodecode/templates/summary/summary.html:71
 
msgid "Git repository"
 
msgstr "Git 版本库"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:69
 
#: rhodecode/templates/journal/journal.html:134
 
#: rhodecode/templates/summary/summary.html:78
 
msgid "public repository"
 
msgstr "公共版本库"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:80
 
#: rhodecode/templates/summary/summary.html:87
 
#: rhodecode/templates/summary/summary.html:88
 
msgid "Fork of"
 
msgstr "分支自"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:92
 
msgid "No changesets yet"
 
msgstr "无修订"
 

	
 
#: rhodecode/templates/data_table/_dt_elements.html:104
 
#, python-format
 
msgid "Confirm to delete this user: %s"
 
msgstr "确认删除用户: %s"
 

	
 
#: rhodecode/templates/email_templates/main.html:8
 
msgid "This is an notification from RhodeCode."
 
msgstr "这是 RhodeCode 发送的一个通知。"
 

	
 
#: rhodecode/templates/errors/error_document.html:46
 
#, python-format
 
msgid "You will be redirected to %s in %s seconds"
 
msgstr "%1s 秒后你将重定向到 %2s"
 

	
 
#: rhodecode/templates/files/file_diff.html:4
 
#, python-format
 
msgid "%s File diff"
 
msgstr "%s 文件差异"
 

	
 
#: rhodecode/templates/files/file_diff.html:12
 
msgid "File diff"
 
msgstr "文件差异"
 

	
 
#: rhodecode/templates/files/files.html:4
 
#: rhodecode/templates/files/files.html:72
 
#, python-format
 
msgid "%s files"
 
msgstr "%s 文件"
 

	
 
#: rhodecode/templates/files/files.html:12
 
#: rhodecode/templates/summary/summary.html:340
 
msgid "files"
 
msgstr "文件"
 

	
 
#: rhodecode/templates/files/files_add.html:4
 
#: rhodecode/templates/files/files_edit.html:4
 
#, python-format
 
msgid "%s Edit file"
 
msgstr "%s 编辑文件"
 

	
 
#: rhodecode/templates/files/files_add.html:19
 
msgid "add file"
 
msgstr "新建文件"
 

	
 
#: rhodecode/templates/files/files_add.html:40
 
msgid "Add new file"
 
msgstr "新建文件"
 

	
 
#: rhodecode/templates/files/files_add.html:45
 
msgid "File Name"
 
msgstr "文件名"
 

	
 
#: rhodecode/templates/files/files_add.html:49
 
#: rhodecode/templates/files/files_add.html:58
 
msgid "or"
 
msgstr "或者"
 

	
 
#: rhodecode/templates/files/files_add.html:49
 
#: rhodecode/templates/files/files_add.html:54
 
msgid "Upload file"
 
msgstr "上传文件"
 

	
 
#: rhodecode/templates/files/files_add.html:58
 
msgid "Create new file"
 
msgstr "创建新文件"
 

	
 
#: rhodecode/templates/files/files_add.html:63
 
#: rhodecode/templates/files/files_edit.html:39
 
#: rhodecode/templates/files/files_ypjax.html:3
 
msgid "Location"
 
msgstr "位置"
 

	
 
@@ -3426,469 +3482,476 @@ msgstr "二进制文件(%s)"
 
msgid "File is too big to display"
 
msgstr "文件过大,不能显示"
 

	
 
#: rhodecode/templates/files/files_source.html:124
 
msgid "Selection link"
 
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:13
 
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:31
 
msgid "Fork name"
 
msgstr "分支名"
 

	
 
#: rhodecode/templates/forks/fork.html:68
 
msgid "Private"
 
msgstr "私有"
 

	
 
#: rhodecode/templates/forks/fork.html:77
 
msgid "Copy permissions"
 
msgstr "拷贝权限"
 

	
 
#: rhodecode/templates/forks/fork.html:81
 
msgid "Copy permissions from forked repository"
 
msgstr "从被分支版本库拷贝权限"
 

	
 
#: rhodecode/templates/forks/fork.html:86
 
msgid "Update after clone"
 
msgstr "克隆后更新"
 

	
 
#: rhodecode/templates/forks/fork.html:90
 
msgid "Checkout source after making a clone"
 
msgstr "完成克隆后检出源代码"
 

	
 
#: rhodecode/templates/forks/fork.html:94
 
msgid "fork this repository"
 
msgstr "对该版本库建立分支"
 

	
 
#: rhodecode/templates/forks/forks.html:5
 
#, python-format
 
msgid "%s Forks"
 
msgstr "%s 的分支"
 

	
 
#: rhodecode/templates/forks/forks.html:13
 
msgid "forks"
 
msgstr "分支"
 

	
 
#: rhodecode/templates/forks/forks_data.html:17
 
msgid "forked"
 
msgstr "已有分支"
 

	
 
#: rhodecode/templates/forks/forks_data.html:38
 
msgid "There are no forks yet"
 
msgstr "无分支"
 

	
 
#: rhodecode/templates/journal/journal.html:13
 
msgid "ATOM journal feed"
 
msgstr "订阅日志 ATOM"
 

	
 
#: rhodecode/templates/journal/journal.html:14
 
msgid "RSS journal feed"
 
msgstr "订阅日志 RSS"
 

	
 
#: rhodecode/templates/journal/journal.html:24
 
#: rhodecode/templates/pullrequests/pullrequest.html:27
 
msgid "Refresh"
 
msgstr "刷新"
 

	
 
#: rhodecode/templates/journal/journal.html:27
 
#: rhodecode/templates/journal/public_journal.html:24
 
msgid "RSS feed"
 
msgstr "订阅 RSS"
 

	
 
#: rhodecode/templates/journal/journal.html:30
 
#: rhodecode/templates/journal/public_journal.html:27
 
msgid "ATOM feed"
 
msgstr "订阅 ATOM"
 

	
 
#: rhodecode/templates/journal/journal.html:41
 
msgid "Watched"
 
msgstr "关注的"
 

	
 
#: rhodecode/templates/journal/journal.html:46
 
msgid "ADD"
 
msgstr "新建版本库"
 

	
 
#: rhodecode/templates/journal/journal.html:114
 
msgid "following user"
 
msgstr "关注用户"
 

	
 
#: rhodecode/templates/journal/journal.html:114
 
msgid "user"
 
msgstr "用户"
 

	
 
#: rhodecode/templates/journal/journal.html:147
 
msgid "You are not following any users or repositories"
 
msgstr "未关注任何用户或版本库"
 

	
 
#: rhodecode/templates/journal/journal_data.html:47
 
msgid "No entries yet"
 
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/journal/public_journal.html:21
 
msgid "Public Journal"
 
msgstr "公共日志"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:4
 
#: rhodecode/templates/pullrequests/pullrequest.html:12
 
msgid "New pull request"
 
msgstr "新建拉取请求"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:28
 
msgid "refresh overview"
 
msgstr "刷新概览"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:66
 
msgid "Detailed compare view"
 
msgstr "详细比较显示"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:70
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:82
 
msgid "Pull request reviewers"
 
msgstr "拉取请求检视人员"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:79
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:94
 
msgid "owner"
 
msgstr "所有者"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:91
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:109
 
msgid "Add reviewer to this pull request."
 
msgstr "为这个拉取请求增加检视人员"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:97
 
msgid "Create new pull request"
 
msgstr "创建新的拉取请求"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:106
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:25
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:33
 
msgid "Title"
 
msgstr "标题"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:115
 
msgid "description"
 
msgstr "描述"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest.html:123
 
msgid "Send pull request"
 
msgstr "发送拉取请求"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:23
 
#, python-format
 
msgid "Closed %s"
 
msgstr "关闭于 %s"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:23
 
#, python-format
 
msgid "with status %s"
 
msgstr "状态%s"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:31
 
msgid "Status"
 
msgstr "状态"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:36
 
msgid "Pull request status"
 
msgstr "拉取请求状态"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:44
 
msgid "Still not reviewed by"
 
msgstr "还未检视的检视人员"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:47
 
#, python-format
 
msgid "%d reviewer"
 
msgid_plural "%d reviewers"
 
msgstr[0] "%d 个检视者"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:54
 
msgid "Created on"
 
msgstr "创建于 %s"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:61
 
msgid "Compare view"
 
msgstr "比较显示"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show.html:65
 
msgid "Incoming changesets"
 
msgstr "传入修订集"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:4
 
msgid "all pull requests"
 
msgstr "所有拉取请求"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:12
 
msgid "All pull requests"
 
msgstr "所有拉取请求"
 

	
 
#: rhodecode/templates/pullrequests/pullrequest_show_all.html:27
 
msgid "Closed"
 
msgstr "已关闭"
 

	
 
# 中文中 repo name 在前面 serch term在后面
 
#: rhodecode/templates/search/search.html:6
 
#, python-format
 
msgid "Search \"%s\" in repository: %s"
 
msgstr "在版本库 %2s 中搜索 \"%1s\""
 
msgstr "搜索 \"%s\" 于版本库 %s 中"
 

	
 
#: rhodecode/templates/search/search.html:8
 
#, python-format
 
msgid "Search \"%s\" in all repositories"
 
msgstr "在所有的版本库中搜索  \"%s\""
 

	
 
#: rhodecode/templates/search/search.html:12
 
#: rhodecode/templates/search/search.html:32
 
#, python-format
 
msgid "Search in repository: %s"
 
msgstr "在版本库 %s 中搜索"
 

	
 
#: rhodecode/templates/search/search.html:14
 
#: rhodecode/templates/search/search.html:34
 
msgid "Search in all repositories"
 
msgstr "在所有的版本库中搜索"
 

	
 
#: rhodecode/templates/search/search.html:48
 
msgid "Search term"
 
msgstr "搜索短语"
 

	
 
#: rhodecode/templates/search/search.html:60
 
msgid "Search in"
 
msgstr "搜索范围"
 

	
 
#: rhodecode/templates/search/search.html:63
 
msgid "File contents"
 
msgstr "文件内容"
 

	
 
#: rhodecode/templates/search/search.html:64
 
msgid "Commit messages"
 
msgstr "提交信息"
 

	
 
#: rhodecode/templates/search/search.html:65
 
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/settings/repo_settings.html:5
 
#, python-format
 
msgid "%s Settings"
 
msgstr "%s 设置"
 

	
 
#: rhodecode/templates/shortlog/shortlog.html:5
 
#, python-format
 
msgid "%s Shortlog"
 
msgstr "%s 简短日志"
 

	
 
#: rhodecode/templates/shortlog/shortlog.html:14
 
msgid "shortlog"
 
msgstr "简短日志"
 

	
 
#: rhodecode/templates/shortlog/shortlog_data.html:7
 
msgid "age"
 
msgstr "时间"
 

	
 
#: rhodecode/templates/shortlog/shortlog_data.html:18
 
msgid "No commit message"
 
msgstr "没有提交信息"
 

	
 
#: rhodecode/templates/shortlog/shortlog_data.html:62
 
msgid "Add or upload files directly via RhodeCode"
 
msgstr "通过 RhodeCode 直接添加或者上传文件"
 

	
 
#: rhodecode/templates/shortlog/shortlog_data.html:71
 
msgid "Push new repo"
 
msgstr "Push 新版本库"
 

	
 
#: rhodecode/templates/shortlog/shortlog_data.html:79
 
msgid "Existing repository?"
 
msgstr "现有版本库?"
 

	
 
#: rhodecode/templates/summary/summary.html:4
 
#, python-format
 
msgid "%s Summary"
 
msgstr "%s 概要"
 

	
 
#: rhodecode/templates/summary/summary.html:12
 
msgid "summary"
 
msgstr "概要"
 

	
 
#: rhodecode/templates/summary/summary.html:20
 
#, python-format
 
msgid "repo %s ATOM feed"
 
msgstr "订阅 ATOM %s"
 

	
 
#: rhodecode/templates/summary/summary.html:21
 
#, python-format
 
msgid "repo %s RSS feed"
 
msgstr "订阅 RSS %s"
 

	
 
#: rhodecode/templates/summary/summary.html:49
 
#: rhodecode/templates/summary/summary.html:52
 
msgid "ATOM"
 
msgstr "ATOM"
 

	
 
#: rhodecode/templates/summary/summary.html:82
 
#, python-format
 
msgid "Non changable ID %s"
 
msgstr "不可变 ID %s"
 

	
 
#: rhodecode/templates/summary/summary.html:87
 
msgid "public"
 
msgstr "公共"
 

	
 
#: rhodecode/templates/summary/summary.html:95
 
msgid "remote clone"
 
msgstr "远程克隆"
 

	
 
#: rhodecode/templates/summary/summary.html:116
 
msgid "Contact"
 
msgstr "联系方式"
 

	
 
#: rhodecode/templates/summary/summary.html:130
 
msgid "Clone url"
 
msgstr "克隆地址"
 

	
 
#: rhodecode/templates/summary/summary.html:133
 
msgid "Show by Name"
 
msgstr "以名字显示"
 

	
 
#: rhodecode/templates/summary/summary.html:134
 
msgid "Show by ID"
 
msgstr "以 ID 显示"
 

	
 
#: rhodecode/templates/summary/summary.html:142
 
msgid "Trending files"
 
msgstr "文件趋势图"
 

	
 
#: rhodecode/templates/summary/summary.html:150
 
#: rhodecode/templates/summary/summary.html:166
 
#: rhodecode/templates/summary/summary.html:194
 
msgid "enable"
 
msgstr "启用"
 

	
 
#: rhodecode/templates/summary/summary.html:158
 
msgid "Download"
 
msgstr "下载"
 

	
 
#: rhodecode/templates/summary/summary.html:162
 
msgid "There are no downloads yet"
 
msgstr "无下载"
 

	
 
#: rhodecode/templates/summary/summary.html:164
 
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:173
 
msgid "Check this to download archive with subrepos"
 
msgstr "勾选以下载包含子版本库的压缩包"
 

	
 
#: rhodecode/templates/summary/summary.html:173
 
msgid "with subrepos"
 
msgstr "包括子版本库"
 

	
 
#: rhodecode/templates/summary/summary.html:186
 
msgid "Commit activity by day / author"
 
msgstr "按日期或作者的提交活动"
 

	
 
#: rhodecode/templates/summary/summary.html:197
 
msgid "Stats gathered: "
 
msgstr "已收集的统计: "
 

	
 
#: rhodecode/templates/summary/summary.html:218
 
msgid "Shortlog"
 
msgstr "简短日志"
 

	
 
#: rhodecode/templates/summary/summary.html:220
 
msgid "Quick start"
 
msgstr "快速入门"
 

	
 
#: rhodecode/templates/summary/summary.html:233
 
#, python-format
 
msgid "Readme file at revision '%s'"
 
msgstr "修订 '%s' 中的README"
 

	
 
#: rhodecode/templates/summary/summary.html:236
 
msgid "Permalink to this readme"
 
msgstr "这个 README 的固定链接"
 

	
 
#: rhodecode/templates/summary/summary.html:293
 
#, python-format
 
msgid "Download %s as %s"
 
msgstr "下载 %s 作为 %s"
 

	
 
#: rhodecode/templates/summary/summary.html:650
 
msgid "commits"
 
msgstr "提交"
 

	
 
#: rhodecode/templates/summary/summary.html:651
 
msgid "files added"
 
msgstr "文件已添加"
 

	
 
#: rhodecode/templates/summary/summary.html:652
 
msgid "files changed"
 
msgstr "文件已更改"
 

	
 
#: rhodecode/templates/summary/summary.html:653
 
msgid "files removed"
 
msgstr "文件已删除"
 

	
 
#: rhodecode/templates/summary/summary.html:656
 
msgid "commit"
 
msgstr "提交"
 

	
 
#: rhodecode/templates/summary/summary.html:657
 
msgid "file added"
 
msgstr "文件已添加"
 

	
 
#: rhodecode/templates/summary/summary.html:658
 
msgid "file changed"
 
msgstr "文件已更改"
 

	
 
#: rhodecode/templates/summary/summary.html:659
 
msgid "file removed"
 
msgstr "文件已删除"
 

	
 
#: rhodecode/templates/tags/tags.html:5
 
#, python-format
 
msgid "%s Tags"
 
msgstr "%s 标签"
 

	
 
#~ msgid "Groups"
 
#~ msgstr "组"
rhodecode/lib/helpers.py
Show inline comments
 
@@ -811,267 +811,286 @@ class RepoPage(Page):
 
            else:
 
                self.previous_page = None
 

	
 
            if self.page < self.last_page:
 
                self.next_page = self.page + 1
 
            else:
 
                self.next_page = None
 

	
 
        # No items available
 
        else:
 
            self.first_page = None
 
            self.page_count = 0
 
            self.last_page = None
 
            self.first_item = None
 
            self.last_item = None
 
            self.previous_page = None
 
            self.next_page = None
 
            self.items = []
 

	
 
        # This is a subclass of the 'list' type. Initialise the list now.
 
        list.__init__(self, reversed(self.items))
 

	
 

	
 
def changed_tooltip(nodes):
 
    """
 
    Generates a html string for changed nodes in changeset page.
 
    It limits the output to 30 entries
 

	
 
    :param nodes: LazyNodesGenerator
 
    """
 
    if nodes:
 
        pref = ': <br/> '
 
        suf = ''
 
        if len(nodes) > 30:
 
            suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
 
        return literal(pref + '<br/> '.join([safe_unicode(x.path)
 
                                             for x in nodes[:30]]) + suf)
 
    else:
 
        return ': ' + _('No Files')
 

	
 

	
 
def repo_link(groups_and_repos):
 
    """
 
    Makes a breadcrumbs link to repo within a group
 
    joins &raquo; on each group to create a fancy link
 

	
 
    ex::
 
        group >> subgroup >> repo
 

	
 
    :param groups_and_repos:
 
    """
 
    groups, repo_name = groups_and_repos
 

	
 
    if not groups:
 
        return repo_name
 
    else:
 
        def make_link(group):
 
            return link_to(group.name, url('repos_group_home',
 
                                           group_name=group.group_name))
 
        return literal(' &raquo; '.join(map(make_link, groups)) + \
 
                       " &raquo; " + repo_name)
 

	
 

	
 
def fancy_file_stats(stats):
 
    """
 
    Displays a fancy two colored bar for number of added/deleted
 
    lines of code on file
 

	
 
    :param stats: two element list of added/deleted lines of code
 
    """
 

	
 
    a, d, t = stats[0], stats[1], stats[0] + stats[1]
 
    width = 100
 
    unit = float(width) / (t or 1)
 

	
 
    # needs > 9% of width to be visible or 0 to be hidden
 
    a_p = max(9, unit * a) if a > 0 else 0
 
    d_p = max(9, unit * d) if d > 0 else 0
 
    p_sum = a_p + d_p
 

	
 
    if p_sum > width:
 
        #adjust the percentage to be == 100% since we adjusted to 9
 
        if a_p > d_p:
 
            a_p = a_p - (p_sum - width)
 
        else:
 
            d_p = d_p - (p_sum - width)
 

	
 
    a_v = a if a > 0 else ''
 
    d_v = d if d > 0 else ''
 

	
 
    def cgen(l_type):
 
        mapping = {'tr': 'top-right-rounded-corner-mid',
 
                   'tl': 'top-left-rounded-corner-mid',
 
                   'br': 'bottom-right-rounded-corner-mid',
 
                   'bl': 'bottom-left-rounded-corner-mid'}
 
        map_getter = lambda x: mapping[x]
 

	
 
        if l_type == 'a' and d_v:
 
            #case when added and deleted are present
 
            return ' '.join(map(map_getter, ['tl', 'bl']))
 

	
 
        if l_type == 'a' and not d_v:
 
            return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
 

	
 
        if l_type == 'd' and a_v:
 
            return ' '.join(map(map_getter, ['tr', 'br']))
 

	
 
        if l_type == 'd' and not a_v:
 
            return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
 

	
 
    d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
 
        cgen('a'), a_p, a_v
 
    )
 
    d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
 
        cgen('d'), d_p, d_v
 
    )
 
    return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
 

	
 

	
 
def urlify_text(text_):
 
    import re
 

	
 
    url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]'''
 
                         '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
 

	
 
    def url_func(match_obj):
 
        url_full = match_obj.groups()[0]
 
        return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
 

	
 
    return literal(url_pat.sub(url_func, text_))
 

	
 

	
 
def urlify_changesets(text_, repository):
 
    """
 
    Extract revision ids from changeset and make link from them
 

	
 
    :param text_:
 
    :param repository:
 
    """
 
    import re
 
    URL_PAT = re.compile(r'([0-9a-fA-F]{12,})')
 

	
 
    def url_func(match_obj):
 
        rev = match_obj.groups()[0]
 
        pref = ''
 
        if match_obj.group().startswith(' '):
 
            pref = ' '
 
        tmpl = (
 
        '%(pref)s<a class="%(cls)s" href="%(url)s">'
 
        '%(rev)s'
 
        '</a>'
 
        )
 
        return tmpl % {
 
         'pref': pref,
 
         'cls': 'revision-link',
 
         'url': url('changeset_home', repo_name=repository, revision=rev),
 
         'rev': rev,
 
        }
 

	
 
    newtext = URL_PAT.sub(url_func, text_)
 

	
 
    return newtext
 

	
 

	
 
def urlify_commit(text_, repository=None, link_=None):
 
    """
 
    Parses given text message and makes proper links.
 
    issues are linked to given issue-server, and rest is a changeset link
 
    if link_ is given, in other case it's a plain text
 

	
 
    :param text_:
 
    :param repository:
 
    :param link_: changeset link
 
    """
 
    import re
 
    import traceback
 

	
 
    def escaper(string):
 
        return string.replace('<', '&lt;').replace('>', '&gt;')
 

	
 
    def linkify_others(t, l):
 
        urls = re.compile(r'(\<a.*?\<\/a\>)',)
 
        links = []
 
        for e in urls.split(t):
 
            if not urls.match(e):
 
                links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
 
            else:
 
                links.append(e)
 

	
 
        return ''.join(links)
 

	
 
    # urlify changesets - extrac revisions and make link out of them
 
    text_ = urlify_changesets(escaper(text_), repository)
 
    newtext = urlify_changesets(escaper(text_), repository)
 

	
 
    try:
 
        conf = config['app_conf']
 

	
 
        URL_PAT = re.compile(r'%s' % conf.get('issue_pat'))
 
        # allow multiple issue servers to be used
 
        valid_indices = [
 
            x.group(1)
 
            for x in map(lambda x: re.match(r'issue_pat(.*)', x), conf.keys())
 
            if x and 'issue_server_link%s' % x.group(1) in conf
 
            and 'issue_prefix%s' % x.group(1) in conf
 
        ]
 

	
 
        log.debug('found issue server suffixes `%s` during valuation of: %s'
 
                  % (','.join(valid_indices), newtext))
 

	
 
        if URL_PAT:
 
            ISSUE_SERVER_LNK = conf.get('issue_server_link')
 
            ISSUE_PREFIX = conf.get('issue_prefix')
 
        for pattern_index in valid_indices:
 
            ISSUE_PATTERN = conf.get('issue_pat%s' % pattern_index)
 
            ISSUE_SERVER_LNK = conf.get('issue_server_link%s' % pattern_index)
 
            ISSUE_PREFIX = conf.get('issue_prefix%s' % pattern_index)
 

	
 
            log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s'
 
                      % (pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
 
                         ISSUE_PREFIX))
 

	
 
            URL_PAT = re.compile(r'%s' % ISSUE_PATTERN)
 

	
 
            def url_func(match_obj):
 
                pref = ''
 
                if match_obj.group().startswith(' '):
 
                    pref = ' '
 

	
 
                issue_id = ''.join(match_obj.groups())
 
                tmpl = (
 
                '%(pref)s<a class="%(cls)s" href="%(url)s">'
 
                '%(issue-prefix)s%(id-repr)s'
 
                '</a>'
 
                )
 
                url = ISSUE_SERVER_LNK.replace('{id}', issue_id)
 
                if repository:
 
                    url = url.replace('{repo}', repository)
 
                    repo_name = repository.split(URL_SEP)[-1]
 
                    url = url.replace('{repo_name}', repo_name)
 

	
 
                return tmpl % {
 
                     'pref': pref,
 
                     'cls': 'issue-tracker-link',
 
                     'url': url,
 
                     'id-repr': issue_id,
 
                     'issue-prefix': ISSUE_PREFIX,
 
                     'serv': ISSUE_SERVER_LNK,
 
                }
 
            newtext = URL_PAT.sub(url_func, newtext)
 
            log.debug('processed prefix:`%s` => %s' % (pattern_index, newtext))
 

	
 
            newtext = URL_PAT.sub(url_func, text_)
 

	
 
        # if we actually did something above
 
        if valid_indices:
 
            if link_:
 
                # wrap not links into final link => link_
 
                newtext = linkify_others(newtext, link_)
 

	
 
            return literal(newtext)
 
    except:
 
        log.error(traceback.format_exc())
 
        pass
 

	
 
    return text_
 
    return newtext
 

	
 

	
 
def rst(source):
 
    return literal('<div class="rst-block">%s</div>' %
 
                   MarkupRenderer.rst(source))
 

	
 

	
 
def rst_w_mentions(source):
 
    """
 
    Wrapped rst renderer with @mention highlighting
 

	
 
    :param source:
 
    """
 
    return literal('<div class="rst-block">%s</div>' %
 
                   MarkupRenderer.rst_with_mentions(source))
 

	
 

	
 
def changeset_status(repo, revision):
 
    return ChangesetStatusModel().get_status(repo, revision)
 

	
 

	
 
def changeset_status_lbl(changeset_status):
 
    return dict(ChangesetStatus.STATUSES).get(changeset_status)
 

	
 

	
 
def get_permission_name(key):
 
    return dict(Permission.PERMS).get(key)
rhodecode/lib/hooks.py
Show inline comments
 
@@ -128,255 +128,255 @@ def pre_pull(ui, repo, **kwargs):
 
        scm = extras['scm']
 
        locked_by = extras['locked_by']
 
    elif 'username' in rc_extras:
 
        username = rc_extras['username']
 
        repository = rc_extras['repository']
 
        scm = rc_extras['scm']
 
        locked_by = rc_extras['locked_by']
 
    else:
 
        raise Exception('Missing data in repo.ui and os.environ')
 

	
 
    if locked_by[0]:
 
        locked_by = User.get(locked_by[0]).username
 
        raise HTTPLockedRC(repository, locked_by)
 

	
 

	
 
def log_pull_action(ui, repo, **kwargs):
 
    """
 
    Logs user last pull action
 

	
 
    :param ui:
 
    :param repo:
 
    """
 
    try:
 
        rc_extras = json.loads(os.environ.get('RC_SCM_DATA', "{}"))
 
    except:
 
        rc_extras = {}
 
    extras = dict(repo.ui.configitems('rhodecode_extras'))
 
    if 'username' in extras:
 
        username = extras['username']
 
        repository = extras['repository']
 
        scm = extras['scm']
 
        make_lock = extras['make_lock']
 
    elif 'username' in rc_extras:
 
        username = rc_extras['username']
 
        repository = rc_extras['repository']
 
        scm = rc_extras['scm']
 
        make_lock = rc_extras['make_lock']
 
    else:
 
        raise Exception('Missing data in repo.ui and os.environ')
 
    user = User.get_by_username(username)
 
    action = 'pull'
 
    action_logger(user, action, repository, extras['ip'], commit=True)
 
    # extension hook call
 
    from rhodecode import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'PULL_HOOK', None)
 

	
 
    if isfunction(callback):
 
        kw = {}
 
        kw.update(extras)
 
        callback(**kw)
 

	
 
    if make_lock is True:
 
        Repository.lock(Repository.get_by_repo_name(repository), user.user_id)
 
        #msg = 'Made lock on repo `%s`' % repository
 
        #sys.stdout.write(msg)
 

	
 
    return 0
 

	
 

	
 
def log_push_action(ui, repo, **kwargs):
 
    """
 
    Maps user last push action to new changeset id, from mercurial
 

	
 
    :param ui:
 
    :param repo: repo object containing the `ui` object
 
    """
 

	
 
    try:
 
        rc_extras = json.loads(os.environ.get('RC_SCM_DATA', "{}"))
 
    except:
 
        rc_extras = {}
 

	
 
    extras = dict(repo.ui.configitems('rhodecode_extras'))
 
    if 'username' in extras:
 
        username = extras['username']
 
        repository = extras['repository']
 
        scm = extras['scm']
 
        make_lock = extras['make_lock']
 
    elif 'username' in rc_extras:
 
        username = rc_extras['username']
 
        repository = rc_extras['repository']
 
        scm = rc_extras['scm']
 
        make_lock = rc_extras['make_lock']
 
    else:
 
        raise Exception('Missing data in repo.ui and os.environ')
 

	
 
    action = 'push' + ':%s'
 

	
 
    if scm == 'hg':
 
        node = kwargs['node']
 

	
 
        def get_revs(repo, rev_opt):
 
            if rev_opt:
 
                revs = revrange(repo, rev_opt)
 

	
 
                if len(revs) == 0:
 
                    return (nullrev, nullrev)
 
                return (max(revs), min(revs))
 
            else:
 
                return (len(repo) - 1, 0)
 

	
 
        stop, start = get_revs(repo, [node + ':'])
 
        h = binascii.hexlify
 
        revs = [h(repo[r].node()) for r in xrange(start, stop + 1)]
 
    elif scm == 'git':
 
        revs = kwargs.get('_git_revs', [])
 
        if '_git_revs' in kwargs:
 
            kwargs.pop('_git_revs')
 

	
 
    action = action % ','.join(revs)
 

	
 
    action_logger(username, action, repository, extras['ip'], commit=True)
 

	
 
    # extension hook call
 
    from rhodecode import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'PUSH_HOOK', None)
 
    if isfunction(callback):
 
        kw = {'pushed_revs': revs}
 
        kw.update(extras)
 
        callback(**kw)
 

	
 
    if make_lock is False:
 
        Repository.unlock(Repository.get_by_repo_name(repository))
 
        msg = 'Released lock on repo `%s`\n' % repository
 
        sys.stdout.write(msg)
 

	
 
    return 0
 

	
 

	
 
def log_create_repository(repository_dict, created_by, **kwargs):
 
    """
 
    Post create repository Hook. This is a dummy function for admins to re-use
 
    if needed. It's taken from rhodecode-extensions module and executed
 
    if present
 

	
 
    :param repository: dict dump of repository object
 
    :param created_by: username who created repository
 
    :param created_date: date of creation
 

	
 
    available keys of repository_dict:
 

	
 
     'repo_type',
 
     'description',
 
     'private',
 
     'created_on',
 
     'enable_downloads',
 
     'repo_id',
 
     'user_id',
 
     'enable_statistics',
 
     'clone_uri',
 
     'fork_id',
 
     'group_id',
 
     'repo_name'
 

	
 
    """
 
    from rhodecode import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'CREATE_REPO_HOOK', None)
 
    if isfunction(callback):
 
        kw = {}
 
        kw.update(repository_dict)
 
        kw.update({'created_by': created_by})
 
        kw.update(kwargs)
 
        return callback(**kw)
 

	
 
    return 0
 

	
 
handle_git_pre_receive = (lambda repo_path, revs, env:
 
    handle_git_receive(repo_path, revs, env, hook_type='pre'))
 
handle_git_post_receive = (lambda repo_path, revs, env:
 
    handle_git_receive(repo_path, revs, env, hook_type='post'))
 

	
 

	
 
def handle_git_receive(repo_path, revs, env, hook_type='post'):
 
    """
 
    A really hacky method that is runned by git post-receive hook and logs
 
    an push action together with pushed revisions. It's executed by subprocess
 
    thus needs all info to be able to create a on the fly pylons enviroment,
 
    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
 
    from rhodecode.config.environment import load_environment
 
    from rhodecode.model import init_model
 
    from rhodecode.model.db import RhodeCodeUi
 
    from rhodecode.lib.utils import make_ui
 
    extras = json.loads(env['RHODECODE_EXTRAS'])
 

	
 
    path, ini_name = os.path.split(env['RHODECODE_CONFIG_FILE'])
 
    path, ini_name = os.path.split(extras['config'])
 
    conf = appconfig('config:%s' % ini_name, relative_to=path)
 
    load_environment(conf.global_conf, conf.local_conf)
 

	
 
    engine = engine_from_config(conf, 'sqlalchemy.db1.')
 
    init_model(engine)
 

	
 
    baseui = make_ui('db')
 
    # fix if it's not a bare repo
 
    if repo_path.endswith('.git'):
 
        repo_path = repo_path[:-4]
 
    if repo_path.endswith(os.sep + '.git'):
 
        repo_path = repo_path[:-5]
 

	
 
    repo = Repository.get_by_full_path(repo_path)
 
    if not repo:
 
        raise OSError('Repository %s not found in database'
 
                      % (safe_str(repo_path)))
 

	
 
    _hooks = dict(baseui.configitems('hooks')) or {}
 

	
 
    extras = json.loads(env['RHODECODE_EXTRAS'])
 
    for k, v in extras.items():
 
        baseui.setconfig('rhodecode_extras', k, v)
 
    repo = repo.scm_instance
 
    repo.ui = baseui
 

	
 
    if hook_type == 'pre':
 
        pre_push(baseui, repo)
 

	
 
    # if push hook is enabled via web interface
 
    elif hook_type == 'post' and _hooks.get(RhodeCodeUi.HOOK_PUSH):
 

	
 
        rev_data = []
 
        for l in revs:
 
            old_rev, new_rev, ref = l.split(' ')
 
            _ref_data = ref.split('/')
 
            if _ref_data[1] in ['tags', 'heads']:
 
                rev_data.append({'old_rev': old_rev,
 
                                 'new_rev': new_rev,
 
                                 'ref': ref,
 
                                 'type': _ref_data[1],
 
                                 'name': _ref_data[2].strip()})
 

	
 
        git_revs = []
 
        for push_ref  in rev_data:
 
            _type = push_ref['type']
 
            if _type == 'heads':
 
                if push_ref['old_rev'] == EmptyChangeset().raw_id:
 
                    cmd = "for-each-ref --format='%(refname)' 'refs/heads/*'"
 
                    heads = repo.run_git_command(cmd)[0]
 
                    heads = heads.replace(push_ref['ref'], '')
 
                    heads = ' '.join(map(lambda c: c.strip('\n').strip(),
 
                                         heads.splitlines()))
 
                    cmd = (('log %(new_rev)s' % push_ref) +
 
                           ' --reverse --pretty=format:"%H" --not ' + heads)
 
                else:
 
                    cmd = (('log %(old_rev)s..%(new_rev)s' % push_ref) +
 
                           ' --reverse --pretty=format:"%H"')
 
                git_revs += repo.run_git_command(cmd)[0].splitlines()
 
            elif _type == 'tags':
 
                git_revs += [push_ref['name']]
 

	
 
        log_push_action(baseui, repo, _git_revs=git_revs)
rhodecode/lib/middleware/pygrack.py
Show inline comments
 
import os
 
import socket
 
import logging
 
import subprocess
 
import traceback
 

	
 
from webob import Request, Response, exc
 

	
 
from rhodecode.lib import subprocessio
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
class FileWrapper(object):
 

	
 
    def __init__(self, fd, content_length):
 
        self.fd = fd
 
        self.content_length = content_length
 
        self.remain = content_length
 

	
 
    def read(self, size):
 
        if size <= self.remain:
 
            try:
 
                data = self.fd.read(size)
 
            except socket.error:
 
                raise IOError(self)
 
            self.remain -= size
 
        elif self.remain:
 
            data = self.fd.read(self.remain)
 
            self.remain = 0
 
        else:
 
            data = None
 
        return data
 

	
 
    def __repr__(self):
 
        return '<FileWrapper %s len: %s, read: %s>' % (
 
            self.fd, self.content_length, self.content_length - self.remain
 
        )
 

	
 

	
 
class GitRepository(object):
 
    git_folder_signature = set(['config', 'head', 'info', 'objects', 'refs'])
 
    commands = ['git-upload-pack', 'git-receive-pack']
 

	
 
    def __init__(self, repo_name, content_path, extras):
 
        files = set([f.lower() for f in os.listdir(content_path)])
 
        if  not (self.git_folder_signature.intersection(files)
 
                == self.git_folder_signature):
 
            raise OSError('%s missing git signature' % content_path)
 
        self.content_path = content_path
 
        self.valid_accepts = ['application/x-%s-result' %
 
                              c for c in self.commands]
 
        self.repo_name = repo_name
 
        self.extras = extras
 

	
 
    def _get_fixedpath(self, path):
 
        """
 
        Small fix for repo_path
 

	
 
        :param path:
 
        :type path:
 
        """
 
        return path.split(self.repo_name, 1)[-1].strip('/')
 

	
 
    def inforefs(self, request, environ):
 
        """
 
        WSGI Response producer for HTTP GET Git Smart
 
        HTTP /info/refs request.
 
        """
 

	
 
        git_command = request.GET.get('service')
 
        if git_command not in self.commands:
 
            log.debug('command %s not allowed' % git_command)
 
            return exc.HTTPMethodNotAllowed()
 

	
 
        # note to self:
 
        # please, resist the urge to add '\n' to git capture and increment
 
        # line count by 1.
 
        # The code in Git client not only does NOT need '\n', but actually
 
        # blows up if you sprinkle "flush" (0000) as "0001\n".
 
        # It reads binary, per number of bytes specified.
 
        # if you do add '\n' as part of data, count it.
 
        server_advert = '# service=%s' % git_command
 
        packet_len = str(hex(len(server_advert) + 4)[2:].rjust(4, '0')).lower()
 
        try:
 
            out = subprocessio.SubprocessIOChunker(
 
                r'git %s --stateless-rpc --advertise-refs "%s"' % (
 
                                git_command[4:], self.content_path),
 
                starting_values=[
 
                    packet_len + server_advert + '0000'
 
                ]
 
            )
 
        except EnvironmentError, e:
 
            log.exception(e)
 
            log.error(traceback.format_exc())
 
            raise exc.HTTPExpectationFailed()
 
        resp = Response()
 
        resp.content_type = 'application/x-%s-advertisement' % str(git_command)
 
        resp.charset = None
 
        resp.app_iter = out
 
        return resp
 

	
 
    def backend(self, request, environ):
 
        """
 
        WSGI Response producer for HTTP POST Git Smart HTTP requests.
 
        Reads commands and data from HTTP POST's body.
 
        returns an iterator obj with contents of git command's
 
        response to stdout
 
        """
 
        git_command = self._get_fixedpath(request.path_info)
 
        if git_command not in self.commands:
 
            log.debug('command %s not allowed' % git_command)
 
            return exc.HTTPMethodNotAllowed()
 

	
 
        if 'CONTENT_LENGTH' in environ:
 
            inputstream = FileWrapper(environ['wsgi.input'],
 
                                      request.content_length)
 
        else:
 
            inputstream = environ['wsgi.input']
 

	
 
        try:
 
            gitenv = os.environ
 
            from rhodecode import CONFIG
 
            from rhodecode.lib.compat import json
 
            gitenv['RHODECODE_EXTRAS'] = json.dumps(self.extras)
 
            # forget all configs
 
            gitenv['GIT_CONFIG_NOGLOBAL'] = '1'
 
            # we need current .ini file used to later initialize rhodecode
 
            # env and connect to db
 
            gitenv['RHODECODE_CONFIG_FILE'] = CONFIG['__file__']
 
            opts = dict(
 
                env=gitenv,
 
                cwd=os.getcwd()
 
            )
 
            cmd = r'git %s --stateless-rpc "%s"' % (git_command[4:],
 
                                                    self.content_path),
 
            log.debug('handling cmd %s' % cmd)
 
            out = subprocessio.SubprocessIOChunker(
 
                r'git %s --stateless-rpc "%s"' % (git_command[4:],
 
                                                  self.content_path),
 
                cmd,
 
                inputstream=inputstream,
 
                **opts
 
            )
 
        except EnvironmentError, e:
 
            log.exception(e)
 
            log.error(traceback.format_exc())
 
            raise exc.HTTPExpectationFailed()
 

	
 
        if git_command in [u'git-receive-pack']:
 
            # updating refs manually after each push.
 
            # Needed for pre-1.7.0.4 git clients using regular HTTP mode.
 
            subprocess.call(u'git --git-dir "%s" '
 
                            'update-server-info' % self.content_path,
 
                            shell=True)
 
            cmd = (u'git --git-dir "%s" '
 
                    'update-server-info' % self.content_path)
 
            log.debug('handling cmd %s' % cmd)
 
            subprocess.call(cmd, shell=True)
 

	
 
        resp = Response()
 
        resp.content_type = 'application/x-%s-result' % git_command.encode('utf8')
 
        resp.charset = None
 
        resp.app_iter = out
 
        return resp
 

	
 
    def __call__(self, environ, start_response):
 
        request = Request(environ)
 
        _path = self._get_fixedpath(request.path_info)
 
        if _path.startswith('info/refs'):
 
            app = self.inforefs
 
        elif [a for a in self.valid_accepts if a in request.accept]:
 
            app = self.backend
 
        try:
 
            resp = app(request, environ)
 
        except exc.HTTPException, e:
 
            resp = e
 
            log.exception(e)
 
            log.error(traceback.format_exc())
 
        except Exception, e:
 
            log.exception(e)
 
            log.error(traceback.format_exc())
 
            resp = exc.HTTPInternalServerError()
 
        return resp(environ, start_response)
 

	
 

	
 
class GitDirectory(object):
 

	
 
    def __init__(self, repo_root, repo_name, extras):
 
        repo_location = os.path.join(repo_root, repo_name)
 
        if not os.path.isdir(repo_location):
 
            raise OSError(repo_location)
 

	
 
        self.content_path = repo_location
 
        self.repo_name = repo_name
 
        self.repo_location = repo_location
 
        self.extras = extras
 

	
 
    def __call__(self, environ, start_response):
 
        content_path = self.content_path
 
        try:
 
            app = GitRepository(self.repo_name, content_path, self.extras)
 
        except (AssertionError, OSError):
 
            content_path = os.path.join(content_path, '.git')
 
            if os.path.isdir(content_path):
 
                app = GitRepository(self.repo_name, content_path, self.extras)
 
            else:
 
                return exc.HTTPNotFound()(environ, start_response)
 
        return app(environ, start_response)
 

	
 

	
 
def make_wsgi_app(repo_name, repo_root, extras):
 
    return GitDirectory(repo_root, repo_name, extras)
rhodecode/lib/middleware/simplegit.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.lib.middleware.simplegit
 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
    SimpleGit middleware for handling git protocol request (push/clone etc.)
 
    It's implemented with basic auth function
 

	
 
    :created_on: Apr 28, 2010
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import os
 
import re
 
import logging
 
import traceback
 

	
 
from dulwich import server as dulserver
 
from dulwich.web import LimitedInputFilter, GunzipFilter
 
from rhodecode.lib.exceptions import HTTPLockedRC
 
from rhodecode.lib.hooks import pre_pull
 

	
 

	
 
class SimpleGitUploadPackHandler(dulserver.UploadPackHandler):
 

	
 
    def handle(self):
 
        write = lambda x: self.proto.write_sideband(1, x)
 

	
 
        graph_walker = dulserver.ProtocolGraphWalker(self,
 
                                                     self.repo.object_store,
 
                                                     self.repo.get_peeled)
 
        objects_iter = self.repo.fetch_objects(
 
          graph_walker.determine_wants, graph_walker, self.progress,
 
          get_tagged=self.get_tagged)
 

	
 
        # Did the process short-circuit (e.g. in a stateless RPC call)? Note
 
        # that the client still expects a 0-object pack in most cases.
 
        if objects_iter is None:
 
            return
 

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

	
 
        for msg in messages:
 
            self.progress(msg + "\n")
 
        # we are done
 
        self.proto.write("0000")
 

	
 

	
 
dulserver.DEFAULT_HANDLERS = {
 
  #git-ls-remote, git-clone, git-fetch and git-pull
 
  'git-upload-pack': SimpleGitUploadPackHandler,
 
  #git-push
 
  'git-receive-pack': dulserver.ReceivePackHandler,
 
}
 

	
 
# not used for now until dulwich get's fixed
 
#from dulwich.repo import Repo
 
#from dulwich.web import make_wsgi_chain
 

	
 
from paste.httpheaders import REMOTE_USER, AUTH_TYPE
 
from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \
 
    HTTPBadRequest, HTTPNotAcceptable
 

	
 
from rhodecode.lib.utils2 import safe_str
 
from rhodecode.lib.utils2 import safe_str, fix_PATH
 
from rhodecode.lib.base import BaseVCSController
 
from rhodecode.lib.auth import get_container_username
 
from rhodecode.lib.utils import is_valid_repo, make_ui
 
from rhodecode.lib.compat import json
 
from rhodecode.model.db import User, RhodeCodeUi
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
GIT_PROTO_PAT = re.compile(r'^/(.+)/(info/refs|git-upload-pack|git-receive-pack)')
 

	
 

	
 
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)
 
    )
 
    return isgit_path
 

	
 

	
 
class SimpleGit(BaseVCSController):
 

	
 
    def _handle_request(self, environ, start_response):
 
        if not is_git(environ):
 
            return self.application(environ, start_response)
 
        if not self._check_ssl(environ, start_response):
 
            return HTTPNotAcceptable('SSL REQUIRED !')(environ, start_response)
 

	
 
        ipaddr = self._get_ip_addr(environ)
 
        username = None
 
        self._git_first_op = False
 
        # skip passing error to error controller
 
        environ['pylons.status_code_redirect'] = True
 

	
 
        #======================================================================
 
        # EXTRACT REPOSITORY NAME FROM ENV
 
        #======================================================================
 
        try:
 
            repo_name = self.__get_repository(environ)
 
            log.debug('Extracted repo name is %s' % repo_name)
 
        except:
 
            return HTTPInternalServerError()(environ, start_response)
 

	
 
        # quick check if that dir exists...
 
        if is_valid_repo(repo_name, self.basepath, 'git') is False:
 
            return HTTPNotFound()(environ, start_response)
 

	
 
        #======================================================================
 
        # GET ACTION PULL or PUSH
 
        #======================================================================
 
        action = self.__get_action(environ)
 

	
 
        #======================================================================
 
        # CHECK ANONYMOUS PERMISSION
 
        #======================================================================
 
        if action in ['pull', 'push']:
 
            anonymous_user = self.__get_user('default')
 
            username = anonymous_user.username
 
            anonymous_perm = self._check_permission(action, anonymous_user,
 
                                                    repo_name)
 

	
 
            if anonymous_perm is not True or anonymous_user.active is False:
 
                if anonymous_perm is not True:
 
                    log.debug('Not enough credentials to access this '
 
                              'repository as anonymous user')
 
                if anonymous_user.active is False:
 
                    log.debug('Anonymous access is disabled, running '
 
                              'authentication')
 
                #==============================================================
 
                # DEFAULT PERM FAILED OR ANONYMOUS ACCESS IS DISABLED SO WE
 
                # NEED TO AUTHENTICATE AND ASK FOR AUTH USER PERMISSIONS
 
                #==============================================================
 

	
 
                # Attempting to retrieve username from the container
 
                username = get_container_username(environ, self.config)
 

	
 
                # If not authenticated by the container, running basic auth
 
                if not username:
 
                    self.authenticate.realm = \
 
                        safe_str(self.config['rhodecode_realm'])
 
                    result = self.authenticate(environ)
 
                    if isinstance(result, str):
 
                        AUTH_TYPE.update(environ, 'basic')
 
                        REMOTE_USER.update(environ, result)
 
                        username = result
 
                    else:
 
                        return result.wsgi_application(environ, start_response)
 

	
 
                #==============================================================
 
                # CHECK PERMISSIONS FOR THIS REQUEST USING GIVEN USERNAME
 
                #==============================================================
 
                try:
 
                    user = self.__get_user(username)
 
                    if user is None or not user.active:
 
                        return HTTPForbidden()(environ, start_response)
 
                    username = user.username
 
                except:
 
                    log.error(traceback.format_exc())
 
                    return HTTPInternalServerError()(environ, start_response)
 

	
 
                #check permissions for this repository
 
                perm = self._check_permission(action, user, repo_name)
 
                if perm is not True:
 
                    return HTTPForbidden()(environ, start_response)
 

	
 
        # extras are injected into UI object and later available
 
        # in hooks executed by rhodecode
 
        from rhodecode import CONFIG
 
        extras = {
 
            'ip': ipaddr,
 
            'username': username,
 
            'action': action,
 
            'repository': repo_name,
 
            'scm': 'git',
 
            'config': CONFIG['__file__'],
 
            'make_lock': None,
 
            'locked_by': [None, None]
 
        }
 

	
 
        #===================================================================
 
        # GIT REQUEST HANDLING
 
        #===================================================================
 
        repo_path = os.path.join(safe_str(self.basepath), safe_str(repo_name))
 
        log.debug('Repository path is %s' % repo_path)
 

	
 
        # CHECK LOCKING only if it's not ANONYMOUS USER
 
        if username != User.DEFAULT_USER:
 
            log.debug('Checking locking on repository')
 
            (make_lock,
 
             locked,
 
             locked_by) = self._check_locking_state(
 
                            environ=environ, action=action,
 
                            repo=repo_name, user_id=user.user_id
 
                       )
 
            # 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')
 
        self.__inject_extras(repo_path, baseui, extras)
 

	
 
        try:
 
            # invalidate cache on push
 
            if action == 'push':
 
                self._invalidate_cache(repo_name)
 
            self._handle_githooks(repo_name, action, baseui, environ)
 

	
 
            log.info('%s action on GIT repo "%s"' % (action, repo_name))
 
            app = self.__make_app(repo_name, repo_path, extras)
 
            return app(environ, start_response)
 
        except HTTPLockedRC, e:
 
            log.debug('Repositry LOCKED ret code 423!')
 
            return e(environ, start_response)
 
        except Exception:
 
            log.error(traceback.format_exc())
 
            return HTTPInternalServerError()(environ, start_response)
 

	
 
    def __make_app(self, repo_name, repo_path, extras):
 
        """
 
        Make an wsgi application using dulserver
 

	
 
        :param repo_name: name of the repository
 
        :param repo_path: full path to the repository
 
        """
 

	
 
        from rhodecode.lib.middleware.pygrack import make_wsgi_app
 
        app = make_wsgi_app(
 
            repo_root=safe_str(self.basepath),
 
            repo_name=repo_name,
 
            extras=extras,
 
        )
 
        app = GunzipFilter(LimitedInputFilter(app))
 
        return app
 

	
 
    def __get_repository(self, environ):
 
        """
 
        Get's repository name out of PATH_INFO header
 

	
 
        :param environ: environ where PATH_INFO is stored
 
        """
 
        try:
 
            environ['PATH_INFO'] = self._get_by_id(environ['PATH_INFO'])
 
            repo_name = GIT_PROTO_PAT.match(environ['PATH_INFO']).group(1)
 
        except:
 
            log.error(traceback.format_exc())
 
            raise
 

	
 
        return repo_name
 

	
 
    def __get_user(self, username):
 
        return User.get_by_username(username)
 

	
 
    def __get_action(self, environ):
 
        """
 
        Maps git request commands into a pull or push command.
 

	
 
        :param environ:
 
        """
 
        service = environ['QUERY_STRING'].split('=')
 

	
 
        if len(service) > 1:
 
            service_cmd = service[1]
 
            mapping = {
 
                'git-receive-pack': 'push',
 
                'git-upload-pack': 'pull',
 
            }
 
            op = mapping[service_cmd]
 
            self._git_stored_op = op
 
            return op
 
        else:
 
            # try to fallback to stored variable as we don't know if the last
 
            # operation is pull/push
 
            op = getattr(self, '_git_stored_op', 'pull')
 
        return op
 

	
 
    def _handle_githooks(self, repo_name, action, baseui, environ):
 
        """
 
        Handles pull action, push is handled by post-receive hook
 
        """
 
        from rhodecode.lib.hooks import log_pull_action
 
        service = environ['QUERY_STRING'].split('=')
 

	
 
        if len(service) < 2:
 
            return
 

	
 
        from rhodecode.model.db import Repository
 
        _repo = Repository.get_by_repo_name(repo_name)
 
        _repo = _repo.scm_instance
 
        _repo._repo.ui = baseui
 

	
 
        _hooks = dict(baseui.configitems('hooks')) or {}
 
        if action == 'pull':
 
            # stupid git, emulate pre-pull hook !
 
            pre_pull(ui=baseui, repo=_repo._repo)
 
        if action == 'pull' and _hooks.get(RhodeCodeUi.HOOK_PULL):
 
            log_pull_action(ui=baseui, repo=_repo._repo)
 

	
 
    def __inject_extras(self, repo_path, baseui, extras={}):
 
        """
 
        Injects some extra params into baseui instance
 

	
 
        :param baseui: baseui instance
 
        :param extras: dict with extra params to put into baseui
 
        """
 

	
 
        # make our hgweb quiet so it doesn't print output
 
        baseui.setconfig('ui', 'quiet', 'true')
 

	
 
        #inject some additional parameters that will be available in ui
 
        #for hooks
 
        for k, v in extras.items():
 
            baseui.setconfig('rhodecode_extras', k, v)

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

0 comments (0 inline, 0 general)