%s에서 %s로 저장소가 전송
compare_commits=%d 커밋들 비교
[tool]
-ago=%s 전
-from_now=%s 지금부터
now=현재
future=미래
1s=1 초
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index c649a2670e0..01b5c783e75 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -110,7 +110,6 @@ never=Nekad
rss_feed=RSS barotne
-
[aria]
navbar=Navigācijas josla
footer=Kājene
@@ -3060,8 +3059,6 @@ starred_repo=atzīmēja ar zvaigznīti %[2]s
watched_repo=sāka sekot %[2]s
[tool]
-ago=pirms %s
-from_now=pēc %s no šī brīža
now=tagad
future=nākotnē
1s=1 sekundes
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 068f67dc51f..2a1074034f0 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -107,7 +107,6 @@ never=Nooit
rss_feed=RSS Feed
-
[aria]
[editor]
@@ -2753,8 +2752,6 @@ compare_commits=Vergelijk %d commits
compare_commits_general=Vergelijk commits
[tool]
-ago=%s geleden
-from_now=%s vanaf nu
now=nu
future=toekomst
1s=1 seconde
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index 0bb732b1594..5d89b21827f 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -105,7 +105,6 @@ error404=Strona, do której próbujesz dotrzeć nie istnieje lu
never=Nigdy
-
[aria]
[editor]
@@ -2641,8 +2640,6 @@ mirror_sync_delete=synchronizuje i usuwa odwołanie %[2]s w %[2]s
watched_repo=começou a observar %[2]s
[tool]
-ago=%s atrás
-from_now=%s a partir de agora
now=agora
future=futuro
1s=1 segundo
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index 4339b3d19ac..85c243cabcd 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -112,8 +112,6 @@ never=Nunca
rss_feed=Fonte RSS
-on_date=no dia
-
[aria]
navbar=Barra de navegação
footer=Rodapé
@@ -133,6 +131,8 @@ buttons.list.task.tooltip=Adicionar uma lista de tarefas
buttons.mention.tooltip=Mencionar um utilizador ou uma equipa
buttons.ref.tooltip=Referenciar uma questão ou um pedido de integração
buttons.switch_to_legacy.tooltip=Usar o editor clássico
+buttons.enable_monospace_font=Habilitar tipo de letra mono-espaçado
+buttons.disable_monospace_font=Desabilitar tipo de letra mono-espaçado
[filter]
string.asc=A - Z
@@ -3127,8 +3127,6 @@ starred_repo=juntou %[2]s aos favoritos
watched_repo=começou a vigiar %[2]s
[tool]
-ago=há %s
-from_now=daqui a %s
now=agora
future=futuro
1s=1 segundo
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index b74ed160945..3bd988d72f2 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -4,7 +4,7 @@ explore=Обзор
help=Помощь
logo=Логотип
sign_in=Вход
-sign_in_with=Войдите с помощью
+sign_in_with=Войти с помощью
sign_out=Выход
sign_up=Регистрация
link_account=Привязать аккаунт
@@ -25,14 +25,14 @@ licenses=Лицензии
return_to_gitea=Вернуться к Gitea
username=Имя пользователя
-email=Адрес эл. почты
+email=Адрес электронной почты
password=Пароль
access_token=Токен доступа
re_type=Введите пароль еще раз
captcha=CAPTCHA
twofa=Двухфакторная аутентификация
twofa_scratch=Двухфакторный scratch-код
-passcode=Пароль
+passcode=Код
webauthn_insert_key=Вставьте ваш ключ безопасности
webauthn_sign_in=Нажмите кнопку на ключе безопасности. Если ваш ключ безопасности не имеет кнопки, вставьте его снова.
@@ -41,11 +41,11 @@ webauthn_use_twofa=Используйте двухфакторный код с
webauthn_error=Не удалось прочитать ваш ключ безопасности.
webauthn_unsupported_browser=Ваш браузер в настоящее время не поддерживает WebAuthn.
webauthn_error_unknown=Произошла неизвестная ошибка. Повторите попытку.
-webauthn_error_insecure=`WebAuthn поддерживает только безопасные соединения. Для тестирования по HTTP, вы можете использовать "localhost" или "127.0.0.1"`
+webauthn_error_insecure=`WebAuthn поддерживает только безопасные соединения. Для тестирования по HTTP можно использовать "localhost" или "127.0.0.1"`
webauthn_error_unable_to_process=Сервер не смог обработать ваш запрос.
-webauthn_error_duplicated=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ ещё не зарегистрирован.
-webauthn_error_empty=Вы должны указать имя для этого ключа.
-webauthn_error_timeout=Тайм-аут достигнут до того, как ваш ключ был прочитан. Перезагрузите эту страницу и повторите попытку.
+webauthn_error_duplicated=Данный ключ безопасности не разрешен для этого запроса. Пожалуйста, убедитесь, что ключ не регистрировался ранее.
+webauthn_error_empty=Необходимо задать имя для этого ключа.
+webauthn_error_timeout=Время истекло раньше, чем ключ был прочитан. Перезагрузите эту страницу и повторите попытку.
webauthn_reload=Обновить
repository=Репозиторий
@@ -91,7 +91,7 @@ enabled=Включено
disabled=Отключен
copy=Скопировать
-copy_url=Копировать URL
+copy_url=Скопировать URL
copy_content=Скопировать содержимое
copy_branch=Скопировать имя ветки
copy_success=Скопировано!
@@ -106,13 +106,12 @@ step1=Шаг 1:
step2=Шаг 2:
error=Ошибка
-error404=Страница, которую вы пытаетесь открыть, либо не существует, либо недостаточно прав для ее просмотра.
+error404=Либо страница, которую вы пытаетесь открыть, не существует, либо у вас недостаточно прав для ее просмотра.
never=Никогда
rss_feed=RSS-лента
-
[aria]
navbar=Панель навигации
footer=Подвал
@@ -128,8 +127,8 @@ string.desc=Я - А
[error]
occurred=Произошла ошибка
report_message=Если вы уверены, что это баг Gitea, пожалуйста, поищите задачу на GitHub или создайте новую при необходимости.
-missing_csrf=Некорректный запрос: CSRF токен отсутствует
-invalid_csrf=Некорректный запрос: неверный CSRF токен
+missing_csrf=Некорректный запрос: отсутствует токен CSRF
+invalid_csrf=Некорректный запрос: неверный токен CSRF
network_error=Ошибка сети
[startpage]
@@ -137,7 +136,7 @@ app_desc=Удобный сервис собственного хостинга
install=Простой в установке
install_desc=Просто запустите исполняемый файл для вашей платформы, разверните через Docker, или установите с помощью менеджера пакетов.
platform=Кроссплатформенный
-platform_desc=Gitea работает на любой операционной системе, которая может компилировать Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
+platform_desc=Gitea работает на любой платформе, поддерживаемой Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
lightweight=Легковесный
lightweight_desc=Gitea имеет низкие системные требования и может работать на недорогом Raspberry Pi. Экономьте энергию вашей машины!
license=Открытый исходный код
@@ -154,7 +153,7 @@ host=Хост
user=Имя пользователя
password=Пароль
db_name=Имя базы данных
-db_helper=Для пользователей MySQL: пожалуйста, используйте движок InnoDB, и если вы используете "utf8mb4" - ваша версия InnoDB должна быть старше 5.6 .
+db_helper=Для пользователей MySQL: пожалуйста, используйте хранилище InnoDB, и если вы используете "utf8mb4", версия InnoDB должна быть выше 5.6 .
db_schema=Схема
db_schema_helper=Оставьте пустым для значения по умолчанию ("public").
ssl_mode=SSL
@@ -179,8 +178,8 @@ app_name=Название сайта
app_name_helper=Здесь вы можете ввести название своей компании.
repo_path=Путь до корня репозитория
repo_path_helper=Все удалённые Git репозитории будут сохранены в эту директорию.
-lfs_path=Корневой путь Git LFS
-lfs_path_helper=В этой директории будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
+lfs_path=Путь к корневому каталогу Git LFS
+lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
run_user=Запуск от имени пользователя
run_user_helper=Введите имя пользователя операционной системы, под которым работает Gitea. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
@@ -287,6 +286,7 @@ search=Поиск
code=Код
search.type.tooltip=Тип поиска
search.fuzzy=Неточный
+search.fuzzy.tooltip=Включать результаты, которые не полностью соответствуют поисковому запросу
search.match=Соответствие
search.match.tooltip=Включать только результаты, которые точно соответствуют поисковому запросу
code_search_unavailable=В настоящее время поиск по коду недоступен. Обратитесь к администратору сайта.
@@ -1029,6 +1029,7 @@ issues=Задачи
pulls=Запросы на слияние
project_board=Проекты
packages=Пакеты
+actions=Действия
labels=Метки
org_labels_desc=Метки уровня организации, которые можно использовать с всеми репозиториями< / strong> в этой организации
org_labels_desc_manage=управлять
@@ -1247,6 +1248,7 @@ issues.choose.blank=По умолчанию
issues.choose.blank_about=Создать запрос из шаблона по умолчанию.
issues.choose.ignore_invalid_templates=Некорректные шаблоны были проигнорированы
issues.choose.invalid_templates=Найден(ы) %v неверный(х) шаблон(ов)
+issues.choose.invalid_config=Конфигурация задачи содержит ошибки:
issues.no_ref=Не указана ветка или тэг
issues.create=Добавить задачу
issues.new_label=Новая метка
@@ -1525,6 +1527,8 @@ pulls.allow_edits_from_maintainers=Разрешить редактировани
pulls.allow_edits_from_maintainers_desc=Пользователи с доступом на запись в основную ветку могут отправлять изменения и в эту ветку
pulls.allow_edits_from_maintainers_err=Не удалось обновить
pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений.
+pulls.has_viewed_file=Просмотрено
+pulls.viewed_files_label=%[1]d из %[2]d файлов просмотрено
pulls.expand_files=Показать все файлы
pulls.collapse_files=Свернуть все файлы
pulls.compare_base=базовая ветка
@@ -1572,6 +1576,7 @@ pulls.can_auto_merge_desc=Этот запрос на слияние может
pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически.
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.num_conflicting_files_1=%d конфликтующий файл
+pulls.num_conflicting_files_n=%d конфликтующих файлов
pulls.approve_count_1=%d одобрение
pulls.reject_count_1=%d запрос на изменение
pulls.reject_count_n=%d запросов на изменение
@@ -1620,10 +1625,23 @@ pulls.reopened_at=`переоткрыл этот запрос на слияни
pulls.merge_instruction_hint=`Вы также можете просмотреть инструкции командной строки.`
pulls.merge_instruction_step1_desc=В репозитории вашего проекта посмотрите новую ветку и протестируйте изменения.
pulls.merge_instruction_step2_desc=Объединить изменения и обновить на Gitea.
+pulls.clear_merge_message=Очистить сообщение о слиянии
+pulls.clear_merge_message_hint=Очистка сообщения о слиянии удалит только содержимое сообщения коммита, но сохранит сгенерированные git добавки, такие как "Co-Authored-By …".
+pulls.auto_merge_button_when_succeed=(При успешных проверках)
+pulls.auto_merge_when_succeed=Слить автоматически после прохождения всех проверок
+pulls.auto_merge_newly_scheduled=Запрос был запланирован для слияния после прохождения всех проверок.
+pulls.auto_merge_has_pending_schedule=%[1]s запланировал этот запрос для автоматического слияния, когда все проверки пройдены %[2]s.
+pulls.auto_merge_cancel_schedule=Отменить автоматическое слияние
+pulls.auto_merge_not_scheduled=Этот запрос не запланирован для автоматического слияния.
+pulls.auto_merge_canceled_schedule=Автоматическое слияние для этого запроса было отменено.
+pulls.auto_merge_newly_scheduled_comment=`запланировал этот запрос для автоматического слияния после прохождения всех проверок %[1]s`
+pulls.auto_merge_canceled_schedule_comment=`отменил автоматическое слияние этого запроса после прохождения всех проверок %[1]s`
+pulls.delete.title=Удалить этот запрос на слияние?
+pulls.delete.text=Вы действительно хотите удалить этот запрос на слияние? (Это навсегда удалит всё содержимое. Возможно, лучше закрыть запрос в архивных целях.)
milestones.new=Новый этап
milestones.closed=Закрыт %s
@@ -1669,6 +1687,7 @@ signing.wont_sign.commitssigned=Слияние не будет подписан
signing.wont_sign.approved=Слияние не будет подписано, так как PR не одобрен
signing.wont_sign.not_signed_in=Вы не авторизовались
+ext_wiki=Доступ к внешней вики
ext_wiki.desc=Ссылка на внешнюю вики.
wiki=Вики
@@ -1765,6 +1784,7 @@ search=Поиск
search.search_repo=Поиск по репозиторию
search.type.tooltip=Тип поиска
search.fuzzy=Неточный
+search.fuzzy.tooltip=Включать результаты, которые не полностью соответствуют поисковому запросу
search.match=Соответствие
search.match.tooltip=Включать только результаты, которые точно соответствуют поисковому запросу
search.results=Результаты поиска "%s" в %s
@@ -1798,6 +1818,7 @@ settings.mirror_sync_in_progress=Синхронизируются репозит
settings.site=Сайт
settings.update_settings=Обновить настройки
settings.branches.update_default_branch=Обновить ветку по умолчанию
+settings.branches.add_new_rule=Добавить новое правило
settings.advanced_settings=Расширенные настройки
settings.wiki_desc=Включить Вики для репозитория
settings.use_internal_wiki=Использовать встроенную вики-систему
@@ -1816,15 +1837,22 @@ settings.tracker_url_format_error=Формат URL внешнего баг-тр
settings.tracker_issue_style=Формат нумерации для внешней системы учета задач
settings.tracker_issue_style.numeric=Цифровой
settings.tracker_issue_style.alphanumeric=Буквенноцифровой
+settings.tracker_issue_style.regexp=Регулярное выражение
+settings.tracker_issue_style.regexp_pattern=Шаблон регулярного выражения
+settings.tracker_issue_style.regexp_pattern_desc=Вместо {index} будет использоваться первая захваченная группа.
settings.tracker_url_format_desc=Вы можете использовать шаблоны {user}, {repo} и {index} для имени пользователя, репозитория и номера задачи.
settings.enable_timetracker=Включить отслеживание времени
settings.allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени
settings.pulls_desc=Включить запросы на слияние
settings.pulls.ignore_whitespace=Игнорировать незначащие изменения (пробелы, табуляция) при проверке на конфликты слияния
settings.pulls.enable_autodetect_manual_merge=Включить автоопределение ручного слияния (Примечание: в некоторых особых случаях могут возникнуть ошибки)
+settings.pulls.allow_rebase_update=Включить обновление ветки из запроса на слияние путём rebase
settings.pulls.default_delete_branch_after_merge=Удалить ветку запроса после его слияния по умолчанию
settings.pulls.default_allow_edits_from_maintainers=По умолчанию разрешать редактирование сопровождающими
+settings.releases_desc=Включить релизы
+settings.packages_desc=Включить реестр пакетов
settings.projects_desc=Включить проекты репозитория
+settings.actions_desc=Включить действия репозитория
settings.admin_settings=Настройки администратора
settings.admin_enable_health_check=Выполнять проверки целостности этого репозитория (git fsck)
settings.admin_code_indexer=Индексатор кода
@@ -1886,6 +1914,7 @@ settings.confirm_delete=Удалить репозиторий
settings.add_collaborator=Добавить соавтора
settings.add_collaborator_success=Соавтор добавлен.
settings.add_collaborator_inactive_user=Невозможно добавить неактивного пользователя как соавтора.
+settings.add_collaborator_owner=Невозможно добавить владельца в качестве соавтора.
settings.add_collaborator_duplicate=Соавтор уже добавлен в этот репозиторий.
settings.delete_collaborator=Удалить
settings.collaborator_deletion=Удалить соавтора
@@ -1917,6 +1946,7 @@ settings.webhook.headers=Заголовки
settings.webhook.payload=Содержимое
settings.webhook.body=Тело ответа
settings.webhook.replay.description=Повторить этот веб-хук.
+settings.webhook.delivery.success=Событие было добавлено в очередь доставки. Может пройти несколько секунд, прежде чем оно отобразится в истории.
settings.githooks_desc=Git-хуки предоставляются самим Git. Вы можете изменять файлы хуков из списка ниже, чтобы настроить собственные операции.
settings.githook_edit_desc=Если хук не активен, будет подставлен пример содержимого. Пустое значение в этом поле приведёт к отключению хука.
settings.githook_name=Название хукa
@@ -1981,6 +2011,7 @@ settings.event_package_desc=Пакет создан или удален в ре
settings.branch_filter=Фильтр веток
settings.branch_filter_desc=Белый список ветвей для событий Push, создания ветвей и удаления ветвей, указанных в виде глоб-шаблона. Если пустой или *, то все событий для всех ветвей будут зарегистрированы. Перейдите по ссылке github.com/gobwas/glob на документацию по синтаксису. Примеры: master, {master,release*}.
settings.authorization_header=Заголовок Authorization
+settings.authorization_header_desc=Будет включён в качестве заголовка авторизации для запросов. Примеры: %s.
settings.active=Активный
settings.active_helper=Информация о происходящих событиях будет отправляться на URL этого веб-хука.
settings.add_hook_success=Веб-хук был добавлен.
@@ -2020,6 +2051,8 @@ settings.key_been_used=Идентичный ключ развёртывания
settings.key_name_used=Ключ развёртывания с таким именем уже существует.
settings.add_key_success=Новый ключ развёртывания '%s' успешно добавлен.
settings.deploy_key_deletion=Удалить ключ развёртывания
+settings.deploy_key_deletion_desc=Удаление ключа развёртывания сделает невозможным доступ к репозиторию с его помощью. Вы уверены?
+settings.deploy_key_deletion_success=Ключ развёртывания был успешно удалён.
settings.branches=Ветки
settings.protected_branch=Защита веток
settings.protected_branch.save_rule=Сохранить правило
@@ -2962,8 +2995,6 @@ starred_repo=добавил(а) %[2]s в избранное
watched_repo=начала(а) наблюдение за %[2]s
[tool]
-ago=%s назад
-from_now=%s с этого момента
now=сейчас
future=в будущем
1s=1 секунду
@@ -3035,11 +3066,20 @@ keywords=Ключевые слова
details=Подробнее
details.author=Автор
details.project_site=Сайт проекта
+details.repository_site=Сайт репозитория
+details.documentation_site=Сайт документации
details.license=Лицензия
versions=Версии
versions.view_all=Показать всё
dependency.version=Версия
+cargo.registry=Настройте этот реестр в файле конфигурации Cargo (например, ~/.cargo/config.toml):
+cargo.install=Чтобы установить пакет с помощью Cargo, выполните следующую команду:
+cargo.documentation=Для получения дополнительной информации о реестре Cargo смотрите документацию.
+cargo.details.repository_site=Сайт репозитория
+cargo.details.documentation_site=Сайт документации
+chef.registry=Настройте этот реестр в своём файле ~/.chef/config.rb:
chef.install=Чтобы установить пакет, выполните следующую команду:
+chef.documentation=Для получения дополнительной информации о реестре Chef смотрите документацию.
composer.registry=Настройте этот реестр в файле ~/.composer/config.json:
composer.install=Чтобы установить пакет с помощью Composer, выполните следующую команду:
composer.documentation=Для получения дополнительной информации о реестре Composer смотрите документацию.
@@ -3048,6 +3088,11 @@ conan.details.repository=Репозиторий
conan.registry=Настроить реестр из командной строки:
conan.install=Чтобы установить пакет с помощью Conan, выполните следующую команду:
conan.documentation=Для получения дополнительной информации о реестре Conan смотрите документацию.
+conda.registry=Пропишите этот реестр в качестве репозитория Conda в своём файле .condarc:
+conda.install=Чтобы установить пакет с помощью Conda, выполните следующую команду:
+conda.documentation=Для получения дополнительной информации о реестре Conda смотрите документацию.
+conda.details.repository_site=Сайт репозитория
+conda.details.documentation_site=Сайт документации
container.details.type=Тип образа
container.details.platform=Платформа
container.digest=Отпечаток:
@@ -3061,6 +3106,7 @@ helm.registry=Настроить реестр из командной строк
helm.install=Чтобы установить пакет, выполните следующую команду:
helm.documentation=Для получения дополнительной информации о реестре Helm смотрите документацию.
maven.install2=Выполнить через командную строку:
+maven.download=Чтобы скачать зависимость, запустите в командной строке:
nuget.registry=Настроить реестр из командной строки:
nuget.install=Чтобы установить пакет с помощью NuGet, выполните следующую команду:
nuget.documentation=Для получения дополнительной информации о реестре NuGet смотрите документацию.
@@ -3071,6 +3117,8 @@ npm.dependencies=Зависимости
npm.dependencies.peer=Одноранговые зависимости
npm.dependencies.optional=Необязательные зависимости
npm.details.tag=Тег
+pub.install=Чтобы установить пакет с помощью Dart, выполните следующую команду:
+pub.documentation=Для получения дополнительной информации о реестре Conda смотрите документацию.
pypi.requires=Требуется Python
pypi.documentation=Для получения дополнительной информации о реестре PyPI смотрите документацию.
rubygems.install=Чтобы установить пакет с помощью gem, выполните следующую команду:
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index 99a43974ef1..6771d118139 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -92,7 +92,6 @@ error404=ඔබ ළඟා වීමට උත්සාහ කරන පිටු
never=කිසි විටෙකත්
-
[aria]
[editor]
@@ -2678,8 +2677,6 @@ create_branch=නිර්මාණය කරන ලද ශාඛාව %[2]sනැරඹීමට පටන් ගත්තා
[tool]
-ago=%s කලින්
-from_now=%s මෙතැන් සිට
now=දැන්
future=අනාගතය
1s=තත්පර 1
diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini
index 9e38834b7d7..76cc71c940a 100644
--- a/options/locale/locale_sk-SK.ini
+++ b/options/locale/locale_sk-SK.ini
@@ -106,7 +106,6 @@ never=Nikdy
rss_feed=RSS kanál
-
[aria]
[editor]
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index 0d4a0036cf5..cf3056ae3d5 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -81,7 +81,6 @@ error404=Sidan du försöker nå finns inte eller så h
-
[aria]
[editor]
@@ -2110,8 +2109,6 @@ compare_commits_general=Jämför commits
mirror_sync_delete=synkade och raderade referens %[2]s på %[3]s från spegel
[tool]
-ago=%s sedan
-from_now=%s från och med nu
now=nu
future=framtiden
1s=1 sekund
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index a5e7061d492..858fdea2317 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -110,7 +110,6 @@ never=Asla
rss_feed=RSS Beslemesi
-
[aria]
navbar=Gezinti Çubuğu
footer=Alt Bilgi
@@ -2988,8 +2987,6 @@ starred_repo=%[2]s deposuna yıldız bıraktı
watched_repo=%[2]s deposunu izlemeye başladı
[tool]
-ago=%s önce
-from_now=%s şu andan
now=şimdi
future=gelecek
1s=1 saniye
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 6b6aa67371d..33a3eaeab8e 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -93,7 +93,6 @@ error404=Сторінка, до якої ви намагаєтеся зверн
never=Ніколи
-
[aria]
[editor]
@@ -2750,8 +2749,6 @@ starred_repo=додав %[2]s у обране
watched_repo=почав слідкувати за %[2]
[tool]
-ago=%s тому
-from_now=%s з цього моменту
now=зараз
future=в майбутньому
1s=1 секунда
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index 7806a195baf..c9adca186fc 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -112,7 +112,6 @@ never=从不
rss_feed=RSS 订阅源
-
[aria]
navbar=导航栏
footer=页脚
@@ -3095,8 +3094,6 @@ starred_repo=点赞了 %[2]s
watched_repo=开始关注 %[2]s
[tool]
-ago=%s前
-from_now=%s 之后
now=现在
future=将来
1s=1 秒
diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini
index 53ead462a9a..29530d9467c 100644
--- a/options/locale/locale_zh-HK.ini
+++ b/options/locale/locale_zh-HK.ini
@@ -51,7 +51,6 @@ enabled=已啟用
-
[aria]
[editor]
@@ -926,8 +925,6 @@ transfer_repo=將儲存庫 %s 轉移至 %s
compare_commits=比較 %d 提交
[tool]
-ago=%s之前
-from_now=%s之後
now=現在
future=未來
1s=1 秒
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index 6dfbe25181a..ca3990af83c 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -112,7 +112,6 @@ never=從來沒有
rss_feed=RSS 摘要
-
[aria]
navbar=導航列
footer=頁尾
@@ -120,6 +119,8 @@ footer.software=關於軟體
footer.links=連結
[editor]
+buttons.enable_monospace_font=啟用等寬字型
+buttons.disable_monospace_font=停用等寬字型
[filter]
string.asc=A - Z
@@ -1748,6 +1749,8 @@ wiki.create_first_page=建立第一個頁面
wiki.page=頁面
wiki.filter_page=過濾頁面
wiki.new_page=頁面
+wiki.page_title=頁面標題
+wiki.page_content=頁面內容
wiki.default_commit_message=關於此次頁面修改的說明(非必要)。
wiki.save_page=儲存頁面
wiki.last_commit_info=%s 於 %s 修改了此頁面
@@ -3105,8 +3108,6 @@ starred_repo=為 %[2]s 加上星號
watched_repo=開始關注 %[2]s
[tool]
-ago=%s前
-from_now=%s之後
now=現在
future=未來
1s=1 秒
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go
index 06bf06b4e84..5bf5fc8c8bc 100644
--- a/routers/api/v1/repo/issue.go
+++ b/routers/api/v1/repo/issue.go
@@ -651,7 +651,7 @@ func CreateIssue(ctx *context.APIContext) {
form.Labels = make([]int64, 0)
}
- if err := issue_service.NewIssue(ctx.Repo.Repository, issue, form.Labels, nil, assigneeIDs); err != nil {
+ if err := issue_service.NewIssue(ctx, ctx.Repo.Repository, issue, form.Labels, nil, assigneeIDs); err != nil {
if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) {
ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err)
return
@@ -752,7 +752,7 @@ func EditIssue(ctx *context.APIContext) {
issue.Content = *form.Body
}
if form.Ref != nil {
- err = issue_service.ChangeIssueRef(issue, ctx.Doer, *form.Ref)
+ err = issue_service.ChangeIssueRef(ctx, issue, ctx.Doer, *form.Ref)
if err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateRef", err)
return
@@ -790,7 +790,7 @@ func EditIssue(ctx *context.APIContext) {
oneAssignee = *form.Assignee
}
- err = issue_service.UpdateAssignees(issue, oneAssignee, form.Assignees, ctx.Doer)
+ err = issue_service.UpdateAssignees(ctx, issue, oneAssignee, form.Assignees, ctx.Doer)
if err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateAssignees", err)
return
@@ -887,7 +887,7 @@ func DeleteIssue(ctx *context.APIContext) {
return
}
- if err = issue_service.DeleteIssue(ctx.Doer, ctx.Repo.GitRepo, issue); err != nil {
+ if err = issue_service.DeleteIssue(ctx, ctx.Doer, ctx.Repo.GitRepo, issue); err != nil {
ctx.Error(http.StatusInternalServerError, "DeleteIssueByID", err)
return
}
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index 9b5ec0b3f8e..f4e2969d7d1 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -534,7 +534,7 @@ func EditPullRequest(ctx *context.APIContext) {
// Send an empty array ([]) to clear all assignees from the Issue.
if ctx.Repo.CanWrite(unit.TypePullRequests) && (form.Assignees != nil || len(form.Assignee) > 0) {
- err = issue_service.UpdateAssignees(issue, form.Assignee, form.Assignees, ctx.Doer)
+ err = issue_service.UpdateAssignees(ctx, issue, form.Assignee, form.Assignees, ctx.Doer)
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err))
diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go
index 8f4b9dafec6..a568cd565a7 100644
--- a/routers/api/v1/repo/pull_review.go
+++ b/routers/api/v1/repo/pull_review.go
@@ -706,7 +706,7 @@ func apiReviewRequest(ctx *context.APIContext, opts api.PullReviewRequestOptions
}
for _, reviewer := range reviewers {
- comment, err := issue_service.ReviewRequest(pr.Issue, ctx.Doer, reviewer, isAdd)
+ comment, err := issue_service.ReviewRequest(ctx, pr.Issue, ctx.Doer, reviewer, isAdd)
if err != nil {
ctx.Error(http.StatusInternalServerError, "ReviewRequest", err)
return
@@ -750,7 +750,7 @@ func apiReviewRequest(ctx *context.APIContext, opts api.PullReviewRequestOptions
}
for _, teamReviewer := range teamReviewers {
- comment, err := issue_service.TeamReviewRequest(pr.Issue, ctx.Doer, teamReviewer, isAdd)
+ comment, err := issue_service.TeamReviewRequest(ctx, pr.Issue, ctx.Doer, teamReviewer, isAdd)
if err != nil {
ctx.ServerError("TeamReviewRequest", err)
return
diff --git a/routers/web/devtest/devtest.go b/routers/web/devtest/devtest.go
index 784940909a6..48875e306d2 100644
--- a/routers/web/devtest/devtest.go
+++ b/routers/web/devtest/devtest.go
@@ -7,6 +7,7 @@ import (
"net/http"
"path"
"strings"
+ "time"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
@@ -32,5 +33,14 @@ func List(ctx *context.Context) {
}
func Tmpl(ctx *context.Context) {
+ now := time.Now()
+ ctx.Data["TimeNow"] = now
+ ctx.Data["TimePast5s"] = now.Add(-5 * time.Second)
+ ctx.Data["TimeFuture5s"] = now.Add(5 * time.Second)
+ ctx.Data["TimePast2m"] = now.Add(-2 * time.Minute)
+ ctx.Data["TimeFuture2m"] = now.Add(2 * time.Minute)
+ ctx.Data["TimePast1y"] = now.Add(-1 * 366 * 86400 * time.Second)
+ ctx.Data["TimeFuture1y"] = now.Add(1 * 366 * 86400 * time.Second)
+
ctx.HTML(http.StatusOK, base.TplName("devtest"+path.Clean("/"+ctx.Params("sub"))))
}
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 3546334ed64..0e232c194c2 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -12,7 +12,6 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
- "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
@@ -23,10 +22,6 @@ import (
"code.gitea.io/gitea/modules/util"
)
-const (
- tplBlame base.TplName = "repo/home"
-)
-
type blameRow struct {
RowNumber int
Avatar gotemplate.HTML
@@ -140,7 +135,7 @@ func RefBlame(ctx *context.Context) {
renderBlame(ctx, blameParts, commitNames, previousCommits)
- ctx.HTML(http.StatusOK, tplBlame)
+ ctx.HTML(http.StatusOK, tplRepoHome)
}
func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) (map[string]*user_model.UserCommit, map[string]string) {
diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go
index c49eb762d8a..92abe0ce259 100644
--- a/routers/web/repo/compare.go
+++ b/routers/web/repo/compare.go
@@ -551,7 +551,11 @@ func ParseCompareInfo(ctx *context.Context) *CompareInfo {
ctx.ServerError("GetCompareInfo", err)
return nil
}
- ctx.Data["BeforeCommitID"] = ci.CompareInfo.MergeBase
+ if ci.DirectComparison {
+ ctx.Data["BeforeCommitID"] = ci.CompareInfo.BaseCommitID
+ } else {
+ ctx.Data["BeforeCommitID"] = ci.CompareInfo.MergeBase
+ }
return ci
}
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index d251f2043c0..fb61ec00d12 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -964,7 +964,7 @@ func DeleteIssue(ctx *context.Context) {
return
}
- if err := issue_service.DeleteIssue(ctx.Doer, ctx.Repo.GitRepo, issue); err != nil {
+ if err := issue_service.DeleteIssue(ctx, ctx.Doer, ctx.Repo.GitRepo, issue); err != nil {
ctx.ServerError("DeleteIssueByID", err)
return
}
@@ -1132,7 +1132,7 @@ func NewIssuePost(ctx *context.Context) {
Ref: form.Ref,
}
- if err := issue_service.NewIssue(repo, issue, labelIDs, attachments, assigneeIDs); err != nil {
+ if err := issue_service.NewIssue(ctx, repo, issue, labelIDs, attachments, assigneeIDs); err != nil {
if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) {
ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error())
return
@@ -2013,7 +2013,7 @@ func UpdateIssueTitle(ctx *context.Context) {
return
}
- if err := issue_service.ChangeTitle(issue, ctx.Doer, title); err != nil {
+ if err := issue_service.ChangeTitle(ctx, issue, ctx.Doer, title); err != nil {
ctx.ServerError("ChangeTitle", err)
return
}
@@ -2037,7 +2037,7 @@ func UpdateIssueRef(ctx *context.Context) {
ref := ctx.FormTrim("ref")
- if err := issue_service.ChangeIssueRef(issue, ctx.Doer, ref); err != nil {
+ if err := issue_service.ChangeIssueRef(ctx, issue, ctx.Doer, ref); err != nil {
ctx.ServerError("ChangeRef", err)
return
}
@@ -2161,7 +2161,7 @@ func UpdateIssueAssignee(ctx *context.Context) {
for _, issue := range issues {
switch action {
case "clear":
- if err := issue_service.DeleteNotPassedAssignee(issue, ctx.Doer, []*user_model.User{}); err != nil {
+ if err := issue_service.DeleteNotPassedAssignee(ctx, issue, ctx.Doer, []*user_model.User{}); err != nil {
ctx.ServerError("ClearAssignees", err)
return
}
@@ -2182,7 +2182,7 @@ func UpdateIssueAssignee(ctx *context.Context) {
return
}
- _, _, err = issue_service.ToggleAssignee(issue, ctx.Doer, assigneeID)
+ _, _, err = issue_service.ToggleAssignee(ctx, issue, ctx.Doer, assigneeID)
if err != nil {
ctx.ServerError("ToggleAssignee", err)
return
@@ -2269,7 +2269,7 @@ func UpdatePullReviewRequest(ctx *context.Context) {
return
}
- _, err = issue_service.TeamReviewRequest(issue, ctx.Doer, team, action == "attach")
+ _, err = issue_service.TeamReviewRequest(ctx, issue, ctx.Doer, team, action == "attach")
if err != nil {
ctx.ServerError("TeamReviewRequest", err)
return
@@ -2307,7 +2307,7 @@ func UpdatePullReviewRequest(ctx *context.Context) {
return
}
- _, err = issue_service.ReviewRequest(issue, ctx.Doer, reviewer, action == "attach")
+ _, err = issue_service.ReviewRequest(ctx, issue, ctx.Doer, reviewer, action == "attach")
if err != nil {
ctx.ServerError("ReviewRequest", err)
return
diff --git a/routers/web/user/search.go b/routers/web/user/search.go
index c5c3aa75f08..bdc4116e377 100644
--- a/routers/web/user/search.go
+++ b/routers/web/user/search.go
@@ -24,6 +24,7 @@ func Search(ctx *context.Context) {
Keyword: ctx.FormTrim("q"),
UID: ctx.FormInt64("uid"),
Type: user_model.UserTypeIndividual,
+ IsActive: ctx.FormOptionalBool("active"),
ListOptions: listOptions,
})
if err != nil {
diff --git a/services/issue/assignee.go b/services/issue/assignee.go
index e5e1456c3f1..4d0224d4bff 100644
--- a/services/issue/assignee.go
+++ b/services/issue/assignee.go
@@ -6,7 +6,6 @@ package issue
import (
"context"
- "code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/organization"
"code.gitea.io/gitea/models/perm"
@@ -18,7 +17,7 @@ import (
)
// DeleteNotPassedAssignee deletes all assignees who aren't passed via the "assignees" array
-func DeleteNotPassedAssignee(issue *issues_model.Issue, doer *user_model.User, assignees []*user_model.User) (err error) {
+func DeleteNotPassedAssignee(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, assignees []*user_model.User) (err error) {
var found bool
oriAssignes := make([]*user_model.User, len(issue.Assignees))
_ = copy(oriAssignes, issue.Assignees)
@@ -34,7 +33,7 @@ func DeleteNotPassedAssignee(issue *issues_model.Issue, doer *user_model.User, a
if !found {
// This function also does comments and hooks, which is why we call it separately instead of directly removing the assignees here
- if _, _, err := ToggleAssignee(issue, doer, assignee.ID); err != nil {
+ if _, _, err := ToggleAssignee(ctx, issue, doer, assignee.ID); err != nil {
return err
}
}
@@ -44,25 +43,25 @@ func DeleteNotPassedAssignee(issue *issues_model.Issue, doer *user_model.User, a
}
// ToggleAssignee changes a user between assigned and not assigned for this issue, and make issue comment for it.
-func ToggleAssignee(issue *issues_model.Issue, doer *user_model.User, assigneeID int64) (removed bool, comment *issues_model.Comment, err error) {
- removed, comment, err = issues_model.ToggleIssueAssignee(issue, doer, assigneeID)
+func ToggleAssignee(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, assigneeID int64) (removed bool, comment *issues_model.Comment, err error) {
+ removed, comment, err = issues_model.ToggleIssueAssignee(ctx, issue, doer, assigneeID)
if err != nil {
return
}
- assignee, err1 := user_model.GetUserByID(db.DefaultContext, assigneeID)
+ assignee, err1 := user_model.GetUserByID(ctx, assigneeID)
if err1 != nil {
err = err1
return
}
- notification.NotifyIssueChangeAssignee(db.DefaultContext, doer, issue, assignee, removed, comment)
+ notification.NotifyIssueChangeAssignee(ctx, doer, issue, assignee, removed, comment)
return removed, comment, err
}
// ReviewRequest add or remove a review request from a user for this PR, and make comment for it.
-func ReviewRequest(issue *issues_model.Issue, doer, reviewer *user_model.User, isAdd bool) (comment *issues_model.Comment, err error) {
+func ReviewRequest(ctx context.Context, issue *issues_model.Issue, doer, reviewer *user_model.User, isAdd bool) (comment *issues_model.Comment, err error) {
if isAdd {
comment, err = issues_model.AddReviewRequest(issue, reviewer, doer)
} else {
@@ -74,7 +73,7 @@ func ReviewRequest(issue *issues_model.Issue, doer, reviewer *user_model.User, i
}
if comment != nil {
- notification.NotifyPullReviewRequest(db.DefaultContext, doer, issue, reviewer, isAdd, comment)
+ notification.NotifyPullReviewRequest(ctx, doer, issue, reviewer, isAdd, comment)
}
return comment, err
@@ -229,7 +228,7 @@ func IsValidTeamReviewRequest(ctx context.Context, reviewer *organization.Team,
}
// TeamReviewRequest add or remove a review request from a team for this PR, and make comment for it.
-func TeamReviewRequest(issue *issues_model.Issue, doer *user_model.User, reviewer *organization.Team, isAdd bool) (comment *issues_model.Comment, err error) {
+func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, reviewer *organization.Team, isAdd bool) (comment *issues_model.Comment, err error) {
if isAdd {
comment, err = issues_model.AddTeamReviewRequest(issue, reviewer, doer)
} else {
@@ -245,11 +244,11 @@ func TeamReviewRequest(issue *issues_model.Issue, doer *user_model.User, reviewe
}
// notify all user in this team
- if err = comment.LoadIssue(db.DefaultContext); err != nil {
+ if err = comment.LoadIssue(ctx); err != nil {
return
}
- members, err := organization.GetTeamMembers(db.DefaultContext, &organization.SearchMembersOptions{
+ members, err := organization.GetTeamMembers(ctx, &organization.SearchMembersOptions{
TeamID: reviewer.ID,
})
if err != nil {
@@ -261,7 +260,7 @@ func TeamReviewRequest(issue *issues_model.Issue, doer *user_model.User, reviewe
continue
}
comment.AssigneeID = member.ID
- notification.NotifyPullReviewRequest(db.DefaultContext, doer, issue, member, isAdd, comment)
+ notification.NotifyPullReviewRequest(ctx, doer, issue, member, isAdd, comment)
}
return comment, err
diff --git a/services/issue/assignee_test.go b/services/issue/assignee_test.go
index 114ace078ed..43b24e1d1fc 100644
--- a/services/issue/assignee_test.go
+++ b/services/issue/assignee_test.go
@@ -31,7 +31,7 @@ func TestDeleteNotPassedAssignee(t *testing.T) {
assert.True(t, isAssigned)
// Clean everyone
- err = DeleteNotPassedAssignee(issue, user1, []*user_model.User{})
+ err = DeleteNotPassedAssignee(db.DefaultContext, issue, user1, []*user_model.User{})
assert.NoError(t, err)
assert.EqualValues(t, 0, len(issue.Assignees))
diff --git a/services/issue/comments.go b/services/issue/comments.go
index 1323fb47aa4..4fe07c17b9d 100644
--- a/services/issue/comments.go
+++ b/services/issue/comments.go
@@ -16,8 +16,8 @@ import (
)
// CreateComment creates comment of issue or commit.
-func CreateComment(opts *issues_model.CreateCommentOptions) (comment *issues_model.Comment, err error) {
- ctx, committer, err := db.TxContext(db.DefaultContext)
+func CreateComment(ctx context.Context, opts *issues_model.CreateCommentOptions) (comment *issues_model.Comment, err error) {
+ ctx, committer, err := db.TxContext(ctx)
if err != nil {
return nil, err
}
@@ -53,7 +53,7 @@ func CreateRefComment(doer *user_model.User, repo *repo_model.Repository, issue
return nil
}
- _, err = CreateComment(&issues_model.CreateCommentOptions{
+ _, err = CreateComment(db.DefaultContext, &issues_model.CreateCommentOptions{
Type: issues_model.CommentTypeCommitRef,
Doer: doer,
Repo: repo,
@@ -66,7 +66,7 @@ func CreateRefComment(doer *user_model.User, repo *repo_model.Repository, issue
// CreateIssueComment creates a plain issue comment.
func CreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, content string, attachments []string) (*issues_model.Comment, error) {
- comment, err := CreateComment(&issues_model.CreateCommentOptions{
+ comment, err := CreateComment(ctx, &issues_model.CreateCommentOptions{
Type: issues_model.CommentTypeComment,
Doer: doer,
Repo: repo,
diff --git a/services/issue/issue.go b/services/issue/issue.go
index b91ee4fc18b..d4f827e99af 100644
--- a/services/issue/issue.go
+++ b/services/issue/issue.go
@@ -4,6 +4,7 @@
package issue
import (
+ "context"
"fmt"
activities_model "code.gitea.io/gitea/models/activities"
@@ -20,49 +21,49 @@ import (
)
// NewIssue creates new issue with labels for repository.
-func NewIssue(repo *repo_model.Repository, issue *issues_model.Issue, labelIDs []int64, uuids []string, assigneeIDs []int64) error {
+func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *issues_model.Issue, labelIDs []int64, uuids []string, assigneeIDs []int64) error {
if err := issues_model.NewIssue(repo, issue, labelIDs, uuids); err != nil {
return err
}
for _, assigneeID := range assigneeIDs {
- if err := AddAssigneeIfNotAssigned(issue, issue.Poster, assigneeID); err != nil {
+ if err := AddAssigneeIfNotAssigned(ctx, issue, issue.Poster, assigneeID); err != nil {
return err
}
}
- mentions, err := issues_model.FindAndUpdateIssueMentions(db.DefaultContext, issue, issue.Poster, issue.Content)
+ mentions, err := issues_model.FindAndUpdateIssueMentions(ctx, issue, issue.Poster, issue.Content)
if err != nil {
return err
}
- notification.NotifyNewIssue(db.DefaultContext, issue, mentions)
+ notification.NotifyNewIssue(ctx, issue, mentions)
if len(issue.Labels) > 0 {
- notification.NotifyIssueChangeLabels(db.DefaultContext, issue.Poster, issue, issue.Labels, nil)
+ notification.NotifyIssueChangeLabels(ctx, issue.Poster, issue, issue.Labels, nil)
}
if issue.Milestone != nil {
- notification.NotifyIssueChangeMilestone(db.DefaultContext, issue.Poster, issue, 0)
+ notification.NotifyIssueChangeMilestone(ctx, issue.Poster, issue, 0)
}
return nil
}
// ChangeTitle changes the title of this issue, as the given user.
-func ChangeTitle(issue *issues_model.Issue, doer *user_model.User, title string) (err error) {
+func ChangeTitle(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, title string) (err error) {
oldTitle := issue.Title
issue.Title = title
- if err = issues_model.ChangeIssueTitle(issue, doer, oldTitle); err != nil {
+ if err = issues_model.ChangeIssueTitle(ctx, issue, doer, oldTitle); err != nil {
return
}
- notification.NotifyIssueChangeTitle(db.DefaultContext, doer, issue, oldTitle)
+ notification.NotifyIssueChangeTitle(ctx, doer, issue, oldTitle)
return nil
}
// ChangeIssueRef changes the branch of this issue, as the given user.
-func ChangeIssueRef(issue *issues_model.Issue, doer *user_model.User, ref string) error {
+func ChangeIssueRef(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, ref string) error {
oldRef := issue.Ref
issue.Ref = ref
@@ -70,7 +71,7 @@ func ChangeIssueRef(issue *issues_model.Issue, doer *user_model.User, ref string
return err
}
- notification.NotifyIssueChangeRef(db.DefaultContext, doer, issue, oldRef)
+ notification.NotifyIssueChangeRef(ctx, doer, issue, oldRef)
return nil
}
@@ -81,7 +82,7 @@ func ChangeIssueRef(issue *issues_model.Issue, doer *user_model.User, ref string
// "assignees" (array): Logins for Users to assign to this issue.
// Pass one or more user logins to replace the set of assignees on this Issue.
// Send an empty array ([]) to clear all assignees from the Issue.
-func UpdateAssignees(issue *issues_model.Issue, oneAssignee string, multipleAssignees []string, doer *user_model.User) (err error) {
+func UpdateAssignees(ctx context.Context, issue *issues_model.Issue, oneAssignee string, multipleAssignees []string, doer *user_model.User) (err error) {
var allNewAssignees []*user_model.User
// Keep the old assignee thingy for compatibility reasons
@@ -102,7 +103,7 @@ func UpdateAssignees(issue *issues_model.Issue, oneAssignee string, multipleAssi
// Loop through all assignees to add them
for _, assigneeName := range multipleAssignees {
- assignee, err := user_model.GetUserByName(db.DefaultContext, assigneeName)
+ assignee, err := user_model.GetUserByName(ctx, assigneeName)
if err != nil {
return err
}
@@ -111,7 +112,7 @@ func UpdateAssignees(issue *issues_model.Issue, oneAssignee string, multipleAssi
}
// Delete all old assignees not passed
- if err = DeleteNotPassedAssignee(issue, doer, allNewAssignees); err != nil {
+ if err = DeleteNotPassedAssignee(ctx, issue, doer, allNewAssignees); err != nil {
return err
}
@@ -121,7 +122,7 @@ func UpdateAssignees(issue *issues_model.Issue, oneAssignee string, multipleAssi
// has access to the repo.
for _, assignee := range allNewAssignees {
// Extra method to prevent double adding (which would result in removing)
- err = AddAssigneeIfNotAssigned(issue, doer, assignee.ID)
+ err = AddAssigneeIfNotAssigned(ctx, issue, doer, assignee.ID)
if err != nil {
return err
}
@@ -131,42 +132,42 @@ func UpdateAssignees(issue *issues_model.Issue, oneAssignee string, multipleAssi
}
// DeleteIssue deletes an issue
-func DeleteIssue(doer *user_model.User, gitRepo *git.Repository, issue *issues_model.Issue) error {
+func DeleteIssue(ctx context.Context, doer *user_model.User, gitRepo *git.Repository, issue *issues_model.Issue) error {
// load issue before deleting it
- if err := issue.LoadAttributes(gitRepo.Ctx); err != nil {
+ if err := issue.LoadAttributes(ctx); err != nil {
return err
}
- if err := issue.LoadPullRequest(gitRepo.Ctx); err != nil {
+ if err := issue.LoadPullRequest(ctx); err != nil {
return err
}
// delete entries in database
- if err := deleteIssue(issue); err != nil {
+ if err := deleteIssue(ctx, issue); err != nil {
return err
}
// delete pull request related git data
- if issue.IsPull {
+ if issue.IsPull && gitRepo != nil {
if err := gitRepo.RemoveReference(fmt.Sprintf("%s%d/head", git.PullPrefix, issue.PullRequest.Index)); err != nil {
return err
}
}
- notification.NotifyDeleteIssue(gitRepo.Ctx, doer, issue)
+ notification.NotifyDeleteIssue(ctx, doer, issue)
return nil
}
// AddAssigneeIfNotAssigned adds an assignee only if he isn't already assigned to the issue.
// Also checks for access of assigned user
-func AddAssigneeIfNotAssigned(issue *issues_model.Issue, doer *user_model.User, assigneeID int64) (err error) {
- assignee, err := user_model.GetUserByID(db.DefaultContext, assigneeID)
+func AddAssigneeIfNotAssigned(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, assigneeID int64) (err error) {
+ assignee, err := user_model.GetUserByID(ctx, assigneeID)
if err != nil {
return err
}
// Check if the user is already assigned
- isAssigned, err := issues_model.IsUserAssignedToIssue(db.DefaultContext, issue, assignee)
+ isAssigned, err := issues_model.IsUserAssignedToIssue(ctx, issue, assignee)
if err != nil {
return err
}
@@ -175,7 +176,7 @@ func AddAssigneeIfNotAssigned(issue *issues_model.Issue, doer *user_model.User,
return nil
}
- valid, err := access_model.CanBeAssigned(db.DefaultContext, assignee, issue.Repo, issue.IsPull)
+ valid, err := access_model.CanBeAssigned(ctx, assignee, issue.Repo, issue.IsPull)
if err != nil {
return err
}
@@ -183,7 +184,7 @@ func AddAssigneeIfNotAssigned(issue *issues_model.Issue, doer *user_model.User,
return repo_model.ErrUserDoesNotHaveAccessToRepo{UserID: assigneeID, RepoName: issue.Repo.Name}
}
- _, _, err = ToggleAssignee(issue, doer, assigneeID)
+ _, _, err = ToggleAssignee(ctx, issue, doer, assigneeID)
if err != nil {
return err
}
@@ -206,8 +207,8 @@ func GetRefEndNamesAndURLs(issues []*issues_model.Issue, repoLink string) (map[i
}
// deleteIssue deletes the issue
-func deleteIssue(issue *issues_model.Issue) error {
- ctx, committer, err := db.TxContext(db.DefaultContext)
+func deleteIssue(ctx context.Context, issue *issues_model.Issue) error {
+ ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
}
diff --git a/services/issue/issue_test.go b/services/issue/issue_test.go
index b67d2e2e79a..da0e97c23c2 100644
--- a/services/issue/issue_test.go
+++ b/services/issue/issue_test.go
@@ -44,7 +44,7 @@ func TestIssue_DeleteIssue(t *testing.T) {
ID: issueIDs[2],
}
- err = deleteIssue(issue)
+ err = deleteIssue(db.DefaultContext, issue)
assert.NoError(t, err)
issueIDs, err = issues_model.GetIssueIDsByRepoID(db.DefaultContext, 1)
assert.NoError(t, err)
@@ -55,7 +55,7 @@ func TestIssue_DeleteIssue(t *testing.T) {
assert.NoError(t, err)
issue, err = issues_model.GetIssueByID(db.DefaultContext, 4)
assert.NoError(t, err)
- err = deleteIssue(issue)
+ err = deleteIssue(db.DefaultContext, issue)
assert.NoError(t, err)
assert.EqualValues(t, 2, len(attachments))
for i := range attachments {
@@ -78,7 +78,7 @@ func TestIssue_DeleteIssue(t *testing.T) {
assert.NoError(t, err)
assert.False(t, left)
- err = deleteIssue(issue2)
+ err = deleteIssue(db.DefaultContext, issue2)
assert.NoError(t, err)
left, err = issues_model.IssueNoDependenciesLeft(db.DefaultContext, issue1)
assert.NoError(t, err)
diff --git a/services/pull/comment.go b/services/pull/comment.go
index 933ad09a85e..24dfd8af0ce 100644
--- a/services/pull/comment.go
+++ b/services/pull/comment.go
@@ -90,7 +90,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *iss
ops.Content = string(dataJSON)
- comment, err = issue_service.CreateComment(ops)
+ comment, err = issue_service.CreateComment(ctx, ops)
return comment, err
}
diff --git a/services/pull/pull.go b/services/pull/pull.go
index fe2f002010b..55dfd3c1802 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -52,7 +52,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *issu
}
for _, assigneeID := range assigneeIDs {
- if err := issue_service.AddAssigneeIfNotAssigned(pull, pull.Poster, assigneeID); err != nil {
+ if err := issue_service.AddAssigneeIfNotAssigned(ctx, pull, pull.Poster, assigneeID); err != nil {
return err
}
}
@@ -122,7 +122,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *issu
Content: string(dataJSON),
}
- _, _ = issue_service.CreateComment(ops)
+ _, _ = issue_service.CreateComment(ctx, ops)
}
return nil
@@ -221,7 +221,7 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer
OldRef: oldBranch,
NewRef: targetBranch,
}
- if _, err = issue_service.CreateComment(options); err != nil {
+ if _, err = issue_service.CreateComment(ctx, options); err != nil {
return fmt.Errorf("CreateChangeTargetBranchComment: %w", err)
}
diff --git a/services/pull/review.go b/services/pull/review.go
index ba93b5e2f54..6feffe4ec4e 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -248,7 +248,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo
return nil, err
}
}
- return issue_service.CreateComment(&issues_model.CreateCommentOptions{
+ return issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{
Type: issues_model.CommentTypeCode,
Doer: doer,
Repo: repo,
@@ -368,7 +368,7 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string,
return
}
- comment, err = issue_service.CreateComment(&issues_model.CreateCommentOptions{
+ comment, err = issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{
Doer: doer,
Content: message,
Type: issues_model.CommentTypeDismissReview,
diff --git a/templates/devtest/gitea-ui.tmpl b/templates/devtest/gitea-ui.tmpl
index c5ab863d00d..2fe478a07d8 100644
--- a/templates/devtest/gitea-ui.tmpl
+++ b/templates/devtest/gitea-ui.tmpl
@@ -1,12 +1,51 @@
{{template "base/head" .}}
-