Merge branch 'master' into feat/approval-new

This commit is contained in:
Jonas Franz 2018-05-31 11:45:19 +02:00
commit c79e5a1f53
No known key found for this signature in database
GPG Key ID: 506AEEBE80BEDECD
17 changed files with 150 additions and 41 deletions

View File

@ -69,9 +69,9 @@ and keep the compatibility on upgrade. To make sure you are
running the test suite exactly like we do, you should install running the test suite exactly like we do, you should install
the CLI for [Drone CI](https://github.com/drone/drone), as the CLI for [Drone CI](https://github.com/drone/drone), as
we are using the server for continous testing, following [these we are using the server for continous testing, following [these
instructions](http://readme.drone.io/usage/getting-started-cli). After that, instructions](http://docs.drone.io/cli-installation/). After that,
you can simply call `drone exec` within your working directory and it will try you can simply call `drone exec --local --build-event "pull_request"` within
to run the test suite locally. your working directory and it will try to run the test suite locally.
## Vendoring ## Vendoring
@ -114,7 +114,7 @@ pull request workflow to do that. And, we also use [LGTM](http://lgtm.co)
to ensure every PR is reviewed by at least 2 maintainers. to ensure every PR is reviewed by at least 2 maintainers.
Please try to make your pull request easy to review for us. And, please read Please try to make your pull request easy to review for us. And, please read
the *[How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/devel/pull-requests.md#best-practices-for-faster-reviews)* guide; the *[How to get faster PR reviews](https://github.com/kubernetes/community/blob/261cb0fd089b64002c91e8eddceebf032462ccd6/contributors/guide/pull-requests.md#best-practices-for-faster-reviews)* guide;
it has lots of useful tips for any project you may want to contribute. it has lots of useful tips for any project you may want to contribute.
Some of the key points: Some of the key points:

2
Gopkg.lock generated
View File

@ -5,7 +5,7 @@
branch = "master" branch = "master"
name = "code.gitea.io/git" name = "code.gitea.io/git"
packages = ["."] packages = ["."]
revision = "0077debc17a58c821f4e62e815a54c1ab52da157" revision = "31f4b8e8c805438ac6d8914b38accb1d8aaf695e"
[[projects]] [[projects]]
branch = "master" branch = "master"

View File

@ -268,7 +268,7 @@ func runServ(c *cli.Context) error {
claims := jwt.MapClaims{ claims := jwt.MapClaims{
"repo": repo.ID, "repo": repo.ID,
"op": lfsVerb, "op": lfsVerb,
"exp": now.Add(5 * time.Minute).Unix(), "exp": now.Add(setting.LFS.HTTPAuthExpiry).Unix(),
"nbf": now.Unix(), "nbf": now.Unix(),
} }
if user != nil { if user != nil {

View File

@ -189,6 +189,8 @@ LFS_START_SERVER = false
LFS_CONTENT_PATH = data/lfs LFS_CONTENT_PATH = data/lfs
; LFS authentication secret, change this yourself ; LFS authentication secret, change this yourself
LFS_JWT_SECRET = LFS_JWT_SECRET =
; LFS authentication validity period (in time.Duration), pushes taking longer than this may fail.
LFS_HTTP_AUTH_EXPIRY = 20m
; Define allowed algorithms and their minimum key length (use -1 to disable a type) ; Define allowed algorithms and their minimum key length (use -1 to disable a type)
[ssh.minimum_key_sizes] [ssh.minimum_key_sizes]
@ -412,7 +414,7 @@ ENABLE_FEDERATED_AVATAR = false
[attachment] [attachment]
; Whether attachments are enabled. Defaults to `true` ; Whether attachments are enabled. Defaults to `true`
ENABLE = true ENABLED = true
; Path for attachments. Defaults to `data/attachments` ; Path for attachments. Defaults to `data/attachments`
PATH = data/attachments PATH = data/attachments
; One or more allowed types, e.g. image/jpeg|image/png ; One or more allowed types, e.g. image/jpeg|image/png

View File

@ -115,6 +115,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
- `LFS_START_SERVER`: **false**: Enables git-lfs support. - `LFS_START_SERVER`: **false**: Enables git-lfs support.
- `LFS_CONTENT_PATH`: **./data/lfs**: Where to store LFS files. - `LFS_CONTENT_PATH`: **./data/lfs**: Where to store LFS files.
- `LFS_JWT_SECRET`: **\<empty\>**: LFS authentication secret, change this a unique string. - `LFS_JWT_SECRET`: **\<empty\>**: LFS authentication secret, change this a unique string.
- `LFS_HTTP_AUTH_EXPIRY`: **20m**: LFS authentication validity period in time.Duration, pushes taking longer than this may fail.
- `REDIRECT_OTHER_PORT`: **false**: If true and `PROTOCOL` is https, redirects http requests - `REDIRECT_OTHER_PORT`: **false**: If true and `PROTOCOL` is https, redirects http requests
on another (https) port. on another (https) port.
- `PORT_TO_REDIRECT`: **80**: Port used when `REDIRECT_OTHER_PORT` is true. - `PORT_TO_REDIRECT`: **80**: Port used when `REDIRECT_OTHER_PORT` is true.

View File

@ -136,10 +136,11 @@ var (
} }
LFS struct { LFS struct {
StartServer bool `ini:"LFS_START_SERVER"` StartServer bool `ini:"LFS_START_SERVER"`
ContentPath string `ini:"LFS_CONTENT_PATH"` ContentPath string `ini:"LFS_CONTENT_PATH"`
JWTSecretBase64 string `ini:"LFS_JWT_SECRET"` JWTSecretBase64 string `ini:"LFS_JWT_SECRET"`
JWTSecretBytes []byte `ini:"-"` JWTSecretBytes []byte `ini:"-"`
HTTPAuthExpiry time.Duration `ini:"LFS_HTTP_AUTH_EXPIRY"`
} }
// Security settings // Security settings
@ -828,6 +829,9 @@ func NewContext() {
LFS.ContentPath = filepath.Join(AppWorkPath, LFS.ContentPath) LFS.ContentPath = filepath.Join(AppWorkPath, LFS.ContentPath)
} }
sec = Cfg.Section("LFS")
LFS.HTTPAuthExpiry = sec.Key("LFS_HTTP_AUTH_EXPIRY").MustDuration(20 * time.Minute)
if LFS.StartServer { if LFS.StartServer {
if err := os.MkdirAll(LFS.ContentPath, 0700); err != nil { if err := os.MkdirAll(LFS.ContentPath, 0700); err != nil {
@ -947,7 +951,7 @@ func NewContext() {
AttachmentAllowedTypes = strings.Replace(sec.Key("ALLOWED_TYPES").MustString("image/jpeg,image/png,application/zip,application/gzip"), "|", ",", -1) AttachmentAllowedTypes = strings.Replace(sec.Key("ALLOWED_TYPES").MustString("image/jpeg,image/png,application/zip,application/gzip"), "|", ",", -1)
AttachmentMaxSize = sec.Key("MAX_SIZE").MustInt64(4) AttachmentMaxSize = sec.Key("MAX_SIZE").MustInt64(4)
AttachmentMaxFiles = sec.Key("MAX_FILES").MustInt(5) AttachmentMaxFiles = sec.Key("MAX_FILES").MustInt(5)
AttachmentEnabled = sec.Key("ENABLE").MustBool(true) AttachmentEnabled = sec.Key("ENABLED").MustBool(true)
TimeFormatKey := Cfg.Section("time").Key("FORMAT").MustString("RFC1123") TimeFormatKey := Cfg.Section("time").Key("FORMAT").MustString("RFC1123")
TimeFormat = map[string]string{ TimeFormat = map[string]string{

View File

@ -7,6 +7,7 @@ package util
import ( import (
"net/url" "net/url"
"path" "path"
"strings"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
) )
@ -56,16 +57,25 @@ func Max(a, b int) int {
// URLJoin joins url components, like path.Join, but preserving contents // URLJoin joins url components, like path.Join, but preserving contents
func URLJoin(base string, elems ...string) string { func URLJoin(base string, elems ...string) string {
u, err := url.Parse(base) if !strings.HasSuffix(base, "/") {
base += "/"
}
baseURL, err := url.Parse(base)
if err != nil { if err != nil {
log.Error(4, "URLJoin: Invalid base URL %s", base) log.Error(4, "URLJoin: Invalid base URL %s", base)
return "" return ""
} }
joinArgs := make([]string, 0, len(elems)+1) joinedPath := path.Join(elems...)
joinArgs = append(joinArgs, u.Path) argURL, err := url.Parse(joinedPath)
joinArgs = append(joinArgs, elems...) if err != nil {
u.Path = path.Join(joinArgs...) log.Error(4, "URLJoin: Invalid arg %s", joinedPath)
return u.String() return ""
}
joinedURL := baseURL.ResolveReference(argURL).String()
if !baseURL.IsAbs() && !strings.HasPrefix(base, "/") {
return joinedURL[1:] // Removing leading '/' if needed
}
return joinedURL
} }
// Min min of two ints // Min min of two ints

View File

@ -30,6 +30,14 @@ func TestURLJoin(t *testing.T) {
"a", "b/c/"), "a", "b/c/"),
newTest("a/b/d", newTest("a/b/d",
"a/", "b/c/", "/../d/"), "a/", "b/c/", "/../d/"),
newTest("https://try.gitea.io/a/b/c#d",
"https://try.gitea.io", "a/b", "c#d"),
newTest("/a/b/d",
"/a/", "b/c/", "/../d/"),
newTest("/a/b/c",
"/a", "b/c/"),
newTest("/a/b/c#hash",
"/a", "b/c#hash"),
} { } {
assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...))
} }

View File

@ -168,6 +168,7 @@ no_reply_address_helper=Domain-Namen für Benutzer mit einer versteckten Emailad
uname_holder=E-Mail-Adresse oder Benutzername uname_holder=E-Mail-Adresse oder Benutzername
password_holder=Passwort password_holder=Passwort
switch_dashboard_context=Kontext der Übersichtsseite wechseln switch_dashboard_context=Kontext der Übersichtsseite wechseln
my_repos=Repositories
show_more_repos=Zeige mehr Repositories… show_more_repos=Zeige mehr Repositories…
collaborative_repos=Gemeinschaftliche Repositories collaborative_repos=Gemeinschaftliche Repositories
my_orgs=Meine Organisationen my_orgs=Meine Organisationen
@ -462,6 +463,7 @@ then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein:
passcode_invalid=Die PIN ist falsch. Probiere es erneut. passcode_invalid=Die PIN ist falsch. Probiere es erneut.
twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird.
u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den <a href="https://fidoalliance.org/">FIDO U2F</a>-Standard unterstützen.
u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung aktivieren, um Hardware-Sicherheitsschlüssel nutzen zu können. u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung aktivieren, um Hardware-Sicherheitsschlüssel nutzen zu können.
u2f_register_key=Sicherheitsschlüssel hinzufügen u2f_register_key=Sicherheitsschlüssel hinzufügen
u2f_nickname=Nickname u2f_nickname=Nickname
@ -691,6 +693,8 @@ issues.filter_sort.recentupdate=Kürzlich aktualisiert
issues.filter_sort.leastupdate=Am Längsten nicht aktualisiert issues.filter_sort.leastupdate=Am Längsten nicht aktualisiert
issues.filter_sort.mostcomment=Am meisten kommentiert issues.filter_sort.mostcomment=Am meisten kommentiert
issues.filter_sort.leastcomment=Am wenigsten kommentiert issues.filter_sort.leastcomment=Am wenigsten kommentiert
issues.filter_sort.mostforks=Meiste Forks
issues.filter_sort.fewestforks=Wenigste Forks
issues.action_open=Öffnen issues.action_open=Öffnen
issues.action_close=Schließen issues.action_close=Schließen
issues.action_label=Label issues.action_label=Label
@ -1357,6 +1361,7 @@ repos.name=Name
repos.private=Privat repos.private=Privat
repos.watches=Beobachtungen repos.watches=Beobachtungen
repos.stars=Favoriten repos.stars=Favoriten
repos.forks=Forks
repos.issues=Issues repos.issues=Issues
repos.size=Größe repos.size=Größe

View File

@ -41,6 +41,7 @@ u2f_error_1=Произошла неизвестная ошибка. Повтор
u2f_error_2=Пожалуйста, убедитесь, что вы используете зашифрованное соединение (https://) и используете правильный URL. u2f_error_2=Пожалуйста, убедитесь, что вы используете зашифрованное соединение (https://) и используете правильный URL.
u2f_error_3=Серверу не удалось обработать ваш запрос. u2f_error_3=Серверу не удалось обработать ваш запрос.
u2f_error_4=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ еще не зарегистрирован. u2f_error_4=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ еще не зарегистрирован.
u2f_error_5=Таймаут достигнут до того, как ваш ключ был прочитан. Перезагрузите, чтобы повторить попытку.
u2f_reload=Обновить u2f_reload=Обновить
repository=Репозиторий repository=Репозиторий
@ -126,6 +127,7 @@ disable_gravatar_popup=Отключить Gravatar и сторонние ист
federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
disable_registration=Отключить самостоятельную регистрацию disable_registration=Отключить самостоятельную регистрацию
disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей.
allow_only_external_registration_popup=Включить регистрацию только через сторонние сервисы.
openid_signin=Включение входа через OpenID openid_signin=Включение входа через OpenID
openid_signin_popup=Включение входа через OpenID. openid_signin_popup=Включение входа через OpenID.
openid_signup=Включить саморегистрацию OpenID openid_signup=Включить саморегистрацию OpenID
@ -141,6 +143,7 @@ confirm_password=Подтвердить пароль
admin_email=Адрес эл. почты admin_email=Адрес эл. почты
install_btn_confirm=Установить Gitea install_btn_confirm=Установить Gitea
test_git_failed=Не удалось проверить 'git' команду: %v test_git_failed=Не удалось проверить 'git' команду: %v
sqlite3_not_available=Эта версия Gitea не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную версию из %s (не 'go build' версия).
invalid_db_setting=Недопустимые параметры настройки базы данных: %v invalid_db_setting=Недопустимые параметры настройки базы данных: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v
save_config_failed=Не удалось сохранить конфигурацию: %v save_config_failed=Не удалось сохранить конфигурацию: %v
@ -429,6 +432,7 @@ confirm_delete_account=Подтвердите удаление
[repo] [repo]
owner=Владелец owner=Владелец
repo_name=Имя репозитория repo_name=Имя репозитория
repo_name_helper=Лучшие названия репозиториев состоят их коротких, легко запоминаемых и уникальных ключевых слов.
visibility=Видимость visibility=Видимость
visiblity_helper=Сделать репозиторий приватным visiblity_helper=Сделать репозиторий приватным
visiblity_fork_helper=(Изменение этого повлияет на все форки.) visiblity_fork_helper=(Изменение этого повлияет на все форки.)
@ -539,6 +543,7 @@ editor.upload_files_to_dir=Загрузить файлы '%s'
commits.commits=Коммиты commits.commits=Коммиты
commits.find=Поиск commits.find=Поиск
commits.search_all=Все ветки
commits.author=Автор commits.author=Автор
commits.message=Сообщение commits.message=Сообщение
commits.date=Дата commits.date=Дата
@ -577,7 +582,9 @@ issues.delete_branch_at=`удалена ветка <b>%s</b> %s`
issues.open_tab=%d открыто(ы) issues.open_tab=%d открыто(ы)
issues.close_tab=%d закрыто(ы) issues.close_tab=%d закрыто(ы)
issues.filter_label=Метка issues.filter_label=Метка
issues.filter_label_no_select=Все метки
issues.filter_milestone=Этап issues.filter_milestone=Этап
issues.filter_milestone_no_select=Все этапы
issues.filter_assignee=Назначено issues.filter_assignee=Назначено
issues.filter_type=Тип issues.filter_type=Тип
issues.filter_type.all_issues=Все задачи issues.filter_type.all_issues=Все задачи
@ -628,6 +635,8 @@ issues.label_count=%d меток
issues.label_open_issues=%d открытых задач issues.label_open_issues=%d открытых задач
issues.label_edit=Редактировать issues.label_edit=Редактировать
issues.label_delete=Удалить issues.label_delete=Удалить
issues.label_modify=Изменить метку
issues.label_deletion=Удалить метку
issues.label.filter_sort.alphabetically=По алфавиту issues.label.filter_sort.alphabetically=По алфавиту
issues.label.filter_sort.reverse_alphabetically=С конца алфавита issues.label.filter_sort.reverse_alphabetically=С конца алфавита
issues.label.filter_sort.by_size=Размер issues.label.filter_sort.by_size=Размер
@ -765,6 +774,7 @@ settings.external_tracker_url=URL внешней системы отслежив
settings.tracker_url_format=Внешний формат ссылки системы отслеживания ошибок. settings.tracker_url_format=Внешний формат ссылки системы отслеживания ошибок.
settings.tracker_issue_style.numeric=Цифровой settings.tracker_issue_style.numeric=Цифровой
settings.tracker_issue_style.alphanumeric=Буквенноцифровой settings.tracker_issue_style.alphanumeric=Буквенноцифровой
settings.admin_settings=Настройки администратора
settings.danger_zone=Опасная зона settings.danger_zone=Опасная зона
settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием. settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием.
settings.transfer=Передать права собственности settings.transfer=Передать права собственности
@ -789,10 +799,15 @@ settings.discord_username=Имя пользователя
settings.discord_icon_url=URL иконки settings.discord_icon_url=URL иконки
settings.slack_color=Цвет settings.slack_color=Цвет
settings.event_create=Создать settings.event_create=Создать
settings.event_fork=Форкнуть
settings.event_issues=Задачи
settings.event_pull_request=Pull Request settings.event_pull_request=Pull Request
settings.event_push=Push settings.event_push=Push
settings.event_repository=Репозиторий settings.event_repository=Репозиторий
settings.event_repository_desc=Репозиторий создан или удален.
settings.add_hook_success=Webhook был добавлен.
settings.update_webhook=Обновление Webhook settings.update_webhook=Обновление Webhook
settings.update_hook_success=Webhook был обновлен.
settings.recent_deliveries=Недавние рассылки settings.recent_deliveries=Недавние рассылки
settings.hook_type=Тип перехватчика settings.hook_type=Тип перехватчика
settings.slack_token=Slack токен settings.slack_token=Slack токен
@ -800,6 +815,7 @@ settings.slack_domain=Домен
settings.slack_channel=Канал settings.slack_channel=Канал
settings.deploy_keys=Ключи развертывания settings.deploy_keys=Ключи развертывания
settings.add_deploy_key=Добавить ключ развертывания settings.add_deploy_key=Добавить ключ развертывания
settings.is_writable=Разрешить запись
settings.title=Заголовок settings.title=Заголовок
settings.deploy_key_content=Содержимое settings.deploy_key_content=Содержимое
settings.branches=Ветки settings.branches=Ветки
@ -845,8 +861,11 @@ release.save_draft=Сохранить черновик
release.deletion_success=Релиз был удалён. release.deletion_success=Релиз был удалён.
release.downloads=Загрузки release.downloads=Загрузки
branch.name=Имя ветки
branch.search=Поиск веток branch.search=Поиск веток
branch.already_exists=Ветка с именем '%s' уже существует.
branch.delete_head=Удалить branch.delete_head=Удалить
branch.delete=Удалить ветку '%s'
branch.delete_html=Удалить ветку branch.delete_html=Удалить ветку
branch.create_branch=Создать ветку <strong>%s</strong> branch.create_branch=Создать ветку <strong>%s</strong>
branch.create_from=из '%s' branch.create_from=из '%s'
@ -870,9 +889,12 @@ create_team=Создать команду
org_desc=Описание org_desc=Описание
team_name=Название команды team_name=Название команды
team_desc=Описание team_desc=Описание
team_permission_desc=Разрешение
team_unit_desc=Разрешить доступ к разделам репозитория
settings=Настройки settings=Настройки
settings.options=Организация
settings.full_name=Полное имя settings.full_name=Полное имя
settings.website=Сайт settings.website=Сайт
settings.location=Местоположение settings.location=Местоположение
@ -881,9 +903,15 @@ settings.update_setting_success=Настройки организации обн
settings.delete=Удалить организацию settings.delete=Удалить организацию
settings.delete_account=Удалить эту организацию settings.delete_account=Удалить эту организацию
settings.confirm_delete_account=Подтвердить удаление settings.confirm_delete_account=Подтвердить удаление
settings.delete_org_title=Удалить организацию
settings.delete_org_desc=Эта организация будет безвозвратно удалена. Продолжить?
settings.hooks_desc=Добавьте webhooks, который будет вызываться для <strong>всех репозиториев</strong> под этой организации. settings.hooks_desc=Добавьте webhooks, который будет вызываться для <strong>всех репозиториев</strong> под этой организации.
members.membership_visibility=Видимость участника команды: members.membership_visibility=Видимость участника команды:
members.public=Видимый
members.public_helper=скрыть
members.private=Скрыт
members.private_helper=сделать видимым
members.member_role=Роль участника: members.member_role=Роль участника:
members.owner=Владелец members.owner=Владелец
members.member=Участник members.member=Участник
@ -895,12 +923,18 @@ members.invite_now=Пригласите сейчас
teams.join=Объединить teams.join=Объединить
teams.leave=Выйти teams.leave=Выйти
teams.read_access=Доступ на чтение teams.read_access=Доступ на чтение
teams.read_access_helper=Участники могут просматривать и клонировать командные репозитории.
teams.write_access=Доступ на запись teams.write_access=Доступ на запись
teams.write_access_helper=Участники могут читать и выполнять push в командные репозитории.
teams.admin_access=Доступ администратора
teams.admin_access_helper=Участники могут выполнять pull, push в командные репозитории и добавлять соавторов в команду.
teams.no_desc=Эта группа не имеет описания teams.no_desc=Эта группа не имеет описания
teams.settings=Настройки teams.settings=Настройки
teams.members=Члены группы разработки teams.members=Члены группы разработки
teams.update_settings=Обновить настройки teams.update_settings=Обновить настройки
teams.delete_team=Удалить команду
teams.add_team_member=Добавление члена группы разработки teams.add_team_member=Добавление члена группы разработки
teams.delete_team_title=Удалить команду
teams.delete_team_success=Команда удалена. teams.delete_team_success=Команда удалена.
teams.repositories=Репозитории группы разработки teams.repositories=Репозитории группы разработки
teams.search_repo_placeholder=Поиск репозитория… teams.search_repo_placeholder=Поиск репозитория…
@ -958,6 +992,7 @@ dashboard.total_gc_pause=Итоговая задержка GC
dashboard.last_gc_pause=Последняя пауза сборщика мусора dashboard.last_gc_pause=Последняя пауза сборщика мусора
dashboard.gc_times=Количество сборок мусора dashboard.gc_times=Количество сборок мусора
users.name=Имя пользователя
users.activated=Активирован users.activated=Активирован
users.admin=Администратор users.admin=Администратор
users.repos=Репозитории users.repos=Репозитории
@ -970,6 +1005,7 @@ orgs.org_manage_panel=Управление организациями
orgs.name=Название orgs.name=Название
orgs.teams=Команды orgs.teams=Команды
orgs.members=Участники orgs.members=Участники
orgs.new_orga=Новая организация
repos.repo_manage_panel=Управление репозиториями repos.repo_manage_panel=Управление репозиториями
repos.owner=Владелец repos.owner=Владелец
@ -994,6 +1030,8 @@ auths.bind_dn=Bind DN
auths.bind_password=Привязать пароль auths.bind_password=Привязать пароль
auths.user_base=База для поиска пользователя auths.user_base=База для поиска пользователя
auths.user_dn=DN пользователя auths.user_dn=DN пользователя
auths.use_paged_search=Использовать постраничный поиск
auths.search_page_size=Размер страницы
auths.filter=Фильтр пользователя auths.filter=Фильтр пользователя
auths.admin_filter=Фильтр администратора auths.admin_filter=Фильтр администратора
auths.ms_ad_sa=Атрибуты поиска MS AD auths.ms_ad_sa=Атрибуты поиска MS AD
@ -1026,7 +1064,11 @@ auths.new_success=Метод аутентификации '%s' был добав
auths.delete_auth_title=Удалить источник аутентификации auths.delete_auth_title=Удалить источник аутентификации
config.server_config=Конфигурация сервера config.server_config=Конфигурация сервера
config.app_name=Название сайта
config.app_ver=Версия Gitea
config.app_url=Базовый URL-адрес Gitea
config.custom_conf=Путь к файлу конфигурации config.custom_conf=Путь к файлу конфигурации
config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора config.disable_router_log=Отключение журнала маршрутизатора
config.run_mode=Режим выполнения config.run_mode=Режим выполнения
config.git_version=Версия Git config.git_version=Версия Git
@ -1038,6 +1080,7 @@ config.reverse_auth_user=Имя пользователя для авториза
config.ssh_config=Конфигурация SSH config.ssh_config=Конфигурация SSH
config.ssh_enabled=SSH включён config.ssh_enabled=SSH включён
config.ssh_start_builtin_server=Использовать встроенный сервер
config.ssh_port=Порт config.ssh_port=Порт
config.ssh_listen_port=Прослушиваемый порт config.ssh_listen_port=Прослушиваемый порт
config.ssh_root_path=Корневой путь config.ssh_root_path=Корневой путь
@ -1050,15 +1093,21 @@ config.db_config=Конфигурация базы данных
config.db_type=Тип config.db_type=Тип
config.db_host=Сервер config.db_host=Сервер
config.db_name=Имя config.db_name=Имя
config.db_ssl_mode=SSL
config.db_ssl_mode_helper=(только для "postgres") config.db_ssl_mode_helper=(только для "postgres")
config.db_path=Путь config.db_path=Путь
config.db_path_helper=(для "sqlite3" и "tidb") config.db_path_helper=(для "sqlite3" и "tidb")
config.service_config=Сервисная конфигурация config.service_config=Сервисная конфигурация
config.disable_register=Отключить самостоятельную регистрацию
config.enable_openid_signin=Включение входа через OpenID
config.show_registration_button=Показать кнопку регистрации config.show_registration_button=Показать кнопку регистрации
config.disable_key_size_check=Отключить проверку на минимальный размер ключа config.disable_key_size_check=Отключить проверку на минимальный размер ключа
config.enable_captcha=Включить CAPTCHA
config.active_code_lives=Время жизни кода для активации config.active_code_lives=Время жизни кода для активации
config.reset_password_code_lives=Время жизни кода на сброс пароля config.reset_password_code_lives=Время жизни кода на сброс пароля
config.enable_timetracking=Включить отслеживание времени
config.default_enable_timetracking=Включить отслеживание времени по умолчанию
config.webhook_config=Конфигурация Webhooks config.webhook_config=Конфигурация Webhooks
config.queue_length=Длина очереди config.queue_length=Длина очереди
@ -1175,6 +1224,8 @@ raw_seconds=секунд
raw_minutes=минут raw_minutes=минут
[dropzone] [dropzone]
default_message=Перетащите файл или кликните сюда для загрузки.
invalid_input_type=Вы не можете загружать файлы этого типа.
file_too_big=Размер файла ({{filesize}} МБ) больше чем максимальный размер ({{maxFilesize}} МБ). file_too_big=Размер файла ({{filesize}} МБ) больше чем максимальный размер ({{maxFilesize}} МБ).
remove_file=Удалить файл remove_file=Удалить файл
@ -1194,4 +1245,5 @@ error.no_gpg_keys_found=Не найден GPG ключ соответствую
error.not_signed_commit=Неподписанный коммит error.not_signed_commit=Неподписанный коммит
[units] [units]
error.unit_not_allowed=У вас нет доступа к этому разделу репозитория.

View File

@ -31,6 +31,7 @@ twofa=Двофакторна авторизація
twofa_scratch=Двофакторний одноразовий пароль twofa_scratch=Двофакторний одноразовий пароль
passcode=Код доступу passcode=Код доступу
u2f_insert_key=Вставте ключ безпеки
u2f_reload=Оновити u2f_reload=Оновити
repository=Репозиторій repository=Репозиторій
@ -146,7 +147,7 @@ no_reply_address=Прихований поштовий домен
[home] [home]
uname_holder=Ім'я користувача або Ел. пошта uname_holder=Ім'я користувача або Ел. пошта
password_holder=Пароль password_holder=Пароль
switch_dashboard_context=Змінити дошку switch_dashboard_context=Переключити контекст панелі управління
my_repos=Репозиторії my_repos=Репозиторії
show_more_repos=Показати більше репозиторіїв… show_more_repos=Показати більше репозиторіїв…
collaborative_repos=Спільні репозиторії collaborative_repos=Спільні репозиторії
@ -292,6 +293,7 @@ twofa=Двофакторна авторизація
account_link=Прив'язані облікові записи account_link=Прив'язані облікові записи
organization=Організації organization=Організації
uid=Ідентифікатор Uid uid=Ідентифікатор Uid
u2f=Ключі безпеки
public_profile=Загальнодоступний профіль public_profile=Загальнодоступний профіль
profile_desc=Ваша адреса електронної пошти використовуватиметься для сповіщення та інших операцій. profile_desc=Ваша адреса електронної пошти використовуватиметься для сповіщення та інших операцій.
@ -305,6 +307,7 @@ continue=Продовжити
cancel=Відміна cancel=Відміна
language=Мова language=Мова
lookup_avatar_by_mail=Знайти Аватар за адресою електронної пошти
federated_avatar_lookup=Знайти зовнішній аватар federated_avatar_lookup=Знайти зовнішній аватар
enable_custom_avatar=Увімкнути користувацькі аватари enable_custom_avatar=Увімкнути користувацькі аватари
choose_new_avatar=Оберіть новий аватар choose_new_avatar=Оберіть новий аватар
@ -652,7 +655,7 @@ pulls.merged=Злито
pulls.has_merged=Запит на злиття було об'єднано. pulls.has_merged=Запит на злиття було об'єднано.
pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично.
pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти.
pulls.cannot_auto_merge_helper=Злити вручну для вирішення конфліктів. pulls.cannot_auto_merge_helper=Злийте вручну для вирішення конфліктів.
pulls.merge_pull_request=Об'єднати запит на злиття pulls.merge_pull_request=Об'єднати запит на злиття
pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.rebase_merge_pull_request=Зробити Rebase і злити
pulls.squash_merge_pull_request=Об'єднати (Squash) і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити
@ -755,6 +758,7 @@ settings.use_internal_wiki=Використовувати вбудовані В
settings.use_external_wiki=Використовувати зовнішні Вікі settings.use_external_wiki=Використовувати зовнішні Вікі
settings.external_wiki_url=URL зовнішньої вікі settings.external_wiki_url=URL зовнішньої вікі
settings.issues_desc=Увімкнути відстеження проблем в репозиторію settings.issues_desc=Увімкнути відстеження проблем в репозиторію
settings.use_internal_issue_tracker=Використовувати вбудовану систему відстеження проблем
settings.external_tracker_url=URL зовнішньої системи відстеження проблем settings.external_tracker_url=URL зовнішньої системи відстеження проблем
settings.tracker_url_format=Формат URL зовнішнього трекера задач settings.tracker_url_format=Формат URL зовнішнього трекера задач
settings.tracker_issue_style.numeric=Цифровий settings.tracker_issue_style.numeric=Цифровий
@ -1108,6 +1112,7 @@ config.app_ver=Версія Gitea
config.app_url=Базова URL-адреса Gitea config.app_url=Базова URL-адреса Gitea
config.custom_conf=Шлях до файлу конфігурації config.custom_conf=Шлях до файлу конфігурації
config.domain=Домен SSH сервера config.domain=Домен SSH сервера
config.offline_mode=Локальний режим
config.disable_router_log=Вимкнути логування роутеру config.disable_router_log=Вимкнути логування роутеру
config.run_user=Запуск від імені Користувача config.run_user=Запуск від імені Користувача
config.run_mode=Режим виконання config.run_mode=Режим виконання
@ -1228,6 +1233,7 @@ notices.type=Тип
notices.type_1=Репозиторій notices.type_1=Репозиторій
notices.desc=Опис notices.desc=Опис
notices.op=Оп. notices.op=Оп.
notices.delete_success=Сповіщення системи були видалені.
[action] [action]
create_repo=створив(ла) репозиторій <a href="%s">%s</a> create_repo=створив(ла) репозиторій <a href="%s">%s</a>

View File

@ -17,9 +17,6 @@ Version: 1.5.9
File(s): /vendor/plugins/gitgraph/gitgraph.js File(s): /vendor/plugins/gitgraph/gitgraph.js
Version: 9b492e8bf1ddf7908a4997b8f83fa38a809a9da3 Version: 9b492e8bf1ddf7908a4997b8f83fa38a809a9da3
File(s): /vendor/plugins/autolink/autolink.js
Version: 741f66f
File(s): /vendor/plugins/vue/vue.min.js File(s): /vendor/plugins/vue/vue.min.js
Version: 2.1.10 Version: 2.1.10
@ -50,6 +47,9 @@ Version: 1.10.1
File(s): /vendor/plugins/pdfjs/ File(s): /vendor/plugins/pdfjs/
Version: 1.4.20 Version: 1.4.20
File(s): /vendor/plugins/u2f/
Version: 1.0.8
File(s): /vendor/assets/font-awesome/fonts/ File(s): /vendor/assets/font-awesome/fonts/
Version: 4.6.0 Version: 4.6.0

View File

@ -45,11 +45,6 @@
<td><a href="https://github.com/bluef/gitgraph.js/blob/master/LICENSE">BSD 3-Clause</a></td> <td><a href="https://github.com/bluef/gitgraph.js/blob/master/LICENSE">BSD 3-Clause</a></td>
<td><a href="https://github.com/bluef/gitgraph.js">gitgraph.js-latest</a></td> <td><a href="https://github.com/bluef/gitgraph.js">gitgraph.js-latest</a></td>
</tr> </tr>
<tr>
<td><a href="/vendor/plugins/autolink/autolink.js">autolink.min.js</a></td>
<td><a href="https://github.com/egoist/autolink.js/blob/master/LICENSE">Expat</a></td>
<td><a href="https://github.com/egoist/autolink.js">autolink.js-latest</a></td>
</tr>
<tr> <tr>
<td><a href="/vendor/plugins/vue/vue.min.js">vue.min.js</a></td> <td><a href="/vendor/plugins/vue/vue.min.js">vue.min.js</a></td>
<td><a href="https://github.com/vuejs/vue/blob/dev/LICENSE">Expat</a></td> <td><a href="https://github.com/vuejs/vue/blob/dev/LICENSE">Expat</a></td>

View File

@ -223,6 +223,10 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
var output bytes.Buffer var output bytes.Buffer
lines := strings.Split(fileContent, "\n") lines := strings.Split(fileContent, "\n")
//Remove blank line at the end of file
if len(lines) > 0 && lines[len(lines)-1] == "" {
lines = lines[:len(lines)-1]
}
for index, line := range lines { for index, line := range lines {
line = gotemplate.HTMLEscapeString(line) line = gotemplate.HTMLEscapeString(line)
if index != len(lines)-1 { if index != len(lines)-1 {

View File

@ -350,7 +350,7 @@ func NewWikiPost(ctx *context.Context, form auth.NewWikiForm) {
return return
} }
ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToFilename(wikiName)) ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToSubURL(wikiName))
} }
// EditWiki render wiki modify page // EditWiki render wiki modify page
@ -391,7 +391,7 @@ func EditWikiPost(ctx *context.Context, form auth.NewWikiForm) {
return return
} }
ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToFilename(newWikiName)) ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToSubURL(newWikiName))
} }
// DeleteWikiPagePost delete wiki page // DeleteWikiPagePost delete wiki page

12
templates/home.tmpl vendored
View File

@ -28,7 +28,7 @@
<i class="octicon octicon-device-desktop"></i> Plattformübergreifend <i class="octicon octicon-device-desktop"></i> Plattformübergreifend
</h1> </h1>
<p class="large"> <p class="large">
Gitea läuft überall. <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> kompiliert für: Windows, Mac OS X, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt! Gitea läuft überall. <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> kompiliert für: Windows, macOS, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt!
</p> </p>
</div> </div>
</div> </div>
@ -142,7 +142,7 @@
<i class="octicon octicon-device-desktop"></i> Multi-plateforme <i class="octicon octicon-device-desktop"></i> Multi-plateforme
</h1> </h1>
<p class="large"> <p class="large">
Gitea tourne partout où <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> peut être compilé : Windows, Mac OS X, Linux, ARM, etc. Choisissez votre préféré ! Gitea tourne partout où <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré !
</p> </p>
</div> </div>
</div> </div>
@ -179,7 +179,7 @@
<i class="octicon octicon-device-desktop"></i> Multiplatforma <i class="octicon octicon-device-desktop"></i> Multiplatforma
</h1> </h1>
<p class="large"> <p class="large">
Gitea funciona en cualquier parte, <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> puede compilarse en: Windows, Mac OS X, Linux, ARM, etc. !Elige tu favorita! Gitea funciona en cualquier parte, <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> puede compilarse en: Windows, macOS, Linux, ARM, etc. !Elige tu favorita!
</p> </p>
</div> </div>
</div> </div>
@ -216,7 +216,7 @@
<i class="octicon octicon-device-desktop"></i> Multi-plataforma <i class="octicon octicon-device-desktop"></i> Multi-plataforma
</h1> </h1>
<p class="large"> <p class="large">
Gitea roda em qualquer sistema operacional em que <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> consegue compilar: Windows, Mac OS X, Linux, ARM, etc. Escolha qual você gosta mais! Gitea roda em qualquer sistema operacional em que <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais!
</p> </p>
</div> </div>
</div> </div>
@ -253,7 +253,7 @@
<i class="octicon octicon-device-desktop"></i> Кроссплатформенный <i class="octicon octicon-device-desktop"></i> Кроссплатформенный
</h1> </h1>
<p class="large"> <p class="large">
Gitea работает на любой операционной системе, которая может компилировать <a target="_blank" rel="noopener" href="http://golang.org/">Go</a>: Windows, Mac OS X, Linux, ARM и т. д. Выбирайте, что вам больше нравится! Gitea работает на любой операционной системе, которая может компилировать <a target="_blank" rel="noopener" href="http://golang.org/">Go</a>: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
</p> </p>
</div> </div>
</div> </div>
@ -327,7 +327,7 @@
<i class="octicon octicon-device-desktop"></i> Cross-platform <i class="octicon octicon-device-desktop"></i> Cross-platform
</h1> </h1>
<p class="large"> <p class="large">
Gitea runs anywhere <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> can compile for: Windows, Mac OS X, Linux, ARM, etc. Choose the one you love! Gitea runs anywhere <a target="_blank" rel="noopener" href="http://golang.org/">Go</a> can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love!
</p> </p>
</div> </div>
</div> </div>

View File

@ -9,6 +9,8 @@ import (
"container/list" "container/list"
"strconv" "strconv"
"strings" "strings"
"github.com/mcuadros/go-version"
) )
// GetRefCommitID returns the last commit ID string of given reference (branch or tag). // GetRefCommitID returns the last commit ID string of given reference (branch or tag).
@ -274,7 +276,7 @@ func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) {
func (repo *Repository) commitsBefore(id SHA1, limit int) (*list.List, error) { func (repo *Repository) commitsBefore(id SHA1, limit int) (*list.List, error) {
cmd := NewCommand("log") cmd := NewCommand("log")
if limit > 0 { if limit > 0 {
cmd.AddArguments("-"+ strconv.Itoa(limit), prettyLogFormat, id.String()) cmd.AddArguments("-"+strconv.Itoa(limit), prettyLogFormat, id.String())
} else { } else {
cmd.AddArguments(prettyLogFormat, id.String()) cmd.AddArguments(prettyLogFormat, id.String())
} }
@ -316,15 +318,35 @@ func (repo *Repository) getCommitsBeforeLimit(id SHA1, num int) (*list.List, err
} }
func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error) { func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error) {
stdout, err := NewCommand("for-each-ref", "--count="+ strconv.Itoa(limit), "--format=%(refname)", "--contains", commit.ID.String(), BranchPrefix).RunInDir(repo.Path) if version.Compare(gitVersion, "2.7.0", ">=") {
stdout, err := NewCommand("for-each-ref", "--count="+strconv.Itoa(limit), "--format=%(refname:strip=2)", "--contains", commit.ID.String(), BranchPrefix).RunInDir(repo.Path)
if err != nil {
return nil, err
}
branches := strings.Fields(stdout)
return branches, nil
}
stdout, err := NewCommand("branch", "--contains", commit.ID.String()).RunInDir(repo.Path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
refs := strings.Split(stdout, "\n") refs := strings.Split(stdout, "\n")
branches := make([]string, len(refs)-1)
for i, ref := range refs[:len(refs)-1] { var max int
branches[i] = strings.TrimPrefix(ref, BranchPrefix) if len(refs) > limit {
max = limit
} else {
max = len(refs) - 1
}
branches := make([]string, max)
for i, ref := range refs[:max] {
parts := strings.Fields(ref)
branches[i] = parts[len(parts)-1]
} }
return branches, nil return branches, nil
} }