# HG changeset patch # User Marcin Kuzminski # Date 2012-05-16 11:29:40 # Node ID c9e3ea5bb59a377dcd52f2d7df10a10309343a83 # Parent 85f31a1b69dc28b8cb13eed5f576d63cb6041990 # Parent 24095abde696dc150ac9bbc5bc55845ca093810e merge beta into codereview diff --git a/CONTRIBUTORS b/CONTRIBUTORS --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -3,10 +3,10 @@ List of contributors to RhodeCode projec Lukasz Balcerzak Jason Harris Thayne Harbaugh - cejones + cejones <> Thomas Waldmann Lorenzo M. Catucci - Dmitri Kuznetsov + Dmitri Kuznetsov <> Jared Bunting Steve Romanow Augosto Hermann @@ -17,4 +17,5 @@ List of contributors to RhodeCode projec Matt Zuba Aras Pranckevicius Tony Bussieres - Erwin Kroon \ No newline at end of file + Erwin Kroon + nansenat16 \ No newline at end of file diff --git a/README.rst b/README.rst --- a/README.rst +++ b/README.rst @@ -15,7 +15,7 @@ RhodeCode is similar in some respects to however RhodeCode can be run as standalone hosted application on your own server. It is open source and donation ware and focuses more on providing a customized, self administered interface for Mercurial_ and GIT_ repositories. -RhodeCode works on *nix systems and Windows it is powered by a vcs_ library +RhodeCode works on \*nix systems and Windows it is powered by a vcs_ library that Lukasz Balcerzak and Marcin Kuzminski created to handle multiple different version control systems. diff --git a/docs/changelog.rst b/docs/changelog.rst old mode 100644 new mode 100755 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,7 +4,7 @@ Changelog ========= -1.3.5 (**2012-XX-XX**) +1.4.0 (**2012-XX-XX**) ---------------------- :status: in-progress @@ -13,6 +13,31 @@ 1.3.5 (**2012-XX-XX**) news ++++ +fixes ++++++ + +1.3.6 (**2012-05-16**) +---------------------- + +news +++++ + +- chinese traditional translation + +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 + +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 @@ -26,6 +51,7 @@ news - 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 +++++ @@ -37,6 +63,8 @@ fixes - 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**) ---------------------- diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -46,6 +46,9 @@ except ImportError: PLATFORM_WIN = ('Windows') PLATFORM_OTHERS = ('Linux', 'Darwin', 'FreeBSD', 'OpenBSD', 'SunOS') +is_windows = __platform__ in PLATFORM_WIN +is_unix = __platform__ in PLATFORM_OTHERS + requirements = [ "Pylons==1.0.0", "Beaker==1.6.3", @@ -62,13 +65,13 @@ requirements = [ "webob==1.0.8", "markdown==2.1.1", "docutils==0.8.1", + "simplejson==2.5.2", ] if __py_version__ < (2, 6): - requirements.append("simplejson") requirements.append("pysqlite") -if __platform__ in PLATFORM_WIN: +if is_windows: requirements.append("mercurial>=2.2.1,<2.3") else: requirements.append("py-bcrypt") diff --git a/rhodecode/config/rcextensions/make_rcextensions.py b/rhodecode/config/rcextensions/make_rcextensions.py --- a/rhodecode/config/rcextensions/make_rcextensions.py +++ b/rhodecode/config/rcextensions/make_rcextensions.py @@ -22,6 +22,8 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . +from __future__ import with_statement + import os import sys import pkg_resources diff --git a/rhodecode/controllers/files.py b/rhodecode/controllers/files.py --- a/rhodecode/controllers/files.py +++ b/rhodecode/controllers/files.py @@ -26,6 +26,7 @@ import os import logging import traceback +import tempfile from pylons import request, response, tmpl_context as c, url from pylons.i18n.translation import _ @@ -48,6 +49,7 @@ from rhodecode.lib.vcs.nodes import File from rhodecode.model.repo import RepoModel from rhodecode.model.scm import ScmModel +from rhodecode.model.db import Repository from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\ _context_url, get_line_ctx, get_ignore_ws @@ -168,7 +170,7 @@ class FilesController(BaseRepoController file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path) response.content_disposition = 'attachment; filename=%s' % \ - safe_str(f_path.split(os.sep)[-1]) + safe_str(f_path.split(Repository.url_sep())[-1]) response.content_type = file_node.mimetype return file_node.content @@ -358,25 +360,23 @@ class FilesController(BaseRepoController except (ImproperArchiveTypeError, KeyError): return _('Unknown archive type') + archive = tempfile.NamedTemporaryFile(mode='w+r+b', delete=False) + cs.fill_archive(stream=archive, kind=fileformat, subrepos=subrepos) + archive.close() response.content_type = content_type response.content_disposition = 'attachment; filename=%s-%s%s' \ - % (repo_name, revision, ext) - - import tempfile - archive = tempfile.mkstemp()[1] - t = open(archive, 'wb') - cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos) + % (repo_name, revision[:12], ext) + response.content_length = str(os.path.getsize(archive.name)) - def get_chunked_archive(archive): - stream = open(archive, 'rb') + def get_chunked_archive(tmpfile): while True: - data = stream.read(4096) + data = tmpfile.read(16 * 1024) if not data: - os.remove(archive) + tmpfile.close() + os.unlink(tmpfile.name) break yield data - - return get_chunked_archive(archive) + return get_chunked_archive(tmpfile=open(archive.name,'rb')) @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin') diff --git a/rhodecode/controllers/summary.py b/rhodecode/controllers/summary.py --- a/rhodecode/controllers/summary.py +++ b/rhodecode/controllers/summary.py @@ -179,10 +179,12 @@ class SummaryController(BaseRepoControll if c.enable_downloads: c.download_options = self._get_download_links(c.rhodecode_repo) - c.readme_data, c.readme_file = self.__get_readme_data(c.rhodecode_db_repo) + c.readme_data, c.readme_file = self.__get_readme_data( + c.rhodecode_db_repo.repo_name, c.rhodecode_repo + ) return render('summary/summary.html') - def __get_readme_data(self, repo): + def __get_readme_data(self, repo_name, repo): @cache_region('long_term') def _get_readme_from_cache(key): @@ -190,7 +192,7 @@ class SummaryController(BaseRepoControll readme_file = None log.debug('Fetching readme file') try: - cs = repo.get_changeset('tip') + cs = repo.get_changeset() # fetches TIP renderer = MarkupRenderer() for f in README_FILES: try: @@ -202,6 +204,7 @@ class SummaryController(BaseRepoControll except NodeDoesNotExistError: continue except ChangesetError: + log.error(traceback.format_exc()) pass except EmptyRepositoryError: pass @@ -210,7 +213,7 @@ class SummaryController(BaseRepoControll return readme_data, readme_file - key = repo.repo_name + '_README' + key = repo_name + '_README' inv = CacheInvalidation.invalidate(key) if inv is not None: region_invalidate(_get_readme_from_cache, None, key) diff --git a/rhodecode/i18n/zh_TW/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/zh_TW/LC_MESSAGES/rhodecode.mo new file mode 100644 index 0000000000000000000000000000000000000000..aee6ff0f60bc1e0d25beda8a140aed37013f771e GIT binary patch literal 23483 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, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: RhodeCode 1.2.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-09-14 15:50-0300\n" +"PO-Revision-Date: 2012-05-09 22:23+0800\n" +"Last-Translator: Nansen \n" +"Language-Team: LANGUAGE \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-Poedit-Language: Chinese\n" +"X-Poedit-Country: TAIWAN\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: rhodecode/controllers/changeset.py:108 +#: rhodecode/controllers/changeset.py:149 +#: rhodecode/controllers/changeset.py:216 +#: rhodecode/controllers/changeset.py:229 +msgid "binary file" +msgstr "二進位檔" + +#: rhodecode/controllers/changeset.py:123 +#: rhodecode/controllers/changeset.py:168 +msgid "Changeset is to big and was cut off, see raw changeset instead" +msgstr "" + +#: rhodecode/controllers/changeset.py:159 +msgid "Diff is to big and was cut off, see raw diff instead" +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:48 +#, python-format +msgid "Changes on %s repository" +msgstr "修改於版本庫 %s" + +#: rhodecode/controllers/feed.py:49 +#, python-format +msgid "%s %s feed" +msgstr "" + +#: rhodecode/controllers/files.py:72 +msgid "There are no files yet" +msgstr "尚未有任何檔案" + +#: rhodecode/controllers/files.py:262 +#, python-format +msgid "Edited %s via RhodeCode" +msgstr "使用 RhodeCode 編輯 %s" + +#: rhodecode/controllers/files.py:267 +#: rhodecode/templates/files/file_diff.html:40 +msgid "No changes" +msgstr "沒有修改" + +#: rhodecode/controllers/files.py:278 +#, python-format +msgid "Successfully committed to %s" +msgstr "成功遞交至 %s" + +#: rhodecode/controllers/files.py:283 +msgid "Error occurred during commit" +msgstr "" + +#: rhodecode/controllers/files.py:308 +msgid "downloads disabled" +msgstr "下載已關閉" + +#: rhodecode/controllers/files.py:313 +#, python-format +msgid "Unknown revision %s" +msgstr "未知修訂 %s" + +#: rhodecode/controllers/files.py:315 +msgid "Empty repository" +msgstr "空的版本庫" + +#: rhodecode/controllers/files.py:317 +msgid "Unknown archive type" +msgstr "未知的存檔類型" + +#: rhodecode/controllers/files.py:385 +#: rhodecode/controllers/files.py:398 +msgid "Binary file" +msgstr "二進位檔" + +#: rhodecode/controllers/files.py:417 +#: rhodecode/templates/changeset/changeset_range.html:4 +#: rhodecode/templates/changeset/changeset_range.html:12 +#: rhodecode/templates/changeset/changeset_range.html:29 +msgid "Changesets" +msgstr "變更" + +#: rhodecode/controllers/files.py:418 +#: rhodecode/controllers/summary.py:175 +#: rhodecode/templates/branches/branches.html:5 +#: rhodecode/templates/summary/summary.html:690 +msgid "Branches" +msgstr "分支" + +#: rhodecode/controllers/files.py:419 +#: rhodecode/controllers/summary.py:176 +#: rhodecode/templates/summary/summary.html:679 +#: rhodecode/templates/tags/tags.html:5 +msgid "Tags" +msgstr "標籤" + +#: rhodecode/controllers/journal.py:50 +#, python-format +msgid "%s public journal %s feed" +msgstr "%s 公開日誌 %s feed" + +#: rhodecode/controllers/journal.py:178 +#: rhodecode/controllers/journal.py:212 +#: rhodecode/templates/admin/repos/repo_edit.html:171 +#: rhodecode/templates/base/base.html:50 +msgid "Public journal" +msgstr "公開日誌" + +#: rhodecode/controllers/login.py:111 +msgid "You have successfully registered into rhodecode" +msgstr "您已經成功註冊rhodecode" + +#: rhodecode/controllers/login.py:133 +msgid "Your password reset link was sent" +msgstr "您的密碼重設連結已寄出" + +#: rhodecode/controllers/login.py:155 +msgid "Your password reset was successful, new password has been sent to your email" +msgstr "您的密碼重設動作已完成,新的密碼已寄至您的信箱" + +#: rhodecode/controllers/search.py:109 +msgid "Invalid search query. Try quoting it." +msgstr "無效的查詢。請使用跳脫字元" + +#: rhodecode/controllers/search.py:114 +msgid "There is no index to search in. Please run whoosh indexer" +msgstr "沒有任何索引可以搜尋。請執行 whoosh 建立索引" + +#: rhodecode/controllers/search.py:118 +msgid "An error occurred during this search operation" +msgstr "" + +#: rhodecode/controllers/settings.py:61 +#: rhodecode/controllers/settings.py:171 +#, 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 "" + +#: rhodecode/controllers/settings.py:109 +#: rhodecode/controllers/admin/repos.py:239 +#, python-format +msgid "Repository %s updated successfully" +msgstr "版本庫 %s 更新完成" + +#: rhodecode/controllers/settings.py:126 +#: rhodecode/controllers/admin/repos.py:257 +#, python-format +msgid "error occurred during update of repository %s" +msgstr "" + +#: rhodecode/controllers/settings.py:144 +#: rhodecode/controllers/admin/repos.py:275 +#, 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 "" + +#: rhodecode/controllers/settings.py:156 +#: rhodecode/controllers/admin/repos.py:287 +#, python-format +msgid "deleted repository %s" +msgstr "刪除版本庫 %s" + +#: rhodecode/controllers/settings.py:159 +#: rhodecode/controllers/admin/repos.py:297 +#: rhodecode/controllers/admin/repos.py:303 +#, python-format +msgid "An error occurred during deletion of %s" +msgstr "" + +#: rhodecode/controllers/settings.py:193 +#, python-format +msgid "forked %s repository as %s" +msgstr "forked %s 版本庫為 %s" + +#: rhodecode/controllers/settings.py:211 +#, python-format +msgid "An error occurred during repository forking %s" +msgstr "" + +#: rhodecode/controllers/summary.py:123 +msgid "No data loaded yet" +msgstr "" + +#: rhodecode/controllers/summary.py:126 +msgid "Statistics are disabled for this repository" +msgstr "這個版本庫的統計功能已停用" + +#: rhodecode/controllers/admin/ldap_settings.py:49 +msgid "BASE" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:50 +msgid "ONELEVEL" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:51 +msgid "SUBTREE" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:55 +msgid "NEVER" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:56 +msgid "ALLOW" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:57 +msgid "TRY" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:58 +msgid "DEMAND" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:59 +msgid "HARD" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:63 +msgid "No encryption" +msgstr "無加密" + +#: rhodecode/controllers/admin/ldap_settings.py:64 +msgid "LDAPS connection" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:65 +msgid "START_TLS on LDAP connection" +msgstr "" + +#: rhodecode/controllers/admin/ldap_settings.py:115 +msgid "Ldap settings updated successfully" +msgstr "LDAP設定更新完成" + +#: rhodecode/controllers/admin/ldap_settings.py:120 +msgid "Unable to activate ldap. The \"python-ldap\" library is missing." +msgstr "無法啟用LDAP。找不到python-ldap函式庫" + +#: rhodecode/controllers/admin/ldap_settings.py:134 +msgid "error occurred during update of ldap settings" +msgstr "" + +#: rhodecode/controllers/admin/permissions.py:56 +msgid "None" +msgstr "無" + +#: rhodecode/controllers/admin/permissions.py:57 +msgid "Read" +msgstr "讀" + +#: rhodecode/controllers/admin/permissions.py:58 +msgid "Write" +msgstr "寫" + +#: rhodecode/controllers/admin/permissions.py:59 +#: 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:10 +#: 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:110 +#: 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:279 +#: rhodecode/templates/base/base.html:366 +#: rhodecode/templates/base/base.html:368 +#: rhodecode/templates/base/base.html:370 +msgid "Admin" +msgstr "管理" + +#: rhodecode/controllers/admin/permissions.py:62 +msgid "disabled" +msgstr "停用" + +#: rhodecode/controllers/admin/permissions.py:64 +msgid "allowed with manual account activation" +msgstr "允許手動啟用帳號" + +#: rhodecode/controllers/admin/permissions.py:66 +msgid "allowed with automatic account activation" +msgstr "允許自動啟用帳號" + +#: rhodecode/controllers/admin/permissions.py:68 +msgid "Disabled" +msgstr "停用" + +#: rhodecode/controllers/admin/permissions.py:69 +msgid "Enabled" +msgstr "啟用" + +#: rhodecode/controllers/admin/permissions.py:102 +msgid "Default permissions updated successfully" +msgstr "預設權限更新完成" + +#: rhodecode/controllers/admin/permissions.py:119 +msgid "error occurred during update of permissions" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:96 +#, python-format +msgid "%s repository is not mapped to db perhaps it was created or renamed from the filesystem please run the application again in order to rescan repositories" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:172 +#, python-format +msgid "created repository %s from %s" +msgstr "建立版本庫 %s 到 %s" + +#: rhodecode/controllers/admin/repos.py:176 +#, python-format +msgid "created repository %s" +msgstr "建立版本庫 %s" + +#: rhodecode/controllers/admin/repos.py:205 +#, python-format +msgid "error occurred during creation of repository %s" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:292 +#, python-format +msgid "Cannot delete %s it still contains attached forks" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:320 +msgid "An error occurred during deletion of repository user" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:335 +msgid "An error occurred during deletion of repository users groups" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:352 +msgid "An error occurred during deletion of repository stats" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:367 +msgid "An error occurred during cache invalidation" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:387 +msgid "Updated repository visibility in public journal" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:390 +msgid "An error occurred during setting this repository in public journal" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:395 +#: rhodecode/model/forms.py:53 +msgid "Token mismatch" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:408 +msgid "Pulled from remote location" +msgstr "" + +#: rhodecode/controllers/admin/repos.py:410 +msgid "An error occurred during pull from remote location" +msgstr "" + +#: rhodecode/controllers/admin/repos_groups.py:83 +#, python-format +msgid "created repos group %s" +msgstr "建立版本庫群組 %s" + +#: rhodecode/controllers/admin/repos_groups.py:96 +#, python-format +msgid "error occurred during creation of repos group %s" +msgstr "" + +#: rhodecode/controllers/admin/repos_groups.py:130 +#, python-format +msgid "updated repos group %s" +msgstr "更新版本庫群組 %s" + +#: rhodecode/controllers/admin/repos_groups.py:143 +#, python-format +msgid "error occurred during update of repos group %s" +msgstr "" + +#: rhodecode/controllers/admin/repos_groups.py:164 +#, python-format +msgid "This group contains %s repositores and cannot be deleted" +msgstr "" + +#: rhodecode/controllers/admin/repos_groups.py:171 +#, python-format +msgid "removed repos group %s" +msgstr "移除版本庫群組 %s" + +#: rhodecode/controllers/admin/repos_groups.py:175 +#, python-format +msgid "error occurred during deletion of repos group %s" +msgstr "" + +#: rhodecode/controllers/admin/settings.py:109 +#, python-format +msgid "Repositories successfully rescanned added: %s,removed: %s" +msgstr "" + +#: rhodecode/controllers/admin/settings.py:118 +msgid "Whoosh reindex task scheduled" +msgstr "Whoosh 重新索引工作排程" + +#: rhodecode/controllers/admin/settings.py:143 +msgid "Updated application settings" +msgstr "更新應用設定" + +#: rhodecode/controllers/admin/settings.py:148 +#: rhodecode/controllers/admin/settings.py:215 +msgid "error occurred during updating application settings" +msgstr "" + +#: rhodecode/controllers/admin/settings.py:210 +msgid "Updated mercurial settings" +msgstr "更新 mercurial 設定" + +#: rhodecode/controllers/admin/settings.py:236 +msgid "Added new hook" +msgstr "新增hook" + +#: rhodecode/controllers/admin/settings.py:247 +msgid "Updated hooks" +msgstr "更新hook" + +#: rhodecode/controllers/admin/settings.py:251 +msgid "error occurred during hook creation" +msgstr "" + +#: rhodecode/controllers/admin/settings.py:310 +msgid "You can't edit this user since it's crucial for entire application" +msgstr "" + +#: rhodecode/controllers/admin/settings.py:339 +msgid "Your account was updated successfully" +msgstr "您的帳號已更新完成" + +#: rhodecode/controllers/admin/settings.py:359 +#: rhodecode/controllers/admin/users.py:130 +#, python-format +msgid "error occurred during update of user %s" +msgstr "" + +#: rhodecode/controllers/admin/users.py:78 +#, python-format +msgid "created user %s" +msgstr "建立使用者 %s" + +#: rhodecode/controllers/admin/users.py:90 +#, python-format +msgid "error occurred during creation of user %s" +msgstr "" + +#: rhodecode/controllers/admin/users.py:116 +msgid "User updated successfully" +msgstr "使用者更新完成" + +#: rhodecode/controllers/admin/users.py:146 +msgid "successfully deleted user" +msgstr "成功刪除使用者" + +#: rhodecode/controllers/admin/users.py:150 +msgid "An error occurred during deletion of user" +msgstr "" + +#: rhodecode/controllers/admin/users.py:166 +msgid "You can't edit this user" +msgstr "您無法編輯這位使用者" + +#: rhodecode/controllers/admin/users.py:195 +#: rhodecode/controllers/admin/users_groups.py:202 +msgid "Granted 'repository create' permission to user" +msgstr "" + +#: rhodecode/controllers/admin/users.py:204 +#: rhodecode/controllers/admin/users_groups.py:211 +msgid "Revoked 'repository create' permission to user" +msgstr "" + +#: rhodecode/controllers/admin/users_groups.py:74 +#, python-format +msgid "created users group %s" +msgstr "建立使用者群組 %s" + +#: rhodecode/controllers/admin/users_groups.py:86 +#, python-format +msgid "error occurred during creation of users group %s" +msgstr "" + +#: rhodecode/controllers/admin/users_groups.py:119 +#, python-format +msgid "updated users group %s" +msgstr "更新使用者群組 %s" + +#: rhodecode/controllers/admin/users_groups.py:138 +#, python-format +msgid "error occurred during update of users group %s" +msgstr "" + +#: rhodecode/controllers/admin/users_groups.py:154 +msgid "successfully deleted users group" +msgstr "成功移除使用者群組" + +#: rhodecode/controllers/admin/users_groups.py:158 +msgid "An error occurred during deletion of users group" +msgstr "" + +#: rhodecode/lib/__init__.py:279 +msgid "year" +msgstr "年" + +#: rhodecode/lib/__init__.py:280 +msgid "month" +msgstr "月" + +#: rhodecode/lib/__init__.py:281 +msgid "day" +msgstr "日" + +#: rhodecode/lib/__init__.py:282 +msgid "hour" +msgstr "時" + +#: rhodecode/lib/__init__.py:283 +msgid "minute" +msgstr "分" + +#: rhodecode/lib/__init__.py:284 +msgid "second" +msgstr "秒" + +#: rhodecode/lib/__init__.py:293 +msgid "ago" +msgstr "之前" + +#: rhodecode/lib/__init__.py:296 +msgid "just now" +msgstr "現在" + +#: rhodecode/lib/auth.py:377 +msgid "You need to be a registered user to perform this action" +msgstr "您必須是註冊使用者才能執行這個動作" + +#: rhodecode/lib/auth.py:421 +msgid "You need to be a signed in to view this page" +msgstr "您必須登入後才能瀏覽這個頁面" + +#: rhodecode/lib/helpers.py:307 +msgid "True" +msgstr "真" + +#: rhodecode/lib/helpers.py:311 +msgid "False" +msgstr "假" + +#: rhodecode/lib/helpers.py:352 +#, python-format +msgid "Show all combined changesets %s->%s" +msgstr "" + +#: rhodecode/lib/helpers.py:356 +msgid "compare view" +msgstr "" + +#: rhodecode/lib/helpers.py:365 +msgid "and" +msgstr "和" + +#: rhodecode/lib/helpers.py:365 +#, python-format +msgid "%s more" +msgstr "" + +#: rhodecode/lib/helpers.py:367 +#: rhodecode/templates/changelog/changelog.html:14 +#: rhodecode/templates/changelog/changelog.html:39 +msgid "revisions" +msgstr "修訂" + +#: rhodecode/lib/helpers.py:385 +msgid "fork name " +msgstr "fork 名稱" + +#: rhodecode/lib/helpers.py:388 +msgid "[deleted] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:389 +#: rhodecode/lib/helpers.py:393 +msgid "[created] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:390 +#: rhodecode/lib/helpers.py:394 +msgid "[forked] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:391 +#: rhodecode/lib/helpers.py:395 +msgid "[updated] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:392 +msgid "[delete] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:396 +msgid "[pushed] into" +msgstr "" + +#: rhodecode/lib/helpers.py:397 +msgid "[committed via RhodeCode] into" +msgstr "" + +#: rhodecode/lib/helpers.py:398 +msgid "[pulled from remote] into" +msgstr "" + +#: rhodecode/lib/helpers.py:399 +msgid "[pulled] from" +msgstr "" + +#: rhodecode/lib/helpers.py:400 +msgid "[started following] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:401 +msgid "[stopped following] repository" +msgstr "" + +#: rhodecode/lib/helpers.py:577 +#, python-format +msgid " and %s more" +msgstr "" + +#: rhodecode/lib/helpers.py:581 +msgid "No Files" +msgstr "沒有檔案" + +#: rhodecode/model/forms.py:66 +msgid "Invalid username" +msgstr "無效的使用者名稱" + +#: rhodecode/model/forms.py:75 +msgid "This username already exists" +msgstr "使用者名稱已存在" + +#: rhodecode/model/forms.py:79 +msgid "Username may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character" +msgstr "使用者名稱只能使用字母數字、底線、小數點或破折號,且必須使用數字或字母開頭" + +#: rhodecode/model/forms.py:94 +msgid "Invalid group name" +msgstr "無效的群組名稱" + +#: rhodecode/model/forms.py:104 +msgid "This users group already exists" +msgstr "這個使用者群組已存在" + +#: rhodecode/model/forms.py:110 +msgid "Group name may only contain alphanumeric characters underscores, periods or dashes and must begin with alphanumeric character" +msgstr "群組名稱只能使用字母數字、底線、小數點或破折號,且必須使用數字或字母開頭" + +#: rhodecode/model/forms.py:132 +msgid "Cannot assign this group as parent" +msgstr "" + +#: rhodecode/model/forms.py:148 +msgid "This group already exists" +msgstr "這個群組已存在" + +#: rhodecode/model/forms.py:164 +#: rhodecode/model/forms.py:172 +#: rhodecode/model/forms.py:180 +msgid "Invalid characters in password" +msgstr "無效的字元在密碼中" + +#: rhodecode/model/forms.py:191 +msgid "Passwords do not match" +msgstr "密碼不相符" + +#: rhodecode/model/forms.py:196 +msgid "invalid password" +msgstr "無效的密碼" + +#: rhodecode/model/forms.py:197 +msgid "invalid user name" +msgstr "無效的使用者名稱" + +#: rhodecode/model/forms.py:198 +msgid "Your account is disabled" +msgstr "您的帳號已被停用" + +#: rhodecode/model/forms.py:233 +msgid "This username is not valid" +msgstr "無效的使用者名稱" + +#: rhodecode/model/forms.py:245 +msgid "This repository name is disallowed" +msgstr "不允許的版本庫名稱" + +#: rhodecode/model/forms.py:266 +#, python-format +msgid "This repository already exists in group \"%s\"" +msgstr "這個版本庫已存在於群組 \"%s\"" + +#: rhodecode/model/forms.py:274 +msgid "This repository already exists" +msgstr "這個版本庫已經存在" + +#: rhodecode/model/forms.py:312 +#: rhodecode/model/forms.py:319 +msgid "invalid clone url" +msgstr "無效的複製URL" + +#: rhodecode/model/forms.py:322 +msgid "Invalid clone url, provide a valid clone http\\s url" +msgstr "" + +#: rhodecode/model/forms.py:334 +msgid "Fork have to be the same type as original" +msgstr "Fork 必須使用相同的版本庫類型" + +#: rhodecode/model/forms.py:341 +msgid "This username or users group name is not valid" +msgstr "使用者名稱或群組名稱無效" + +#: rhodecode/model/forms.py:403 +msgid "This is not a valid path" +msgstr "不是一個有效的路徑" + +#: rhodecode/model/forms.py:416 +msgid "This e-mail address is already taken" +msgstr "這個郵件位址已經使用了" + +#: rhodecode/model/forms.py:427 +msgid "This e-mail address doesn't exist." +msgstr "這個郵件位址不存在" + +#: rhodecode/model/forms.py:447 +msgid "The LDAP Login attribute of the CN must be specified - this is the name of the attribute that is equivalent to 'username'" +msgstr "" + +#: rhodecode/model/forms.py:466 +msgid "Please enter a login" +msgstr "請登入" + +#: rhodecode/model/forms.py:467 +#, python-format +msgid "Enter a value %(min)i characters long or more" +msgstr "" + +#: rhodecode/model/forms.py:475 +msgid "Please enter a password" +msgstr "請輸入密碼" + +#: rhodecode/model/forms.py:476 +#, python-format +msgid "Enter %(min)i characters or more" +msgstr "" + +#: rhodecode/model/user.py:145 +msgid "[RhodeCode] New User registration" +msgstr "[RhodeCode] 新使用者註冊" + +#: rhodecode/model/user.py:157 +#: rhodecode/model/user.py:179 +msgid "You can't Edit this user since it's crucial for entire application" +msgstr "您無法編輯這個使用者,因為他是系統帳號" + +#: rhodecode/model/user.py:201 +msgid "You can't remove this user since it's crucial for entire application" +msgstr "您無法移除這個使用者,因為他是系統帳號" + +#: rhodecode/model/user.py:204 +#, python-format +msgid "This user still owns %s repositories and cannot be removed. Switch owners or remove those repositories" +msgstr "這個使用者擁有 %s 個版本庫所以無法移除,請先變更版本庫擁有者或者刪除版本庫" + +#: rhodecode/templates/index.html:4 +msgid "Dashboard" +msgstr "儀表板" + +#: rhodecode/templates/index_base.html:22 +#: rhodecode/templates/admin/users/user_edit_my_account.html:102 +msgid "quick filter..." +msgstr "快速過濾..." + +#: rhodecode/templates/index_base.html:23 +#: rhodecode/templates/base/base.html:300 +msgid "repositories" +msgstr "個版本庫" + +#: rhodecode/templates/index_base.html:29 +#: rhodecode/templates/admin/repos/repos.html:22 +msgid "ADD NEW REPOSITORY" +msgstr "新增版本庫" + +#: rhodecode/templates/index_base.html:41 +#: 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:42 +#: rhodecode/templates/index_base.html:73 +#: rhodecode/templates/admin/repos/repo_add_base.html:44 +#: rhodecode/templates/admin/repos/repo_edit.html:64 +#: rhodecode/templates/admin/repos/repos.html:31 +#: 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/settings/repo_fork.html:40 +#: rhodecode/templates/settings/repo_settings.html:40 +#: rhodecode/templates/summary/summary.html:92 +msgid "Description" +msgstr "描述" + +#: rhodecode/templates/index_base.html:53 +#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:46 +msgid "Repositories group" +msgstr "版本庫群組" + +#: rhodecode/templates/index_base.html:72 +#: rhodecode/templates/admin/repos/repo_add_base.html:9 +#: rhodecode/templates/admin/repos/repo_edit.html:32 +#: rhodecode/templates/admin/repos/repos.html:30 +#: rhodecode/templates/admin/users/user_edit_my_account.html:117 +#: rhodecode/templates/files/files_browser.html:157 +#: rhodecode/templates/settings/repo_settings.html:31 +#: rhodecode/templates/summary/summary.html:31 +#: rhodecode/templates/summary/summary.html:107 +msgid "Name" +msgstr "名稱" + +#: rhodecode/templates/index_base.html:74 +#: rhodecode/templates/admin/repos/repos.html:32 +#: rhodecode/templates/summary/summary.html:114 +msgid "Last change" +msgstr "最後修改" + +#: rhodecode/templates/index_base.html:75 +#: rhodecode/templates/admin/repos/repos.html:33 +msgid "Tip" +msgstr "" + +#: rhodecode/templates/index_base.html:76 +#: rhodecode/templates/admin/repos/repo_edit.html:97 +msgid "Owner" +msgstr "擁有者" + +#: rhodecode/templates/index_base.html:77 +#: rhodecode/templates/journal/public_journal.html:20 +#: rhodecode/templates/summary/summary.html:180 +#: rhodecode/templates/summary/summary.html:183 +msgid "RSS" +msgstr "" + +#: rhodecode/templates/index_base.html:78 +#: rhodecode/templates/journal/public_journal.html:23 +#: rhodecode/templates/summary/summary.html:181 +#: rhodecode/templates/summary/summary.html:184 +msgid "Atom" +msgstr "" + +#: rhodecode/templates/index_base.html:87 +#: rhodecode/templates/index_base.html:89 +#: rhodecode/templates/index_base.html:91 +#: rhodecode/templates/base/base.html:209 +#: rhodecode/templates/base/base.html:211 +#: rhodecode/templates/base/base.html:213 +#: rhodecode/templates/summary/summary.html:4 +msgid "Summary" +msgstr "概況" + +#: rhodecode/templates/index_base.html:95 +#: rhodecode/templates/index_base.html:97 +#: rhodecode/templates/index_base.html:99 +#: rhodecode/templates/base/base.html:225 +#: rhodecode/templates/base/base.html:227 +#: rhodecode/templates/base/base.html:229 +#: rhodecode/templates/changelog/changelog.html:6 +#: rhodecode/templates/changelog/changelog.html:14 +msgid "Changelog" +msgstr "修改紀錄" + +#: rhodecode/templates/index_base.html:103 +#: rhodecode/templates/index_base.html:105 +#: rhodecode/templates/index_base.html:107 +#: rhodecode/templates/base/base.html:268 +#: rhodecode/templates/base/base.html:270 +#: rhodecode/templates/base/base.html:272 +#: rhodecode/templates/files/files.html:4 +msgid "Files" +msgstr "檔案" + +#: rhodecode/templates/index_base.html:116 +#: rhodecode/templates/admin/repos/repos.html:42 +#: rhodecode/templates/admin/users/user_edit_my_account.html:127 +#: rhodecode/templates/summary/summary.html:48 +msgid "Mercurial repository" +msgstr "Mercurial 版本庫" + +#: rhodecode/templates/index_base.html:118 +#: rhodecode/templates/admin/repos/repos.html:44 +#: rhodecode/templates/admin/users/user_edit_my_account.html:129 +#: rhodecode/templates/summary/summary.html:51 +msgid "Git repository" +msgstr "Git 版本庫" + +#: rhodecode/templates/index_base.html:123 +#: rhodecode/templates/admin/repos/repo_edit_perms.html:16 +#: rhodecode/templates/journal/journal.html:53 +#: rhodecode/templates/summary/summary.html:56 +msgid "private repository" +msgstr "私有版本庫" + +#: rhodecode/templates/index_base.html:125 +#: rhodecode/templates/journal/journal.html:55 +#: rhodecode/templates/summary/summary.html:58 +msgid "public repository" +msgstr "公開版本庫" + +#: rhodecode/templates/index_base.html:133 +#: rhodecode/templates/base/base.html:291 +#: rhodecode/templates/settings/repo_fork.html:13 +msgid "fork" +msgstr "" + +#: rhodecode/templates/index_base.html:134 +#: rhodecode/templates/admin/repos/repos.html:60 +#: rhodecode/templates/admin/users/user_edit_my_account.html:143 +#: rhodecode/templates/summary/summary.html:69 +#: rhodecode/templates/summary/summary.html:71 +msgid "Fork of" +msgstr "" + +#: rhodecode/templates/index_base.html:155 +#: rhodecode/templates/admin/repos/repos.html:73 +msgid "No changesets yet" +msgstr "尚未有任何變更" + +#: rhodecode/templates/index_base.html:161 +#: rhodecode/templates/index_base.html:163 +#, python-format +msgid "Subscribe to %s rss feed" +msgstr "訂閱 %s rss" + +#: rhodecode/templates/index_base.html:168 +#: rhodecode/templates/index_base.html:170 +#, python-format +msgid "Subscribe to %s atom feed" +msgstr "訂閱 %s atom" + +#: rhodecode/templates/login.html:5 +#: rhodecode/templates/login.html:54 +#: rhodecode/templates/base/base.html:38 +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:47 +#: rhodecode/templates/admin/users/user_edit_my_account.html:45 +#: rhodecode/templates/base/base.html:15 +#: rhodecode/templates/summary/summary.html:106 +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:24 +msgid "Password" +msgstr "密碼" + +#: rhodecode/templates/login.html:60 +msgid "Forgot your password ?" +msgstr "忘記您的密碼?" + +#: rhodecode/templates/login.html:63 +#: rhodecode/templates/base/base.html:35 +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:50 +#: rhodecode/templates/admin/users/user_edit.html:74 +#: rhodecode/templates/admin/users/user_edit_my_account.html:63 +msgid "First Name" +msgstr "名" + +#: rhodecode/templates/register.html:56 +#: rhodecode/templates/admin/users/user_add.html:59 +#: rhodecode/templates/admin/users/user_edit.html:83 +#: rhodecode/templates/admin/users/user_edit_my_account.html:72 +msgid "Last Name" +msgstr "姓" + +#: rhodecode/templates/register.html:65 +#: rhodecode/templates/admin/users/user_add.html:68 +#: rhodecode/templates/admin/users/user_edit.html:92 +#: rhodecode/templates/admin/users/user_edit_my_account.html:81 +#: rhodecode/templates/summary/summary.html:108 +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:14 +msgid "Private repository" +msgstr "私有的版本庫" + +#: rhodecode/templates/repo_switcher_list.html:19 +msgid "Public repository" +msgstr "公開的版本庫" + +#: rhodecode/templates/admin/admin.html:5 +#: rhodecode/templates/admin/admin.html:9 +msgid "Admin journal" +msgstr "管理員日誌" + +#: rhodecode/templates/admin/admin_log.html:6 +msgid "Action" +msgstr "動作" + +#: rhodecode/templates/admin/admin_log.html:7 +msgid "Repository" +msgstr "版本庫" + +#: rhodecode/templates/admin/admin_log.html:8 +msgid "Date" +msgstr "時間" + +#: rhodecode/templates/admin/admin_log.html:9 +msgid "From IP" +msgstr "來源IP" + +#: rhodecode/templates/admin/admin_log.html:52 +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 "" + +#: 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 "" + +#: rhodecode/templates/admin/ldap/ldap.html:63 +msgid "LDAP Filter" +msgstr "" + +#: rhodecode/templates/admin/ldap/ldap.html:67 +msgid "LDAP Search Scope" +msgstr "" + +#: 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/settings/hooks.html:73 +#: rhodecode/templates/admin/users/user_edit.html:117 +#: rhodecode/templates/admin/users/user_edit.html:142 +#: rhodecode/templates/admin/users/user_edit_my_account.html:89 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:263 +msgid "Save" +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:109 +#: rhodecode/templates/admin/users/user_edit.html:127 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:248 +#: rhodecode/templates/settings/repo_settings.html:58 +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 "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/repos.html:10 +#: 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:80 +#: rhodecode/templates/summary/summary.html:82 +msgid "Clone from" +msgstr "複製由" + +#: rhodecode/templates/admin/repos/repo_add_base.html:28 +#: rhodecode/templates/admin/repos/repo_edit.html:48 +#: rhodecode/templates/admin/repos_groups/repos_groups.html:4 +msgid "Repository group" +msgstr "版本庫群組" + +#: rhodecode/templates/admin/repos/repo_add_base.html:36 +#: rhodecode/templates/admin/repos/repo_edit.html:56 +msgid "Type" +msgstr "類型" + +#: rhodecode/templates/admin/repos/repo_add_base.html:52 +#: rhodecode/templates/admin/repos/repo_edit.html:73 +#: rhodecode/templates/settings/repo_fork.html:48 +#: rhodecode/templates/settings/repo_settings.html:49 +msgid "Private" +msgstr "私有" + +#: rhodecode/templates/admin/repos/repo_add_base.html:59 +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_my_account.html:148 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:13 +#: rhodecode/templates/files/files_annotate.html:49 +#: rhodecode/templates/files/files_source.html:20 +msgid "edit" +msgstr "編輯" + +#: rhodecode/templates/admin/repos/repo_edit.html:40 +msgid "Clone uri" +msgstr "複製URL" + +#: rhodecode/templates/admin/repos/repo_edit.html:81 +msgid "Enable statistics" +msgstr "啟用統計" + +#: rhodecode/templates/admin/repos/repo_edit.html:89 +msgid "Enable downloads" +msgstr "啟用下載" + +#: rhodecode/templates/admin/repos/repo_edit.html:127 +msgid "Administration" +msgstr "管理者" + +#: rhodecode/templates/admin/repos/repo_edit.html:130 +msgid "Statistics" +msgstr "統計" + +#: rhodecode/templates/admin/repos/repo_edit.html:134 +msgid "Reset current statistics" +msgstr "重設目前的統計" + +#: rhodecode/templates/admin/repos/repo_edit.html:134 +msgid "Confirm to remove current statistics" +msgstr "確認移除目前的統計" + +#: rhodecode/templates/admin/repos/repo_edit.html:137 +msgid "Fetched to rev" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit.html:138 +msgid "Percentage of stats gathered" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit.html:147 +msgid "Remote" +msgstr "遠端" + +#: rhodecode/templates/admin/repos/repo_edit.html:151 +msgid "Pull changes from remote location" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit.html:151 +msgid "Confirm to pull changes from remote side" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit.html:162 +msgid "Cache" +msgstr "快取" + +#: rhodecode/templates/admin/repos/repo_edit.html:166 +msgid "Invalidate repository cache" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit.html:166 +msgid "Confirm to invalidate repository cache" +msgstr "確認廢止版本庫快取" + +#: rhodecode/templates/admin/repos/repo_edit.html:177 +msgid "Remove from public journal" +msgstr "從公開日誌移除" + +#: rhodecode/templates/admin/repos/repo_edit.html:179 +msgid "Add to public journal" +msgstr "新增至公開日誌" + +#: rhodecode/templates/admin/repos/repo_edit.html:185 +msgid "Delete" +msgstr "移除" + +#: rhodecode/templates/admin/repos/repo_edit.html:189 +msgid "Remove this repository" +msgstr "移除版本庫" + +#: rhodecode/templates/admin/repos/repo_edit.html:189 +#: rhodecode/templates/admin/repos/repos.html:79 +msgid "Confirm to delete this repository" +msgstr "確認移除這個版本庫" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:3 +msgid "none" +msgstr "無" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:4 +msgid "read" +msgstr "讀" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:5 +msgid "write" +msgstr "寫" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:6 +#: rhodecode/templates/admin/users/users.html:38 +#: rhodecode/templates/base/base.html:296 +msgid "admin" +msgstr "管理員" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:7 +msgid "member" +msgstr "成員" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:33 +#: rhodecode/templates/admin/repos/repo_edit_perms.html:53 +msgid "revoke" +msgstr "" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:75 +msgid "Add another member" +msgstr "新增另ㄧ位成員" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:89 +msgid "Failed to remove user" +msgstr "移除使用者失敗" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:104 +msgid "Failed to remove users group" +msgstr "移除使用者群組失敗" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:205 +msgid "Group" +msgstr "群組" + +#: rhodecode/templates/admin/repos/repo_edit_perms.html:206 +#: rhodecode/templates/admin/users_groups/users_groups.html:33 +msgid "members" +msgstr "成員" + +#: rhodecode/templates/admin/repos/repos.html:5 +msgid "Repositories administration" +msgstr "版本庫管理員" + +#: rhodecode/templates/admin/repos/repos.html:34 +#: rhodecode/templates/summary/summary.html:100 +msgid "Contact" +msgstr "聯絡方式" + +#: rhodecode/templates/admin/repos/repos.html:35 +#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36 +#: rhodecode/templates/admin/users/user_edit_my_account.html:119 +#: rhodecode/templates/admin/users/users.html:40 +#: rhodecode/templates/admin/users_groups/users_groups.html:35 +msgid "action" +msgstr "動作" + +#: rhodecode/templates/admin/repos/repos.html:51 +#: rhodecode/templates/admin/users/user_edit_my_account.html:134 +#: rhodecode/templates/admin/users/user_edit_my_account.html:148 +msgid "private" +msgstr "私有" + +#: rhodecode/templates/admin/repos/repos.html:53 +#: rhodecode/templates/admin/repos/repos.html:59 +#: rhodecode/templates/admin/users/user_edit_my_account.html:136 +#: rhodecode/templates/admin/users/user_edit_my_account.html:142 +#: rhodecode/templates/summary/summary.html:68 +msgid "public" +msgstr "公開" + +#: rhodecode/templates/admin/repos/repos.html:79 +#: rhodecode/templates/admin/users/users.html:55 +msgid "delete" +msgstr "刪除" + +#: rhodecode/templates/admin/repos_groups/repos_groups.html:8 +msgid "Groups" +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/repos_groups/repos_groups_edit.html:58 +#: rhodecode/templates/admin/users/user_add.html:85 +#: rhodecode/templates/admin/users_groups/users_group_add.html:49 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:90 +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_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 repositories" +msgstr "版本庫數量" + +#: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54 +msgid "Confirm to delete this group" +msgstr "確認刪除這個群組" + +#: 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 "設定管理員" + +#: rhodecode/templates/admin/settings/hooks.html:9 +#: rhodecode/templates/admin/settings/settings.html:9 +#: rhodecode/templates/settings/repo_settings.html:5 +#: rhodecode/templates/settings/repo_settings.html:13 +msgid "Settings" +msgstr "設定" + +#: rhodecode/templates/admin/settings/hooks.html:24 +msgid "Built in hooks - read only" +msgstr "內建hook - 唯讀" + +#: rhodecode/templates/admin/settings/hooks.html:40 +msgid "Custom hooks" +msgstr "自訂hook" + +#: rhodecode/templates/admin/settings/hooks.html:56 +msgid "remove" +msgstr "移除" + +#: rhodecode/templates/admin/settings/hooks.html:88 +msgid "Failed to remove hook" +msgstr "移除hook失敗" + +#: 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:45 +msgid "Rescan repositories" +msgstr "重新掃描版本庫" + +#: rhodecode/templates/admin/settings/settings.html:51 +msgid "Whoosh indexing" +msgstr "Whoosh 索引" + +#: rhodecode/templates/admin/settings/settings.html:59 +msgid "index build option" +msgstr "索引選項" + +#: rhodecode/templates/admin/settings/settings.html:64 +msgid "build from scratch" +msgstr "重頭建立索引" + +#: rhodecode/templates/admin/settings/settings.html:70 +msgid "Reindex" +msgstr "重新索引" + +#: rhodecode/templates/admin/settings/settings.html:76 +msgid "Global application settings" +msgstr "全域設定" + +#: rhodecode/templates/admin/settings/settings.html:85 +msgid "Application name" +msgstr "應用名稱" + +#: rhodecode/templates/admin/settings/settings.html:94 +msgid "Realm text" +msgstr "" + +#: rhodecode/templates/admin/settings/settings.html:103 +msgid "GA code" +msgstr "" + +#: rhodecode/templates/admin/settings/settings.html:111 +#: rhodecode/templates/admin/settings/settings.html:177 +msgid "Save settings" +msgstr "儲存設定" + +#: rhodecode/templates/admin/settings/settings.html:112 +#: rhodecode/templates/admin/settings/settings.html:178 +#: rhodecode/templates/admin/users/user_edit.html:118 +#: rhodecode/templates/admin/users/user_edit.html:143 +#: rhodecode/templates/admin/users/user_edit_my_account.html:90 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:264 +#: rhodecode/templates/files/files_edit.html:50 +msgid "Reset" +msgstr "重設" + +#: rhodecode/templates/admin/settings/settings.html:118 +msgid "Mercurial settings" +msgstr "Mercurial 設定" + +#: rhodecode/templates/admin/settings/settings.html:127 +msgid "Web" +msgstr "" + +#: rhodecode/templates/admin/settings/settings.html:132 +msgid "require ssl for pushing" +msgstr "推送時要求使用SSL" + +#: rhodecode/templates/admin/settings/settings.html:139 +msgid "Hooks" +msgstr "" + +#: rhodecode/templates/admin/settings/settings.html:142 +msgid "advanced setup" +msgstr "進階設定" + +#: rhodecode/templates/admin/settings/settings.html:147 +msgid "Update repository after push (hg update)" +msgstr "push後更新版本庫 (hg update)" + +#: rhodecode/templates/admin/settings/settings.html:151 +msgid "Show repository size after push" +msgstr "push 後顯示版本庫大小" + +#: rhodecode/templates/admin/settings/settings.html:155 +msgid "Log user push commands" +msgstr "紀錄使用者推送命令" + +#: rhodecode/templates/admin/settings/settings.html:159 +msgid "Log user pull commands" +msgstr "紀錄使用者抓取命令" + +#: rhodecode/templates/admin/settings/settings.html:166 +msgid "Repositories location" +msgstr "版本庫路徑" + +#: rhodecode/templates/admin/settings/settings.html:171 +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:172 +msgid "unlock" +msgstr "解鎖" + +#: rhodecode/templates/admin/users/user_add.html:5 +msgid "Add user" +msgstr "新增使用者" + +#: rhodecode/templates/admin/users/user_add.html:10 +#: rhodecode/templates/admin/users/user_edit.html:11 +#: rhodecode/templates/admin/users/users.html:9 +msgid "Users" +msgstr "使用者" + +#: rhodecode/templates/admin/users/user_add.html:12 +msgid "add new user" +msgstr "新增使用者" + +#: rhodecode/templates/admin/users/user_add.html:77 +#: rhodecode/templates/admin/users/user_edit.html:101 +#: 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:33 +#: rhodecode/templates/admin/users/user_edit_my_account.html:32 +msgid "Change your avatar at" +msgstr "修改您的頭像於" + +#: rhodecode/templates/admin/users/user_edit.html:34 +#: rhodecode/templates/admin/users/user_edit_my_account.html:33 +msgid "Using" +msgstr "使用中" + +#: rhodecode/templates/admin/users/user_edit.html:40 +#: rhodecode/templates/admin/users/user_edit_my_account.html:39 +msgid "API key" +msgstr "" + +#: rhodecode/templates/admin/users/user_edit.html:56 +msgid "LDAP DN" +msgstr "" + +#: rhodecode/templates/admin/users/user_edit.html:65 +#: rhodecode/templates/admin/users/user_edit_my_account.html:54 +msgid "New password" +msgstr "新密碼" + +#: rhodecode/templates/admin/users/user_edit.html:135 +#: rhodecode/templates/admin/users_groups/users_group_edit.html:256 +msgid "Create repositories" +msgstr "建立版本庫" + +#: rhodecode/templates/admin/users/user_edit_my_account.html:5 +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:101 +msgid "My repositories" +msgstr "我的版本庫" + +#: rhodecode/templates/admin/users/user_edit_my_account.html:107 +msgid "ADD REPOSITORY" +msgstr "新增版本庫" + +#: rhodecode/templates/admin/users/user_edit_my_account.html:118 +#: rhodecode/templates/branches/branches_data.html:7 +#: rhodecode/templates/shortlog/shortlog_data.html:8 +#: rhodecode/templates/tags/tags_data.html:7 +msgid "revision" +msgstr "修訂" + +#: rhodecode/templates/admin/users/user_edit_my_account.html:157 +msgid "No repositories yet" +msgstr "沒有任何版本庫" + +#: rhodecode/templates/admin/users/user_edit_my_account.html:159 +msgid "create one now" +msgstr "" + +#: rhodecode/templates/admin/users/users.html:5 +msgid "Users administration" +msgstr "使用者管理員" + +#: rhodecode/templates/admin/users/users.html:23 +msgid "ADD NEW USER" +msgstr "新增使用者" + +#: rhodecode/templates/admin/users/users.html:33 +msgid "username" +msgstr "使用者名稱" + +#: rhodecode/templates/admin/users/users.html:34 +#: rhodecode/templates/branches/branches_data.html:5 +#: rhodecode/templates/tags/tags_data.html:5 +msgid "name" +msgstr "名字" + +#: rhodecode/templates/admin/users/users.html:35 +msgid "lastname" +msgstr "姓" + +#: rhodecode/templates/admin/users/users.html:36 +msgid "last login" +msgstr "最後登入" + +#: rhodecode/templates/admin/users/users.html:37 +#: rhodecode/templates/admin/users_groups/users_groups.html:34 +msgid "active" +msgstr "啟用" + +#: rhodecode/templates/admin/users/users.html:39 +#: rhodecode/templates/base/base.html:305 +msgid "ldap" +msgstr "" + +#: rhodecode/templates/admin/users/users.html:56 +msgid "Confirm to delete this user" +msgstr "確認刪除這個使用者" + +#: 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_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/base/base.html:32 +msgid "Forgot password ?" +msgstr "忘記密碼?" + +#: rhodecode/templates/base/base.html:57 +#: rhodecode/templates/base/base.html:338 +#: rhodecode/templates/base/base.html:340 +#: rhodecode/templates/base/base.html:342 +msgid "Home" +msgstr "首頁" + +#: rhodecode/templates/base/base.html:61 +#: rhodecode/templates/base/base.html:347 +#: rhodecode/templates/base/base.html:349 +#: rhodecode/templates/base/base.html:351 +#: rhodecode/templates/journal/journal.html:4 +#: rhodecode/templates/journal/journal.html:17 +#: rhodecode/templates/journal/public_journal.html:4 +msgid "Journal" +msgstr "日誌" + +#: rhodecode/templates/base/base.html:66 +msgid "Login" +msgstr "登入" + +#: rhodecode/templates/base/base.html:68 +msgid "Log Out" +msgstr "登出" + +#: rhodecode/templates/base/base.html:107 +msgid "Submit a bug" +msgstr "回報錯誤" + +#: rhodecode/templates/base/base.html:141 +msgid "Switch repository" +msgstr "切換版本庫" + +#: rhodecode/templates/base/base.html:143 +msgid "Products" +msgstr "" + +#: rhodecode/templates/base/base.html:149 +msgid "loading..." +msgstr "載入中..." + +#: rhodecode/templates/base/base.html:234 +#: rhodecode/templates/base/base.html:236 +#: rhodecode/templates/base/base.html:238 +msgid "Switch to" +msgstr "切換至" + +#: rhodecode/templates/base/base.html:242 +#: rhodecode/templates/branches/branches.html:13 +msgid "branches" +msgstr "分支" + +#: rhodecode/templates/base/base.html:249 +#: rhodecode/templates/branches/branches_data.html:52 +msgid "There are no branches yet" +msgstr "沒有任何分支" + +#: rhodecode/templates/base/base.html:254 +#: rhodecode/templates/shortlog/shortlog_data.html:10 +#: rhodecode/templates/tags/tags.html:14 +msgid "tags" +msgstr "標籤" + +#: rhodecode/templates/base/base.html:261 +#: rhodecode/templates/tags/tags_data.html:32 +msgid "There are no tags yet" +msgstr "沒有任何標籤" + +#: rhodecode/templates/base/base.html:277 +#: rhodecode/templates/base/base.html:281 +#: rhodecode/templates/files/files_annotate.html:40 +#: rhodecode/templates/files/files_source.html:11 +msgid "Options" +msgstr "選項" + +#: rhodecode/templates/base/base.html:286 +#: rhodecode/templates/base/base.html:288 +#: rhodecode/templates/base/base.html:306 +msgid "settings" +msgstr "設定" + +#: rhodecode/templates/base/base.html:292 +msgid "search" +msgstr "搜尋" + +#: rhodecode/templates/base/base.html:299 +msgid "journal" +msgstr "日誌" + +#: rhodecode/templates/base/base.html:301 +msgid "repositories groups" +msgstr "版本庫群組" + +#: rhodecode/templates/base/base.html:302 +msgid "users" +msgstr "使用者" + +#: rhodecode/templates/base/base.html:303 +msgid "users groups" +msgstr "使用者群組" + +#: rhodecode/templates/base/base.html:304 +msgid "permissions" +msgstr "權限" + +#: rhodecode/templates/base/base.html:317 +#: rhodecode/templates/base/base.html:319 +#: rhodecode/templates/followers/followers.html:5 +msgid "Followers" +msgstr "追蹤者" + +#: rhodecode/templates/base/base.html:325 +#: rhodecode/templates/base/base.html:327 +#: rhodecode/templates/forks/forks.html:5 +msgid "Forks" +msgstr "" + +#: rhodecode/templates/base/base.html:356 +#: rhodecode/templates/base/base.html:358 +#: rhodecode/templates/base/base.html:360 +#: rhodecode/templates/search/search.html:4 +#: rhodecode/templates/search/search.html:24 +#: rhodecode/templates/search/search.html:46 +msgid "Search" +msgstr "搜尋" + +#: rhodecode/templates/base/root.html:57 +#: rhodecode/templates/journal/journal.html:48 +#: rhodecode/templates/summary/summary.html:36 +msgid "Stop following this repository" +msgstr "停止追蹤這個版本庫" + +#: rhodecode/templates/base/root.html:66 +#: rhodecode/templates/summary/summary.html:40 +msgid "Start following this repository" +msgstr "開始追蹤這個版本庫" + +#: rhodecode/templates/branches/branches_data.html:4 +#: rhodecode/templates/tags/tags_data.html:4 +msgid "date" +msgstr "日期" + +#: rhodecode/templates/branches/branches_data.html:6 +#: rhodecode/templates/shortlog/shortlog_data.html:7 +#: rhodecode/templates/tags/tags_data.html:6 +msgid "author" +msgstr "作者" + +#: rhodecode/templates/branches/branches_data.html:8 +#: rhodecode/templates/shortlog/shortlog_data.html:11 +#: rhodecode/templates/tags/tags_data.html:8 +msgid "links" +msgstr "連結" + +#: rhodecode/templates/branches/branches_data.html:23 +#: rhodecode/templates/branches/branches_data.html:43 +#: rhodecode/templates/shortlog/shortlog_data.html:39 +#: rhodecode/templates/tags/tags_data.html:24 +msgid "changeset" +msgstr "修改" + +#: rhodecode/templates/branches/branches_data.html:25 +#: rhodecode/templates/branches/branches_data.html:45 +#: rhodecode/templates/files/files.html:12 +#: rhodecode/templates/shortlog/shortlog_data.html:41 +#: rhodecode/templates/summary/summary.html:233 +#: rhodecode/templates/tags/tags_data.html:26 +msgid "files" +msgstr "檔案" + +#: rhodecode/templates/changelog/changelog.html:14 +msgid "showing " +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:14 +msgid "out of" +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:37 +msgid "Show" +msgstr "顯示" + +#: rhodecode/templates/changelog/changelog.html:50 +#: rhodecode/templates/changeset/changeset.html:42 +#: rhodecode/templates/summary/summary.html:609 +msgid "commit" +msgstr "遞交" + +#: rhodecode/templates/changelog/changelog.html:63 +msgid "Affected number of files, click to show more details" +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:67 +#: rhodecode/templates/changeset/changeset.html:66 +msgid "merge" +msgstr "合併" + +#: rhodecode/templates/changelog/changelog.html:72 +#: rhodecode/templates/changeset/changeset.html:72 +msgid "Parent" +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:77 +#: rhodecode/templates/changeset/changeset.html:77 +msgid "No parents" +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:82 +#: rhodecode/templates/changeset/changeset.html:80 +#: rhodecode/templates/files/files.html:29 +#: rhodecode/templates/files/files_annotate.html:25 +#: rhodecode/templates/files/files_edit.html:33 +#: rhodecode/templates/shortlog/shortlog_data.html:9 +msgid "branch" +msgstr "分支" + +#: rhodecode/templates/changelog/changelog.html:86 +#: rhodecode/templates/changeset/changeset.html:83 +msgid "tag" +msgstr "標籤" + +#: rhodecode/templates/changelog/changelog.html:122 +msgid "Show selected changes __S -> __E" +msgstr "" + +#: rhodecode/templates/changelog/changelog.html:172 +#: rhodecode/templates/shortlog/shortlog_data.html:61 +msgid "There are no changes yet" +msgstr "尚未有任何變更" + +#: rhodecode/templates/changelog/changelog_details.html:2 +#: rhodecode/templates/changeset/changeset.html:55 +msgid "removed" +msgstr "移除" + +#: rhodecode/templates/changelog/changelog_details.html:3 +#: rhodecode/templates/changeset/changeset.html:56 +msgid "changed" +msgstr "修改" + +#: rhodecode/templates/changelog/changelog_details.html:4 +#: rhodecode/templates/changeset/changeset.html:57 +msgid "added" +msgstr "新增" + +#: rhodecode/templates/changelog/changelog_details.html:6 +#: rhodecode/templates/changelog/changelog_details.html:7 +#: rhodecode/templates/changelog/changelog_details.html:8 +#: rhodecode/templates/changeset/changeset.html:59 +#: rhodecode/templates/changeset/changeset.html:60 +#: rhodecode/templates/changeset/changeset.html:61 +#, python-format +msgid "affected %s files" +msgstr "" + +#: rhodecode/templates/changeset/changeset.html:6 +#: rhodecode/templates/changeset/changeset.html:14 +#: rhodecode/templates/changeset/changeset.html:31 +msgid "Changeset" +msgstr "" + +#: rhodecode/templates/changeset/changeset.html:32 +#: rhodecode/templates/changeset/changeset.html:121 +#: rhodecode/templates/changeset/changeset_range.html:78 +#: rhodecode/templates/files/file_diff.html:32 +#: rhodecode/templates/files/file_diff.html:42 +msgid "raw diff" +msgstr "原始差異" + +#: rhodecode/templates/changeset/changeset.html:34 +#: rhodecode/templates/changeset/changeset.html:123 +#: rhodecode/templates/changeset/changeset_range.html:80 +#: rhodecode/templates/files/file_diff.html:34 +msgid "download diff" +msgstr "下載差異" + +#: rhodecode/templates/changeset/changeset.html:90 +#, python-format +msgid "%s files affected with %s additions and %s deletions." +msgstr "" + +#: rhodecode/templates/changeset/changeset.html:101 +msgid "Changeset was too big and was cut off..." +msgstr "" + +#: rhodecode/templates/changeset/changeset.html:119 +#: rhodecode/templates/changeset/changeset_range.html:76 +#: rhodecode/templates/files/file_diff.html:30 +msgid "diff" +msgstr "差異" + +#: rhodecode/templates/changeset/changeset.html:132 +#: rhodecode/templates/changeset/changeset_range.html:89 +msgid "No changes in this file" +msgstr "這個檔案沒有任何變更" + +#: rhodecode/templates/changeset/changeset_range.html:30 +msgid "Compare View" +msgstr "比較顯示" + +#: rhodecode/templates/changeset/changeset_range.html:52 +msgid "Files affected" +msgstr "" + +#: rhodecode/templates/errors/error_document.html:44 +#, python-format +msgid "You will be redirected to %s in %s seconds" +msgstr "" + +#: rhodecode/templates/files/file_diff.html:4 +#: rhodecode/templates/files/file_diff.html:12 +msgid "File diff" +msgstr "檔案差異" + +#: rhodecode/templates/files/file_diff.html:42 +msgid "Diff is to big to display" +msgstr "" + +#: rhodecode/templates/files/files.html:37 +#: rhodecode/templates/files/files_annotate.html:31 +#: rhodecode/templates/files/files_edit.html:39 +msgid "Location" +msgstr "位置" + +#: rhodecode/templates/files/files.html:46 +msgid "Go back" +msgstr "" + +#: rhodecode/templates/files/files.html:47 +msgid "No files at given path" +msgstr "" + +#: rhodecode/templates/files/files_annotate.html:4 +msgid "File annotate" +msgstr "檔案註釋" + +#: rhodecode/templates/files/files_annotate.html:12 +msgid "annotate" +msgstr "註釋" + +#: rhodecode/templates/files/files_annotate.html:33 +#: rhodecode/templates/files/files_browser.html:160 +#: rhodecode/templates/files/files_source.html:2 +msgid "Revision" +msgstr "修訂" + +#: rhodecode/templates/files/files_annotate.html:36 +#: rhodecode/templates/files/files_browser.html:158 +#: rhodecode/templates/files/files_source.html:7 +msgid "Size" +msgstr "大小" + +#: rhodecode/templates/files/files_annotate.html:38 +#: rhodecode/templates/files/files_browser.html:159 +#: rhodecode/templates/files/files_source.html:9 +msgid "Mimetype" +msgstr "" + +#: rhodecode/templates/files/files_annotate.html:41 +msgid "show source" +msgstr "顯示原始碼" + +#: rhodecode/templates/files/files_annotate.html:43 +#: rhodecode/templates/files/files_annotate.html:78 +#: rhodecode/templates/files/files_source.html:14 +#: rhodecode/templates/files/files_source.html:51 +msgid "show as raw" +msgstr "顯示原始文件" + +#: rhodecode/templates/files/files_annotate.html:45 +#: rhodecode/templates/files/files_source.html:16 +msgid "download as raw" +msgstr "下載原始文件" + +#: rhodecode/templates/files/files_annotate.html:54 +#: rhodecode/templates/files/files_source.html:25 +msgid "History" +msgstr "歷史" + +#: rhodecode/templates/files/files_annotate.html:73 +#: rhodecode/templates/files/files_source.html:46 +#, python-format +msgid "Binary file (%s)" +msgstr "二進位檔 (%s)" + +#: rhodecode/templates/files/files_annotate.html:78 +#: rhodecode/templates/files/files_source.html:51 +msgid "File is too big to display" +msgstr "顯示的檔案太大" + +#: rhodecode/templates/files/files_browser.html:13 +msgid "view" +msgstr "顯示" + +#: rhodecode/templates/files/files_browser.html:14 +msgid "previous revision" +msgstr "前一個修訂" + +#: rhodecode/templates/files/files_browser.html:16 +msgid "next revision" +msgstr "下一個修訂" + +#: rhodecode/templates/files/files_browser.html:23 +msgid "follow current branch" +msgstr "" + +#: rhodecode/templates/files/files_browser.html:27 +msgid "search file list" +msgstr "搜尋檔案列表" + +#: rhodecode/templates/files/files_browser.html:32 +msgid "Loading file list..." +msgstr "載入檔案列表..." + +#: rhodecode/templates/files/files_browser.html:111 +msgid "search truncated" +msgstr "" + +#: rhodecode/templates/files/files_browser.html:122 +msgid "no matching files" +msgstr "無符合的檔案" + +#: rhodecode/templates/files/files_browser.html:161 +msgid "Last modified" +msgstr "最後修改" + +#: rhodecode/templates/files/files_browser.html:162 +msgid "Last commiter" +msgstr "最後的遞交者" + +#: rhodecode/templates/files/files_edit.html:4 +msgid "Edit file" +msgstr "編輯檔案" + +#: rhodecode/templates/files/files_edit.html:19 +msgid "edit file" +msgstr "編輯檔案" + +#: rhodecode/templates/files/files_edit.html:45 +#: rhodecode/templates/shortlog/shortlog_data.html:5 +msgid "commit message" +msgstr "遞交資訊" + +#: rhodecode/templates/files/files_edit.html:51 +msgid "Commit changes" +msgstr "遞交修改" + +#: rhodecode/templates/files/files_source.html:12 +msgid "show annotation" +msgstr "險是註釋" + +#: rhodecode/templates/files/files_source.html:153 +msgid "Selection link" +msgstr "" + +#: rhodecode/templates/followers/followers.html:13 +msgid "followers" +msgstr "追蹤者" + +#: rhodecode/templates/followers/followers_data.html:12 +msgid "Started following" +msgstr "開始追蹤" + +#: 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:34 +msgid "There are no forks yet" +msgstr "尚未有任何 fork" + +#: rhodecode/templates/journal/journal.html:34 +msgid "Following" +msgstr "已追蹤" + +#: rhodecode/templates/journal/journal.html:41 +msgid "following user" +msgstr "追蹤使用者" + +#: rhodecode/templates/journal/journal.html:41 +msgid "user" +msgstr "使用者" + +#: rhodecode/templates/journal/journal.html:65 +msgid "You are not following any users or repositories" +msgstr "您尚未追蹤任何使用者或版本庫" + +#: rhodecode/templates/journal/journal_data.html:46 +msgid "No entries yet" +msgstr "" + +#: rhodecode/templates/journal/public_journal.html:17 +msgid "Public Journal" +msgstr "開放日誌" + +#: rhodecode/templates/search/search.html:7 +#: rhodecode/templates/search/search.html:26 +msgid "in repository: " +msgstr "於版本庫:" + +#: rhodecode/templates/search/search.html:9 +#: rhodecode/templates/search/search.html:28 +msgid "in all repositories" +msgstr "於所有的版本庫" + +#: rhodecode/templates/search/search.html:42 +msgid "Search term" +msgstr "搜尋關鍵字" + +#: rhodecode/templates/search/search.html:54 +msgid "Search in" +msgstr "搜尋範圍" + +#: rhodecode/templates/search/search.html:57 +msgid "File contents" +msgstr "文件內容" + +#: rhodecode/templates/search/search.html:59 +msgid "File names" +msgstr "檔案名稱" + +#: rhodecode/templates/search/search_content.html:20 +#: rhodecode/templates/search/search_path.html:15 +msgid "Permission denied" +msgstr "權限不足" + +#: rhodecode/templates/settings/repo_fork.html:5 +msgid "Fork" +msgstr "分支" + +#: rhodecode/templates/settings/repo_fork.html:31 +msgid "Fork name" +msgstr "分支名稱" + +#: rhodecode/templates/settings/repo_fork.html:55 +msgid "fork this repository" +msgstr "fork 這個版本庫" + +#: rhodecode/templates/shortlog/shortlog.html:5 +#: rhodecode/templates/summary/summary.html:666 +msgid "Shortlog" +msgstr "簡短紀錄" + +#: rhodecode/templates/shortlog/shortlog.html:14 +msgid "shortlog" +msgstr "簡短紀錄" + +#: rhodecode/templates/shortlog/shortlog_data.html:6 +msgid "age" +msgstr "" + +#: rhodecode/templates/summary/summary.html:12 +msgid "summary" +msgstr "概況" + +#: rhodecode/templates/summary/summary.html:79 +msgid "remote clone" +msgstr "遠端複製" + +#: rhodecode/templates/summary/summary.html:121 +msgid "by" +msgstr "" + +#: rhodecode/templates/summary/summary.html:128 +msgid "Clone url" +msgstr "複製連結" + +#: rhodecode/templates/summary/summary.html:137 +msgid "Trending source files" +msgstr "" + +#: rhodecode/templates/summary/summary.html:146 +msgid "Download" +msgstr "下載" + +#: rhodecode/templates/summary/summary.html:150 +msgid "There are no downloads yet" +msgstr "沒有任何下載" + +#: rhodecode/templates/summary/summary.html:152 +msgid "Downloads are disabled for this repository" +msgstr "這個版本庫的下載已停用" + +#: rhodecode/templates/summary/summary.html:154 +#: rhodecode/templates/summary/summary.html:320 +msgid "enable" +msgstr "啟用" + +#: rhodecode/templates/summary/summary.html:162 +#: rhodecode/templates/summary/summary.html:297 +#, python-format +msgid "Download %s as %s" +msgstr "下載 %s 為 %s" + +#: rhodecode/templates/summary/summary.html:168 +msgid "Check this to download archive with subrepos" +msgstr "" + +#: rhodecode/templates/summary/summary.html:168 +msgid "with subrepos" +msgstr "" + +#: rhodecode/templates/summary/summary.html:176 +msgid "Feeds" +msgstr "" + +#: rhodecode/templates/summary/summary.html:257 +#: rhodecode/templates/summary/summary.html:684 +#: rhodecode/templates/summary/summary.html:695 +msgid "show more" +msgstr "顯示更多" + +#: rhodecode/templates/summary/summary.html:312 +msgid "Commit activity by day / author" +msgstr "" + +#: rhodecode/templates/summary/summary.html:324 +msgid "Loaded in" +msgstr "" + +#: rhodecode/templates/summary/summary.html:603 +msgid "commits" +msgstr "遞交" + +#: rhodecode/templates/summary/summary.html:604 +msgid "files added" +msgstr "多個檔案新增" + +#: rhodecode/templates/summary/summary.html:605 +msgid "files changed" +msgstr "多個檔案修改" + +#: rhodecode/templates/summary/summary.html:606 +msgid "files removed" +msgstr "移除多個檔案" + +#: rhodecode/templates/summary/summary.html:610 +msgid "file added" +msgstr "檔案新增" + +#: rhodecode/templates/summary/summary.html:611 +msgid "file changed" +msgstr "檔案修改" + +#: rhodecode/templates/summary/summary.html:612 +msgid "file removed" +msgstr "移除檔案" + diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -64,7 +64,7 @@ class PasswordGenerator(object): passwd_gen = PasswordGenerator() #print 8-letter password containing only big and small letters of alphabet - print passwd_gen.gen_password(8, passwd_gen.ALPHABETS_BIG_SMALL) + passwd_gen.gen_password(8, passwd_gen.ALPHABETS_BIG_SMALL) """ ALPHABETS_NUM = r'''1234567890''' ALPHABETS_SMALL = r'''qwertyuiopasdfghjklzxcvbnm''' diff --git a/rhodecode/lib/ext_json.py b/rhodecode/lib/ext_json.py --- a/rhodecode/lib/ext_json.py +++ b/rhodecode/lib/ext_json.py @@ -81,22 +81,24 @@ except ImportError: _sj = None -# simplejson not found try out regular json module -import json as _json - +try: + # simplejson not found try out regular json module + import json as _json -# extended JSON encoder for json -class ExtendedEncoder(_json.JSONEncoder): - def default(self, obj): - try: - return _obj_dump(obj) - except NotImplementedError: - pass - return _json.JSONEncoder.default(self, obj) -# monkey-patch JSON encoder to use extended version -_json.dumps = functools.partial(_json.dumps, cls=ExtendedEncoder) -_json.dump = functools.partial(_json.dump, cls=ExtendedEncoder) -stdlib = _json + # extended JSON encoder for json + class ExtendedEncoder(_json.JSONEncoder): + def default(self, obj): + try: + return _obj_dump(obj) + except NotImplementedError: + pass + return _json.JSONEncoder.default(self, obj) + # monkey-patch JSON encoder to use extended version + _json.dumps = functools.partial(_json.dumps, cls=ExtendedEncoder) + _json.dump = functools.partial(_json.dump, cls=ExtendedEncoder) + stdlib = _json +except ImportError: + _json = None # set all available json modules simplejson = _sj diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -150,7 +150,7 @@ def action_logger(user, action, repo, ip user_log = UserLog() user_log.user_id = user_obj.user_id - user_log.action = action + user_log.action = safe_unicode(action) user_log.repository_id = repo_obj.repo_id user_log.repository_name = repo_name diff --git a/rhodecode/lib/utils2.py b/rhodecode/lib/utils2.py --- a/rhodecode/lib/utils2.py +++ b/rhodecode/lib/utils2.py @@ -215,7 +215,6 @@ def safe_str(unicode_, to_encoding=None) try: import chardet encoding = chardet.detect(unicode_)['encoding'] - print encoding if encoding is None: raise UnicodeEncodeError() diff --git a/rhodecode/lib/vcs/backends/git/changeset.py b/rhodecode/lib/vcs/backends/git/changeset.py --- a/rhodecode/lib/vcs/backends/git/changeset.py +++ b/rhodecode/lib/vcs/backends/git/changeset.py @@ -240,11 +240,11 @@ class GitChangeset(BaseChangeset): which is generally not good. Should be replaced with algorithm iterating commits. """ - cmd = 'log --pretty="format: %%H" --name-status -p %s -- "%s"' % ( + cmd = 'log --pretty="format: %%H" -s -p %s -- "%s"' % ( self.id, path ) so, se = self.repository.run_git_command(cmd) - ids = re.findall(r'\w{40}', so) + ids = re.findall(r'[0-9a-fA-F]{40}', so) return [self.repository.get_changeset(id) for id in ids] def get_file_annotate(self, path): diff --git a/rhodecode/lib/vcs/backends/hg/changeset.py b/rhodecode/lib/vcs/backends/hg/changeset.py --- a/rhodecode/lib/vcs/backends/hg/changeset.py +++ b/rhodecode/lib/vcs/backends/hg/changeset.py @@ -37,6 +37,10 @@ class MercurialChangeset(BaseChangeset): return safe_unicode(self._ctx.branch()) @LazyProperty + def bookmarks(self): + return map(safe_unicode, self._ctx.bookmarks()) + + @LazyProperty def message(self): return safe_unicode(self._ctx.description()) @@ -259,8 +263,6 @@ class MercurialChangeset(BaseChangeset): archival.archive(self.repository._repo, stream, self.raw_id, kind, prefix=prefix, subrepos=subrepos) - #stream.close() - if stream.closed and hasattr(stream, 'name'): stream = open(stream.name, 'rb') elif hasattr(stream, 'mode') and 'r' not in stream.mode: diff --git a/rhodecode/lib/vcs/utils/__init__.py b/rhodecode/lib/vcs/utils/__init__.py --- a/rhodecode/lib/vcs/utils/__init__.py +++ b/rhodecode/lib/vcs/utils/__init__.py @@ -90,7 +90,6 @@ def safe_str(unicode_, to_encoding=None) try: import chardet encoding = chardet.detect(unicode_)['encoding'] - print encoding if encoding is None: raise UnicodeEncodeError() diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -647,7 +647,7 @@ class Repository(Base, BaseModel): # SCM PROPERTIES #========================================================================== - def get_changeset(self, rev): + def get_changeset(self, rev=None): return get_changeset_safe(self.scm_instance, rev) @property @@ -1297,7 +1297,8 @@ class Notification(Base, BaseModel): @property def recipients(self): return [x.user for x in UserNotification.query()\ - .filter(UserNotification.notification == self).all()] + .filter(UserNotification.notification == self)\ + .order_by(UserNotification.user).all()] @classmethod def create(cls, created_by, subject, body, recipients, type_=None): diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -225,10 +225,8 @@ class UserModel(BaseModel): from rhodecode.model.notification import NotificationModel try: - new_user = User() - for k, v in form_data.items(): - if k != 'admin': - setattr(new_user, k, v) + form_data['admin'] = False + new_user = self.create(form_data) self.sa.add(new_user) self.sa.flush() @@ -533,7 +531,6 @@ class UserModel(BaseModel): for perm in user_repo_group_perms_from_users_groups: g_k = perm.UsersGroupRepoGroupToPerm.group.group_name - print perm, g_k p = perm.Permission.permission_name cur_perm = user.permissions[GK][g_k] # overwrite permission only if it's greater than permission diff --git a/rhodecode/public/css/style.css b/rhodecode/public/css/style.css --- a/rhodecode/public/css/style.css +++ b/rhodecode/public/css/style.css @@ -2545,6 +2545,10 @@ h3.files_location { .right .logtags{ padding: 2px 2px 2px 2px; } +.right .logtags .branchtag,.right .logtags .tagtag,.right .logtags .booktag{ + margin: 0px 2px; +} + .right .logtags .branchtag,.logtags .branchtag { padding: 1px 3px 1px 3px; background-color: #bfbfbf; @@ -2583,10 +2587,10 @@ h3.files_location { text-decoration: none; color: #ffffff; } -.right .logbooks .bookbook,.logbooks .bookbook { - padding: 1px 3px 2px; +.right .logbooks .bookbook,.logbooks .bookbook,.right .logtags .bookbook,.logtags .bookbook { + padding: 1px 3px 1px 3px; background-color: #46A546; - font-size: 9.75px; + font-size: 10px; font-weight: bold; color: #ffffff; text-transform: uppercase; @@ -2595,10 +2599,10 @@ h3.files_location { -moz-border-radius: 3px; border-radius: 3px; } -.right .logbooks .bookbook,.logbooks .bookbook a{ +.right .logbooks .bookbook,.logbooks .bookbook a,.right .logtags .bookbook,.logtags .bookbook a{ color: #ffffff; } -.right .logbooks .bookbook,.logbooks .bookbook a:hover{ +.right .logbooks .bookbook,.logbooks .bookbook a:hover,.right .logtags .bookbook,.logtags .bookbook a:hover{ text-decoration: none; color: #ffffff; } diff --git a/rhodecode/templates/changelog/changelog.html b/rhodecode/templates/changelog/changelog.html --- a/rhodecode/templates/changelog/changelog.html +++ b/rhodecode/templates/changelog/changelog.html @@ -100,8 +100,16 @@ %endif %if cs.branch: - ${h.link_to(h.shorter(cs.branch),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} + ${h.link_to(h.shorter(cs.branch),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} + %endif + %if h.is_hg(c.rhodecode_repo): + %for book in cs.bookmarks: + + ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} + + %endfor + %endif %for tag in cs.tags: ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} diff --git a/rhodecode/tests/__init__.py b/rhodecode/tests/__init__.py --- a/rhodecode/tests/__init__.py +++ b/rhodecode/tests/__init__.py @@ -21,13 +21,15 @@ from pylons import config, url from routes.util import URLGenerator from webtest import TestApp +from rhodecode import is_windows from rhodecode.model.meta import Session from rhodecode.model.db import User import pylons.test os.environ['TZ'] = 'UTC' -time.tzset() +if not is_windows: + time.tzset() log = logging.getLogger(__name__) @@ -71,6 +73,7 @@ NEW_GIT_REPO = 'vcs_test_git_new' HG_FORK = 'vcs_test_hg_fork' GIT_FORK = 'vcs_test_git_fork' + class TestController(TestCase): def __init__(self, *args, **kwargs): diff --git a/rhodecode/tests/functional/test_files.py b/rhodecode/tests/functional/test_files.py --- a/rhodecode/tests/functional/test_files.py +++ b/rhodecode/tests/functional/test_files.py @@ -190,18 +190,22 @@ class TestFilesController(TestController self.log_user() for arch_ext, info in ARCHIVE_SPECS.items(): + short = '27cd5cce30c9%s' % arch_ext fname = '27cd5cce30c96924232dffcd24178a07ffeb5dfc%s' % arch_ext - filename = '%s-%s' % (HG_REPO, fname) - - response = self.app.get(url(controller='files', action='archivefile', + filename = '%s-%s' % (HG_REPO, short) + response = self.app.get(url(controller='files', + action='archivefile', repo_name=HG_REPO, fname=fname)) - assert response.status == '200 OK', 'wrong response code' - assert response.response._headers.items() == [('Pragma', 'no-cache'), - ('Cache-Control', 'no-cache'), - ('Content-Type', '%s; charset=utf-8' % info[0]), - ('Content-Disposition', 'attachment; filename=%s' % filename), ], 'wrong headers' + self.assertEqual(response.status, '200 OK') + self.assertEqual(response.response._headers.items(), + [('Pragma', 'no-cache'), + ('Cache-Control', 'no-cache'), + ('Content-Type', '%s; charset=utf-8' % info[0]), + ('Content-Disposition', 'attachment; filename=%s' % filename), + ] + ) def test_archival_wrong_ext(self): self.log_user() @@ -212,8 +216,7 @@ class TestFilesController(TestController response = self.app.get(url(controller='files', action='archivefile', repo_name=HG_REPO, fname=fname)) - assert 'Unknown archive type' in response.body - + response.mustcontain('Unknown archive type') def test_archival_wrong_revision(self): self.log_user() @@ -224,7 +227,7 @@ class TestFilesController(TestController response = self.app.get(url(controller='files', action='archivefile', repo_name=HG_REPO, fname=fname)) - assert 'Unknown revision' in response.body + response.mustcontain('Unknown revision') #========================================================================== # RAW FILE @@ -236,8 +239,8 @@ class TestFilesController(TestController revision='27cd5cce30c96924232dffcd24178a07ffeb5dfc', f_path='vcs/nodes.py')) - assert response.content_disposition == "attachment; filename=nodes.py" - assert response.content_type == "text/x-python" + self.assertEqual(response.content_disposition, "attachment; filename=nodes.py") + self.assertEqual(response.content_type, "text/x-python") def test_raw_file_wrong_cs(self): self.log_user() @@ -277,7 +280,7 @@ class TestFilesController(TestController revision='27cd5cce30c96924232dffcd24178a07ffeb5dfc', f_path='vcs/nodes.py')) - assert response.content_type == "text/plain" + self.assertEqual(response.content_type, "text/plain") def test_raw_wrong_cs(self): self.log_user() diff --git a/rhodecode/tests/functional/test_login.py b/rhodecode/tests/functional/test_login.py --- a/rhodecode/tests/functional/test_login.py +++ b/rhodecode/tests/functional/test_login.py @@ -54,7 +54,6 @@ class TestLoginController(TestController self.assertEqual(response.status, '200 OK') self.assertTrue('Users administration' in response.body) - def test_login_short_password(self): response = self.app.post(url(controller='login', action='index'), {'username':'test_admin', @@ -101,7 +100,7 @@ class TestLoginController(TestController 'lastname':'test'}) self.assertEqual(response.status , '200 OK') - assert 'This e-mail address is already taken' in response.body + response.mustcontain('This e-mail address is already taken') def test_register_err_same_email_case_sensitive(self): response = self.app.post(url(controller='login', action='register'), @@ -112,7 +111,7 @@ class TestLoginController(TestController 'name':'test', 'lastname':'test'}) self.assertEqual(response.status , '200 OK') - assert 'This e-mail address is already taken' in response.body + response.mustcontain('This e-mail address is already taken') def test_register_err_wrong_data(self): response = self.app.post(url(controller='login', action='register'), @@ -123,9 +122,8 @@ class TestLoginController(TestController 'name':'test', 'lastname':'test'}) self.assertEqual(response.status , '200 OK') - assert 'An email address must contain a single @' in response.body - assert 'Enter a value 6 characters long or more' in response.body - + response.mustcontain('An email address must contain a single @') + response.mustcontain('Enter a value 6 characters long or more') def test_register_err_username(self): response = self.app.post(url(controller='login', action='register'), @@ -137,11 +135,11 @@ class TestLoginController(TestController 'lastname':'test'}) self.assertEqual(response.status , '200 OK') - assert 'An email address must contain a single @' in response.body - assert ('Username may only contain ' + response.mustcontain('An email address must contain a single @') + response.mustcontain('Username may only contain ' 'alphanumeric characters underscores, ' 'periods or dashes and must begin with ' - 'alphanumeric character') in response.body + 'alphanumeric character') def test_register_err_case_sensitive(self): response = self.app.post(url(controller='login', action='register'), @@ -156,8 +154,6 @@ class TestLoginController(TestController self.assertTrue('An email address must contain a single @' in response.body) self.assertTrue('This username already exists' in response.body) - - def test_register_special_chars(self): response = self.app.post(url(controller='login', action='register'), {'username':'xxxaxn', @@ -170,7 +166,6 @@ class TestLoginController(TestController self.assertEqual(response.status , '200 OK') self.assertTrue('Invalid characters in password' in response.body) - def test_register_password_mismatch(self): response = self.app.post(url(controller='login', action='register'), {'username':'xs', @@ -180,8 +175,8 @@ class TestLoginController(TestController 'name':'test', 'lastname':'test'}) - self.assertEqual(response.status , '200 OK') - assert 'Passwords do not match' in response.body + self.assertEqual(response.status, '200 OK') + response.mustcontain('Passwords do not match') def test_register_ok(self): username = 'test_regular4' @@ -196,28 +191,32 @@ class TestLoginController(TestController 'password_confirmation':password, 'email':email, 'name':name, - 'lastname':lastname}) - self.assertEqual(response.status , '302 Found') - assert 'You have successfully registered into rhodecode' in response.session['flash'][0], 'No flash message about user registration' + 'lastname':lastname, + 'admin':True}) # This should be overriden + self.assertEqual(response.status, '302 Found') + self.checkSessionFlash(response, 'You have successfully registered into rhodecode') ret = self.Session.query(User).filter(User.username == 'test_regular4').one() - assert ret.username == username , 'field mismatch %s %s' % (ret.username, username) - assert check_password(password, ret.password) == True , 'password mismatch' - assert ret.email == email , 'field mismatch %s %s' % (ret.email, email) - assert ret.name == name , 'field mismatch %s %s' % (ret.name, name) - assert ret.lastname == lastname , 'field mismatch %s %s' % (ret.lastname, lastname) - + self.assertEqual(ret.username, username) + self.assertEqual(check_password(password, ret.password), True) + self.assertEqual(ret.email, email) + self.assertEqual(ret.name, name) + self.assertEqual(ret.lastname, lastname) + self.assertNotEqual(ret.api_key, None) + self.assertEqual(ret.admin, False) def test_forgot_password_wrong_mail(self): - response = self.app.post(url(controller='login', action='password_reset'), - {'email':'marcin@wrongmail.org', }) + response = self.app.post( + url(controller='login', action='password_reset'), + {'email': 'marcin@wrongmail.org',} + ) - assert "This e-mail address doesn't exist" in response.body, 'Missing error message about wrong email' + response.mustcontain("This e-mail address doesn't exist") def test_forgot_password(self): response = self.app.get(url(controller='login', action='password_reset')) - self.assertEqual(response.status , '200 OK') + self.assertEqual(response.status, '200 OK') username = 'test_password_reset_1' password = 'qweqwe' diff --git a/rhodecode/tests/test_models.py b/rhodecode/tests/test_models.py --- a/rhodecode/tests/test_models.py +++ b/rhodecode/tests/test_models.py @@ -5,7 +5,8 @@ from rhodecode.tests import * from rhodecode.model.repos_group import ReposGroupModel from rhodecode.model.repo import RepoModel from rhodecode.model.db import RepoGroup, User, Notification, UserNotification, \ - UsersGroup, UsersGroupMember, Permission, UsersGroupRepoGroupToPerm + UsersGroup, UsersGroupMember, Permission, UsersGroupRepoGroupToPerm,\ + Repository from sqlalchemy.exc import IntegrityError from rhodecode.model.user import UserModel @@ -153,24 +154,23 @@ class TestReposGroups(unittest.TestCase) self.assertTrue(self.__check_path('g2', 'g1')) # test repo - self.assertEqual(r.repo_name, os.path.join('g2', 'g1', r.just_name)) - + self.assertEqual(r.repo_name, RepoGroup.url_sep().join(['g2', 'g1', r.just_name])) def test_move_to_root(self): g1 = _make_group('t11') Session.commit() - g2 = _make_group('t22',parent_id=g1.group_id) + g2 = _make_group('t22', parent_id=g1.group_id) Session.commit() - self.assertEqual(g2.full_path,'t11/t22') + self.assertEqual(g2.full_path, 't11/t22') self.assertTrue(self.__check_path('t11', 't22')) g2 = self.__update_group(g2.group_id, 'g22', parent_id=None) Session.commit() - self.assertEqual(g2.group_name,'g22') + self.assertEqual(g2.group_name, 'g22') # we moved out group from t1 to '' so it's full path should be 'g2' - self.assertEqual(g2.full_path,'g22') + self.assertEqual(g2.full_path, 'g22') self.assertFalse(self.__check_path('t11', 't22')) self.assertTrue(self.__check_path('g22')) @@ -620,7 +620,7 @@ class TestPermissions(unittest.TestCase) # add repo to group form_data = { 'repo_name':HG_REPO, - 'repo_name_full':os.path.join(self.g1.group_name,HG_REPO), + 'repo_name_full':RepoGroup.url_sep().join([self.g1.group_name,HG_REPO]), 'repo_type':'hg', 'clone_uri':'', 'repo_group':self.g1.group_id,