From 6643647687aa2ba8a41f8f95d404407ff6106d8c Mon Sep 17 00:00:00 2001 From: fzerorubigd Date: Wed, 31 Dec 2014 21:37:51 +0330 Subject: [PATCH 01/37] add afunction to rewrite all public keys on admin request refs #763 --- conf/locale/locale_en-US.ini | 17 +++-------------- models/publickey.go | 29 ++++++++++++++++++++++++++--- routers/admin/admin.go | 4 ++++ templates/admin/dashboard.tmpl | 5 +++++ 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 34f9febc1..deedbefab 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -64,7 +64,7 @@ app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in e-mail. email_title = E-mail Service Settings(Optional) smtp_host = SMTP Host mailer_user = Sender E-mail -mailer_password = Sender Password +mailer_password = Sender Password notify_title = Notification Settings(Optional) register_confirm = Enable Register Confirmation mail_notify = Enable Mail Notification @@ -511,6 +511,8 @@ dashboard.delete_repo_archives = Delete all repositories archives dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully. dashboard.git_gc_repos = Do garbage collection on repositories dashboard.git_gc_repos_success = All repositories have done garbage collection successfully. +dashboard.resync_all_sshkeys = Do resync .ssh/autorized_key file +dashboard.resync_all_sshkeys_success = All keys are synced again. dashboard.server_uptime = Server Uptime dashboard.current_goroutine = Current Goroutines dashboard.current_memory_usage = Current Memory Usage @@ -711,16 +713,3 @@ months = %d months %s years = %d years %s raw_seconds = seconds raw_minutes = minutes - - - - - - - - - - - - - diff --git a/models/publickey.go b/models/publickey.go index ba15ca455..fbba691ab 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -163,7 +163,7 @@ func CheckPublicKeyString(content string) (bool, error) { } // saveAuthorizedKeyFile writes SSH key content to authorized_keys file. -func saveAuthorizedKeyFile(key *PublicKey) error { +func saveAuthorizedKeyFile(keys ...*PublicKey) error { sshOpLocker.Lock() defer sshOpLocker.Unlock() @@ -188,8 +188,13 @@ func saveAuthorizedKeyFile(key *PublicKey) error { } } - _, err = f.WriteString(key.GetAuthorizedString()) - return err + for _, key := range keys { + _, err = f.WriteString(key.GetAuthorizedString()) + if err != nil { + return err + } + } + return nil } // AddPublicKey adds new public key to database and authorized_keys file. @@ -341,3 +346,21 @@ func DeletePublicKey(key *PublicKey) error { } return os.Rename(tmpPath, fpath) } + +// RewriteAllPublicKeys remove any authorized key and re-write all key from database again +func RewriteAllPublicKeys() error { + keys := make([]*PublicKey, 0, 5) + err := x.Find(&keys) + if err != nil { + return err + } + + fpath := filepath.Join(SshPath, "authorized_keys") + if _, err := os.Stat(fpath); os.IsNotExist(err) { + return saveAuthorizedKeyFile(keys...) + } + if err := os.Remove(fpath); err != nil { + return err + } + return saveAuthorizedKeyFile(keys...) +} diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 563a9cdc4..ea50d5c4c 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -118,6 +118,7 @@ const ( CLEAN_INACTIVATE_USER CLEAN_REPO_ARCHIVES GIT_GC_REPOS + SYNC_SSH_AUTHORIZED_KEY ) func Dashboard(ctx *middleware.Context) { @@ -144,6 +145,9 @@ func Dashboard(ctx *middleware.Context) { case GIT_GC_REPOS: success = ctx.Tr("admin.dashboard.git_gc_repos_success") err = models.GitGcRepos() + case SYNC_SSH_AUTHORIZED_KEY: + success = ctx.Tr("admin.dashboard.resync_all_sshkeys_success") + err = models.RewriteAllPublicKeys() } if err != nil { diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index 8d17c360b..b57051753 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -48,6 +48,11 @@ {{.i18n.Tr "admin.dashboard.git_gc_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}} + + {{.i18n.Tr "admin.dashboard.resync_all_sshkeys"}} + {{.i18n.Tr "admin.dashboard.operation_run"}} + + From 44fa9147b76b5500641eecd1be1f76affc8288f8 Mon Sep 17 00:00:00 2001 From: Peter Smit Date: Fri, 2 Jan 2015 11:15:42 +0200 Subject: [PATCH 02/37] Fix #819 by fetching the repository from db before updating --- models/repo.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/models/repo.go b/models/repo.go index 50b2b3fc2..495f1660c 100644 --- a/models/repo.go +++ b/models/repo.go @@ -507,6 +507,11 @@ func initRepository(f string, u *User, repo *Repository, initReadme bool, repoLa } if len(fileName) == 0 { + // re-fetch the repository from database before updating it (else it would + // override changes that were done earlier with sql) + if _, err := x.Get(repo); err != nil { + return err + } repo.IsBare = true repo.DefaultBranch = "master" return UpdateRepository(repo) From c0e9481fa64be9d1ac4aa1366077e6078251792d Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 26 Jan 2015 09:13:34 -0500 Subject: [PATCH 03/37] update locale --- conf/locale/locale_ru-RU.ini | 106 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/conf/locale/locale_ru-RU.ini b/conf/locale/locale_ru-RU.ini index 6655342fe..bcc71f8db 100755 --- a/conf/locale/locale_ru-RU.ini +++ b/conf/locale/locale_ru-RU.ini @@ -61,7 +61,7 @@ domain=Домен domain_helper=This affects SSH clone URLs. app_url=URL приложения app_url_helper=This affects HTTP/HTTPS clone URL and somewhere in e-mail. -email_title=E-mail Service Settings (Optional) +email_title=Настройки службы электронной почты (опционально) smtp_host=Узел SMTP mailer_user=Электронная почта отправителя mailer_password=Пароль отправителя @@ -75,7 +75,7 @@ confirm_password=Подтвердить пароль admin_email=Эл. почта install_gogs=Установить Gogs test_git_failed=Не удалось проверить 'git' команду: %v -sqlite3_not_available=Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version. +sqlite3_not_available=Ваша версия не поддерживает SQLite3, пожалуйста скачайте официальную бинарную версию от %s, а не версию gobuild. invalid_db_setting=Настройки базы данных не правильные: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v run_user_not_match=Run user isn't the current user: %s -> %s @@ -98,9 +98,9 @@ repos=Репозитории [auth] create_new_account=Создать новый аккаунт register_hepler_msg=Уже есть аккаунт? Авторизуйтесь! -social_register_hepler_msg=Уже есть учетная запись? Свяжите ее соцсетью! +social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью! disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. -disable_register_mail=Sorry, Register Mail Confirmation has been disabled. +disable_register_mail=К сожалению подтверждение регистрации по почте отключено. remember_me=Запомнить меня forgot_password=Забыли пароль forget_password=Забыли пароль? @@ -109,7 +109,7 @@ confirmation_mail_sent_prompt=Новое письмо для подтвержд sign_in_email=Войдите в свой адрес электронной почты active_your_account=Активируйте свой аккаунт resent_limit_prompt=Вы слишком часто отправляете письмо с активацией. Подождите 3 минуты, пожалуйста. -has_unconfirmed_mail=Hi %s, you have an unconfirmed e-mail address %s). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below. +has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (%s). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже. resend_mail=Нажмите здесь, чтобы переотправить активационное письмо email_not_associate=Этот адрес электронной почты не связан ни с одной учетной записью. send_reset_mail=Нажмите сюда, чтобы отправить письмо для сброса пароля @@ -157,17 +157,17 @@ enterred_invalid_repo_name=Пожалуйста, убедитесь, что вв enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное. enterred_invalid_password=Убедитесь, что введенный пароль верен. user_not_exist=Данный пользователь не существует. -last_org_owner=The user to remove is the last member in owner team. There must be another owner. +last_org_owner=Удаляемый пользователь является последним в команде владельцев. Должен быть хотя бы один владелец. invalid_ssh_key=К сожалению, мы не смогли проверить ваш SSH-ключ: %s unable_verify_ssh_key=Gogs не может проверить ваш SSH-ключ, но мы допускаем, что он действителен. Пожалуйста, удостоверьтесь самостоятельно, что ключ действителен. auth_failed=Ошибка аутентификации: %v -still_own_repo=Your account still have ownership of repository, you have to delete or transfer them first. +still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его. still_has_org=Your account still have membership of organization, you have to left or delete them first. org_still_own_repo=Данная организация все еще является владельцем репозиториев, необходимо удалить или переместить их в начале. -still_own_user=This authentication still has used by some users, you should move them and then delete again. +still_own_user=Эта проверка подлинности по-прежнему используется некоторыми пользователями, вы должны переместить их и затем снова удалить. target_branch_not_exist=Целевая ветка не существует @@ -192,7 +192,7 @@ delete=Удалить аккаунт uid=UID public_profile=Открытый профиль -profile_desc=Your E-mail address is public and will be used for any account related notifications, and any web based operations made via the site. +profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт. full_name=ФИО website=Веб-сайт location=Местоположение @@ -217,15 +217,15 @@ new_password=Новый пароль password_incorrect=Текущий пароль не правильный. change_password_success=Пароль сменен успешно. Теперь вы можете войти с новым паролем. -emails=E-mail Addresses -manage_emails=Manage e-mail addresses -email_desc=Your primary e-mail address will be used for notifications and other operations. -primary=Primary -primary_email=Set as primary -delete_email=Delete -add_new_email=Add new e-mail address -add_email=Add e-mail -add_email_success=Your new E-mail address was successfully added. +emails=Адреса электронной почты +manage_emails=Управление адресами электронной почты +email_desc=Ваш основной адрес электронной почты будет использован для уведомлений и других операций. +primary=Основной +primary_email=Установить как основной +delete_email=Удалить +add_new_email=Добавить новый адрес электронной почты +add_email=Добавить электронную почту +add_email_success=Новый адрес электронной почты успешно добавлен. manage_ssh_keys=Управление SSH ключами add_key=Добавить ключ @@ -240,20 +240,20 @@ add_on=Добавлено last_used=Последний раз использовался no_activity=Еще не применялся -manage_social=Manage Associated Social Accounts -social_desc=This is a list of associated social accounts. Remove any binding that you do not recognize. +manage_social=Управление привязанными учетными записями в соцсетях +social_desc=Это список привязанных учетных записей в соцсетях. Удаляйте любые неизвестные вам привязки. unbind=Отвязать unbind_success=Социальная учетная запись отвязана. -manage_access_token=Manage Personal Access Tokens +manage_access_token=Управление Токенами Персонального Доступа generate_new_token=Создать новый token -tokens_desc=Tokens you have generated that can be used to access the Gogs API. -new_token_desc=As for now, every token will have full access to your account. +tokens_desc=Созданные вами токены могут использоваться для доступа к Gogs API. +new_token_desc=Пока что каждый токен будет иметь полный доступ к вашей учетной записи. token_name=Имя маркера generate_token=Генерировать маркер -generate_token_succees=New access token has been generated successfully! Make sure to copy your new personal access token now. You won't be able to see it again! +generate_token_succees=Успешно создан новый токен доступа! Пожалуйста сделайте копию вашего нового токена персонального доступа. Вы не сможете увидеть его снова! delete_token=Удалить -delete_token_success=Personal access token has been deleted successfully! Don't forget to update your applications as well. +delete_token_success=Персональный токен доступа был успешно удален! Не забудьте так же обновить ваши приложения. delete_account=Удалить свой аккаунт delete_prompt=Этим действием вы удалите свою учетную запись навсегда и НЕ СМОЖЕТЕ ее вернуть! @@ -285,7 +285,7 @@ goget_meta_helper=This repository will be зеркалом -migrate_repo=Migrate Repository +migrate_repo=Перенос репозитория copy_link=Копировать click_to_copy=Скопировать в буфер обмена @@ -322,7 +322,7 @@ commits.author=Автор commits.message=Сообщение commits.date=Дата commits.older=Раньше -commits.newer=Newer +commits.newer=Новее settings=Настройки settings.options=Опции @@ -347,9 +347,9 @@ settings.transfer_owner=Новый владелец settings.make_transfer=Выполнить передачу settings.transfer_succeed=Repository ownership has been transferred successfully. settings.confirm_delete=Подтвердить удаление -settings.add_collaborator=Add New Collaborator -settings.add_collaborator_success=New collaborator has been added. -settings.remove_collaborator_success=Collaborator has been removed. +settings.add_collaborator=Добавить нового соавтора +settings.add_collaborator_success=Был добавлен новый соавтор. +settings.remove_collaborator_success=Соавтор был удален. settings.user_is_org_member=User is organization member who cannot be added as a collaborator. settings.add_webhook=Добавить Webhook settings.hooks_desc=Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our Webhooks Guide. @@ -462,14 +462,14 @@ members.invite_now=Пригласите сейчас teams.join=Объединить teams.leave=Выйти teams.read_access=Доступ на чтение -teams.read_access_helper=This team will be able to view and clone its repositories. +teams.read_access_helper=Эта команда будет иметь возможность просматривать и клонировать ее репозитории. teams.write_access=Доступ на запись -teams.write_access_helper=This team will be able to read its repositories, as well as push to them. +teams.write_access_helper=Эта команда будет в состоянии прочитать ее репозитории, а также посылать изменения. teams.admin_access=Доступ администратора teams.admin_access_helper=This team will be able to push/pull to its repositories, as well as add other collaborators to them. teams.no_desc=Эта группа не имеет описания teams.settings=Настройки -teams.owners_permission_desc=Owners have full access to all repositories and have admin rights to the organization. +teams.owners_permission_desc=Владельцы имеют полный доступ ко всем репозиториям и имеют права администратора организации. teams.members=Члены группы разработки teams.update_settings=Обновить настройки teams.delete_team=Удалить эту группу разработки @@ -486,7 +486,7 @@ teams.remove_repo=Удалить teams.add_nonexistent_repo=Вы добавляете в отсутствующий репозиторий, пожалуйста сначала его создайте. [admin] -dashboard=Dashboard +dashboard=Панель управления users=Пользователи organizations=Организации repositories=Репозитории @@ -508,14 +508,14 @@ dashboard.clean_unbind_oauth=Clean unbound OAuthes dashboard.clean_unbind_oauth_success=All unbind OAuthes have been deleted successfully. dashboard.delete_inactivate_accounts=Удалить все неактивированные учетные записи dashboard.delete_inactivate_accounts_success=Все неактивированные учетные записи удалены успешно. -dashboard.delete_repo_archives=Delete all repositories archives -dashboard.delete_repo_archives_success=All repositories archives have been deleted successfully. -dashboard.git_gc_repos=Do garbage collection on repositories -dashboard.git_gc_repos_success=All repositories have done garbage collection successfully. +dashboard.delete_repo_archives=Удаление всех архивов репозиториев +dashboard.delete_repo_archives_success=Все архивы репозиториев были успешно удалены. +dashboard.git_gc_repos=Выполнить сборку мусора на репозиториях +dashboard.git_gc_repos_success=Сборка мусора на всех репозиториях успешно выполнена. dashboard.server_uptime=Время непрерывной работы сервера dashboard.current_goroutine=Current Goroutines dashboard.current_memory_usage=Текущее использование памяти -dashboard.total_memory_allocated=Total Memory Allocated +dashboard.total_memory_allocated=Всего памяти выделено dashboard.memory_obtained=Memory Obtained dashboard.pointer_lookup_times=Pointer Lookup Times dashboard.memory_allocate_times=Memory Allocate Times @@ -543,7 +543,7 @@ dashboard.last_gc_pause=Last GC Pause dashboard.gc_times=GC Times users.user_manage_panel=User Manage Panel -users.new_account=Create New Account +users.new_account=Создать новый аккаунт users.name=Имя users.activated=Активирован users.admin=Администратор @@ -560,7 +560,7 @@ users.is_admin=У этой учетной записи есть права ад users.allow_git_hook=Пользователь имеет право создать Git перехватчик users.update_profile=Обновить профиль учетной записи users.delete_account=Удалить эту учетную запись -users.still_own_repo=This account still have ownership of repository, you have to delete or transfer them first. +users.still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его. users.still_has_org=This account still have membership of organization, you have to left or delete them first. orgs.org_manage_panel=Управление группами @@ -630,7 +630,7 @@ config.db_path=Path config.db_path_helper=(for "sqlite3" only) config.service_config=Service Configuration config.register_email_confirm=Require E-mail Confirmation -config.disable_register=Disable Registration +config.disable_register=Отключить регистрацию config.require_sign_in_view=Require Sign In View config.mail_notify=Mail Notification config.enable_cache_avatar=Enable Cache Avatar @@ -640,12 +640,12 @@ config.webhook_config=Настройка автоматического обно config.task_interval=Task Interval config.deliver_timeout=Deliver Timeout config.mailer_config=Mailer Configuration -config.mailer_enabled=Enabled -config.mailer_name=Name -config.mailer_host=Host -config.mailer_user=User -config.oauth_config=OAuth Configuration -config.oauth_enabled=Enabled +config.mailer_enabled=Включено +config.mailer_name=Имя +config.mailer_host=Сервер +config.mailer_user=Пользователь +config.oauth_config=Конфигурация OAuth +config.oauth_enabled=Включено config.cache_config=Cache Configuration config.cache_adapter=Cache Adapter config.cache_interval=Cache Interval @@ -653,7 +653,7 @@ config.cache_conn=Cache Connection config.session_config=Session Configuration config.session_provider=Session Provider config.provider_config=Provider Config -config.cookie_name=Cookie Name +config.cookie_name=Имя файла cookie config.enable_set_cookie=Enable Set Cookie config.gc_interval_time=GC Interval Time config.session_life_time=Время жизни сессии @@ -684,7 +684,7 @@ notices.op=Op. notices.delete_success=System notice has been deleted successfully. [action] -create_repo=created repository %s +create_repo=создан репозиторий %s commit_repo=pushed to %s at %s create_issue=opened issue %s#%s comment_issue=commented on issue %s#%s @@ -703,9 +703,9 @@ now=сейчас 1w=1 week %s 1mon=1 month %s 1y=1 year %s -seconds=%d seconds %s -minutes=%d minutes %s -hours=%d hours %s +seconds=%d секунд %s +minutes=%d минут %s +hours=%d часов %s days=%d days %s weeks=%d weeks %s months=%d months %s From 9803f84c883c372cca9ed5859cbf8f930af63d51 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Tue, 27 Jan 2015 16:30:58 -0500 Subject: [PATCH 04/37] update link --- README.md | 4 ++-- README_ZH.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ce53a85e8..ebaa12b7f 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ Gogs - Go Git Service [![wercker status](https://app.wercker.com/status/ad0bdb0b Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. -![Demo](https://gowalker.org/public/gogs_demo.gif) +![Demo](http://gogs.qiniudn.com/gogs_demo.gif) ##### Current version: 0.5.11 Beta ### NOTICES -- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **June 21, 2014** and will reset multiple times after. Please do **NOT** put your important data on the site. +- Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site. - Demo site [try.gogs.io](https://try.gogs.io) is running under `dev` branch. #### Other language version diff --git a/README_ZH.md b/README_ZH.md index a91b0ce57..30b9e778c 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -3,7 +3,7 @@ Gogs - Go Git Service [![wercker status](https://app.wercker.com/status/ad0bdb0b Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。 -![Demo](https://gowalker.org/public/gogs_demo.gif) +![Demo](http://gogs.qiniudn.com/gogs_demo.gif) ##### 当前版本:0.5.11 Beta From 37fcc8daf2d7d86e4d0f8baaeab0b2e11e5ec8d0 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 30 Jan 2015 18:05:20 -0500 Subject: [PATCH 05/37] modules/base: add RenderCommitMessage with XSS-safe and special links - update russian locale --- README.md | 2 +- README_ZH.md | 2 +- conf/locale/locale_ru-RU.ini | 18 +++++++++--------- gogs.go | 2 +- modules/base/markdown.go | 2 +- modules/base/template.go | 6 ++++++ routers/repo/commit.go | 4 ++-- routers/repo/view.go | 4 ++-- templates/.VERSION | 2 +- templates/repo/commits_table.tmpl | 2 +- templates/repo/diff.tmpl | 2 +- templates/repo/view_list.tmpl | 2 +- 12 files changed, 27 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ebaa12b7f..f85e7354f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. ![Demo](http://gogs.qiniudn.com/gogs_demo.gif) -##### Current version: 0.5.11 Beta +##### Current version: 0.5.12 Beta ### NOTICES diff --git a/README_ZH.md b/README_ZH.md index 30b9e778c..a67799ac3 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。 ![Demo](http://gogs.qiniudn.com/gogs_demo.gif) -##### 当前版本:0.5.11 Beta +##### 当前版本:0.5.12 Beta ## 开发目的 diff --git a/conf/locale/locale_ru-RU.ini b/conf/locale/locale_ru-RU.ini index bcc71f8db..b0da5c550 100755 --- a/conf/locale/locale_ru-RU.ini +++ b/conf/locale/locale_ru-RU.ini @@ -164,7 +164,7 @@ unable_verify_ssh_key=Gogs не может проверить ваш SSH-клю auth_failed=Ошибка аутентификации: %v still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его. -still_has_org=Your account still have membership of organization, you have to left or delete them first. +still_has_org=Вы находитесь в организации, сперва Вам необходимо покинуть ее или удалить. org_still_own_repo=Данная организация все еще является владельцем репозиториев, необходимо удалить или переместить их в начале. still_own_user=Эта проверка подлинности по-прежнему используется некоторыми пользователями, вы должны переместить их и затем снова удалить. @@ -631,22 +631,22 @@ config.db_path_helper=(for "sqlite3" only) config.service_config=Service Configuration config.register_email_confirm=Require E-mail Confirmation config.disable_register=Отключить регистрацию -config.require_sign_in_view=Require Sign In View -config.mail_notify=Mail Notification -config.enable_cache_avatar=Enable Cache Avatar +config.require_sign_in_view=Для просмотра необходима авторизация +config.mail_notify=Почтовые уведомления +config.enable_cache_avatar=Кешировать аватар config.active_code_lives=Active Code Lives config.reset_password_code_lives=Reset Password Code Lives config.webhook_config=Настройка автоматического обновления репозиции -config.task_interval=Task Interval -config.deliver_timeout=Deliver Timeout -config.mailer_config=Mailer Configuration +config.task_interval=Интервал задания +config.deliver_timeout=Задержка доставки +config.mailer_config=Настройки почты config.mailer_enabled=Включено config.mailer_name=Имя config.mailer_host=Сервер config.mailer_user=Пользователь config.oauth_config=Конфигурация OAuth config.oauth_enabled=Включено -config.cache_config=Cache Configuration +config.cache_config=Настройки кеша config.cache_adapter=Cache Adapter config.cache_interval=Cache Interval config.cache_conn=Cache Connection @@ -674,7 +674,7 @@ monitor.execute_times=Execute Times monitor.process=Запущенные процессы monitor.desc=Описание monitor.start=Start Time -monitor.execute_time=Execution Time +monitor.execute_time=Время выполнения notices.system_notice_list=Система уведомлений notices.type=Тип diff --git a/gogs.go b/gogs.go index 5711452d7..a3c749cea 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.12.0120 Beta" +const APP_VER = "0.5.12.0130 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/base/markdown.go b/modules/base/markdown.go index b2f94c480..2cd3617a8 100644 --- a/modules/base/markdown.go +++ b/modules/base/markdown.go @@ -103,7 +103,7 @@ var ( MentionPattern = regexp.MustCompile(`@[0-9a-zA-Z_]{1,}`) commitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`) issueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`) - issueIndexPattern = regexp.MustCompile(`#[0-9]+`) + issueIndexPattern = regexp.MustCompile(`( |^)#[0-9]+`) sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{40}\b`) ) diff --git a/modules/base/template.go b/modules/base/template.go index 829999d1c..34caa4552 100644 --- a/modules/base/template.go +++ b/modules/base/template.go @@ -90,6 +90,11 @@ func ToUtf8(content string) string { return res } +// RenderCommitMessage renders commit message with XSS-safe and special links. +func RenderCommitMessage(msg, urlPrefix string) template.HTML { + return template.HTML(string(RenderIssueIndexPattern([]byte(template.HTMLEscapeString(msg)), urlPrefix))) +} + var mailDomains = map[string]string{ "gmail.com": "gmail.com", } @@ -163,6 +168,7 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{ "EscapePound": func(str string) string { return strings.Replace(str, "#", "%23", -1) }, + "RenderCommitMessage": RenderCommitMessage, } type Actioner interface { diff --git a/routers/repo/commit.go b/routers/repo/commit.go index 4571b24f2..e92ec8c88 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -37,7 +37,7 @@ func RenderIssueLinks(oldCommits *list.List, repoLink string) *list.List { newCommits := list.New() for e := oldCommits.Front(); e != nil; e = e.Next() { c := e.Value.(*git.Commit) - c.CommitMessage = string(base.RenderIssueIndexPattern([]byte(c.CommitMessage), repoLink)) + c.CommitMessage = c.CommitMessage newCommits.PushBack(c) } return newCommits @@ -206,7 +206,7 @@ func Diff(ctx *middleware.Context) { commitId := ctx.Repo.CommitId commit := ctx.Repo.Commit - commit.CommitMessage = string(base.RenderIssueIndexPattern([]byte(commit.CommitMessage), ctx.Repo.RepoLink)) + commit.CommitMessage = commit.CommitMessage diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName), commitId, setting.Git.MaxGitDiffLines) if err != nil { diff --git a/routers/repo/view.go b/routers/repo/view.go index 606a0da63..cb689df6a 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -156,9 +156,9 @@ func Home(ctx *middleware.Context) { for _, f := range files { switch c := f[1].(type) { case *git.Commit: - c.CommitMessage = string(base.RenderIssueIndexPattern([]byte(c.CommitMessage), ctx.Repo.RepoLink)) + c.CommitMessage = c.CommitMessage case *git.SubModuleFile: - c.CommitMessage = string(base.RenderIssueIndexPattern([]byte(c.CommitMessage), ctx.Repo.RepoLink)) + c.CommitMessage = c.CommitMessage } } ctx.Data["Files"] = files diff --git a/templates/.VERSION b/templates/.VERSION index 36f8bef5b..1674af9a2 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.12.0120 Beta \ No newline at end of file +0.5.12.0130 Beta \ No newline at end of file diff --git a/templates/repo/commits_table.tmpl b/templates/repo/commits_table.tmpl index bd3777b46..4c8141ab1 100644 --- a/templates/repo/commits_table.tmpl +++ b/templates/repo/commits_table.tmpl @@ -32,7 +32,7 @@ {{end}} {{SubStr .Id.String 0 10}} - {{Str2html .Summary}} + {{RenderCommitMessage .Summary $.RepoLink}} {{TimeSince .Author.When $.Lang}} {{end}} diff --git a/templates/repo/diff.tmpl b/templates/repo/diff.tmpl index 225175e8d..804535160 100644 --- a/templates/repo/diff.tmpl +++ b/templates/repo/diff.tmpl @@ -17,7 +17,7 @@
{{.i18n.Tr "repo.diff.browse_source"}} -

{{Str2html .Commit.Message}}

+

{{RenderCommitMessage .Commit.Message $.RepoLink}}

diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl index fed91effa..7bb9ffef7 100644 --- a/templates/repo/view_list.tmpl +++ b/templates/repo/view_list.tmpl @@ -53,7 +53,7 @@ {{SubStr $commit.Id.String 0 10}} - {{Str2html $commit.Summary}} + {{RenderCommitMessage $commit.Summary $.RepoLink}} {{TimeSince $commit.Committer.When $.Lang}} From ee6786216a608fca2de322c90c7256577f2a500a Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 30 Jan 2015 18:12:30 -0500 Subject: [PATCH 06/37] modules/base: clean code with #838 --- models/repo.go | 7 ++----- modules/base/markdown.go | 2 +- modules/base/template.go | 6 +----- modules/base/tool.go | 30 +++--------------------------- 4 files changed, 7 insertions(+), 38 deletions(-) diff --git a/models/repo.go b/models/repo.go index 65689b6a1..58c099d49 100644 --- a/models/repo.go +++ b/models/repo.go @@ -7,7 +7,6 @@ package models import ( "errors" "fmt" - "html" "html/template" "io/ioutil" "os" @@ -218,11 +217,9 @@ func (repo *Repository) HasAccess(uname string) bool { // DescriptionHtml does special handles to description and return HTML string. func (repo *Repository) DescriptionHtml() template.HTML { sanitize := func(s string) string { - // TODO(nuss-justin): Improve sanitization. Strip all tags? - ss := html.EscapeString(s) - return fmt.Sprintf(`%s`, ss, ss) + return fmt.Sprintf(`%[1]s`, s) } - return template.HTML(DescPattern.ReplaceAllStringFunc(base.XSSString(repo.Description), sanitize)) + return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize)) } // IsRepositoryExist returns true if the repository with given name under user has already existed. diff --git a/modules/base/markdown.go b/modules/base/markdown.go index 2cd3617a8..c7369ab9f 100644 --- a/modules/base/markdown.go +++ b/modules/base/markdown.go @@ -212,7 +212,7 @@ func RenderRawMarkdown(body []byte, urlPrefix string) []byte { func RenderMarkdown(rawBytes []byte, urlPrefix string) []byte { body := RenderSpecialLink(rawBytes, urlPrefix) body = RenderRawMarkdown(body, urlPrefix) - body = XSS(body) + body = Sanitizer.SanitizeBytes(body) return body } diff --git a/modules/base/template.go b/modules/base/template.go index 34caa4552..f3fa13857 100644 --- a/modules/base/template.go +++ b/modules/base/template.go @@ -13,7 +13,6 @@ import ( "strings" "time" - "github.com/microcosm-cc/bluemonday" "golang.org/x/net/html/charset" "golang.org/x/text/transform" @@ -21,11 +20,8 @@ import ( "github.com/gogits/gogs/modules/setting" ) -// FIXME: use me to Markdown API renders -var p = bluemonday.UGCPolicy() - func Str2html(raw string) template.HTML { - return template.HTML(p.Sanitize(raw)) + return template.HTML(Sanitizer.Sanitize(raw)) } func Range(l int) []int { diff --git a/modules/base/tool.go b/modules/base/tool.go index ff5a4f4cd..5043364ce 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -15,17 +15,19 @@ import ( "hash" "html/template" "math" - "regexp" "strings" "time" "github.com/Unknwon/com" "github.com/Unknwon/i18n" + "github.com/microcosm-cc/bluemonday" "github.com/gogits/gogs/modules/avatar" "github.com/gogits/gogs/modules/setting" ) +var Sanitizer = bluemonday.UGCPolicy() + // Encode string to md5 hex value. func EncodeMd5(str string) string { m := md5.New() @@ -473,29 +475,3 @@ func DateFormat(t time.Time, format string) string { format = replacer.Replace(format) return t.Format(format) } - -type xssFilter struct { - reg *regexp.Regexp - repl []byte -} - -var ( - whiteSpace = []byte(" ") - xssFilters = []xssFilter{ - {regexp.MustCompile(`\ [ONon]\w*=["]*`), whiteSpace}, - {regexp.MustCompile(`<[SCRIPTscript]{6}`), whiteSpace}, - {regexp.MustCompile(`=[` + "`" + `'"]*[JAVASCRIPTjavascript \t\0 ]*:`), whiteSpace}, - } -) - -// XSS goes through all the XSS filters to make user input content as safe as possible. -func XSS(in []byte) []byte { - for _, filter := range xssFilters { - in = filter.reg.ReplaceAll(in, filter.repl) - } - return in -} - -func XSSString(in string) string { - return string(XSS([]byte(in))) -} From d8394bb2e0703db2dc2a57fea843a526663bb279 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 30 Jan 2015 20:30:07 -0500 Subject: [PATCH 07/37] modules/midlleware: little auth code fix --- modules/middleware/auth.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go index 94bb1c14a..01e2ab534 100644 --- a/modules/middleware/auth.go +++ b/modules/middleware/auth.go @@ -54,7 +54,8 @@ func Toggle(options *ToggleOptions) macaron.Handler { if strings.HasSuffix(ctx.Req.RequestURI, "watch") { return } - ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) + println(url.QueryEscape(setting.AppSubUrl + ctx.Req.RequestURI)) + ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) ctx.Redirect(setting.AppSubUrl + "/user/login") return } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { From fb9dcfa921d72900936ddc7533861c33d847aa00 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 30 Jan 2015 20:30:42 -0500 Subject: [PATCH 08/37] modules/midlleware: little auth code fix, #777 --- modules/middleware/auth.go | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go index 01e2ab534..b0bcd87f5 100644 --- a/modules/middleware/auth.go +++ b/modules/middleware/auth.go @@ -54,7 +54,6 @@ func Toggle(options *ToggleOptions) macaron.Handler { if strings.HasSuffix(ctx.Req.RequestURI, "watch") { return } - println(url.QueryEscape(setting.AppSubUrl + ctx.Req.RequestURI)) ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) ctx.Redirect(setting.AppSubUrl + "/user/login") return From 7e3d66673d7223f17f1f290423360eabd7fb0751 Mon Sep 17 00:00:00 2001 From: Clint Armstrong Date: Fri, 30 Jan 2015 22:51:38 -0500 Subject: [PATCH 09/37] Add freebsd rc script --- scripts/rc/freebsd/gogs | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 scripts/rc/freebsd/gogs diff --git a/scripts/rc/freebsd/gogs b/scripts/rc/freebsd/gogs new file mode 100644 index 000000000..df13ee0d9 --- /dev/null +++ b/scripts/rc/freebsd/gogs @@ -0,0 +1,46 @@ +#!/bin/sh +# +# $FreeBSD$ +# +# PROVIDE: gogs +# REQUIRE: NETWORKING SYSLOG +# KEYWORD: shutdown +# +# Add the following lines to /etc/rc.conf to enable gogs: +# +#gogs_enable="YES" + +. /etc/rc.subr + +name="gogs" +rcvar="gogs_enable" + +load_rc_config $name + +: ${gogs_user:="git"} +: ${gogs_enable:="NO"} +: ${gogs_directory:="/home/git"} + +command="${gogs_directory}/scripts/start.sh" + +pidfile="${gogs_directory}/${name}.pid" + +start_cmd="${name}_start" +stop_cmd="${name}_stop" + +gogs_start() { + cd ${gogs_directory} + export USER=${gogs_user} + export HOME=${gogs_directory} + /usr/sbin/daemon -f -u ${gogs_user} -p ${pidfile} $command +} + +gogs_stop() { + if [ ! -f $pidfile ]; then + echo "GOGS PID File not found. Maybe GOGS is not running?" + else + kill $(cat $pidfile) + fi +} + +run_rc_command "$1" From 66a9c0d71dc739a4a0d584dc4793db2d32f3e561 Mon Sep 17 00:00:00 2001 From: Clint Armstrong Date: Fri, 30 Jan 2015 22:52:57 -0500 Subject: [PATCH 10/37] Rename scripts/rc/freebsd/gogs to scripts/init/freebsd/gogs --- scripts/{rc => init}/freebsd/gogs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{rc => init}/freebsd/gogs (100%) diff --git a/scripts/rc/freebsd/gogs b/scripts/init/freebsd/gogs similarity index 100% rename from scripts/rc/freebsd/gogs rename to scripts/init/freebsd/gogs From 32152d23633c3bf3a1704212a53012d4937e519f Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sat, 31 Jan 2015 15:27:57 -0500 Subject: [PATCH 11/37] routers/repo: set raw page content type to 'text/plain' #828 --- README.md | 1 + conf/locale/TRANSLATORS | 3 ++- gogs.go | 2 +- routers/repo/download.go | 8 ++++---- templates/.VERSION | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f85e7354f..226f2c877 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. - Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) has been reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site. - Demo site [try.gogs.io](https://try.gogs.io) is running under `dev` branch. +- If you think there are vulnerabilities in the project, please talk private to **u@gogs.io**, thanks! #### Other language version diff --git a/conf/locale/TRANSLATORS b/conf/locale/TRANSLATORS index 38e4ddc27..c848b05e3 100644 --- a/conf/locale/TRANSLATORS +++ b/conf/locale/TRANSLATORS @@ -1,6 +1,7 @@ # This file lists all PUBLIC individuals having contributed content to the translation. # Order of name is meaningless. +Christoph Kisfeld Thomas Fanninger Łukasz Jan Niemier -Lafriks \ No newline at end of file +Lafriks diff --git a/gogs.go b/gogs.go index a3c749cea..bdd3a8211 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.12.0130 Beta" +const APP_VER = "0.5.12.0131 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/routers/repo/download.go b/routers/repo/download.go index 6367c40e2..c5e18e005 100644 --- a/routers/repo/download.go +++ b/routers/repo/download.go @@ -25,16 +25,16 @@ func ServeBlob(ctx *middleware.Context, blob *git.Blob) error { buf = buf[:n] } - contentType, isTextFile := base.IsTextFile(buf) + _, isTextFile := base.IsTextFile(buf) _, isImageFile := base.IsImageFile(buf) - ctx.Resp.Header().Set("Content-Type", contentType) + ctx.Resp.Header().Set("Content-Type", "text/plain") if !isTextFile && !isImageFile { ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName)) ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") } ctx.Resp.Write(buf) - io.Copy(ctx.Resp, dataRc) - return nil + _, err = io.Copy(ctx.Resp, dataRc) + return err } func SingleDownload(ctx *middleware.Context) { diff --git a/templates/.VERSION b/templates/.VERSION index 1674af9a2..ab97c4a15 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.12.0130 Beta \ No newline at end of file +0.5.12.0131 Beta \ No newline at end of file From faddaff90d4710f763ccc76c467ba6ff04472c38 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sat, 31 Jan 2015 15:31:09 -0500 Subject: [PATCH 12/37] templates: fix commit message render issue #828 --- templates/repo/view_list.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl index 7bb9ffef7..06536b472 100644 --- a/templates/repo/view_list.tmpl +++ b/templates/repo/view_list.tmpl @@ -14,7 +14,7 @@ {{ShortSha .LastCommit.Id.String}} - {{Str2html .LastCommit.Summary}} + {{RenderCommitMessage .LastCommit.Summary .RepoLink}} {{TimeSince .LastCommit.Author.When $.Lang}} From 3d9cda2d98940102b1bdffc053e036cc696b9f8e Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 08:46:53 -0500 Subject: [PATCH 13/37] public/ng: fix auto-completion #832 --- gogs.go | 2 +- public/js/app.js | 16 ---------------- public/ng/js/gogs.js | 2 +- templates/.VERSION | 2 +- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/gogs.go b/gogs.go index bdd3a8211..423d30190 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.12.0131 Beta" +const APP_VER = "0.5.12.0201 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/public/js/app.js b/public/js/app.js index 23b629e3e..61539148e 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1052,22 +1052,6 @@ function initRepoSetting() { return; } Gogits.getUsers($this.val(), $this.next()); - /*$.ajax({ - url: '/api/v1/users/search?q=' + $this.val(), - dataType: "json", - success: function (json) { - if (json.ok && json.data.length) { - var html = ''; - $.each(json.data, function (i, item) { - html += '
  • ' + item.username + '
  • '; - }); - $this.next().toggleShow(); - $this.next().find('ul').html(html); - } else { - $this.next().toggleHide(); - } - } - });*/ }).on('focus', function () { if (!$(this).val()) { $(this).next().toggleHide(); diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index ff38bda9d..f0bb76330 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -608,7 +608,7 @@ function initTeamMembersList() { $ul.toggleShow(); } }).next().next().find('ul').on("click", 'li', function () { - $('#org-team-members-add').val($(this).text()); + $('#org-team-members-add').val($(this).find('.username').text()); $ul.toggleHide(); }); } diff --git a/templates/.VERSION b/templates/.VERSION index ab97c4a15..6e3c63ed8 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.12.0131 Beta \ No newline at end of file +0.5.12.0201 Beta \ No newline at end of file From b293b6eaa6b305bbac2147f76d5722607e8aa04b Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 12:41:03 -0500 Subject: [PATCH 14/37] cmd: CMD option for port number of `gogs web` to prevent first time run conflict - routers: use new binding convention to simplify code - templates: able to set HTTP port number in install page --- .travis.yml | 6 ++ cmd/web.go | 18 ++++-- conf/app.ini | 3 + conf/locale/locale_en-US.ini | 2 + models/models.go | 16 ++--- modules/auth/auth.go | 7 +++ modules/auth/user_form.go | 41 ++++++------- modules/setting/setting.go | 2 +- routers/install.go | 112 ++++++++++++++--------------------- templates/install.tmpl | 48 ++++++++------- 10 files changed, 133 insertions(+), 122 deletions(-) diff --git a/.travis.yml b/.travis.yml index b060c6939..ae8533695 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,11 @@ language: go go: - 1.2 - 1.3 + - 1.4 + - tip sudo: false + +notifications: + email: + - u@gogs.io \ No newline at end of file diff --git a/cmd/web.go b/cmd/web.go index 241abf2c9..e6fb2925c 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -53,7 +53,9 @@ var CmdWeb = cli.Command{ Description: `Gogs web server is the only thing you need to run, and it takes care of all the other things for you`, Action: runWeb, - Flags: []cli.Flag{}, + Flags: []cli.Flag{ + cli.StringFlag{"port, p", "3000", "Temporary port number to prevent conflict", ""}, + }, } type VerChecker struct { @@ -162,7 +164,7 @@ func newMacaron() *macaron.Macaron { return m } -func runWeb(*cli.Context) { +func runWeb(ctx *cli.Context) { routers.GlobalInit() checkVersion() @@ -179,9 +181,9 @@ func runWeb(*cli.Context) { // Routers. m.Get("/", ignSignIn, routers.Home) m.Get("/explore", ignSignIn, routers.Explore) - // FIXME: when i'm binding form here??? - m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install) - m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost) + m.Combo("/install", routers.InstallInit). + Get(routers.Install). + Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost) m.Group("", func() { m.Get("/pulls", user.Pulls) m.Get("/issues", user.Issues) @@ -460,6 +462,12 @@ func runWeb(*cli.Context) { // Not found handler. m.NotFound(routers.NotFound) + // Flag for port number in case first time run conflict. + if ctx.IsSet("port") { + setting.AppUrl = strings.Replace(setting.AppUrl, setting.HttpPort, ctx.String("port"), 1) + setting.HttpPort = ctx.String("port") + } + var err error listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort) log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl) diff --git a/conf/app.ini b/conf/app.ini index 1af480a82..072421505 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,3 +1,6 @@ +# NEVER EVER MODIFY THIS FILE +# PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE + ; App name that shows on every page title APP_NAME = Gogs: Go Git Service ; Change it if you run locally diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 7db7ca0d4..534e8d387 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -59,6 +59,8 @@ run_user = Run User run_user_helper = The user must have access to Repository Root Path and run Gogs. domain = Domain domain_helper = This affects SSH clone URLs. +http_port = HTTP Port +http_port_helper = Port number which application will listen on. app_url = Application URL app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in e-mail. email_title = E-mail Service Settings (Optional) diff --git a/models/models.go b/models/models.go index 55e7bf582..df030e51b 100644 --- a/models/models.go +++ b/models/models.go @@ -32,7 +32,7 @@ var ( HasEngine bool DbCfg struct { - Type, Host, Name, User, Pwd, Path, SslMode string + Type, Host, Name, User, Passwd, Path, SSLMode string } EnableSQLite3 bool @@ -58,10 +58,10 @@ func LoadModelsConfig() { DbCfg.Host = sec.Key("HOST").String() DbCfg.Name = sec.Key("NAME").String() DbCfg.User = sec.Key("USER").String() - if len(DbCfg.Pwd) == 0 { - DbCfg.Pwd = sec.Key("PASSWD").String() + if len(DbCfg.Passwd) == 0 { + DbCfg.Passwd = sec.Key("PASSWD").String() } - DbCfg.SslMode = sec.Key("SSL_MODE").String() + DbCfg.SSLMode = sec.Key("SSL_MODE").String() DbCfg.Path = sec.Key("PATH").MustString("data/gogs.db") } @@ -70,7 +70,7 @@ func getEngine() (*xorm.Engine, error) { switch DbCfg.Type { case "mysql": cnnstr = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", - DbCfg.User, DbCfg.Pwd, DbCfg.Host, DbCfg.Name) + DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name) case "postgres": var host, port = "127.0.0.1", "5432" fields := strings.Split(DbCfg.Host, ":") @@ -81,7 +81,7 @@ func getEngine() (*xorm.Engine, error) { port = fields[1] } cnnstr = fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s", - DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode) + DbCfg.User, DbCfg.Passwd, host, port, DbCfg.Name, DbCfg.SSLMode) case "sqlite3": if !EnableSQLite3 { return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type) @@ -97,7 +97,7 @@ func getEngine() (*xorm.Engine, error) { func NewTestEngine(x *xorm.Engine) (err error) { x, err = getEngine() if err != nil { - return fmt.Errorf("models.init(fail to connect to database): %v", err) + return fmt.Errorf("connect to database: %v", err) } return x.Sync(tables...) @@ -106,7 +106,7 @@ func NewTestEngine(x *xorm.Engine) (err error) { func SetEngine() (err error) { x, err = getEngine() if err != nil { - return fmt.Errorf("models.init(fail to connect to database): %v", err) + return fmt.Errorf("connect to database: %v", err) } // WARNING: for serv command, MUST remove the output to os.stdout, diff --git a/modules/auth/auth.go b/modules/auth/auth.go index 1dd96d8d4..ad7ce5b9a 100644 --- a/modules/auth/auth.go +++ b/modules/auth/auth.go @@ -9,6 +9,7 @@ import ( "reflect" "strings" + "github.com/Unknwon/com" "github.com/Unknwon/macaron" "github.com/macaron-contrib/binding" "github.com/macaron-contrib/session" @@ -135,6 +136,10 @@ type Form interface { binding.Validator } +func init() { + binding.SetNameMapper(com.ToSnakeCase) +} + // AssignForm assign form values back to the template data. func AssignForm(form interface{}, data map[string]interface{}) { typ := reflect.TypeOf(form) @@ -152,6 +157,8 @@ func AssignForm(form interface{}, data map[string]interface{}) { // Allow ignored fields in the struct if fieldName == "-" { continue + } else if len(fieldName) == 0 { + fieldName = com.ToSnakeCase(field.Name) } data[fieldName] = val.Field(i).Interface() diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index becd5cbca..3c0ff6517 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -12,26 +12,27 @@ import ( ) type InstallForm struct { - Database string `form:"database" binding:"Required"` - DbHost string `form:"host"` - DbUser string `form:"user"` - DbPasswd string `form:"passwd"` - DatabaseName string `form:"database_name"` - SslMode string `form:"ssl_mode"` - DatabasePath string `form:"database_path"` - RepoRootPath string `form:"repo_path" binding:"Required"` - RunUser string `form:"run_user" binding:"Required"` - Domain string `form:"domain" binding:"Required"` - AppUrl string `form:"app_url" binding:"Required"` - SmtpHost string `form:"smtp_host"` - SmtpEmail string `form:"mailer_user"` - SmtpPasswd string `form:"mailer_pwd"` - RegisterConfirm string `form:"register_confirm"` - MailNotify string `form:"mail_notify"` - AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"` - AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(255)"` - ConfirmPasswd string `form:"confirm_passwd" binding:"Required;MinSize(6);MaxSize(255)"` - AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"` + DbType string `binding:"Required"` + DbHost string + DbUser string + DbPasswd string + DbName string + SSLMode string + DbPath string + RepoRootPath string `binding:"Required"` + RunUser string `binding:"Required"` + Domain string `binding:"Required"` + HTTPPort string `binding:"Required"` + AppUrl string `binding:"Required"` + SMTPHost string + SMTPEmail string + SMTPPasswd string + RegisterConfirm string + MailNotify string + AdminName string `binding:"Required;AlphaDashDot;MaxSize(30)"` + AdminPasswd string `binding:"Required;MinSize(6);MaxSize(255)"` + AdminConfirmPasswd string `binding:"Required;MinSize(6);MaxSize(255)"` + AdminEmail string `binding:"Required;Email;MaxSize(50)"` } func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { diff --git a/modules/setting/setting.go b/modules/setting/setting.go index bc9da3c63..e7c44cdd4 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -178,7 +178,7 @@ func NewConfigContext() { log.Fatal(4, "Fail to load custom 'conf/app.ini': %v", err) } } else { - log.Warn("No custom 'conf/app.ini' found, please go to '/install'") + log.Warn("No custom 'conf/app.ini' found, ignore this if you're running first time") } Cfg.NameMapper = ini.AllCapsUnderscore diff --git a/routers/install.go b/routers/install.go index a2491c4fc..58e6cf664 100644 --- a/routers/install.go +++ b/routers/install.go @@ -73,12 +73,7 @@ func GlobalInit() { checkRunMode() } -func renderDbOption(ctx *middleware.Context) { - ctx.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"} -} - -// @router /install [get] -func Install(ctx *middleware.Context, form auth.InstallForm) { +func InstallInit(ctx *middleware.Context) { if setting.InstallLock { ctx.Handle(404, "Install", errors.New("Installation is prohibited")) return @@ -87,46 +82,35 @@ func Install(ctx *middleware.Context, form auth.InstallForm) { ctx.Data["Title"] = ctx.Tr("install.install") ctx.Data["PageIsInstall"] = true - // FIXME: when i'm ckeching length here? should they all be 0 no matter when? - // Get and assign values to install form. - if len(form.DbHost) == 0 { - form.DbHost = models.DbCfg.Host - } - if len(form.DbUser) == 0 { - form.DbUser = models.DbCfg.User - } - if len(form.DbPasswd) == 0 { - form.DbPasswd = models.DbCfg.Pwd - } - if len(form.DatabaseName) == 0 { - form.DatabaseName = models.DbCfg.Name - } - if len(form.DatabasePath) == 0 { - form.DatabasePath = models.DbCfg.Path - } + ctx.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"} +} - if len(form.RepoRootPath) == 0 { - form.RepoRootPath = setting.RepoRootPath - } - if len(form.RunUser) == 0 { - // Note: it's not normall to use SSH in windows so current user can be first option(not git). - if setting.IsWindows && setting.RunUser == "git" { - form.RunUser = os.Getenv("USER") - if len(form.RunUser) == 0 { - form.RunUser = os.Getenv("USERNAME") - } - } else { - form.RunUser = setting.RunUser +func Install(ctx *middleware.Context) { + form := auth.InstallForm{} + + form.DbHost = models.DbCfg.Host + form.DbUser = models.DbCfg.User + form.DbPasswd = models.DbCfg.Passwd + form.DbName = models.DbCfg.Name + form.DbPath = models.DbCfg.Path + + form.RepoRootPath = setting.RepoRootPath + + // Note(unknwon): it's hard for Windows users change a running user, + // so just use current one if config says default. + if setting.IsWindows && setting.RunUser == "git" { + form.RunUser = os.Getenv("USER") + if len(form.RunUser) == 0 { + form.RunUser = os.Getenv("USERNAME") } + } else { + form.RunUser = setting.RunUser } - if len(form.Domain) == 0 { - form.Domain = setting.Domain - } - if len(form.AppUrl) == 0 { - form.AppUrl = setting.AppUrl - } - renderDbOption(ctx) + form.Domain = setting.Domain + form.HTTPPort = setting.HttpPort + form.AppUrl = setting.AppUrl + curDbOp := "" if models.EnableSQLite3 { curDbOp = "SQLite3" // Default when enabled. @@ -138,16 +122,7 @@ func Install(ctx *middleware.Context, form auth.InstallForm) { } func InstallPost(ctx *middleware.Context, form auth.InstallForm) { - if setting.InstallLock { - ctx.Handle(404, "InstallPost", errors.New("Installation is prohibited")) - return - } - - ctx.Data["Title"] = ctx.Tr("install.install") - ctx.Data["PageIsInstall"] = true - - renderDbOption(ctx) - ctx.Data["CurDbOption"] = form.Database + ctx.Data["CurDbOption"] = form.DbType if ctx.HasError() { ctx.HTML(200, INSTALL) @@ -162,18 +137,17 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { // Pass basic check, now test configuration. // Test database setting. dbTypes := map[string]string{"MySQL": "mysql", "PostgreSQL": "postgres", "SQLite3": "sqlite3"} - models.DbCfg.Type = dbTypes[form.Database] + models.DbCfg.Type = dbTypes[form.DbType] models.DbCfg.Host = form.DbHost models.DbCfg.User = form.DbUser - models.DbCfg.Pwd = form.DbPasswd - models.DbCfg.Name = form.DatabaseName - models.DbCfg.SslMode = form.SslMode - models.DbCfg.Path = form.DatabasePath + models.DbCfg.Passwd = form.DbPasswd + models.DbCfg.Name = form.DbName + models.DbCfg.SSLMode = form.SSLMode + models.DbCfg.Path = form.DbPath // Set test engine. var x *xorm.Engine if err := models.NewTestEngine(x); err != nil { - // FIXME: should use core.QueryDriver (github.com/go-xorm/core) if strings.Contains(err.Error(), `Unknown database type: sqlite3`) { ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "http://gogs.io/docs/installation/install_from_binary.html"), INSTALL, &form) } else { @@ -194,7 +168,6 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { if len(curUser) == 0 { curUser = os.Getenv("USERNAME") } - // Does not check run user when the install lock is off. if form.RunUser != curUser { ctx.Data["Err_RunUser"] = true ctx.RenderWithErr(ctx.Tr("install.run_user_not_match", form.RunUser, curUser), INSTALL, &form) @@ -202,31 +175,36 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { } // Check admin password. - if form.AdminPasswd != form.ConfirmPasswd { + if form.AdminPasswd != form.AdminConfirmPasswd { ctx.Data["Err_AdminPasswd"] = true ctx.RenderWithErr(ctx.Tr("form.password_not_match"), INSTALL, form) return } + if form.AppUrl[len(form.AppUrl)-1] != '/' { + form.AppUrl += "/" + } + // Save settings. setting.Cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type) setting.Cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host) setting.Cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name) setting.Cfg.Section("database").Key("USER").SetValue(models.DbCfg.User) - setting.Cfg.Section("database").Key("PASSWD").SetValue(models.DbCfg.Pwd) - setting.Cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SslMode) + setting.Cfg.Section("database").Key("PASSWD").SetValue(models.DbCfg.Passwd) + setting.Cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SSLMode) setting.Cfg.Section("database").Key("PATH").SetValue(models.DbCfg.Path) setting.Cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath) setting.Cfg.Section("").Key("RUN_USER").SetValue(form.RunUser) setting.Cfg.Section("server").Key("DOMAIN").SetValue(form.Domain) + setting.Cfg.Section("server").Key("HTTP_PORT").SetValue(form.HTTPPort) setting.Cfg.Section("server").Key("ROOT_URL").SetValue(form.AppUrl) - if len(strings.TrimSpace(form.SmtpHost)) > 0 { + if len(strings.TrimSpace(form.SMTPHost)) > 0 { setting.Cfg.Section("mailer").Key("ENABLED").SetValue("true") - setting.Cfg.Section("mailer").Key("HOST").SetValue(form.SmtpHost) - setting.Cfg.Section("mailer").Key("USER").SetValue(form.SmtpEmail) - setting.Cfg.Section("mailer").Key("PASSWD").SetValue(form.SmtpPasswd) + setting.Cfg.Section("mailer").Key("HOST").SetValue(form.SMTPHost) + setting.Cfg.Section("mailer").Key("USER").SetValue(form.SMTPEmail) + setting.Cfg.Section("mailer").Key("PASSWD").SetValue(form.SMTPPasswd) setting.Cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm == "on")) setting.Cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify == "on")) @@ -264,5 +242,5 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { log.Info("First-time run install finished!") ctx.Flash.Success(ctx.Tr("install.install_success")) - ctx.Redirect(setting.AppSubUrl + "/user/login") + ctx.Redirect(form.AppUrl + "user/login") } diff --git a/templates/install.tmpl b/templates/install.tmpl index f1c28031d..3a7eb7877 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -13,7 +13,7 @@
    {{.i18n.Tr "install.requite_db_desc"}}
    - {{range .DbOptions}} {{end}} @@ -22,20 +22,20 @@
    - - + +
    - - + +
    - - + +
    - - + + {{.i18n.Tr "install.db_helper"}}
    @@ -51,8 +51,8 @@
    - - + + {{.i18n.Tr "install.sqlite_helper"}}
    @@ -61,8 +61,8 @@
    {{.i18n.Tr "install.general_title"}}
    - - + + {{.i18n.Tr "install.repo_path_helper"}}
    @@ -78,6 +78,12 @@ {{.i18n.Tr "install.domain_helper"}}
    +
    + + + + {{.i18n.Tr "install.http_port_helper"}} +
    @@ -93,12 +99,12 @@
    - - + +
    - - + +

    @@ -122,12 +128,12 @@
    - - + +
    - - + +
    From 27bd2157ed4fac16677e2747ac4671acc3c6efa1 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 12:44:10 -0500 Subject: [PATCH 15/37] update travis.yml and add badge --- .travis.yml | 2 ++ README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ae8533695..85e5f396e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ go: sudo: false +script: go build -v + notifications: email: - u@gogs.io \ No newline at end of file diff --git a/README.md b/README.md index 226f2c877..a2f71967d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Gogs - Go Git Service [![wercker status](https://app.wercker.com/status/ad0bdb0bc450ac6f09bc56b9640a50aa/s/ "wercker status")](https://app.wercker.com/project/bykey/ad0bdb0bc450ac6f09bc56b9640a50aa) [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) +Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) ===================== [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) From ac29dc93cd36489eafb1a653f52d7ccb35dd4d2f Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 13:36:40 -0500 Subject: [PATCH 16/37] conf/locale: add Japanese support README: remove duplicated travis badge --- README.md | 4 +- README_ZH.md | 2 +- conf/app.ini | 4 +- conf/locale/locale_ja-JP.ini | 728 +++++++++++++++++++++++++++++++++++ 4 files changed, 733 insertions(+), 5 deletions(-) create mode 100755 conf/locale/locale_ja-JP.ini diff --git a/README.md b/README.md index a2f71967d..3d87e3a1f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) +Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) ===================== [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -51,7 +51,7 @@ The goal of this project is to make the easiest, fastest and most painless way t - Drone CI integration - Supports MySQL, PostgreSQL and SQLite3 - Social account login(GitHub, Google, QQ, Weibo) -- Multi-language support([7 languages](https://crowdin.com/project/gogs)) +- Multi-language support([9 languages](https://crowdin.com/project/gogs)) ## System Requirements diff --git a/README_ZH.md b/README_ZH.md index a67799ac3..be3a2b1bc 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -39,7 +39,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自 - Drone CI 持续部署集成 - 支持 MySQL、PostgreSQL 以及 SQLite3 数据库 - 社交帐号登录(GitHub、Google、QQ、微博) -- 多语言支持([7 种语言]([more](https://crowdin.com/project/gogs))) +- 多语言支持([9 种语言]([more](https://crowdin.com/project/gogs))) ## 系统要求 diff --git a/conf/app.ini b/conf/app.ini index 072421505..b7a0f1a7c 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -278,5 +278,5 @@ INTERVAL = 24 ARGS = [i18n] -LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL,lv-LV,ru-RU -NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский +LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL,lv-LV,ru-RU,ja-JP +NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本语 diff --git a/conf/locale/locale_ja-JP.ini b/conf/locale/locale_ja-JP.ini new file mode 100755 index 000000000..04df692ae --- /dev/null +++ b/conf/locale/locale_ja-JP.ini @@ -0,0 +1,728 @@ +app_desc=Go言語で実装したセルフホストGitサーバ + +home=ホーム +dashboard=ダッシュボード +explore=エスクプローラ +help=ヘルプ +sign_in=サインイン +social_sign_in=SNSでサインイン: ステップ2 アカウント連携 +sign_out=サインアウト +sign_up=サインアップ +register=登録 +website=WEBサイト +version=バージョン +page=ページ +template=テンプレート +language=言語 + +username=ユーザ名 +email=E-mail +password=パスワード +re_type=再入力 +captcha=キャプチャ + +repository=リポジトリ +organization=組織 +mirror=ミラー +new_repo=新しいリポジトリ +new_migrate=新しい移行 +new_fork=新しいフォークのリポジトリ +new_org=新しい組織 +manage_org=組織を管理 +admin_panel=管理者パネル +account_settings=アカウント設定 +settings=設定 + +news_feed=ニュースのフィード +pull_requests=プルリクエスト +issues=課題 + +cancel=キャンセル + +[install] +install=インストール +title=初回実行のインストール手順 +requite_db_desc=Gogs には、MySQL や PostgreSQL 、SQLite3 が必要です。 +db_type=データベースの種類 +host=ホスト +user=ユーザ +password=パスワード +db_name=データベース名 +db_helper=Mysql INNODB エンジン utf8_general_ci の文字セットを使用してください。 +ssl_mode=SSL モード +path=パス +sqlite_helper=SQLite3 データベースのファイル パス +general_title=Gogs の全般設定 +repo_path=リポジトリのルートパス +repo_path_helper=すべての Git リモート リポジトリはこのディレクトリに保存されます。 +run_user=実行ユーザ +run_user_helper=ユーザーはリポジトリ ルートパスへのアクセス、及びGogs を実行する権限を所有する必要があります。 +domain=ドメイン +domain_helper=これはSSHクローンURLに影響する。 +app_url=アプリケーションの URL +app_url_helper=This affects HTTP/HTTPS clone URL and somewhere in e-mail. +email_title=E-mailサービス設定(Optional) +smtp_host=SMTP ホスト +mailer_user=送信者の電子メール +mailer_password=送信者のパスワード +notify_title=通知 Settings(Optional) +register_confirm=登録の確認を有効にする +mail_notify=メール通知を有効にする +admin_title=管理者アカウントの設定 +admin_name=ユーザ名 +admin_password=パスワード +confirm_password=パスワード確認 +admin_email=E-mail +install_gogs=Gogs をインストール +test_git_failed='Git' コマンドテストに失敗: %v +sqlite3_not_available=このリリース バージョンは SQLite3 をサポートしていません。gobuild バージョンではない、公式のバイナリ バージョンを %s からダウンロードしてください。 +invalid_db_setting=データベースの設定が正しくありません: %v +invalid_repo_path=リポジトリのルート パスが無効です: %v +run_user_not_match=実行ユーザーは、現在のユーザーではない: %s-> %s +save_config_failed=構成の保存に失敗した: %v +invalid_admin_setting=管理者アカウントの設定が無効です: %v +install_success=ようこそ!我々はあなたが Gogs を選んでくれて嬉しいです!楽しみましょう! + +[home] +uname_holder=ユーザー名またはEメール +password_holder=パスワード +switch_dashboard_context=ダッシュ ボードのコンテキストを切替 +my_repos=私のリポジトリ +collaborative_repos=共同リポジトリ +my_orgs=私の組織 +my_mirrors=私のミラー + +[explore] +repos=リポジトリ + +[auth] +create_new_account=新規アカウントを作成 +register_hepler_msg=すでにアカウントをお持ちですか?今すぐログイン ! +social_register_hepler_msg=すでにアカウントをお持ちですか?今すぐバインド ! +disable_register_prompt=申し訳ありませんが、登録が無効になっています。サイト管理者に問い合わせてください。 +disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。 +remember_me=ログイン状態を保持する +forgot_password=パスワードを忘れた +forget_password=パスワードを忘れた? +sign_up_now=アカウントが必要ですか?今すぐサインアップ +confirmation_mail_sent_prompt=新しい確認メールを %s に送りました。登録を完了させるために、%d時間以内にあなたのメールボックスを確認してください。 +sign_in_email=E-mailでサイイン +active_your_account=アカウントをアクティブ +resent_limit_prompt=申し訳ありませんが、アクティベーションメールは頻繁に送信しています。3 分お待ちください。 +has_unconfirmed_mail=こんにちは %s さん、あなたの電子メール アドレス (%s) は未確認です。もし確認メールをまだ確認できていないか、改めて再送信する場合は、下のボタンをクリックしてください。 +resend_mail=アクティベーションメールを再送信するにはここをクリック +email_not_associate=この電子メール アドレスは、アカウントには関連付けられません。 +send_reset_mail=パスワードリセットのメールを再送するにはここをクリック +reset_password=パスワードリセット +invalid_code=申し訳ありませんが、確認用コードが期限切れまたは無効です。 +reset_password_helper=パスワードをリセットするにはここをクリック +password_too_short=6文字未満のパスワードは設定できません。 + +[form] +UserName=ユーザ名 +RepoName=リポジトリ名 +Email=Eメールアドレス +Password=パスワード +Retype=パスワードを再入力 +SSHTitle=SSH キーの名前 +HttpsUrl=HTTPS URL +PayloadUrl=ペイロードの URL +TeamName=チーム名 +AuthName=承認名 +AdminEmail=管理者の電子メール + +require_error=空にできません +alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります +alpha_dash_dot_error=' アルファベット、数値、ダッシュ(-)、アンダースコア(_) 、ドット(.)のいずれかを入力する必要があります。 ' +min_size_error=' 少なくとも %s 文字の必要があります ' +max_size_error=' %s 文字以下の必要があります ' +email_error=' は有効な電子メール アドレスではない ' +url_error=' は有効な URL はありません。 ' +unknown_error=不明なエラー: +captcha_incorrect=Captcha が一致しませんでした。 +password_not_match=パスワードと確認用パスワードが一致同していません。 + +username_been_taken=ユーザー名は既に使用されています。 +repo_name_been_taken=リポジトリ名は既に使用されています。 +org_name_been_taken=組織名は既に使用されています。 +team_name_been_taken=チーム名は既に使用されています。 +email_been_used=電子メール アドレスは既に使用されています。 +ssh_key_been_used=パブリック キー名が使用されています。 +illegal_username=あなたのユーザ名に無効な文字が含まれます。 +illegal_repo_name=リポジトリ名には無効な文字が含まれています。 +illegal_org_name=組織名に無効な文字が含まれています。 +illegal_team_name=チーム名に無効な文字が含まれています。 +username_password_incorrect=ユーザー名またはパスワードが正しくありません。 +enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。 +enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。 +enterred_invalid_password=入力したパスワードが正しいかを確認してください。 +user_not_exist=指定されたユーザーは存在しません。 +last_org_owner=削除するユーザーはチームの最後のメンバーです。別の所有者設定が必要です。 + +invalid_ssh_key=SSHを確認できません:%s +unable_verify_ssh_key=GogsはあなたのSSH keyを確認できません。しかし、我々は有効とみなしますので、自分自身で確認してください。 +auth_failed=認証に失敗しました: %v + +still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。 +still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。 +org_still_own_repo=この組織はまだリポジトリの所有しています、リポジトリを削除または転送する必要があります。 + +still_own_user=この認証はまだ一部のユーザーによって使用されています。一部のユーザを移動させてから、もう一度削除してください。 + +target_branch_not_exist=ターゲットブランチが存在しない + +[user] +change_avatar=gravatar.com で自分のアバターを変更 +change_custom_avatar=設定で自分のアバターを変更 +join_on=参加しました +repositories=リポジトリ +activity=パブリック・アクティビティ +followers=フォロワー +starred=スター +following=フォロー + +[settings] +profile=プロフィール +password=パスワード +ssh_keys=SSH キー +social=SNSアカウント +applications=アプリケーション +orgs=組織 +delete=アカウントを削除 +uid=Uid + +public_profile=パブリック プロフィール +profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。 +full_name=フルネーム +website=WEBサイト +location=ロケーション +update_profile=プロファイル更新 +update_profile_success=あなたのプロフィールが更新されました。 +change_username=ユーザー名が変更されました +change_username_desc=ユーザー名が変更されている、継続したいですか?これはあなたのアカウントに関連するすべてのリンクに影響を与える。 +continue=続行 +cancel=キャンセル + +enable_custom_avatar=カスタムのアバターを有効にする +enable_custom_avatar_helper=Gravatarからのフェッチを無効にするのを、有効にします +choose_new_avatar=新しいアバターを選択 +update_avatar=アバターの設定を更新 +uploaded_avatar_not_a_image=アップロードされたファイルは画像ではない。 +no_custom_avatar_available=利用可能なカスタム アバターがないため、有効にできません。 +update_avatar_success=あなたのアバターの設定が更新されました。 + +change_password=パスワードを変更 +old_password=現在のパスワード +new_password=新しいパスワード +password_incorrect=現在のパスワードが正しくありません。 +change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワード経由でサインインすることができます。 + +emails=E-mail アドレス +manage_emails=E-mail アドレスを管理 +email_desc=あなたのプライマリメールアドレスは、通知やその他の操作に使用されます。 +primary=プライマリー +primary_email=プライマリに設定 +delete_email=削除 +add_new_email=新しいe-mailアドレスを追加 +add_email=電子メールを追加します。 +add_email_success=新しいe-mail アドレスが追加されました。 + +manage_ssh_keys=SSH キーを管理 +add_key=キーを追加 +ssh_desc=これはあなたのアカウントに関連付けられている SSH キーの一覧です。あなたが認識していないキーを削除します。 +ssh_helper=ヘルプが必要ですか? 我々のガイドをご覧ください。 SSH キーを生成 SSH の一般的な問題 +add_new_key=SSH キーを追加 +key_name=キーの名前 +key_content=コンテンツ +add_key_success=新しい SSH キーが追加されました ! +delete_key=削除 +add_on=追加された +last_used=最終使用日 +no_activity=最近の活動なし + +manage_social=関連付けられているSNSアカウントを管理 +social_desc=これは関連付けられたソーシャルアカウントのリストです。あなたが認識していない結び付けを削除します。 +unbind=バインド解除 +unbind_success=SNSアカウントがバインドされていない。 + +manage_access_token=個人のアクセス トークンを管理 +generate_new_token=新しいトークンを生成 +tokens_desc=生成したトークンを利用して Gogs の API にアクセスすることができます。 +new_token_desc=今のところ、全てのトークンはあなたのアカウントにフルアクセスできます。 +token_name=トークン名 +generate_token=トークンを生成 +generate_token_succees=新しいアクセス トークンは正常に生成されました !今すぐあなたの新しいアクセス トークンをコピーしておいてください。二度と見ることはできませんので確認してください! +delete_token=削除 +delete_token_success=個人のアクセス トークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。 + +delete_account=アカウントを削除 +delete_prompt=この操作はあなたのアカウントを完全に削除し、復旧できない ! +confirm_delete_account=削除の確認 +delete_account_title=アカウントの削除 +delete_account_desc=このアカウントは永久に削除しようとしている、継続しますか? + +[repo] +owner=オーナー +repo_name=リポジトリ名 +repo_name_helper=偉大なリポジトリ名は短い。思い出に残り、そして一意だ。 +visibility=ビジビリティ +visiblity_helper=このリポジトリは プライベート です。 +fork_repo=フォークのリポジトリ +fork_from=フォーク元 +fork_visiblity_helper=フォークされたリポジトリは可視状態を変更できません +repo_desc=説明 +repo_lang=言語 +repo_lang_helper=.gitignore ファイルを選択 +license=ライセンス +license_helper=ライセンス ファイルを選択 +init_readme=README.md 付きでリポジトリを初期化 +create_repo=リポジトリを作成 +default_branch=デフォルトのブランチ +mirror_interval=ミラー 間隔(時) +goget_meta=Go-Get Meta +goget_meta_helper=このリポジトリは Go-Getable になります + +need_auth=認証が必要 +migrate_type=マイグレーションの種類 +migrate_type_helper=このリポジトリは ミラー になります +migrate_repo=リポジトリを移行 + +copy_link=コピー +click_to_copy=クリップボードにコピー +copied=コピー成功 +clone_helper=クローニングのヘルプが必要ですか? ヘルプ を参照してください! +unwatch=Unwatch +watch=Watch +unstar=Unstar +star=Star +fork=Fork + +no_desc=説明なし +quick_guide=クイック ガイド +clone_this_repo=このリポジトリのクローンを作成 +create_new_repo_command=コマンドラインで新しいリポジトリを作成します。 +push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ + +branch=ブランチ +tree=ツリー +branch_and_tags=ブランチ& タグ +branches=ブランチ +tags=タグ +issues=課題 +commits=コミット +releases=リリース +file_raw=生データ +file_history=履歴 +file_view_raw=生データを見る + +commits.commits=コミット +commits.search=コミットの検索 +commits.find=検索 +commits.author=作者 +commits.message=メッセージ +commits.date=日付 +commits.older=古い +commits.newer=新しい + +settings=設定 +settings.options=オプション +settings.collaboration=コラボレーション +settings.hooks=Webhooks +settings.githooks=Git のフック +settings.deploy_keys=デプロイキー +settings.basic_settings=基本設定 +settings.danger_zone=危険地帯 +settings.site=公式サイト +settings.update_settings=設定の更新 +settings.change_reponame=リポジトリ名が変更されました +settings.change_reponame_desc=リポジトリの名前が変更されています、継続しますか?このリポジトリ関連すべてのリンクに影響を与えます。 +settings.transfer=オーナー移転 +settings.transfer_desc=リポジトリをあなたが管理者権限を持っている別のユーザーまた組織に移譲します。 +settings.new_owner_has_same_repo=新しいオーナーは、既に同じ名前のリポジトリを持っています。 +settings.delete=このリポジトリを削除 +settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。 +settings.transfer_notices=

    - You will lose access if new owner is a individual user.

    - You will remain access if new owner is an organization and you're one of the owners.

    +settings.update_settings_success=リポジトリ オプションが更新されました。 +settings.transfer_owner=新しいオーナー +settings.make_transfer=Make Transfer +settings.transfer_succeed=リポジトリの所有権は正常に転送されました。 +settings.confirm_delete=削除の確認 +settings.add_collaborator=新しい共同編集者を追加 +settings.add_collaborator_success=新しい共同編集者が追加されました。 +settings.remove_collaborator_success=共同編集者が削除されました。 +settings.user_is_org_member=ユーザーは組織の一員なので、共同編集者として追加することはできません。 +settings.add_webhook=Webhook を追加 +settings.hooks_desc=Webhooksは、Gogsで特定のイベントの発生時に指定された外部サービスに通知を許可します。イベントが発生すると、それぞれ指定されたUrlに、POSTリクエストが送られます。詳細はこちらのの Webhooks ガイドをご覧ください。 +settings.githooks_desc=Git のフックは Git 自体によって提供されています。以下のリストのファイルを編集して、サポートされているフックのカスタム操作を適用することができます。 +settings.githook_edit_desc=もしフックがアクティブではない場合は、サンプルコンテンツが表示されます。コンテンツを空白にするにはこのフックを無効にします。 +settings.githook_name=フックの名前 +settings.githook_content=コンテンツをフック +settings.update_githook=フックを更新 +settings.remove_hook_success=Webhookが削除されました。 +settings.add_webhook_desc=We’ll send a POST request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, x-www-form-urlencoded, etc). More information can be found in Webhooks Guide. +settings.payload_url=ペイロードの URL +settings.content_type=コンテンツ タイプ +settings.secret=秘密 +settings.event_desc=Which events would you like to trigger this webhook? +settings.event_push_only=Just the push event. +settings.active=アクティブ +settings.active_helper=We will deliver event details when this hook is triggered. +settings.add_hook_success=新しい webhook が追加されました。 +settings.update_webhook=Webhookを更新 +settings.update_hook_success=Webhook を更新しました。 +settings.delete_webhook=Webhook を削除 +settings.recent_deliveries=最近のデリバリー +settings.hook_type=フックタイプ +settings.add_slack_hook_desc=Add Slack integration to your repository. +settings.slack_token=トークン +settings.slack_domain=ドメイン +settings.slack_channel=チャンネル + +diff.browse_source=ソースを参照 +diff.parent=親 +diff.commit=コミット +diff.data_not_available=差分データは利用できません。 +diff.show_diff_stats=差分情報を表示 +diff.stats_desc= %d changed files with %d additions and %d deletions +diff.bin=BIN +diff.view_file=ファイルの表示 + +release.releases=リリース +release.new_release=新しいリリース +release.draft=ドラフト +release.prerelease=プレリリース +release.stable=安定 +release.edit=編集 +release.ahead=%d commits to %s since this release +release.source_code=ソース コード +release.tag_name=タグ名 +release.target=ターゲット +release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。 +release.release_title=リリース タイトル +release.content_with_md=Content with Markdown +release.write=書込み +release.preview=プレビュー +release.content_placeholder=コンテンツを書く +release.loading=読み込み中… +release.prerelease_desc=これはリリース前のものです +release.prerelease_helper=We’ll point out that this release is identified as non-production ready. +release.publish=リリースを発行 +release.save_draft=下書きを保存 +release.edit_release=リリースを編集 +release.tag_name_already_exist=このタグ名には既にリリースが存在します。 + +[org] +org_name_holder=組織名 +org_name_helper=Great organization names are short and memorable. +org_email_helper=Organization's E-mail receives all notifications and confirmations. +create_org=組織を作成 +repo_updated=更新した +people=人々 +invite_someone=誰かを招待 +teams=チーム +lower_members=メンバー +lower_repositories=リポジトリ +create_new_team=新しいチームを作成 +org_desc=説明 +team_name=チーム名 +team_desc=説明 +team_name_helper=会話の時、この名前を使用しチーム名を表明します。 +team_desc_helper=このチームに関する全ての情報は? +team_permission_desc=このチームに必要な権限レベルは? + +settings=設定 +settings.options=オプション +settings.full_name=フルネーム +settings.website=WEBサイト +settings.location=ロケーション +settings.update_settings=設定の更新 +settings.change_orgname=組織名が変更されました +settings.change_orgname_desc=組織名が変更されています、継続しますか?これはすべての関連リンクに影響を与えます。 +settings.update_setting_success=組織の設定が更新されました。 +settings.delete=組織を削除 +settings.delete_account=この組織を削除 +settings.delete_prompt=The operation will delete this organization permanently, and CANNOT be undone! +settings.confirm_delete_account=削除の確認 +settings.delete_org_title=組織の削除 +settings.delete_org_desc=This organization is going to be deleted permanently, do you want to continue? +settings.hooks_desc=Add webhooks that will be triggered for all repositories under this organization. + +members.public=パブリック +members.public_helper=プライベートにする +members.private=プライベート +members.private_helper=公開する +members.owner=オーナー +members.member=メンバー +members.conceal=隠す +members.remove=削除 +members.leave=退出 +members.invite_desc=Start typing a username to invite a new member to %s: +members.invite_now=今すぐ招待 + +teams.join=参加 +teams.leave=退出 +teams.read_access=読み取りアクセス権 +teams.read_access_helper=このチームはリポジトリの閲覧とクローンをすることができます。 +teams.write_access=書き込みアクセス権 +teams.write_access_helper=This team will be able to read its repositories, as well as push to them. +teams.admin_access=管理者のアクセス権 +teams.admin_access_helper=This team will be able to push/pull to its repositories, as well as add other collaborators to them. +teams.no_desc=このチームは説明がありません。 +teams.settings=設定 +teams.owners_permission_desc=オーナーはすべてのリポジトリ へのフルアクセス権、組織の 管理権限を持ちます。 +teams.members=チーム メンバー +teams.update_settings=設定の更新 +teams.delete_team=このチームを削除 +teams.add_team_member=チーム メンバーを追加 +teams.delete_team_title=チームの削除 +teams.delete_team_desc=このチームを削除します、継続しますか?このチームのメンバーはいくつかのリポジトリへのアクセスを失う可能性があります。 +teams.delete_team_success=指定のチームが正常に削除されました。 +teams.read_permission_desc=This team grants Read access: members can view and clone the team's repositories. +teams.write_permission_desc=This team grants Write access: members can read from and push to the team's repositories. +teams.admin_permission_desc=This team grants Admin access: members can read from, push to, and add collaborators to the team's repositories. +teams.repositories=チームのリポジトリ +teams.add_team_repository=チームのリポジトリを追加 +teams.remove_repo=削除(Remove) +teams.add_nonexistent_repo=The repository you're trying to add does not exist, please create it first. + +[admin] +dashboard=ダッシュボード +users=ユーザ +organizations=組織 +repositories=リポジトリ +authentication=認証 +config=コンフィギュレーション +notices=システム通知 +monitor=モニタリング +prev=前へ +next=次へ + +dashboard.statistic=統計 +dashboard.operations=操作 +dashboard.system_status=システム モニターのステータス +dashboard.statistic_info=Gogs database has %d users, %d organizations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. +dashboard.operation_name=操作の名前 +dashboard.operation_switch=スイッチ +dashboard.operation_run=実行 +dashboard.clean_unbind_oauth=結び付けられていない OAuth をクリーン +dashboard.clean_unbind_oauth_success=結び付けられていない全ての OAuth を正常に削除しました。 +dashboard.delete_inactivate_accounts=非アクティブのアカウントをすべて削除 +dashboard.delete_inactivate_accounts_success=すべての非アクティブアカウントは正常に削除されました。 +dashboard.delete_repo_archives=リポジトリのすべてのアーカイブを削除 +dashboard.delete_repo_archives_success=リポジトリのすべてのアーカイブが正常に削除されました。 +dashboard.git_gc_repos=リポジトリでのガベージコレクションを実行します。 +dashboard.git_gc_repos_success=All repositories have done garbage collection successfully. +dashboard.server_uptime=サーバーの稼働時間 +dashboard.current_goroutine=現在のGoroutine +dashboard.current_memory_usage=現在のメモリ使用量 +dashboard.total_memory_allocated=割り当てられたメモリの合計 +dashboard.memory_obtained=Memory Obtained +dashboard.pointer_lookup_times=ポインタ参照回数 +dashboard.memory_allocate_times=メモリ割当回数 +dashboard.memory_free_times=メモリ解放回数 +dashboard.current_heap_usage=現在のヒープ使用量 +dashboard.heap_memory_obtained=Heap Memory Obtained +dashboard.heap_memory_idle=Heap Memory Idle +dashboard.heap_memory_in_use=使用中のヒープ メモリ +dashboard.heap_memory_released=ヒープ メモリが解放されました +dashboard.heap_objects=ヒープ オブジェクト +dashboard.bootstrap_stack_usage=ブートストラップスタック使用量 +dashboard.stack_memory_obtained=Stack Memory Obtained +dashboard.mspan_structures_usage=MSpan Structures Usage +dashboard.mspan_structures_obtained=MSpan Structures Obtained +dashboard.mcache_structures_usage=MCache Structures Usage +dashboard.mcache_structures_obtained=MCache Structures Obtained +dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained +dashboard.gc_metadata_obtained=GC Metadada Obtained +dashboard.other_system_allocation_obtained=Other System Allocation Obtained +dashboard.next_gc_recycle=Next GC Recycle +dashboard.last_gc_time=Since Last GC Time +dashboard.total_gc_time=Total GC Pause +dashboard.total_gc_pause=Total GC Pause +dashboard.last_gc_pause=Last GC Pause +dashboard.gc_times=GC実行回数 + +users.user_manage_panel=ユーザー管理パネル +users.new_account=新規アカウントを作成 +users.name=名前 +users.activated=アクティブ化 +users.admin=アドミン +users.repos=リポジトリ +users.created=作成されました +users.edit=編集 +users.auth_source=認証元 +users.local=ローカル +users.auth_login_name=認証ログイン名 +users.update_profile_success=アカウントのプロファイルが更新されました。 +users.edit_account=アカウントの編集 +users.is_activated=アカウントがアクティブされました +users.is_admin=このアカウントには管理者の権限を持つ +users.allow_git_hook=このアカウントには Git のフックを作成する権限を持つ +users.update_profile=アカウント ・ プロファイルを更新 +users.delete_account=このアカウントを削除 +users.still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。 +users.still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。 + +orgs.org_manage_panel=組織の管理パネル +orgs.name=名前 +orgs.teams=チーム +orgs.members=メンバー + +repos.repo_manage_panel=リポジトリの管理パネル +repos.owner=オーナー +repos.name=名前 +repos.private=プライベート +repos.watches=Watches +repos.stars=Stars +repos.issues=課題 + +auths.auth_manage_panel=承認の管理パネル +auths.new=新しい認証元を追加 +auths.name=名前 +auths.type=タイプ +auths.enabled=Enabled +auths.updated=Updated +auths.auth_type=認証の種類 +auths.auth_name=認証名 +auths.domain=ドメイン +auths.host=ホスト +auths.port=ポート +auths.base_dn=ベースのドメイン名 +auths.attributes=属性検索 +auths.filter=検索フィルター +auths.ms_ad_sa=Ms Ad SA +auths.smtp_auth=SMTP 認証の種類 +auths.smtphost=SMTP ホスト +auths.smtpport=SMTP ポート +auths.enable_tls=TLS 暗号化を有効にする +auths.enable_auto_register=自動登録を有効にする +auths.tips=ヒント +auths.edit=認証設定を編集 +auths.activated=認証がアクティブされました +auths.update_success=認証の設定が正常に更新されました。 +auths.update=認証設定の更新 +auths.delete=この権限を削除 +auths.delete_auth_title=認証の削除 +auths.delete_auth_desc=認証を削除します、継続しますか? + +config.server_config=サーバーの構成 +config.app_name=アプリケーション名 +config.app_ver=アプリケーションのバージョン +config.app_url=アプリケーションの URL +config.domain=ドメイン +config.offline_mode=オフラインモード +config.disable_router_log=ルーターのログを無効にする +config.run_user=実行ユーザ +config.run_mode=実行モード +config.repo_root_path=リポジトリのルートパス +config.static_file_root_path=静的ファイルのルートパス +config.log_file_root_path=ログ ファイルのルート パス +config.script_type=スクリプトの種類 +config.reverse_auth_user=Reverse Authentication User +config.db_config=データベースの構成 +config.db_type=タイプ +config.db_host=ホスト +config.db_name=名前 +config.db_user=ユーザ +config.db_ssl_mode=SSL モード +config.db_ssl_mode_helper=(「postgres」のみ) +config.db_path=パス +config.db_path_helper=(「sqlite3」のみ) +config.service_config=サービスの構成 +config.register_email_confirm=電子メールの確認を必要 +config.disable_register=登録を無効にする +config.require_sign_in_view=Require Sign In View +config.mail_notify=メール通知 +config.enable_cache_avatar=アバターのキャッシュを有効にします。 +config.active_code_lives=Active Code Lives +config.reset_password_code_lives=Reset Password Code Lives +config.webhook_config=Webhook設定 +config.task_interval=タスクの間隔 +config.deliver_timeout=Deliver Timeout +config.mailer_config=メーラーの構成 +config.mailer_enabled=有効にした +config.mailer_name=名前 +config.mailer_host=ホスト +config.mailer_user=ユーザ +config.oauth_config=OAuth 構成 +config.oauth_enabled=Enabled +config.cache_config=キャッシュの構成 +config.cache_adapter=キャッシュ アダプター +config.cache_interval=キャッシュ間隔 +config.cache_conn=Cache Connection +config.session_config=セッションの構成 +config.session_provider=セッション プロバイダー +config.provider_config=プロバイダーの構成 +config.cookie_name=クッキー名 +config.enable_set_cookie=クッキーの設定を有効にする +config.gc_interval_time=GC 間隔 +config.session_life_time=セッションのライフタイム +config.https_only=HTTPS のみ +config.cookie_life_time=クッキーのライフタイム +config.picture_config=画像構成 +config.picture_service=画像サービス +config.disable_gravatar=グラバターを無効にする +config.log_config=ログの構成 +config.log_mode=ログ モード + +monitor.cron=Cron タスク +monitor.name=名前 +monitor.schedule=スケジュール +monitor.next=次回 +monitor.previous=前回 +monitor.execute_times=実行回数 +monitor.process=実行中のプロセス +monitor.desc=説明 +monitor.start=開始日時 +monitor.execute_time=実行時間: + +notices.system_notice_list=システム通知 +notices.type=タイプ +notices.type_1=リポジトリ +notices.desc=説明 +notices.op=Op。 +notices.delete_success=System notice has been deleted successfully. + +[action] +create_repo=created repository %s +commit_repo=pushed to %s at %s +create_issue=問題 %s #%s を開きました +comment_issue=問題 %s #%s のコメント +transfer_repo=リポジトリ %s%s へ転送しました +push_tag=%s に タグ %s をプッシュしました +compare_2_commits=これら 2 のコミットの比較を閲覧する + +[tool] +ago=前 +from_now=今から +now=今 +1s=1 秒 %s +1m=1 分 %s +1h=1 時間 %s +1d=1 日 %s +1w=1 週間 %s +1mon=1 ヶ月 %s +1y=1 年間 %s +seconds=%d 秒 %s +minutes=%d 分の %s +hours=%d 時間 %s +days=%d 日 %s +weeks=%d 週間 %s +months=%d ヶ月 %s +years=%d 年 %s +raw_seconds=秒 +raw_minutes=分 + + + + + + + + + + + + + + From 4c4488213ad8dbc5fd9a971feb46223b5ef719e5 Mon Sep 17 00:00:00 2001 From: Tristan Storch Date: Sun, 1 Feb 2015 20:30:22 +0100 Subject: [PATCH 17/37] correction: updated docker link --- templates/home.tmpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/home.tmpl b/templates/home.tmpl index 02f2a3bad..8603f26f4 100644 --- a/templates/home.tmpl +++ b/templates/home.tmpl @@ -28,7 +28,7 @@
    Einfach zu installieren -

    Starte einfach die Anwendung für deine Plattform. Gogs gibt es auch für Docker, Vagrant oder als Installationspaket.

    +

    Starte einfach die Anwendung für deine Plattform. Gogs gibt es auch für Docker, Vagrant oder als Installationspaket.

    @@ -49,7 +49,7 @@
    易安装 -

    您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。

    +

    您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。

    @@ -70,7 +70,7 @@
    Easy to install -

    Simply run the binary for your platform. Or ship Gogs with Docker or Vagrant, or get it packaged.

    +

    Simply run the binary for your platform. Or ship Gogs with Docker or Vagrant, or get it packaged.

    From 89ea3e1acce645460980a639b440c6a139f8e10a Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 14:39:58 -0500 Subject: [PATCH 18/37] routers: save partial config when install --- cmd/web.go | 4 ++-- routers/install.go | 52 ++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/cmd/web.go b/cmd/web.go index e6fb2925c..8e75e8bec 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -77,13 +77,13 @@ func checkVersion() { // Check dependency version. checkers := []VerChecker{ - {"github.com/Unknwon/macaron", macaron.Version, "0.5.0"}, + {"github.com/Unknwon/macaron", macaron.Version, "0.5.1"}, {"github.com/macaron-contrib/binding", binding.Version, "0.0.4"}, {"github.com/macaron-contrib/cache", cache.Version, "0.0.7"}, {"github.com/macaron-contrib/csrf", csrf.Version, "0.0.1"}, {"github.com/macaron-contrib/i18n", i18n.Version, "0.0.5"}, {"github.com/macaron-contrib/session", session.Version, "0.1.6"}, - {"gopkg.in/ini.v1", ini.Version, "1.0.1"}, + {"gopkg.in/ini.v1", ini.Version, "1.2.0"}, } for _, c := range checkers { ver := strings.Join(strings.Split(c.Version(), ".")[:3], ".") diff --git a/routers/install.go b/routers/install.go index 58e6cf664..9c3f134d4 100644 --- a/routers/install.go +++ b/routers/install.go @@ -14,6 +14,7 @@ import ( "github.com/Unknwon/com" "github.com/Unknwon/macaron" "github.com/go-xorm/xorm" + "gopkg.in/ini.v1" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" @@ -186,41 +187,42 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { } // Save settings. - setting.Cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type) - setting.Cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host) - setting.Cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name) - setting.Cfg.Section("database").Key("USER").SetValue(models.DbCfg.User) - setting.Cfg.Section("database").Key("PASSWD").SetValue(models.DbCfg.Passwd) - setting.Cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SSLMode) - setting.Cfg.Section("database").Key("PATH").SetValue(models.DbCfg.Path) - - setting.Cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath) - setting.Cfg.Section("").Key("RUN_USER").SetValue(form.RunUser) - setting.Cfg.Section("server").Key("DOMAIN").SetValue(form.Domain) - setting.Cfg.Section("server").Key("HTTP_PORT").SetValue(form.HTTPPort) - setting.Cfg.Section("server").Key("ROOT_URL").SetValue(form.AppUrl) + cfg := ini.Empty() + cfg.Section("database").Key("DB_TYPE").SetValue(models.DbCfg.Type) + cfg.Section("database").Key("HOST").SetValue(models.DbCfg.Host) + cfg.Section("database").Key("NAME").SetValue(models.DbCfg.Name) + cfg.Section("database").Key("USER").SetValue(models.DbCfg.User) + cfg.Section("database").Key("PASSWD").SetValue(models.DbCfg.Passwd) + cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SSLMode) + cfg.Section("database").Key("PATH").SetValue(models.DbCfg.Path) + + cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath) + cfg.Section("").Key("RUN_USER").SetValue(form.RunUser) + cfg.Section("server").Key("DOMAIN").SetValue(form.Domain) + cfg.Section("server").Key("HTTP_PORT").SetValue(form.HTTPPort) + cfg.Section("server").Key("ROOT_URL").SetValue(form.AppUrl) if len(strings.TrimSpace(form.SMTPHost)) > 0 { - setting.Cfg.Section("mailer").Key("ENABLED").SetValue("true") - setting.Cfg.Section("mailer").Key("HOST").SetValue(form.SMTPHost) - setting.Cfg.Section("mailer").Key("USER").SetValue(form.SMTPEmail) - setting.Cfg.Section("mailer").Key("PASSWD").SetValue(form.SMTPPasswd) + cfg.Section("mailer").Key("ENABLED").SetValue("true") + cfg.Section("mailer").Key("HOST").SetValue(form.SMTPHost) + cfg.Section("mailer").Key("USER").SetValue(form.SMTPEmail) + cfg.Section("mailer").Key("PASSWD").SetValue(form.SMTPPasswd) - setting.Cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm == "on")) - setting.Cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify == "on")) + cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm == "on")) + cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify == "on")) } - setting.Cfg.Section("").Key("RUN_MODE").SetValue("prod") + cfg.Section("").Key("RUN_MODE").SetValue("prod") - setting.Cfg.Section("session").Key("PROVIDER").SetValue("file") + cfg.Section("session").Key("PROVIDER").SetValue("file") - setting.Cfg.Section("log").Key("MODE").SetValue("file") + cfg.Section("log").Key("MODE").SetValue("file") - setting.Cfg.Section("security").Key("INSTALL_LOCK").SetValue("true") - setting.Cfg.Section("security").Key("SECRET_KEY").SetValue(base.GetRandomString(15)) + cfg.Section("security").Key("INSTALL_LOCK").SetValue("true") + cfg.Section("security").Key("SECRET_KEY").SetValue(base.GetRandomString(15)) os.MkdirAll("custom/conf", os.ModePerm) - if err := setting.Cfg.SaveTo(path.Join(setting.CustomPath, "conf/app.ini")); err != nil { + if err := cfg.SaveTo(path.Join(setting.CustomPath, "conf/app.ini")); err != nil { ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), INSTALL, &form) return } From b8425ccbece9f10973e9454566de29001e81d534 Mon Sep 17 00:00:00 2001 From: Miguel de la Cruz Date: Sun, 1 Feb 2015 22:47:58 +0100 Subject: [PATCH 19/37] Add Miguel de la Cruz as a translator --- conf/locale/TRANSLATORS | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/locale/TRANSLATORS b/conf/locale/TRANSLATORS index c848b05e3..5dac72418 100644 --- a/conf/locale/TRANSLATORS +++ b/conf/locale/TRANSLATORS @@ -5,3 +5,4 @@ Christoph Kisfeld Thomas Fanninger Łukasz Jan Niemier Lafriks +Miguel de la Cruz From 0a2068d7fbd447de1135d3b16e9f26de5dd18d56 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 1 Feb 2015 17:21:56 -0500 Subject: [PATCH 20/37] models: code fix on #818 --- cmd/fix.go | 2 +- conf/locale/locale_en-US.ini | 4 +-- models/publickey.go | 52 +++++++++++++++++++++++------------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cmd/fix.go b/cmd/fix.go index 5122ff32c..eff85d628 100644 --- a/cmd/fix.go +++ b/cmd/fix.go @@ -164,7 +164,7 @@ func runFixLocation(ctx *cli.Context) { fmt.Scanln() // Fix in authorized_keys file. - sshPath := path.Join(models.SshPath, "authorized_keys") + sshPath := path.Join(models.SSHPath, "authorized_keys") if com.IsFile(sshPath) { fmt.Printf("Fixing pathes in file: %s\n", sshPath) if err := rewriteAuthorizedKeys(sshPath, oldPath, execPath); err != nil { diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index c0979d1bd..660fb253b 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -514,8 +514,8 @@ dashboard.delete_repo_archives = Delete all repositories archives dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully. dashboard.git_gc_repos = Do garbage collection on repositories dashboard.git_gc_repos_success = All repositories have done garbage collection successfully. -dashboard.resync_all_sshkeys = Do resync .ssh/autorized_key file -dashboard.resync_all_sshkeys_success = All keys are synced again. +dashboard.resync_all_sshkeys = Rewrite '.ssh/autorized_key' file(caution: non-Gogs keys will be lost) +dashboard.resync_all_sshkeys_success = All public keys have been rewritten successfully. dashboard.server_uptime = Server Uptime dashboard.current_goroutine = Current Goroutines dashboard.current_memory_usage = Current Memory Usage diff --git a/models/publickey.go b/models/publickey.go index 41233d0c3..67ab4242f 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -33,7 +33,7 @@ const ( ) var ( - ErrKeyAlreadyExist = errors.New("Public key already exist") + ErrKeyAlreadyExist = errors.New("Public key already exists") ErrKeyNotExist = errors.New("Public key does not exist") ErrKeyUnableVerify = errors.New("Unable to verify public key") ) @@ -41,7 +41,7 @@ var ( var sshOpLocker = sync.Mutex{} var ( - SshPath string // SSH directory. + SSHPath string // SSH directory. appPath string // Execution(binary) path. ) @@ -72,9 +72,9 @@ func init() { appPath = strings.Replace(appPath, "\\", "/", -1) // Determine and create .ssh path. - SshPath = filepath.Join(homeDir(), ".ssh") - if err = os.MkdirAll(SshPath, 0700); err != nil { - log.Fatal(4, "fail to create SshPath(%s): %v\n", SshPath, err) + SSHPath = filepath.Join(homeDir(), ".ssh") + if err = os.MkdirAll(SSHPath, 0700); err != nil { + log.Fatal(4, "fail to create '%s': %v", SSHPath, err) } } @@ -248,12 +248,13 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error { sshOpLocker.Lock() defer sshOpLocker.Unlock() - fpath := filepath.Join(SshPath, "authorized_keys") + fpath := filepath.Join(SSHPath, "authorized_keys") f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return err } defer f.Close() + finfo, err := f.Stat() if err != nil { return err @@ -270,8 +271,7 @@ func saveAuthorizedKeyFile(keys ...*PublicKey) error { } for _, key := range keys { - _, err = f.WriteString(key.GetAuthorizedString()) - if err != nil { + if _, err = f.WriteString(key.GetAuthorizedString()); err != nil { return err } } @@ -418,8 +418,8 @@ func DeletePublicKey(key *PublicKey) error { return err } - fpath := filepath.Join(SshPath, "authorized_keys") - tmpPath := filepath.Join(SshPath, "authorized_keys.tmp") + fpath := filepath.Join(SSHPath, "authorized_keys") + tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp") if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil { return err } else if err = os.Remove(fpath); err != nil { @@ -428,20 +428,36 @@ func DeletePublicKey(key *PublicKey) error { return os.Rename(tmpPath, fpath) } -// RewriteAllPublicKeys remove any authorized key and re-write all key from database again +// RewriteAllPublicKeys removes any authorized key and rewrite all keys from database again. func RewriteAllPublicKeys() error { - keys := make([]*PublicKey, 0, 5) - err := x.Find(&keys) + sshOpLocker.Lock() + defer sshOpLocker.Unlock() + + tmpPath := filepath.Join(SSHPath, "authorized_keys.tmp") + f, err := os.Create(tmpPath) if err != nil { return err } + defer os.Remove(tmpPath) - fpath := filepath.Join(SshPath, "authorized_keys") - if _, err := os.Stat(fpath); os.IsNotExist(err) { - return saveAuthorizedKeyFile(keys...) + err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { + _, err = f.WriteString((bean.(*PublicKey)).GetAuthorizedString()) + return err + }) + f.Close() + if err != nil { + return err } - if err := os.Remove(fpath); err != nil { + + fpath := filepath.Join(SSHPath, "authorized_keys") + if com.IsExist(fpath) { + if err = os.Remove(fpath); err != nil { + return err + } + } + if err = os.Rename(tmpPath, fpath); err != nil { return err } - return saveAuthorizedKeyFile(keys...) + + return nil } From 956c59b282a4d3f9e2bf92742d89b2e1cc28f6cd Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 2 Feb 2015 07:33:24 -0500 Subject: [PATCH 21/37] conf/locale: update Japanese locale --- conf/locale/locale_ja-JP.ini | 68 ++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/conf/locale/locale_ja-JP.ini b/conf/locale/locale_ja-JP.ini index 04df692ae..d2355a7cd 100755 --- a/conf/locale/locale_ja-JP.ini +++ b/conf/locale/locale_ja-JP.ini @@ -341,7 +341,7 @@ settings.transfer_desc=リポジトリをあなたが管理者権限を持って settings.new_owner_has_same_repo=新しいオーナーは、既に同じ名前のリポジトリを持っています。 settings.delete=このリポジトリを削除 settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。 -settings.transfer_notices=

    - You will lose access if new owner is a individual user.

    - You will remain access if new owner is an organization and you're one of the owners.

    +settings.transfer_notices=

    -新オーナーは個人ユーザの場合、あなたはにアクセスできなくなります。

    -新オーナーは組織であり、かつあなたが組織のオーナーに所属する場合、あなたはアクセス権を維持します。

    settings.update_settings_success=リポジトリ オプションが更新されました。 settings.transfer_owner=新しいオーナー settings.make_transfer=Make Transfer @@ -363,8 +363,8 @@ settings.add_webhook_desc=We’ll send a POST request to the URL be settings.payload_url=ペイロードの URL settings.content_type=コンテンツ タイプ settings.secret=秘密 -settings.event_desc=Which events would you like to trigger this webhook? -settings.event_push_only=Just the push event. +settings.event_desc=どのイベントをこのWEBフックのトリガーにしますか? +settings.event_push_only=push イベントのみ settings.active=アクティブ settings.active_helper=We will deliver event details when this hook is triggered. settings.add_hook_success=新しい webhook が追加されました。 @@ -373,7 +373,7 @@ settings.update_hook_success=Webhook を更新しました。 settings.delete_webhook=Webhook を削除 settings.recent_deliveries=最近のデリバリー settings.hook_type=フックタイプ -settings.add_slack_hook_desc=Add Slack integration to your repository. +settings.add_slack_hook_desc= Slack インテグレーションをリポジトリに追加します。 settings.slack_token=トークン settings.slack_domain=ドメイン settings.slack_channel=チャンネル @@ -383,7 +383,7 @@ diff.parent=親 diff.commit=コミット diff.data_not_available=差分データは利用できません。 diff.show_diff_stats=差分情報を表示 -diff.stats_desc= %d changed files with %d additions and %d deletions +diff.stats_desc=共有%d 個のファイルを変更した%d 個の追加%d 個の削除を含む diff.bin=BIN diff.view_file=ファイルの表示 @@ -399,7 +399,7 @@ release.tag_name=タグ名 release.target=ターゲット release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。 release.release_title=リリース タイトル -release.content_with_md=Content with Markdown +release.content_with_md= Markdown コンテンツ release.write=書込み release.preview=プレビュー release.content_placeholder=コンテンツを書く @@ -413,8 +413,8 @@ release.tag_name_already_exist=このタグ名には既にリリースが存在 [org] org_name_holder=組織名 -org_name_helper=Great organization names are short and memorable. -org_email_helper=Organization's E-mail receives all notifications and confirmations. +org_name_helper=偉大な組織の名は短く覚えやすいです。 +org_email_helper=組織の電子メールはすべての通知や確認を受け取ります。 create_org=組織を作成 repo_updated=更新した people=人々 @@ -441,10 +441,10 @@ settings.change_orgname_desc=組織名が変更されています、継続しま settings.update_setting_success=組織の設定が更新されました。 settings.delete=組織を削除 settings.delete_account=この組織を削除 -settings.delete_prompt=The operation will delete this organization permanently, and CANNOT be undone! +settings.delete_prompt=操作はこの組織を完全に削除し、復旧できない! settings.confirm_delete_account=削除の確認 settings.delete_org_title=組織の削除 -settings.delete_org_desc=This organization is going to be deleted permanently, do you want to continue? +settings.delete_org_desc=この組織は完全に削除されます、継続しますか? settings.hooks_desc=Add webhooks that will be triggered for all repositories under this organization. members.public=パブリック @@ -456,7 +456,7 @@ members.member=メンバー members.conceal=隠す members.remove=削除 members.leave=退出 -members.invite_desc=Start typing a username to invite a new member to %s: +members.invite_desc=%s に招待する新しいメンバーをユーザ名を入力してください: members.invite_now=今すぐ招待 teams.join=参加 @@ -464,9 +464,9 @@ teams.leave=退出 teams.read_access=読み取りアクセス権 teams.read_access_helper=このチームはリポジトリの閲覧とクローンをすることができます。 teams.write_access=書き込みアクセス権 -teams.write_access_helper=This team will be able to read its repositories, as well as push to them. +teams.write_access_helper=このチームはリポジトリを読むだけではなく、プッシュすることもできます。 teams.admin_access=管理者のアクセス権 -teams.admin_access_helper=This team will be able to push/pull to its repositories, as well as add other collaborators to them. +teams.admin_access_helper=このチームはリポジトリにプッシュ/プル、及び他の共同編集者を追加することができます。 teams.no_desc=このチームは説明がありません。 teams.settings=設定 teams.owners_permission_desc=オーナーはすべてのリポジトリ へのフルアクセス権、組織の 管理権限を持ちます。 @@ -477,9 +477,9 @@ teams.add_team_member=チーム メンバーを追加 teams.delete_team_title=チームの削除 teams.delete_team_desc=このチームを削除します、継続しますか?このチームのメンバーはいくつかのリポジトリへのアクセスを失う可能性があります。 teams.delete_team_success=指定のチームが正常に削除されました。 -teams.read_permission_desc=This team grants Read access: members can view and clone the team's repositories. -teams.write_permission_desc=This team grants Write access: members can read from and push to the team's repositories. -teams.admin_permission_desc=This team grants Admin access: members can read from, push to, and add collaborators to the team's repositories. +teams.read_permission_desc=このチームは読み取り権限を持ち: メンバーはリポジトリの表示及びクローンの作成ができます。 +teams.write_permission_desc=このチームは書き込み権限を持ち: メンバーはリポジトリの表示及リポジトリへのプッシュができます。 +teams.admin_permission_desc=このチームは管理者の権限を持ち: メンバーはチームのリポジトリに対して、読み取り、プッシュや共同編集者の追加ができます。 teams.repositories=チームのリポジトリ teams.add_team_repository=チームのリポジトリを追加 teams.remove_repo=削除(Remove) @@ -511,35 +511,35 @@ dashboard.delete_inactivate_accounts_success=すべての非アクティブア dashboard.delete_repo_archives=リポジトリのすべてのアーカイブを削除 dashboard.delete_repo_archives_success=リポジトリのすべてのアーカイブが正常に削除されました。 dashboard.git_gc_repos=リポジトリでのガベージコレクションを実行します。 -dashboard.git_gc_repos_success=All repositories have done garbage collection successfully. +dashboard.git_gc_repos_success=すべてのリポジトリは正常にガベージ コレクションを行いました。 dashboard.server_uptime=サーバーの稼働時間 dashboard.current_goroutine=現在のGoroutine dashboard.current_memory_usage=現在のメモリ使用量 dashboard.total_memory_allocated=割り当てられたメモリの合計 -dashboard.memory_obtained=Memory Obtained +dashboard.memory_obtained=配分されたメモリ量 dashboard.pointer_lookup_times=ポインタ参照回数 dashboard.memory_allocate_times=メモリ割当回数 dashboard.memory_free_times=メモリ解放回数 dashboard.current_heap_usage=現在のヒープ使用量 -dashboard.heap_memory_obtained=Heap Memory Obtained -dashboard.heap_memory_idle=Heap Memory Idle +dashboard.heap_memory_obtained=配分されたヒープ メモリ量 +dashboard.heap_memory_idle=アイドルのヒープ メモリ量 dashboard.heap_memory_in_use=使用中のヒープ メモリ dashboard.heap_memory_released=ヒープ メモリが解放されました dashboard.heap_objects=ヒープ オブジェクト dashboard.bootstrap_stack_usage=ブートストラップスタック使用量 -dashboard.stack_memory_obtained=Stack Memory Obtained -dashboard.mspan_structures_usage=MSpan Structures Usage -dashboard.mspan_structures_obtained=MSpan Structures Obtained -dashboard.mcache_structures_usage=MCache Structures Usage -dashboard.mcache_structures_obtained=MCache Structures Obtained +dashboard.stack_memory_obtained=配分されたスタック メモリ量 +dashboard.mspan_structures_usage=MSpan 構造体の使用量 +dashboard.mspan_structures_obtained=配分されたMSpan 構造体 +dashboard.mcache_structures_usage=MCache 構造体の使用量 +dashboard.mcache_structures_obtained=分配されたMCache 構造体 dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained dashboard.gc_metadata_obtained=GC Metadada Obtained dashboard.other_system_allocation_obtained=Other System Allocation Obtained -dashboard.next_gc_recycle=Next GC Recycle -dashboard.last_gc_time=Since Last GC Time -dashboard.total_gc_time=Total GC Pause -dashboard.total_gc_pause=Total GC Pause -dashboard.last_gc_pause=Last GC Pause +dashboard.next_gc_recycle=次回のGCリサイクル +dashboard.last_gc_time=前回GCからの時間 +dashboard.total_gc_time=GC一時停止の合計 +dashboard.total_gc_pause=GC一時停止の合計 +dashboard.last_gc_pause=直近のGC一時停止 dashboard.gc_times=GC実行回数 users.user_manage_panel=ユーザー管理パネル @@ -649,7 +649,7 @@ config.oauth_enabled=Enabled config.cache_config=キャッシュの構成 config.cache_adapter=キャッシュ アダプター config.cache_interval=キャッシュ間隔 -config.cache_conn=Cache Connection +config.cache_conn=キャッシュ接続 config.session_config=セッションの構成 config.session_provider=セッション プロバイダー config.provider_config=プロバイダーの構成 @@ -681,11 +681,11 @@ notices.type=タイプ notices.type_1=リポジトリ notices.desc=説明 notices.op=Op。 -notices.delete_success=System notice has been deleted successfully. +notices.delete_success=システム通知が正常に削除されました。 [action] -create_repo=created repository %s -commit_repo=pushed to %s at %s +create_repo=リポジトリ %sを作成しました +commit_repo=%s%sにプッシュしました create_issue=問題 %s #%s を開きました comment_issue=問題 %s #%s のコメント transfer_repo=リポジトリ %s%s へ転送しました From 57291d1e2a3190562c169f8c69e3bc65725ee4f4 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 2 Feb 2015 09:44:51 -0500 Subject: [PATCH 22/37] conf/locale: update Japanese locale --- conf/locale/TRANSLATORS | 3 ++- conf/locale/locale_ja-JP.ini | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/conf/locale/TRANSLATORS b/conf/locale/TRANSLATORS index 5dac72418..6c72f3342 100644 --- a/conf/locale/TRANSLATORS +++ b/conf/locale/TRANSLATORS @@ -1,8 +1,9 @@ # This file lists all PUBLIC individuals having contributed content to the translation. # Order of name is meaningless. +Akihiro YAGASAKI Christoph Kisfeld Thomas Fanninger Łukasz Jan Niemier Lafriks -Miguel de la Cruz +Miguel de la Cruz \ No newline at end of file diff --git a/conf/locale/locale_ja-JP.ini b/conf/locale/locale_ja-JP.ini index d2355a7cd..1d1d61493 100755 --- a/conf/locale/locale_ja-JP.ini +++ b/conf/locale/locale_ja-JP.ini @@ -60,7 +60,7 @@ run_user_helper=ユーザーはリポジトリ ルートパスへのアクセス domain=ドメイン domain_helper=これはSSHクローンURLに影響する。 app_url=アプリケーションの URL -app_url_helper=This affects HTTP/HTTPS clone URL and somewhere in e-mail. +app_url_helper=この設定は、HTTP / HTTPSのクローンURLおよび、一部のメールボックスへのリンクに影響を与えます。 email_title=E-mailサービス設定(Optional) smtp_host=SMTP ホスト mailer_user=送信者の電子メール @@ -279,7 +279,7 @@ init_readme=README.md 付きでリポジトリを初期化 create_repo=リポジトリを作成 default_branch=デフォルトのブランチ mirror_interval=ミラー 間隔(時) -goget_meta=Go-Get Meta +goget_meta=Go-Get メタ goget_meta_helper=このリポジトリは Go-Getable になります need_auth=認証が必要 @@ -344,7 +344,7 @@ settings.delete_desc=リポジトリを削除すると元に戻せません。 settings.transfer_notices=

    -新オーナーは個人ユーザの場合、あなたはにアクセスできなくなります。

    -新オーナーは組織であり、かつあなたが組織のオーナーに所属する場合、あなたはアクセス権を維持します。

    settings.update_settings_success=リポジトリ オプションが更新されました。 settings.transfer_owner=新しいオーナー -settings.make_transfer=Make Transfer +settings.make_transfer=転送 settings.transfer_succeed=リポジトリの所有権は正常に転送されました。 settings.confirm_delete=削除の確認 settings.add_collaborator=新しい共同編集者を追加 @@ -359,14 +359,14 @@ settings.githook_name=フックの名前 settings.githook_content=コンテンツをフック settings.update_githook=フックを更新 settings.remove_hook_success=Webhookが削除されました。 -settings.add_webhook_desc=We’ll send a POST request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, x-www-form-urlencoded, etc). More information can be found in Webhooks Guide. +settings.add_webhook_desc=私たちは、指定されたURLに購読されたイベントの詳細を POSTリクエストとして送信します。あなたは、異なるデータ受信モード(JSONまたは, x-www-form-urlencoded, その他) を設定することができます。詳細については、Webhookガイドを参照してください。 settings.payload_url=ペイロードの URL settings.content_type=コンテンツ タイプ settings.secret=秘密 settings.event_desc=どのイベントをこのWEBフックのトリガーにしますか? settings.event_push_only=push イベントのみ settings.active=アクティブ -settings.active_helper=We will deliver event details when this hook is triggered. +settings.active_helper=このフックのトリガーが引かれた時に、イベントの詳細を配信します。 settings.add_hook_success=新しい webhook が追加されました。 settings.update_webhook=Webhookを更新 settings.update_hook_success=Webhook を更新しました。 @@ -393,7 +393,7 @@ release.draft=ドラフト release.prerelease=プレリリース release.stable=安定 release.edit=編集 -release.ahead=%d commits to %s since this release +release.ahead=このリリース以降 %s へ %d コミット release.source_code=ソース コード release.tag_name=タグ名 release.target=ターゲット @@ -405,7 +405,7 @@ release.preview=プレビュー release.content_placeholder=コンテンツを書く release.loading=読み込み中… release.prerelease_desc=これはリリース前のものです -release.prerelease_helper=We’ll point out that this release is identified as non-production ready. +release.prerelease_helper=このリリースは非プロダクション利用として識別します。 release.publish=リリースを発行 release.save_draft=下書きを保存 release.edit_release=リリースを編集 @@ -445,7 +445,7 @@ settings.delete_prompt=操作はこの組織を完全に削除し、復旧all repositories under this organization. +settings.hooks_desc=この組織のもとで すべてのリポジトリ に対してトリガーされる webhook を追加します。 members.public=パブリック members.public_helper=プライベートにする @@ -483,7 +483,7 @@ teams.admin_permission_desc=このチームは管理者の権 teams.repositories=チームのリポジトリ teams.add_team_repository=チームのリポジトリを追加 teams.remove_repo=削除(Remove) -teams.add_nonexistent_repo=The repository you're trying to add does not exist, please create it first. +teams.add_nonexistent_repo=追加しようとしているリポジトリは存在しません。まずはじめに作成してください。 [admin] dashboard=ダッシュボード @@ -500,7 +500,7 @@ next=次へ dashboard.statistic=統計 dashboard.operations=操作 dashboard.system_status=システム モニターのステータス -dashboard.statistic_info=Gogs database has %d users, %d organizations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. +dashboard.statistic_info=Gogs データベースは %d ユーザ, %d 組織, %d 公開鍵, %d リポジトリ, %d ウォッチ, %d スター, %d 行動, %d アクセス, %d 問題, %d コメント, %d ソーシャルアカウント, %d フォロー, %d ミラー, %d リリース, %d ログイン元, %d webhook, %d マイルストーン, %d ラベル, %d フックタスク, %d チーム, %d アップデートタスク, %d 添付ファイル の情報を持っています。 dashboard.operation_name=操作の名前 dashboard.operation_switch=スイッチ dashboard.operation_run=実行 @@ -532,9 +532,9 @@ dashboard.mspan_structures_usage=MSpan 構造体の使用量 dashboard.mspan_structures_obtained=配分されたMSpan 構造体 dashboard.mcache_structures_usage=MCache 構造体の使用量 dashboard.mcache_structures_obtained=分配されたMCache 構造体 -dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained -dashboard.gc_metadata_obtained=GC Metadada Obtained -dashboard.other_system_allocation_obtained=Other System Allocation Obtained +dashboard.profiling_bucket_hash_table_obtained=ハッシュテーブル分析に割り当てられたメモリ +dashboard.gc_metadata_obtained=GCメタデータ取得 +dashboard.other_system_allocation_obtained=他のシステムに割り当てられたメモリ dashboard.next_gc_recycle=次回のGCリサイクル dashboard.last_gc_time=前回GCからの時間 dashboard.total_gc_time=GC一時停止の合計 @@ -618,7 +618,7 @@ config.repo_root_path=リポジトリのルートパス config.static_file_root_path=静的ファイルのルートパス config.log_file_root_path=ログ ファイルのルート パス config.script_type=スクリプトの種類 -config.reverse_auth_user=Reverse Authentication User +config.reverse_auth_user=リバース認証ユーザ config.db_config=データベースの構成 config.db_type=タイプ config.db_host=ホスト @@ -631,14 +631,14 @@ config.db_path_helper=(「sqlite3」のみ) config.service_config=サービスの構成 config.register_email_confirm=電子メールの確認を必要 config.disable_register=登録を無効にする -config.require_sign_in_view=Require Sign In View +config.require_sign_in_view=サインインを要求 config.mail_notify=メール通知 config.enable_cache_avatar=アバターのキャッシュを有効にします。 -config.active_code_lives=Active Code Lives -config.reset_password_code_lives=Reset Password Code Lives +config.active_code_lives=コードリンクの有効期限をアクティブ +config.reset_password_code_lives=パスワードリンクの有効期限をリセット config.webhook_config=Webhook設定 config.task_interval=タスクの間隔 -config.deliver_timeout=Deliver Timeout +config.deliver_timeout=送信タイムアウト config.mailer_config=メーラーの構成 config.mailer_enabled=有効にした config.mailer_name=名前 From 5c4b85c0290adce70b9c58ed151e30081151a57c Mon Sep 17 00:00:00 2001 From: Etienne Bruines Date: Mon, 2 Feb 2015 16:34:07 +0100 Subject: [PATCH 23/37] Referencing issues from commit messages is now possible. Code-wise: the fixing-part of the code now doesn't reference the issue any more, because this is done by the referencing-part of the code, which is called just before. Fixes #462, #668, #732. --- models/action.go | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/models/action.go b/models/action.go index de2cdd12c..318a5f6ad 100644 --- a/models/action.go +++ b/models/action.go @@ -41,12 +41,14 @@ var ( var ( // Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages - IssueKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} - IssueKeywordsPat *regexp.Regexp + IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} + IssueCloseKeywordsPat *regexp.Regexp + IssueReferenceKeywordsPat *regexp.Regexp ) func init() { - IssueKeywordsPat = regexp.MustCompile(fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(IssueKeywords, "|"))) + IssueCloseKeywordsPat = regexp.MustCompile(fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(IssueCloseKeywords, "|"))) + IssueReferenceKeywordsPat = regexp.MustCompile(fmt.Sprintf(`(?i)(?:) \S+`)) } // Action represents user operation type and other information to repository., @@ -110,13 +112,13 @@ func (a Action) GetIssueInfos() []string { func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, commits []*base.PushCommit) error { for _, c := range commits { - refs := IssueKeywordsPat.FindAllString(c.Message, -1) - - for _, ref := range refs { + references := IssueReferenceKeywordsPat.FindAllString(c.Message, -1) + + for _, ref := range references { ref := ref[strings.IndexByte(ref, byte(' '))+1:] ref = strings.TrimRightFunc(ref, func(c rune) bool { - return !unicode.IsDigit(c) - }) + return !unicode.IsDigit(c) + }) if len(ref) == 0 { continue @@ -144,6 +146,35 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMIT, message, nil); err != nil { return err } + } + + closes := IssueCloseKeywordsPat.FindAllString(c.Message, -1) + + for _, ref := range closes { + ref := ref[strings.IndexByte(ref, byte(' '))+1:] + ref = strings.TrimRightFunc(ref, func(c rune) bool { + return !unicode.IsDigit(c) + }) + + if len(ref) == 0 { + continue + } + + // Add repo name if missing + if ref[0] == '#' { + ref = fmt.Sprintf("%s/%s%s", repoUserName, repoName, ref) + } else if strings.Contains(ref, "/") == false { + // We don't support User#ID syntax yet + // return ErrNotImplemented + + continue + } + + issue, err := GetIssueByRef(ref) + + if err != nil { + return err + } if issue.RepoId == repoId { if issue.IsClosed { @@ -168,6 +199,7 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com } } } + } return nil From bfce0def25bab777d9287136c60e6e30e9f18591 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 2 Feb 2015 23:04:36 -0500 Subject: [PATCH 24/37] modules/base: fix README filename checker, fix #877 --- gogs.go | 2 +- modules/base/markdown.go | 8 +++++++- templates/.VERSION | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/gogs.go b/gogs.go index 423d30190..1f0f15b8b 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.12.0201 Beta" +const APP_VER = "0.5.12.0202 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/base/markdown.go b/modules/base/markdown.go index c7369ab9f..d3f3e5fea 100644 --- a/modules/base/markdown.go +++ b/modules/base/markdown.go @@ -63,12 +63,18 @@ func IsImageFile(data []byte) (string, bool) { return contentType, false } +// IsReadmeFile returns true if given file name suppose to be a README file. func IsReadmeFile(name string) bool { name = strings.ToLower(name) if len(name) < 6 { return false + } else if len(name) == 6 { + if name == "readme" { + return true + } + return false } - if name[:6] == "readme" { + if name[:7] == "readme." { return true } return false diff --git a/templates/.VERSION b/templates/.VERSION index 6e3c63ed8..aa8ee543a 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.12.0201 Beta \ No newline at end of file +0.5.12.0202 Beta \ No newline at end of file From 4de0b19cece439dceb285c56dde1e5ce2f67b098 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 2 Feb 2015 23:42:53 -0500 Subject: [PATCH 25/37] models: mirro code fix for #821 --- models/repo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/repo.go b/models/repo.go index 16b51c47e..b74582175 100644 --- a/models/repo.go +++ b/models/repo.go @@ -504,9 +504,9 @@ func initRepository(f string, u *User, repo *Repository, initReadme bool, repoLa } if len(fileName) == 0 { - // re-fetch the repository from database before updating it (else it would + // Re-fetch the repository from database before updating it (else it would // override changes that were done earlier with sql) - if _, err := x.Get(repo); err != nil { + if repo, err = GetRepositoryById(repo.Id); err != nil { return err } repo.IsBare = true From e43bd15b968523ec86dba143b9634397f2d8bc40 Mon Sep 17 00:00:00 2001 From: Alexey Makhov Date: Tue, 3 Feb 2015 10:32:55 +0300 Subject: [PATCH 26/37] fix settings/email html&css --- public/ng/css/gogs.css | 5 ++++- templates/user/settings/email.tmpl | 16 +++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 12ae89ed4..653b4dc93 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -1761,6 +1761,7 @@ The register and sign-in page style #org-setting-form, #repo-setting-form, #user-profile-form, +#add-email-form, .repo-setting-form { background-color: #FFF; padding: 30px 0; @@ -1789,6 +1790,7 @@ The register and sign-in page style #org-setting-form .ipt, #repo-setting-form .ipt, #user-profile-form .ipt, +#add-email-form .ipt, .repo-setting-form .ipt { width: 360px; } @@ -1819,7 +1821,7 @@ The register and sign-in page style #repo-hooks-panel .setting-list, #repo-hooks-history-panel .setting-list, #user-social-panel .setting-list, -#user-applications-panel .setting-list, +#user-applications-panel .setting-list, #user-ssh-panel .setting-list { background-color: #FFF; } @@ -1827,6 +1829,7 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list li, #user-social-panel .setting-list li, #user-applications-panel .setting-list li, +#user-email-panel .setting-list li, #user-ssh-panel .setting-list li { padding: 8px 20px; border-bottom: 1px solid #eaeaea; diff --git a/templates/user/settings/email.tmpl b/templates/user/settings/email.tmpl index fc8bcbbcf..c5dfbeb7e 100644 --- a/templates/user/settings/email.tmpl +++ b/templates/user/settings/email.tmpl @@ -36,19 +36,21 @@ {{end}} {{end}} -
    - {{.CsrfTokenHtml}} -

    {{.i18n.Tr "settings.add_new_email"}}

    -

    + +

    + {{.i18n.Tr "settings.add_new_email"}} +
    + + {{.CsrfTokenHtml}} +

    - +

    -
    - +
    From 32fb5ea5d08d6e3d53e898a5b5b75f3b5401d1ef Mon Sep 17 00:00:00 2001 From: Alexey Makhov Date: Tue, 3 Feb 2015 11:05:13 +0300 Subject: [PATCH 27/37] fix settings/email html&css in less --- public/ng/css/gogs.css | 5 +---- public/ng/less/gogs/settings.less | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 653b4dc93..12ae89ed4 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -1761,7 +1761,6 @@ The register and sign-in page style #org-setting-form, #repo-setting-form, #user-profile-form, -#add-email-form, .repo-setting-form { background-color: #FFF; padding: 30px 0; @@ -1790,7 +1789,6 @@ The register and sign-in page style #org-setting-form .ipt, #repo-setting-form .ipt, #user-profile-form .ipt, -#add-email-form .ipt, .repo-setting-form .ipt { width: 360px; } @@ -1821,7 +1819,7 @@ The register and sign-in page style #repo-hooks-panel .setting-list, #repo-hooks-history-panel .setting-list, #user-social-panel .setting-list, -#user-applications-panel .setting-list, +#user-applications-panel .setting-list, #user-ssh-panel .setting-list { background-color: #FFF; } @@ -1829,7 +1827,6 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list li, #user-social-panel .setting-list li, #user-applications-panel .setting-list li, -#user-email-panel .setting-list li, #user-ssh-panel .setting-list li { padding: 8px 20px; border-bottom: 1px solid #eaeaea; diff --git a/public/ng/less/gogs/settings.less b/public/ng/less/gogs/settings.less index de923daba..981645445 100644 --- a/public/ng/less/gogs/settings.less +++ b/public/ng/less/gogs/settings.less @@ -35,6 +35,7 @@ #org-setting-form, #repo-setting-form, #user-profile-form, +#add-email-form, .repo-setting-form { background-color: #FFF; padding: 30px 0; @@ -69,6 +70,7 @@ #repo-hooks-history-panel, #user-social-panel, #user-applications-panel, +#user-email-panel, #user-ssh-panel { margin-bottom: 20px; .setting-list { From 8e238058b22adba7cb9e02c5911d45f281a52ee2 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Tue, 3 Feb 2015 06:54:29 -0500 Subject: [PATCH 28/37] public/ng/css: code fix on #895 - templates/user/settings: fix email panel nav highlight --- public/ng/css/gogs.css | 19 +++++++++++++++++++ templates/user/settings/email.tmpl | 2 +- templates/user/settings/nav.tmpl | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 12ae89ed4..bc54d653c 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -1761,6 +1761,7 @@ The register and sign-in page style #org-setting-form, #repo-setting-form, #user-profile-form, +#add-email-form, .repo-setting-form { background-color: #FFF; padding: 30px 0; @@ -1769,6 +1770,7 @@ The register and sign-in page style #org-setting-form textarea, #repo-setting-form textarea, #user-profile-form textarea, +#add-email-form textarea, .repo-setting-form textarea { margin-left: 4px; height: 100px; @@ -1777,11 +1779,13 @@ The register and sign-in page style #org-setting-form label, #repo-setting-form label, #user-profile-form label, +#add-email-form label, .repo-setting-form label, #auth-setting-form .form-label, #org-setting-form .form-label, #repo-setting-form .form-label, #user-profile-form .form-label, +#add-email-form .form-label, .repo-setting-form .form-label { width: 240px; } @@ -1789,6 +1793,7 @@ The register and sign-in page style #org-setting-form .ipt, #repo-setting-form .ipt, #user-profile-form .ipt, +#add-email-form .ipt, .repo-setting-form .ipt { width: 360px; } @@ -1796,6 +1801,7 @@ The register and sign-in page style #org-setting-form .field, #repo-setting-form .field, #user-profile-form .field, +#add-email-form .field, .repo-setting-form .field { margin-bottom: 24px; } @@ -1813,6 +1819,7 @@ The register and sign-in page style #repo-hooks-history-panel, #user-social-panel, #user-applications-panel, +#user-email-panel, #user-ssh-panel { margin-bottom: 20px; } @@ -1820,6 +1827,7 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list, #user-social-panel .setting-list, #user-applications-panel .setting-list, +#user-email-panel .setting-list, #user-ssh-panel .setting-list { background-color: #FFF; } @@ -1827,6 +1835,7 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list li, #user-social-panel .setting-list li, #user-applications-panel .setting-list li, +#user-email-panel .setting-list li, #user-ssh-panel .setting-list li { padding: 8px 20px; border-bottom: 1px solid #eaeaea; @@ -1835,6 +1844,7 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list li.ssh:hover, #user-social-panel .setting-list li.ssh:hover, #user-applications-panel .setting-list li.ssh:hover, +#user-email-panel .setting-list li.ssh:hover, #user-ssh-panel .setting-list li.ssh:hover { background-color: #ffffEE; } @@ -1842,6 +1852,7 @@ The register and sign-in page style #repo-hooks-history-panel .setting-list li i, #user-social-panel .setting-list li i, #user-applications-panel .setting-list li i, +#user-email-panel .setting-list li i, #user-ssh-panel .setting-list li i { padding-right: 5px; } @@ -1849,6 +1860,7 @@ The register and sign-in page style #repo-hooks-history-panel .active-icon, #user-social-panel .active-icon, #user-applications-panel .active-icon, +#user-email-panel .active-icon, #user-ssh-panel .active-icon { width: 10px; height: 10px; @@ -1861,6 +1873,7 @@ The register and sign-in page style #repo-hooks-history-panel .ssh-content, #user-social-panel .ssh-content, #user-applications-panel .ssh-content, +#user-email-panel .ssh-content, #user-ssh-panel .ssh-content { margin-left: 24px; } @@ -1868,6 +1881,7 @@ The register and sign-in page style #repo-hooks-history-panel .ssh-content .octicon, #user-social-panel .ssh-content .octicon, #user-applications-panel .ssh-content .octicon, +#user-email-panel .ssh-content .octicon, #user-ssh-panel .ssh-content .octicon { margin-right: 4px; } @@ -1875,16 +1889,19 @@ The register and sign-in page style #repo-hooks-history-panel .ssh-content .print, #user-social-panel .ssh-content .print, #user-applications-panel .ssh-content .print, +#user-email-panel .ssh-content .print, #user-ssh-panel .ssh-content .print, #repo-hooks-panel .ssh-content .access, #repo-hooks-history-panel .ssh-content .access, #user-social-panel .ssh-content .access, #user-applications-panel .ssh-content .access, +#user-email-panel .ssh-content .access, #user-ssh-panel .ssh-content .access, #repo-hooks-panel .ssh-content .activity, #repo-hooks-history-panel .ssh-content .activity, #user-social-panel .ssh-content .activity, #user-applications-panel .ssh-content .activity, +#user-email-panel .ssh-content .activity, #user-ssh-panel .ssh-content .activity { color: #888; } @@ -1892,6 +1909,7 @@ The register and sign-in page style #repo-hooks-history-panel .ssh-content .access, #user-social-panel .ssh-content .access, #user-applications-panel .ssh-content .access, +#user-email-panel .ssh-content .access, #user-ssh-panel .ssh-content .access { max-width: 500px; } @@ -1899,6 +1917,7 @@ The register and sign-in page style #repo-hooks-history-panel .ssh-btn, #user-social-panel .ssh-btn, #user-applications-panel .ssh-btn, +#user-email-panel .ssh-btn, #user-ssh-panel .ssh-btn { margin-top: 6px; } diff --git a/templates/user/settings/email.tmpl b/templates/user/settings/email.tmpl index c5dfbeb7e..c99e6a041 100644 --- a/templates/user/settings/email.tmpl +++ b/templates/user/settings/email.tmpl @@ -48,7 +48,7 @@

    - +

    diff --git a/templates/user/settings/nav.tmpl b/templates/user/settings/nav.tmpl index 780f1218a..d8003c8ba 100644 --- a/templates/user/settings/nav.tmpl +++ b/templates/user/settings/nav.tmpl @@ -4,7 +4,7 @@