send email to info@gitea.co.uk.
`) + test( + `j.doe@example.com, + j.doe@example.com. + j.doe@example.com; + j.doe@example.com? + j.doe@example.com!`, + `j.doe@example.com,
+j.doe@example.com.
+j.doe@example.com;
+j.doe@example.com?
+j.doe@example.com!
`, ``,
+ `THUMBS UP`, `THUMBS UP`,
+ `Hello World`, `Hello World`,
+ `wg(8) tool`, `Provides alternative wg(8) tool`,
+ }
+
+ for i := 0; i < len(testCases); i += 2 {
+ assert.Equal(t, testCases[i+1], SanitizeDescription(testCases[i]))
+ }
+}
+
func TestSanitizeNonEscape(t *testing.T) {
descStr := ".drone.yml, /docs/**/*.txt."
@@ -2886,6 +2886,7 @@ packages.package_manage_panel = Package Management
packages.total_size = Total Size: %s
packages.unreferenced_size = Unreferenced Size: %s
packages.cleanup = Clean up expired data
+packages.cleanup.success = Cleaned up expired data successfully
packages.owner = Owner
packages.creator = Creator
packages.name = Name
@@ -3538,7 +3539,11 @@ runs.status = Status
runs.actors_no_select = All actors
runs.status_no_select = All status
runs.no_results = No results matched.
+runs.no_workflows = There are no workflows yet.
+runs.no_workflows.quick_start = Don't know how to start with Gitea Action? See the quick start guide.
+runs.no_workflows.documentation = For more information on the Gitea Action, see the documentation.
runs.no_runs = The workflow has no runs yet.
+runs.empty_commit_message = (empty commit message)
workflow.disable = Disable Workflow
workflow.disable_success = Workflow '%s' disabled successfully.
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index ebde7e5baeb..017444cbd09 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -1330,9 +1330,9 @@ projects.column.new_title=Nom
projects.column.new_submit=Créer une colonne
projects.column.new=Nouvelle colonne
projects.column.set_default=Définir par défaut
-projects.column.set_default_desc=Missionne cette colonne d'accueillir les tickets et demande d'ajouts non catégorisés.
+projects.column.set_default_desc=Les tickets et demandes d’ajout non-catégorisés seront placés dans cette colonne.
projects.column.unset_default=Défaire par défaut
-projects.column.unset_default_desc=Décharge cette colonne d'accueillir les tickets et demandes d'ajouts non catégorisées. Ceux-ci iront dans une colonne idoine.
+projects.column.unset_default_desc=Les tickets et demandes d'ajouts non-catégorisés seront placés dans une colonne idoine.
projects.column.delete=Supprimer la colonne
projects.column.deletion_desc=La suppression d'une colonne de projet déplace tous les tickets liés à 'Non catégorisé'. Continuer ?
projects.column.color=Couleur
@@ -3214,22 +3214,22 @@ notices.delete_success=Les informations systèmes ont été supprimées.
[action]
create_repo=a créé le dépôt %s
-rename_repo=a rebaptisé le dépôt de %[1]s vers %[3]s
-commit_repo=a soumis sur %[3]s à %[4]s
-create_issue=`ticket ouvert %[3]s#%[2]s`
-close_issue=`ticket fermé %[3]s#%[2]s`
+rename_repo=a rebaptisé le dépôt %[1]s%s à %s
-push_tag=a poussé l'étiquette %[3]s vers %[4]s
-delete_tag=étiquette supprimée %[2]s de %[3]s
-delete_branch=branche %[2]s supprimée de %[3]s
+comment_pull=`a commenté la demande d’ajout %[3]s#%[2]s`
+merge_pull_request=`a fusionné la demande d’ajout %[3]s#%[2]s`
+auto_merge_pull_request=`a fusionné automatiquement la demande d’ajout %[3]s#%[2]s`
+transfer_repo=a transféré le dépôt %s vers %s
+push_tag=a poussé l’étiquette %[3]s vers %[4]s
+delete_tag=a supprimé l’étiquette %[2]s de %[3]s
+delete_branch=a supprimée la branche %[2]s de %[3]s
compare_branch=Comparer
compare_commits=Comparer %d révisions
compare_commits_general=Comparer les révisions
@@ -3242,8 +3242,8 @@ publish_release=`a publié "%[4]s" à %[3]
review_dismissed=`a révoqué l’évaluation de %[4]s sur %[3]s#%[2]s.`
review_dismissed_reason=Raison :
create_branch=a créé la branche %[3]s dans %[4]s.
-starred_repo=est fan de %[2]s.
-watched_repo=observe %[2]s.
+starred_repo=aime %[2]s
+watched_repo=observe %[2]s
[tool]
now=maintenant
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 3a560eba1d1..aad2d86b832 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -163,7 +163,7 @@ buttons.code.tooltip=Добавить код
buttons.link.tooltip=Добавить ссылку
buttons.list.unordered.tooltip=Добавить маркированный список
buttons.list.ordered.tooltip=Добавить нумерованный список
-buttons.list.task.tooltip=Добавить список задач
+buttons.list.task.tooltip=Добавить список заданий
buttons.mention.tooltip=Упомянуть пользователя или команду
buttons.ref.tooltip=Сослаться на задачу или запрос на слияние
buttons.switch_to_legacy.tooltip=Использовать старый редактор
@@ -937,6 +937,7 @@ fork_from=Форк от
already_forked=Вы уже форкнули %s
fork_to_different_account=Ответвление для другой учётной записи
fork_visibility_helper=Видимость форкнутого репозитория изменить нельзя.
+fork_branch=Ветка для клонирования в форк
all_branches=Все ветки
use_template=Использовать этот шаблон
clone_in_vsc=Клонировать в VS Code
@@ -1316,7 +1317,7 @@ projects.card_type.desc=Предпросмотр карточек
projects.card_type.images_and_text=Изображения и текст
projects.card_type.text_only=Только текст
-issues.desc=Организация отчетов об ошибках, задач и этапов.
+issues.desc=Организация отчетов об ошибках, заданий и этапов.
issues.filter_assignees=Фильтр назначений
issues.filter_milestones=Фильтр этапов
issues.filter_projects=Фильтровать проекты
@@ -1801,7 +1802,13 @@ milestones.filter_sort.most_issues=Большинство задач
milestones.filter_sort.least_issues=Меньшинство задач
signing.will_sign=Этот коммит будет подписан ключом «%s».
+signing.wont_sign.never=Коммиты никогда не подписываются.
+signing.wont_sign.always=Коммиты всегда подписываются.
+signing.wont_sign.pubkey=Этот коммит не будет подписан, поскольку к вашей учётной записи не привязано публичного ключа.
+signing.wont_sign.twofa=Для подписания коммитов у вас должна быть включена двухфакторная аутентификация.
signing.wont_sign.basesigned=Слияние не будет подписано, так как базовый коммит не подписан.
+signing.wont_sign.commitssigned=Слияние не будет подписано, так как все связанные коммиты не подписаны.
+signing.wont_sign.approved=Слияние не будет подписано, так как запрос на слияние не одобрен.
signing.wont_sign.not_signed_in=Вы не вошли в систему.
ext_wiki=Доступ к внешней вики
@@ -1849,8 +1856,8 @@ activity.merged_prs_count_1=Принятый запрос на слияние
activity.merged_prs_count_n=Принятых запросов на слияние
activity.opened_prs_count_1=Новый запрос на слияние
activity.opened_prs_count_n=Новых запросов на слияние
-activity.title.user_1=%d пользователь
-activity.title.user_n=%d пользователей
+activity.title.user_1=%d пользователем
+activity.title.user_n=%d пользователями
activity.title.prs_1=%d запрос на слияние
activity.title.prs_n=%d запросов на слияние
activity.title.prs_merged_by=%s приняты %s
@@ -1861,9 +1868,9 @@ activity.active_issues_count_1=%d Активная задача
activity.active_issues_count_n=%d Активных задач
activity.closed_issues_count_1=Закрытая задача
activity.closed_issues_count_n=Закрытых задач
-activity.title.issues_1=%d Задача
-activity.title.issues_n=%d Задач
-activity.title.issues_closed_from=%s закрыто %s
+activity.title.issues_1=%d задача
+activity.title.issues_n=%d задач
+activity.title.issues_closed_from=%s закрыто от %s
activity.title.issues_created_by=%s создано %s
activity.closed_issue_label=Закрыто
activity.new_issues_count_1=Новая задача
@@ -1881,8 +1888,8 @@ activity.no_git_activity=В этот период не было новых ко
activity.git_stats_exclude_merges=За исключением слияний,
activity.git_stats_author_1=%d автор
activity.git_stats_author_n=%d автора(ов)
-activity.git_stats_pushed_1=отправлен
-activity.git_stats_pushed_n=отправлено
+activity.git_stats_pushed_1=отправил
+activity.git_stats_pushed_n=отправили
activity.git_stats_commit_1=%d коммит
activity.git_stats_commit_n=%d коммитов
activity.git_stats_push_to_branch=в %s и
@@ -1890,8 +1897,8 @@ activity.git_stats_push_to_all_branches=во все ветки.
activity.git_stats_on_default_branch=На %s,
activity.git_stats_file_1=%d файл
activity.git_stats_file_n=%d файлов
-activity.git_stats_files_changed_1=изменилось
-activity.git_stats_files_changed_n=изменено
+activity.git_stats_files_changed_1=изменён,
+activity.git_stats_files_changed_n=изменены,
activity.git_stats_additions=и там было
activity.git_stats_addition_1=%d добавление
activity.git_stats_addition_n=%d добавлений
@@ -1942,6 +1949,7 @@ settings.mirror_settings.last_update=Последнее обновление
settings.mirror_settings.push_mirror.none=Push-зеркало не добавлено
settings.mirror_settings.push_mirror.remote_url=URL удалённого хранилища
settings.mirror_settings.push_mirror.add=Добавить Push-зеркало
+settings.mirror_settings.push_mirror.edit_sync_time=Изменить интервал синхронизации зеркала
settings.sync_mirror=Синхронизировать
settings.site=Сайт
@@ -2146,6 +2154,7 @@ settings.event_pull_request_sync_desc=Запрос на слияние синх
settings.event_pull_request_review_request=Запрошена рецензия для запроса на слияние
settings.event_pull_request_review_request_desc=Создан или удалён запрос на рецензию для запроса на слияние.
settings.event_pull_request_approvals=Утверждения запросов на слияние
+settings.event_pull_request_merge=Удовлетворение запросов на слияние
settings.event_package=Пакеты
settings.event_package_desc=Пакет создан или удален в репозитории.
settings.branch_filter=Фильтр веток
@@ -2208,6 +2217,7 @@ settings.protect_disable_push=Отключить отправку
settings.protect_disable_push_desc=Отправка не будет разрешена в эту ветку.
settings.protect_enable_push=Включить отправку
settings.protect_enable_push_desc=Любому, у кого есть доступ на запись, будет разрешена отправка изменений в эту ветку (но не принудительная отправка).
+settings.protect_enable_merge=Разрешить всем
settings.protect_enable_merge_desc=Все, у кого есть доступ на запись, смогут удовлетворять запросы на слияние в эту ветку.
settings.protect_whitelist_committers=Ограничение отправки по белому списку
settings.protect_whitelist_committers_desc=Только пользователям или командам из белого списка будет разрешена отправка изменений в эту ветку (но не принудительная отправка).
@@ -2432,6 +2442,7 @@ branch.already_exists=Ветка с именем «%s» уже существу
branch.delete_head=Удалить
branch.delete=Удалить ветку «%s»
branch.delete_html=Удалить ветку
+branch.delete_desc=Удаление ветки необратимо. Несмотря на то, что удаленная ветка может просуществовать некоторое время перед тем, как она будет окончательно удалена, это действие НЕВОЗМОЖНО отменить в большинстве случаев. Продолжить?
branch.deletion_success=Ветка «%s» удалена.
branch.deletion_failed=Не удалось удалить ветку «%s».
branch.delete_branch_has_new_commits=Ветку «%s» нельзя удалить, поскольку после слияния были добавлены новые коммиты.
@@ -2470,7 +2481,7 @@ tag.create_success=Тег «%s» создан.
topic.manage_topics=Редактировать тематические метки
topic.done=Сохранить
-topic.count_prompt=Вы не можете выбрать более 25 тем
+topic.count_prompt=Нельзя выбрать более 25 тем
find_file.go_to_file=Перейти к файлу
find_file.no_matching=Совпадающих файлов не найдено
@@ -2509,6 +2520,7 @@ form.create_org_not_allowed=Этому пользователю не разре
settings=Настройки
settings.options=Организация
settings.full_name=Полное имя
+settings.email=Почта для связи
settings.website=Сайт
settings.location=Местоположение
settings.permission=Разрешения
@@ -2522,6 +2534,7 @@ settings.visibility.private_shortname=Приватный
settings.update_settings=Обновить настройки
settings.update_setting_success=Настройки организации обновлены.
+settings.change_orgname_prompt=Обратите внимание: изменение названия организации также изменит URL вашей организации и освободит старое имя.
settings.change_orgname_redirect_prompt=Старое имя будет перенаправлено до тех пор, пока оно не будет введено.
settings.update_avatar_success=Аватар организации обновлён.
settings.delete=Удалить организацию
@@ -2625,17 +2638,18 @@ dashboard.operation_run=Запуск
dashboard.clean_unbind_oauth=Очистить список незавершённых авторизаций OAuth
dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены.
dashboard.task.started=Началось задание: %[1]s
-dashboard.task.process=Задача: %[1]s
-dashboard.task.cancelled=Задача: %[1]s отменена: %[3]s
-dashboard.task.error=Ошибка в Задаче: %[1]s: %[3]s
-dashboard.task.finished=Задача: %[1]s, начатая %[2]s завершена
-dashboard.task.unknown=Неизвестная задача: %[1]s
-dashboard.cron.started=Стартовал Cron: %[1]s
-dashboard.cron.process=Cron: %[1]s
-dashboard.cron.error=Ошибка в задаче Cron: %s: %[3]s
-dashboard.cron.finished=Крон: %[1]s завершено
+dashboard.task.process=Задание: %[1]s
+dashboard.task.cancelled=Задание %[1]s отменено: %[3]s
+dashboard.task.error=Ошибка в задании: %[1]s: %[3]s
+dashboard.task.finished=Задание %[1]s, начатое %[2]s, завершено
+dashboard.task.unknown=Неизвестное задание: %[1]s
+dashboard.cron.started=Планировщик запущен: %[1]s
+dashboard.cron.process=Планировщик: %[1]s
+dashboard.cron.cancelled=Планировщик: %[1]s отменено: %[3]s
+dashboard.cron.error=Ошибка в запланированном задании: %s: %[3]s
+dashboard.cron.finished=Планировщик: %[1]s завершено
dashboard.delete_inactive_accounts=Удалить все неактивированные учётные записи
-dashboard.delete_inactive_accounts.started=Удалить все запущенные задачи неактивированных аккаунтов.
+dashboard.delete_inactive_accounts.started=Удаление всех неактивированных учётных записей началось.
dashboard.delete_repo_archives=Удалить все архивы репозиториев (ZIP, TAR.GZ, и т.д..)
dashboard.delete_repo_archives.started=Удаление всех архивов репозитория началось.
dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git
@@ -2689,8 +2703,8 @@ dashboard.delete_old_actions.started=Удалите все старые дейс
dashboard.update_checker=Проверка обновлений
dashboard.delete_old_system_notices=Удалить все старые системные уведомления из базы данных
dashboard.gc_lfs=Выполнить сборку мусора метаобъектов LFS
-dashboard.stop_zombie_tasks=Остановить задачи-зомби
-dashboard.stop_endless_tasks=Остановить бесконечные задачи
+dashboard.stop_zombie_tasks=Остановить задания-зомби
+dashboard.stop_endless_tasks=Остановить бесконечные задания
dashboard.cancel_abandoned_jobs=Отменить брошенные задания
users.user_manage_panel=Панель управления пользователями
@@ -2700,6 +2714,8 @@ users.full_name=Полное имя
users.activated=Активирован
users.admin=Администратор
users.restricted=Ограничено
+users.reserved=Зарезервировано
+users.bot=Бот
users.2fa=Двухфакторная авторизация
users.repos=Репозитории
users.created=Создано
@@ -2746,6 +2762,7 @@ users.list_status_filter.is_prohibit_login=Запретить вход
users.list_status_filter.not_prohibit_login=Разрешить вход
users.list_status_filter.is_2fa_enabled=2FA включено
users.list_status_filter.not_2fa_enabled=2FA отключено
+users.details=О пользователе
emails.email_manage_panel=Управление эл. почтой пользователя
emails.primary=Первичный
@@ -2782,6 +2799,7 @@ repos.lfs_size=Размер LFS
packages.package_manage_panel=Управление пакетами
packages.total_size=Общий размер: %s
packages.unreferenced_size=Размер по ссылке: %s
+packages.cleanup=Очистить устаревшие данные
packages.owner=Владелец
packages.creator=Автор
packages.name=Наименование
@@ -2928,6 +2946,7 @@ config.disable_router_log=Отключение журнала маршрутиз
config.run_user=Запуск от имени пользователя
config.run_mode=Режим выполнения
config.git_version=Версия Git
+config.app_data_path=Путь к данным приложения
config.repo_root_path=Путь до папки репозиториев
config.lfs_root_path=Корневой путь LFS
config.log_file_root_path=Путь к журналу
@@ -3053,7 +3072,7 @@ config.set_setting_failed=Задать параметр %s не удалось
monitor.stats=Статистика
-monitor.cron=Задачи cron
+monitor.cron=Запланированные задания
monitor.name=Название
monitor.schedule=Расписание
monitor.next=Следующий раз
@@ -3100,7 +3119,7 @@ notices.delete_selected=Удалить выбранные
notices.delete_all=Удалить все уведомления
notices.type=Тип
notices.type_1=Репозиторий
-notices.type_2=Задача
+notices.type_2=Задание
notices.desc=Описание
notices.op=Oп.
notices.delete_success=Уведомления системы были удалены.
@@ -3200,6 +3219,7 @@ desc=Управление пакетами репозитория.
empty=Пока нет пакетов.
empty.documentation=Дополнительную информацию о реестре пакетов можно найти в документации.
empty.repo=Вы загрузили пакет, но он здесь не отображается? Перейдите в настройки пакета и свяжите его с этим репозиторием.
+registry.documentation=Для получения дополнительной информации о реестре %s смотрите документацию.
filter.type=Тип
filter.type.all=Все
filter.no_result=Фильтр не дал результатов.
@@ -3289,6 +3309,8 @@ pub.install=Чтобы установить пакет с помощью Dart,
pypi.requires=Требуется Python
pypi.install=Чтобы установить пакет с помощью pip, выполните следующую команду:
rpm.registry=Настроить реестр из командной строки:
+rpm.distros.redhat=на дистрибутивах семейства RedHat
+rpm.distros.suse=на дистрибутивах семейства SUSE
rpm.install=Чтобы установить пакет, выполните следующую команду:
rubygems.install=Чтобы установить пакет с помощью gem, выполните следующую команду:
rubygems.install2=или добавьте его в Gemfile:
@@ -3313,6 +3335,7 @@ settings.delete.success=Пакет удалён.
settings.delete.error=Не удалось удалить пакет.
owner.settings.cargo.title=Индекс реестра Cargo
owner.settings.cargo.initialize=Инициализировать индекс
+owner.settings.cargo.initialize.description=Для использования реестра Cargo необходим специальный Git-репозиторий с индексом. Эта опция (пере)создаст репозиторий и настроит его автоматически.
owner.settings.cargo.initialize.error=Не удалось инициализировать индекс Cargo: %v
owner.settings.cargo.initialize.success=Индекс Cargo успешно создан.
owner.settings.cargo.rebuild=Перестроить индекс
@@ -3381,7 +3404,8 @@ runners.description=Описание
runners.labels=Метки
runners.last_online=Был онлайн
runners.runner_title=Раннер
-runners.task_list=Недавние задачи на раннере
+runners.task_list=Недавние задания на раннере
+runners.task_list.no_tasks=Задания пока нет.
runners.task_list.run=Запуск
runners.task_list.status=Статус
runners.task_list.repository=Репозиторий
@@ -3395,7 +3419,7 @@ runners.delete_runner=Удалить этот раннер
runners.delete_runner_success=Раннер успешно удалён
runners.delete_runner_failed=Не удалось удалить раннер
runners.delete_runner_header=Подтвердите удаление раннера
-runners.delete_runner_notice=Если на этом раннере выполняется задача, она будет завершена и помечена как неудачная. Это может нарушить рабочий поток сборки.
+runners.delete_runner_notice=Если на этом раннере выполняется задание, оно будет завершено и помечено как неудачное. Это может нарушить рабочий поток сборки.
runners.none=Нет доступных раннеров
runners.status.unspecified=Неизвестно
runners.status.idle=Простаивает
@@ -3406,10 +3430,19 @@ runners.reset_registration_token_success=Токен регистрации ра
runs.all_workflows=Все рабочие потоки
runs.commit=коммит
+runs.pushed_by=отправлено
runs.invalid_workflow_helper=Файл конфигурации рабочего потока некорректен. Пожалуйста, проверьте конфигурационный файл: %s
runs.no_matching_runner_helper=Нет подходящего раннера: %s
+runs.actor=Актор
runs.status=Статус
+runs.actors_no_select=Все акторы
+runs.no_runs=Рабочий поток ещё не запускался.
+workflow.disable=Выключить рабочий поток
+workflow.disable_success=Рабочий поток «%s» успешно выключен.
+workflow.enable=Включить рабочий поток
+workflow.enable_success=Рабочий поток «%s» успешно включен.
+workflow.disabled=Рабочий поток выключен.
need_approval_desc=Требуется одобрение, чтобы запустить рабочие потоки для запроса на слияние.
diff --git a/package-lock.json b/package-lock.json
index fa9c8a73280..5a49efee23e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,7 @@
"@claviska/jquery-minicolors": "2.3.6",
"@github/markdown-toolbar-element": "2.2.1",
"@github/relative-time-element": "4.3.0",
- "@github/text-expander-element": "2.5.0",
+ "@github/text-expander-element": "2.6.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.8.0",
"@webcomponents/custom-elements": "1.6.0",
@@ -25,12 +25,12 @@
"easymde": "2.18.0",
"esbuild-loader": "4.0.2",
"escape-goat": "4.0.0",
- "fast-glob": "3.3.1",
+ "fast-glob": "3.3.2",
"jquery": "3.7.1",
"katex": "0.16.9",
"license-checker-webpack-plugin": "0.2.1",
"lightningcss-loader": "2.1.0",
- "mermaid": "10.6.0",
+ "mermaid": "10.6.1",
"mini-css-extract-plugin": "2.7.6",
"minimatch": "9.0.3",
"monaco-editor": "0.44.0",
@@ -38,14 +38,14 @@
"pdfobject": "2.2.12",
"pretty-ms": "8.0.0",
"sortablejs": "1.15.0",
- "swagger-ui-dist": "5.9.1",
+ "swagger-ui-dist": "5.10.0",
"throttle-debounce": "5.0.0",
"tinycolor2": "1.6.0",
"tippy.js": "6.3.7",
"toastify-js": "1.12.0",
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
- "vue": "3.3.7",
+ "vue": "3.3.8",
"vue-bar-graph": "2.0.0",
"vue-loader": "17.3.1",
"vue3-calendar-heatmap": "2.0.5",
@@ -55,11 +55,11 @@
},
"devDependencies": {
"@eslint-community/eslint-plugin-eslint-comments": "4.1.0",
- "@playwright/test": "1.39.0",
+ "@playwright/test": "1.40.0",
"@stoplight/spectral-cli": "6.11.0",
- "@stylistic/eslint-plugin-js": "1.0.0",
- "@vitejs/plugin-vue": "4.4.0",
- "eslint": "8.53.0",
+ "@stylistic/eslint-plugin-js": "1.4.0",
+ "@vitejs/plugin-vue": "4.5.0",
+ "eslint": "8.54.0",
"eslint-plugin-array-func": "4.0.0",
"eslint-plugin-i": "2.29.0",
"eslint-plugin-jquery": "1.5.1",
@@ -80,7 +80,7 @@
"stylelint-declaration-block-no-ignored-properties": "2.7.0",
"stylelint-declaration-strict-value": "1.9.2",
"stylelint-stylistic": "0.4.3",
- "svgo": "3.0.2",
+ "svgo": "3.0.4",
"updates": "15.0.4",
"vite-string-plugin": "1.1.2",
"vitest": "0.34.6"
@@ -286,9 +286,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
- "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz",
+ "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -987,9 +987,9 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.53.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
- "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz",
+ "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1011,9 +1011,9 @@
"integrity": "sha512-+tFjX9//HRS1HnBa5cNgfEtE52arwiutYg1TOF+Trk40SPxst9Q8Rtc3BKD6aKsvfbtub68vfhipgchGjj9o7g=="
},
"node_modules/@github/text-expander-element": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.5.0.tgz",
- "integrity": "sha512-BjCxTshkUCgNXo/8iXUSK1sJ7kMJqhVsw6LAzIFtgaYrm4q2068WnPKjngfR+/QPhxN1nSvgd7CozblEIYjUZA==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.6.1.tgz",
+ "integrity": "sha512-i6krPGXJRABfKXut0WArFd365Je4PT0MljtDoXUoCOEp+lGrmdosDMxmO0EfOYc97jBn+Hd2XO1mMsuI5+fwmQ==",
"dependencies": {
"@github/combobox-nav": "^2.0.2"
}
@@ -1349,12 +1349,12 @@
}
},
"node_modules/@playwright/test": {
- "version": "1.39.0",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz",
- "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==",
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz",
+ "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==",
"dev": true,
"dependencies": {
- "playwright": "1.39.0"
+ "playwright": "1.40.0"
},
"bin": {
"playwright": "cli.js"
@@ -1882,17 +1882,15 @@
"dev": true
},
"node_modules/@stylistic/eslint-plugin-js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.0.0.tgz",
- "integrity": "sha512-xxvjyYnUEgjBTnXKYMk6JbU0LHkf269d6y4IgW69bK/VwHrqLfdgE6mYvft42U7KVpp6Tbf6Z64tLRYD/rYd/A==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.4.0.tgz",
+ "integrity": "sha512-cANyn4ECWu8kxPmBM4K/Q4WocD3JbA0POmGbA2lJ4tynPE8jGyKpfP8SZj6BIidXV0pkyqvxEfaKppB4D16UsA==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "acorn": "^8.10.0",
+ "acorn": "^8.11.2",
"escape-string-regexp": "^4.0.0",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
- "esutils": "^2.0.3",
"graphemer": "^1.4.0"
}
},
@@ -2180,15 +2178,15 @@
"dev": true
},
"node_modules/@vitejs/plugin-vue": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz",
- "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz",
+ "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==",
"dev": true,
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"peerDependencies": {
- "vite": "^4.0.0",
+ "vite": "^4.0.0 || ^5.0.0",
"vue": "^3.2.25"
}
},
@@ -2300,36 +2298,36 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz",
- "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz",
+ "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==",
"dependencies": {
"@babel/parser": "^7.23.0",
- "@vue/shared": "3.3.7",
+ "@vue/shared": "3.3.8",
"estree-walker": "^2.0.2",
"source-map-js": "^1.0.2"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz",
- "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz",
+ "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==",
"dependencies": {
- "@vue/compiler-core": "3.3.7",
- "@vue/shared": "3.3.7"
+ "@vue/compiler-core": "3.3.8",
+ "@vue/shared": "3.3.8"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz",
- "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz",
+ "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==",
"dependencies": {
"@babel/parser": "^7.23.0",
- "@vue/compiler-core": "3.3.7",
- "@vue/compiler-dom": "3.3.7",
- "@vue/compiler-ssr": "3.3.7",
- "@vue/reactivity-transform": "3.3.7",
- "@vue/shared": "3.3.7",
+ "@vue/compiler-core": "3.3.8",
+ "@vue/compiler-dom": "3.3.8",
+ "@vue/compiler-ssr": "3.3.8",
+ "@vue/reactivity-transform": "3.3.8",
+ "@vue/shared": "3.3.8",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5",
"postcss": "^8.4.31",
@@ -2348,30 +2346,30 @@
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz",
- "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz",
+ "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==",
"dependencies": {
- "@vue/compiler-dom": "3.3.7",
- "@vue/shared": "3.3.7"
+ "@vue/compiler-dom": "3.3.8",
+ "@vue/shared": "3.3.8"
}
},
"node_modules/@vue/reactivity": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz",
- "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz",
+ "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==",
"dependencies": {
- "@vue/shared": "3.3.7"
+ "@vue/shared": "3.3.8"
}
},
"node_modules/@vue/reactivity-transform": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz",
- "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz",
+ "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==",
"dependencies": {
"@babel/parser": "^7.23.0",
- "@vue/compiler-core": "3.3.7",
- "@vue/shared": "3.3.7",
+ "@vue/compiler-core": "3.3.8",
+ "@vue/shared": "3.3.8",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.5"
}
@@ -2388,40 +2386,40 @@
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz",
- "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz",
+ "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==",
"dependencies": {
- "@vue/reactivity": "3.3.7",
- "@vue/shared": "3.3.7"
+ "@vue/reactivity": "3.3.8",
+ "@vue/shared": "3.3.8"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz",
- "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz",
+ "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==",
"dependencies": {
- "@vue/runtime-core": "3.3.7",
- "@vue/shared": "3.3.7",
+ "@vue/runtime-core": "3.3.8",
+ "@vue/shared": "3.3.8",
"csstype": "^3.1.2"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz",
- "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz",
+ "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==",
"dependencies": {
- "@vue/compiler-ssr": "3.3.7",
- "@vue/shared": "3.3.7"
+ "@vue/compiler-ssr": "3.3.8",
+ "@vue/shared": "3.3.8"
},
"peerDependencies": {
- "vue": "3.3.7"
+ "vue": "3.3.8"
}
},
"node_modules/@vue/shared": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz",
- "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg=="
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz",
+ "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw=="
},
"node_modules/@webassemblyjs/ast": {
"version": "1.11.6",
@@ -4741,15 +4739,15 @@
}
},
"node_modules/eslint": {
- "version": "8.53.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
- "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz",
+ "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.3",
- "@eslint/js": "8.53.0",
+ "@eslint/js": "8.54.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -5298,9 +5296,9 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -7621,9 +7619,9 @@
}
},
"node_modules/mermaid": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.6.0.tgz",
- "integrity": "sha512-Hcti+Q2NiWnb2ZCijSX89Bn2i7TCUwosBdIn/d+u63Sz7y40XU6EKMctT4UX4qZuZGfKGZpfOeim2/KTrdR7aQ==",
+ "version": "10.6.1",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.6.1.tgz",
+ "integrity": "sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==",
"dependencies": {
"@braintree/sanitize-url": "^6.0.1",
"@types/d3-scale": "^4.0.3",
@@ -8742,12 +8740,12 @@
"dev": true
},
"node_modules/playwright": {
- "version": "1.39.0",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz",
- "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==",
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz",
+ "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==",
"dev": true,
"dependencies": {
- "playwright-core": "1.39.0"
+ "playwright-core": "1.40.0"
},
"bin": {
"playwright": "cli.js"
@@ -8760,9 +8758,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.39.0",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz",
- "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==",
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz",
+ "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==",
"dev": true,
"bin": {
"playwright-core": "cli.js"
@@ -10303,16 +10301,17 @@
"dev": true
},
"node_modules/svgo": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
- "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.4.tgz",
+ "integrity": "sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==",
"dev": true,
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^5.1.0",
"css-tree": "^2.2.1",
- "csso": "^5.0.5",
+ "css-what": "^6.1.0",
+ "csso": "5.0.5",
"picocolors": "^1.0.0"
},
"bin": {
@@ -10336,9 +10335,9 @@
}
},
"node_modules/swagger-ui-dist": {
- "version": "5.9.1",
- "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.1.tgz",
- "integrity": "sha512-5zAx+hUwJb9T3EAntc7TqYkV716CMqG6sZpNlAAMOMWkNXRYxGkN8ADIvD55dQZ10LxN90ZM/TQmN7y1gpICnw=="
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.0.tgz",
+ "integrity": "sha512-PBTn5qDOQVtU29hrx74km86SnK3/mFtF3grI98y575y1aRpxiuStRTIvsfXFudPFkLofHU7H9a+fKrP+Oayc3g=="
},
"node_modules/symbol-tree": {
"version": "3.2.4",
@@ -11512,15 +11511,15 @@
}
},
"node_modules/vue": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz",
- "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz",
+ "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==",
"dependencies": {
- "@vue/compiler-dom": "3.3.7",
- "@vue/compiler-sfc": "3.3.7",
- "@vue/runtime-dom": "3.3.7",
- "@vue/server-renderer": "3.3.7",
- "@vue/shared": "3.3.7"
+ "@vue/compiler-dom": "3.3.8",
+ "@vue/compiler-sfc": "3.3.8",
+ "@vue/runtime-dom": "3.3.8",
+ "@vue/server-renderer": "3.3.8",
+ "@vue/shared": "3.3.8"
},
"peerDependencies": {
"typescript": "*"
diff --git a/package.json b/package.json
index f536894e26f..4aee1bb0494 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
"@claviska/jquery-minicolors": "2.3.6",
"@github/markdown-toolbar-element": "2.2.1",
"@github/relative-time-element": "4.3.0",
- "@github/text-expander-element": "2.5.0",
+ "@github/text-expander-element": "2.6.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.8.0",
"@webcomponents/custom-elements": "1.6.0",
@@ -24,12 +24,12 @@
"easymde": "2.18.0",
"esbuild-loader": "4.0.2",
"escape-goat": "4.0.0",
- "fast-glob": "3.3.1",
+ "fast-glob": "3.3.2",
"jquery": "3.7.1",
"katex": "0.16.9",
"license-checker-webpack-plugin": "0.2.1",
"lightningcss-loader": "2.1.0",
- "mermaid": "10.6.0",
+ "mermaid": "10.6.1",
"mini-css-extract-plugin": "2.7.6",
"minimatch": "9.0.3",
"monaco-editor": "0.44.0",
@@ -37,14 +37,14 @@
"pdfobject": "2.2.12",
"pretty-ms": "8.0.0",
"sortablejs": "1.15.0",
- "swagger-ui-dist": "5.9.1",
+ "swagger-ui-dist": "5.10.0",
"throttle-debounce": "5.0.0",
"tinycolor2": "1.6.0",
"tippy.js": "6.3.7",
"toastify-js": "1.12.0",
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
- "vue": "3.3.7",
+ "vue": "3.3.8",
"vue-bar-graph": "2.0.0",
"vue-loader": "17.3.1",
"vue3-calendar-heatmap": "2.0.5",
@@ -54,11 +54,11 @@
},
"devDependencies": {
"@eslint-community/eslint-plugin-eslint-comments": "4.1.0",
- "@playwright/test": "1.39.0",
+ "@playwright/test": "1.40.0",
"@stoplight/spectral-cli": "6.11.0",
- "@stylistic/eslint-plugin-js": "1.0.0",
- "@vitejs/plugin-vue": "4.4.0",
- "eslint": "8.53.0",
+ "@stylistic/eslint-plugin-js": "1.4.0",
+ "@vitejs/plugin-vue": "4.5.0",
+ "eslint": "8.54.0",
"eslint-plugin-array-func": "4.0.0",
"eslint-plugin-i": "2.29.0",
"eslint-plugin-jquery": "1.5.1",
@@ -79,7 +79,7 @@
"stylelint-declaration-block-no-ignored-properties": "2.7.0",
"stylelint-declaration-strict-value": "1.9.2",
"stylelint-stylistic": "0.4.3",
- "svgo": "3.0.2",
+ "svgo": "3.0.4",
"updates": "15.0.4",
"vite-string-plugin": "1.1.2",
"vitest": "0.34.6"
diff --git a/poetry.lock b/poetry.lock
index 15745cf5407..822343d9e28 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
[[package]]
name = "click"
@@ -27,12 +27,12 @@ files = [
[[package]]
name = "cssbeautifier"
-version = "1.14.9"
+version = "1.14.11"
description = "CSS unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
- {file = "cssbeautifier-1.14.9.tar.gz", hash = "sha256:2da432472f68170eb854aff97b16a24721f5090ee36af2e31199590a89e7f71f"},
+ {file = "cssbeautifier-1.14.11.tar.gz", hash = "sha256:40544c2b62bbcb64caa5e7f37a02df95654e5ce1bcacadac4ca1f3dc89c31513"},
]
[package.dependencies]
@@ -100,12 +100,12 @@ files = [
[[package]]
name = "jsbeautifier"
-version = "1.14.9"
+version = "1.14.11"
description = "JavaScript unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
- {file = "jsbeautifier-1.14.9.tar.gz", hash = "sha256:c738ebc36b47bd94e4ca6dd17a9004c3cc74edad582ca1d60e0e5d5945a63cb9"},
+ {file = "jsbeautifier-1.14.11.tar.gz", hash = "sha256:6b632581ea60dd1c133cd25a48ad187b4b91f526623c4b0fb5443ef805250505"},
]
[package.dependencies]
@@ -149,6 +149,7 @@ files = [
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
@@ -156,8 +157,15 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
@@ -174,6 +182,7 @@ files = [
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
@@ -181,6 +190,7 @@ files = [
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
@@ -327,13 +337,13 @@ telegram = ["requests"]
[[package]]
name = "yamllint"
-version = "1.32.0"
+version = "1.33.0"
description = "A linter for YAML files."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "yamllint-1.32.0-py3-none-any.whl", hash = "sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7"},
- {file = "yamllint-1.32.0.tar.gz", hash = "sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a"},
+ {file = "yamllint-1.33.0-py3-none-any.whl", hash = "sha256:28a19f5d68d28d8fec538a1db21bb2d84c7dc2e2ea36266da8d4d1c5a683814d"},
+ {file = "yamllint-1.33.0.tar.gz", hash = "sha256:2dceab9ef2d99518a2fcf4ffc964d44250ac4459be1ba3ca315118e4a1a81f7d"},
]
[package.dependencies]
@@ -346,4 +356,4 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"]
[metadata]
lock-version = "2.0"
python-versions = "^3.8"
-content-hash = "a2e2a44801f0da2cc5cc1d1a3f707853f51a4346fef725f98c67a074dcb223d6"
+content-hash = "5bf456fd73e69c13f16d080503f6dbaf60294f15d74343c16ef5a57b5b345db1"
diff --git a/public/assets/img/svg/fontawesome-save.svg b/public/assets/img/svg/fontawesome-save.svg
index ece457e5591..e7b3ea9d5b3 100644
--- a/public/assets/img/svg/fontawesome-save.svg
+++ b/public/assets/img/svg/fontawesome-save.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/fontawesome-windows.svg b/public/assets/img/svg/fontawesome-windows.svg
index ec8633761c0..b1c16040c97 100644
--- a/public/assets/img/svg/fontawesome-windows.svg
+++ b/public/assets/img/svg/fontawesome-windows.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-alpine.svg b/public/assets/img/svg/gitea-alpine.svg
index 1c878013ac1..79be41cb251 100644
--- a/public/assets/img/svg/gitea-alpine.svg
+++ b/public/assets/img/svg/gitea-alpine.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-azuread.svg b/public/assets/img/svg/gitea-azuread.svg
index 36845b7ee36..1aee2aa40d7 100644
--- a/public/assets/img/svg/gitea-azuread.svg
+++ b/public/assets/img/svg/gitea-azuread.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-azureadv2.svg b/public/assets/img/svg/gitea-azureadv2.svg
index a5fa73a76cf..3d4af13e51a 100644
--- a/public/assets/img/svg/gitea-azureadv2.svg
+++ b/public/assets/img/svg/gitea-azureadv2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-bitbucket.svg b/public/assets/img/svg/gitea-bitbucket.svg
index 7794df3d29b..1443f378d57 100644
--- a/public/assets/img/svg/gitea-bitbucket.svg
+++ b/public/assets/img/svg/gitea-bitbucket.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-cargo.svg b/public/assets/img/svg/gitea-cargo.svg
index 0d82ee3c4a2..1b720b1dacb 100644
--- a/public/assets/img/svg/gitea-cargo.svg
+++ b/public/assets/img/svg/gitea-cargo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-codebase.svg b/public/assets/img/svg/gitea-codebase.svg
index 7871527b2c2..5f3085f58c7 100644
--- a/public/assets/img/svg/gitea-codebase.svg
+++ b/public/assets/img/svg/gitea-codebase.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-composer.svg b/public/assets/img/svg/gitea-composer.svg
index 2ffe9e2af02..aa311993c3a 100644
--- a/public/assets/img/svg/gitea-composer.svg
+++ b/public/assets/img/svg/gitea-composer.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-conda.svg b/public/assets/img/svg/gitea-conda.svg
index 90080440cf0..15b6458ca42 100644
--- a/public/assets/img/svg/gitea-conda.svg
+++ b/public/assets/img/svg/gitea-conda.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-cran.svg b/public/assets/img/svg/gitea-cran.svg
index de85ccab529..b3b3e312bcb 100644
--- a/public/assets/img/svg/gitea-cran.svg
+++ b/public/assets/img/svg/gitea-cran.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-debian.svg b/public/assets/img/svg/gitea-debian.svg
index 96f8f468e50..2471f35776c 100644
--- a/public/assets/img/svg/gitea-debian.svg
+++ b/public/assets/img/svg/gitea-debian.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-discord.svg b/public/assets/img/svg/gitea-discord.svg
index 5397e30ca5f..1bb3a647c8d 100644
--- a/public/assets/img/svg/gitea-discord.svg
+++ b/public/assets/img/svg/gitea-discord.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-empty-checkbox.svg b/public/assets/img/svg/gitea-empty-checkbox.svg
index dc4083e255d..40d75366f47 100644
--- a/public/assets/img/svg/gitea-empty-checkbox.svg
+++ b/public/assets/img/svg/gitea-empty-checkbox.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-exclamation.svg b/public/assets/img/svg/gitea-exclamation.svg
index cf5a7b76f52..b899f8d7f6a 100644
--- a/public/assets/img/svg/gitea-exclamation.svg
+++ b/public/assets/img/svg/gitea-exclamation.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-facebook.svg b/public/assets/img/svg/gitea-facebook.svg
index 497c5652995..4154e1fc46b 100644
--- a/public/assets/img/svg/gitea-facebook.svg
+++ b/public/assets/img/svg/gitea-facebook.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-git.svg b/public/assets/img/svg/gitea-git.svg
index ba4318c8b1b..33a98deb164 100644
--- a/public/assets/img/svg/gitea-git.svg
+++ b/public/assets/img/svg/gitea-git.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-gitbucket.svg b/public/assets/img/svg/gitea-gitbucket.svg
index edea1e5fe69..4c0ef46d92e 100644
--- a/public/assets/img/svg/gitea-gitbucket.svg
+++ b/public/assets/img/svg/gitea-gitbucket.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-gitea.svg b/public/assets/img/svg/gitea-gitea.svg
index f9015a31bdd..6574fbce5ec 100644
--- a/public/assets/img/svg/gitea-gitea.svg
+++ b/public/assets/img/svg/gitea-gitea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-go.svg b/public/assets/img/svg/gitea-go.svg
index a432bdbf21b..bc7969d47d9 100644
--- a/public/assets/img/svg/gitea-go.svg
+++ b/public/assets/img/svg/gitea-go.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-google.svg b/public/assets/img/svg/gitea-google.svg
index 95fa7a37611..9629ca03b6a 100644
--- a/public/assets/img/svg/gitea-google.svg
+++ b/public/assets/img/svg/gitea-google.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-join.svg b/public/assets/img/svg/gitea-join.svg
index 574c8b272f4..c1d2f275e8d 100644
--- a/public/assets/img/svg/gitea-join.svg
+++ b/public/assets/img/svg/gitea-join.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-lock-cog.svg b/public/assets/img/svg/gitea-lock-cog.svg
index c7be1f09c0d..7775b35f6d3 100644
--- a/public/assets/img/svg/gitea-lock-cog.svg
+++ b/public/assets/img/svg/gitea-lock-cog.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-lock.svg b/public/assets/img/svg/gitea-lock.svg
index 3f1df87b790..87069eae4ba 100644
--- a/public/assets/img/svg/gitea-lock.svg
+++ b/public/assets/img/svg/gitea-lock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-matrix.svg b/public/assets/img/svg/gitea-matrix.svg
index 33e2708d647..16023b0caee 100644
--- a/public/assets/img/svg/gitea-matrix.svg
+++ b/public/assets/img/svg/gitea-matrix.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-maven.svg b/public/assets/img/svg/gitea-maven.svg
index b739ae486bf..8f889918812 100644
--- a/public/assets/img/svg/gitea-maven.svg
+++ b/public/assets/img/svg/gitea-maven.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-microsoftonline.svg b/public/assets/img/svg/gitea-microsoftonline.svg
index 84bea0305da..ce4f1a5c8f2 100644
--- a/public/assets/img/svg/gitea-microsoftonline.svg
+++ b/public/assets/img/svg/gitea-microsoftonline.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-nextcloud.svg b/public/assets/img/svg/gitea-nextcloud.svg
index c28b620ccd7..42c53017ac1 100644
--- a/public/assets/img/svg/gitea-nextcloud.svg
+++ b/public/assets/img/svg/gitea-nextcloud.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-npm.svg b/public/assets/img/svg/gitea-npm.svg
index 68f3f6c9455..7ef74e72bd1 100644
--- a/public/assets/img/svg/gitea-npm.svg
+++ b/public/assets/img/svg/gitea-npm.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-onedev.svg b/public/assets/img/svg/gitea-onedev.svg
index 75a79ab3bae..956aa2c9a95 100644
--- a/public/assets/img/svg/gitea-onedev.svg
+++ b/public/assets/img/svg/gitea-onedev.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-openid.svg b/public/assets/img/svg/gitea-openid.svg
index f8e313f5159..a7d22376057 100644
--- a/public/assets/img/svg/gitea-openid.svg
+++ b/public/assets/img/svg/gitea-openid.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-pub.svg b/public/assets/img/svg/gitea-pub.svg
index fd6bfe90b9d..bfb32125068 100644
--- a/public/assets/img/svg/gitea-pub.svg
+++ b/public/assets/img/svg/gitea-pub.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-python.svg b/public/assets/img/svg/gitea-python.svg
index 87585b2b694..a10bad9e073 100644
--- a/public/assets/img/svg/gitea-python.svg
+++ b/public/assets/img/svg/gitea-python.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-rubygems.svg b/public/assets/img/svg/gitea-rubygems.svg
index db89cf9e05b..4741b37a7d9 100644
--- a/public/assets/img/svg/gitea-rubygems.svg
+++ b/public/assets/img/svg/gitea-rubygems.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-split.svg b/public/assets/img/svg/gitea-split.svg
index e2c6f7db724..56b2ff193da 100644
--- a/public/assets/img/svg/gitea-split.svg
+++ b/public/assets/img/svg/gitea-split.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-swift.svg b/public/assets/img/svg/gitea-swift.svg
index 0e26bcd4529..6e93083b536 100644
--- a/public/assets/img/svg/gitea-swift.svg
+++ b/public/assets/img/svg/gitea-swift.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-unlock.svg b/public/assets/img/svg/gitea-unlock.svg
index b6339348507..595dec0e68e 100644
--- a/public/assets/img/svg/gitea-unlock.svg
+++ b/public/assets/img/svg/gitea-unlock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-whitespace.svg b/public/assets/img/svg/gitea-whitespace.svg
index 35e19439f04..d046d16e0b1 100644
--- a/public/assets/img/svg/gitea-whitespace.svg
+++ b/public/assets/img/svg/gitea-whitespace.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-yandex.svg b/public/assets/img/svg/gitea-yandex.svg
index 54ded7eb872..58f26e12694 100644
--- a/public/assets/img/svg/gitea-yandex.svg
+++ b/public/assets/img/svg/gitea-yandex.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/material-invert-colors.svg b/public/assets/img/svg/material-invert-colors.svg
index 576ec72a785..feddf73ca4d 100644
--- a/public/assets/img/svg/material-invert-colors.svg
+++ b/public/assets/img/svg/material-invert-colors.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/material-palette.svg b/public/assets/img/svg/material-palette.svg
index f719dadc5d0..f98cef7bdcf 100644
--- a/public/assets/img/svg/material-palette.svg
+++ b/public/assets/img/svg/material-palette.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-accessibility-inset.svg b/public/assets/img/svg/octicon-accessibility-inset.svg
index 2ab660c5004..6d5fcd20bd4 100644
--- a/public/assets/img/svg/octicon-accessibility-inset.svg
+++ b/public/assets/img/svg/octicon-accessibility-inset.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-accessibility.svg b/public/assets/img/svg/octicon-accessibility.svg
index 6e26a53f3b8..e12784f3407 100644
--- a/public/assets/img/svg/octicon-accessibility.svg
+++ b/public/assets/img/svg/octicon-accessibility.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-alert-fill.svg b/public/assets/img/svg/octicon-alert-fill.svg
index 6173f0648c0..a2135affc17 100644
--- a/public/assets/img/svg/octicon-alert-fill.svg
+++ b/public/assets/img/svg/octicon-alert-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-alert.svg b/public/assets/img/svg/octicon-alert.svg
index 0d81ca2f4b7..1d97fbeb54f 100644
--- a/public/assets/img/svg/octicon-alert.svg
+++ b/public/assets/img/svg/octicon-alert.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-archive.svg b/public/assets/img/svg/octicon-archive.svg
index 6816984e69c..48ad67ec630 100644
--- a/public/assets/img/svg/octicon-archive.svg
+++ b/public/assets/img/svg/octicon-archive.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-arrow-right.svg b/public/assets/img/svg/octicon-arrow-right.svg
index 993df7ecf28..b421c393237 100644
--- a/public/assets/img/svg/octicon-arrow-right.svg
+++ b/public/assets/img/svg/octicon-arrow-right.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-arrow-up-right.svg b/public/assets/img/svg/octicon-arrow-up-right.svg
index 4d760cec658..6ba2bf63236 100644
--- a/public/assets/img/svg/octicon-arrow-up-right.svg
+++ b/public/assets/img/svg/octicon-arrow-up-right.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-arrow-up.svg b/public/assets/img/svg/octicon-arrow-up.svg
index fdd8fa6a2f3..7b6647f1af2 100644
--- a/public/assets/img/svg/octicon-arrow-up.svg
+++ b/public/assets/img/svg/octicon-arrow-up.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bell-fill.svg b/public/assets/img/svg/octicon-bell-fill.svg
index 96cdfb2842f..a385b9e5fda 100644
--- a/public/assets/img/svg/octicon-bell-fill.svg
+++ b/public/assets/img/svg/octicon-bell-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bell-slash.svg b/public/assets/img/svg/octicon-bell-slash.svg
index e1989c6b39f..07668ca654c 100644
--- a/public/assets/img/svg/octicon-bell-slash.svg
+++ b/public/assets/img/svg/octicon-bell-slash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bell.svg b/public/assets/img/svg/octicon-bell.svg
index c2f18ab371c..aed30a47652 100644
--- a/public/assets/img/svg/octicon-bell.svg
+++ b/public/assets/img/svg/octicon-bell.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-blocked.svg b/public/assets/img/svg/octicon-blocked.svg
index be9ec7e6e9b..fb38943a639 100644
--- a/public/assets/img/svg/octicon-blocked.svg
+++ b/public/assets/img/svg/octicon-blocked.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bold.svg b/public/assets/img/svg/octicon-bold.svg
index 396bf74ccfa..ea2545975e6 100644
--- a/public/assets/img/svg/octicon-bold.svg
+++ b/public/assets/img/svg/octicon-bold.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bookmark-slash.svg b/public/assets/img/svg/octicon-bookmark-slash.svg
index c3ebabe79d7..79c07ef2a21 100644
--- a/public/assets/img/svg/octicon-bookmark-slash.svg
+++ b/public/assets/img/svg/octicon-bookmark-slash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-briefcase.svg b/public/assets/img/svg/octicon-briefcase.svg
index 7d3559638c4..c4a89cb3ac6 100644
--- a/public/assets/img/svg/octicon-briefcase.svg
+++ b/public/assets/img/svg/octicon-briefcase.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-broadcast.svg b/public/assets/img/svg/octicon-broadcast.svg
index a89f1250b7b..6d999c43e86 100644
--- a/public/assets/img/svg/octicon-broadcast.svg
+++ b/public/assets/img/svg/octicon-broadcast.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-bug.svg b/public/assets/img/svg/octicon-bug.svg
index f398ef82b83..8245e6cd536 100644
--- a/public/assets/img/svg/octicon-bug.svg
+++ b/public/assets/img/svg/octicon-bug.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-cache.svg b/public/assets/img/svg/octicon-cache.svg
index 1630aa2224b..c7bb5cfe3ff 100644
--- a/public/assets/img/svg/octicon-cache.svg
+++ b/public/assets/img/svg/octicon-cache.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-calendar.svg b/public/assets/img/svg/octicon-calendar.svg
index 3d43f26bc93..55fd2f49da1 100644
--- a/public/assets/img/svg/octicon-calendar.svg
+++ b/public/assets/img/svg/octicon-calendar.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-check-circle-fill.svg b/public/assets/img/svg/octicon-check-circle-fill.svg
index f3a9f6a15da..689d38023cc 100644
--- a/public/assets/img/svg/octicon-check-circle-fill.svg
+++ b/public/assets/img/svg/octicon-check-circle-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-check-circle.svg b/public/assets/img/svg/octicon-check-circle.svg
index 89ce3a750cb..28d99f19b11 100644
--- a/public/assets/img/svg/octicon-check-circle.svg
+++ b/public/assets/img/svg/octicon-check-circle.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-check.svg b/public/assets/img/svg/octicon-check.svg
index e38a8f4103c..10dffe55de0 100644
--- a/public/assets/img/svg/octicon-check.svg
+++ b/public/assets/img/svg/octicon-check.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-checkbox.svg b/public/assets/img/svg/octicon-checkbox.svg
index 88ff9cf487f..eebffde2e08 100644
--- a/public/assets/img/svg/octicon-checkbox.svg
+++ b/public/assets/img/svg/octicon-checkbox.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-checklist.svg b/public/assets/img/svg/octicon-checklist.svg
index 7d4cd8566d4..33ab2c32298 100644
--- a/public/assets/img/svg/octicon-checklist.svg
+++ b/public/assets/img/svg/octicon-checklist.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-chevron-right.svg b/public/assets/img/svg/octicon-chevron-right.svg
index e9d04c151a4..d5a610bd354 100644
--- a/public/assets/img/svg/octicon-chevron-right.svg
+++ b/public/assets/img/svg/octicon-chevron-right.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-chevron-up.svg b/public/assets/img/svg/octicon-chevron-up.svg
index 958bd3ab980..952dd484afa 100644
--- a/public/assets/img/svg/octicon-chevron-up.svg
+++ b/public/assets/img/svg/octicon-chevron-up.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-circle-slash.svg b/public/assets/img/svg/octicon-circle-slash.svg
index 817158aa077..1c0a2e03587 100644
--- a/public/assets/img/svg/octicon-circle-slash.svg
+++ b/public/assets/img/svg/octicon-circle-slash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-circle.svg b/public/assets/img/svg/octicon-circle.svg
index 6dc288a16ea..c2fa88b929e 100644
--- a/public/assets/img/svg/octicon-circle.svg
+++ b/public/assets/img/svg/octicon-circle.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-clock-fill.svg b/public/assets/img/svg/octicon-clock-fill.svg
index 43e87de195f..423e5fd29d7 100644
--- a/public/assets/img/svg/octicon-clock-fill.svg
+++ b/public/assets/img/svg/octicon-clock-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-clock.svg b/public/assets/img/svg/octicon-clock.svg
index f1140b8efdc..ae277ee82f0 100644
--- a/public/assets/img/svg/octicon-clock.svg
+++ b/public/assets/img/svg/octicon-clock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-cloud-offline.svg b/public/assets/img/svg/octicon-cloud-offline.svg
index f0963b818d2..5193a54d281 100644
--- a/public/assets/img/svg/octicon-cloud-offline.svg
+++ b/public/assets/img/svg/octicon-cloud-offline.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-code-of-conduct.svg b/public/assets/img/svg/octicon-code-of-conduct.svg
index 2477aa7279a..2bf627843ca 100644
--- a/public/assets/img/svg/octicon-code-of-conduct.svg
+++ b/public/assets/img/svg/octicon-code-of-conduct.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-code-review.svg b/public/assets/img/svg/octicon-code-review.svg
index ce9e16cb421..595e48eb49a 100644
--- a/public/assets/img/svg/octicon-code-review.svg
+++ b/public/assets/img/svg/octicon-code-review.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-codescan-checkmark.svg b/public/assets/img/svg/octicon-codescan-checkmark.svg
index 9e150c49c32..773ad56dbea 100644
--- a/public/assets/img/svg/octicon-codescan-checkmark.svg
+++ b/public/assets/img/svg/octicon-codescan-checkmark.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-codescan.svg b/public/assets/img/svg/octicon-codescan.svg
index 85cbc27392c..ac4b6b4a186 100644
--- a/public/assets/img/svg/octicon-codescan.svg
+++ b/public/assets/img/svg/octicon-codescan.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-codespaces.svg b/public/assets/img/svg/octicon-codespaces.svg
index 701ceefd5fb..30a3890b568 100644
--- a/public/assets/img/svg/octicon-codespaces.svg
+++ b/public/assets/img/svg/octicon-codespaces.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-columns.svg b/public/assets/img/svg/octicon-columns.svg
index a6344001a16..a88b8071c2b 100644
--- a/public/assets/img/svg/octicon-columns.svg
+++ b/public/assets/img/svg/octicon-columns.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-command-palette.svg b/public/assets/img/svg/octicon-command-palette.svg
index e41255b40be..6c8528180ec 100644
--- a/public/assets/img/svg/octicon-command-palette.svg
+++ b/public/assets/img/svg/octicon-command-palette.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-comment-discussion.svg b/public/assets/img/svg/octicon-comment-discussion.svg
index 6be15c7bcfb..7abc3f135f7 100644
--- a/public/assets/img/svg/octicon-comment-discussion.svg
+++ b/public/assets/img/svg/octicon-comment-discussion.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-copilot-warning.svg b/public/assets/img/svg/octicon-copilot-warning.svg
index ce956452046..e690dfb507d 100644
--- a/public/assets/img/svg/octicon-copilot-warning.svg
+++ b/public/assets/img/svg/octicon-copilot-warning.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-copilot.svg b/public/assets/img/svg/octicon-copilot.svg
index b2a143c5c63..83872243cf6 100644
--- a/public/assets/img/svg/octicon-copilot.svg
+++ b/public/assets/img/svg/octicon-copilot.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-cpu.svg b/public/assets/img/svg/octicon-cpu.svg
index 41b6e7cfaec..753b9b5799e 100644
--- a/public/assets/img/svg/octicon-cpu.svg
+++ b/public/assets/img/svg/octicon-cpu.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-credit-card.svg b/public/assets/img/svg/octicon-credit-card.svg
index 1ba32dee728..94c8f1581e7 100644
--- a/public/assets/img/svg/octicon-credit-card.svg
+++ b/public/assets/img/svg/octicon-credit-card.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-cross-reference.svg b/public/assets/img/svg/octicon-cross-reference.svg
index cca24cd13f6..edd42fa473c 100644
--- a/public/assets/img/svg/octicon-cross-reference.svg
+++ b/public/assets/img/svg/octicon-cross-reference.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-dash.svg b/public/assets/img/svg/octicon-dash.svg
index f3665638a67..39ebd0d264e 100644
--- a/public/assets/img/svg/octicon-dash.svg
+++ b/public/assets/img/svg/octicon-dash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-dependabot.svg b/public/assets/img/svg/octicon-dependabot.svg
index cfda70fee28..250d10cc1b8 100644
--- a/public/assets/img/svg/octicon-dependabot.svg
+++ b/public/assets/img/svg/octicon-dependabot.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-desktop-download.svg b/public/assets/img/svg/octicon-desktop-download.svg
index 643829c9e94..4b1446a18ec 100644
--- a/public/assets/img/svg/octicon-desktop-download.svg
+++ b/public/assets/img/svg/octicon-desktop-download.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-device-camera-video.svg b/public/assets/img/svg/octicon-device-camera-video.svg
index ebbed57707f..4e7e1e7c4d6 100644
--- a/public/assets/img/svg/octicon-device-camera-video.svg
+++ b/public/assets/img/svg/octicon-device-camera-video.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-device-camera.svg b/public/assets/img/svg/octicon-device-camera.svg
index 7ad8d402ac8..bf4de4a59cb 100644
--- a/public/assets/img/svg/octicon-device-camera.svg
+++ b/public/assets/img/svg/octicon-device-camera.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-device-desktop.svg b/public/assets/img/svg/octicon-device-desktop.svg
index 2bb49e47784..0911947ee13 100644
--- a/public/assets/img/svg/octicon-device-desktop.svg
+++ b/public/assets/img/svg/octicon-device-desktop.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-device-mobile.svg b/public/assets/img/svg/octicon-device-mobile.svg
index 2f0ca597529..cf247e215c1 100644
--- a/public/assets/img/svg/octicon-device-mobile.svg
+++ b/public/assets/img/svg/octicon-device-mobile.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-devices.svg b/public/assets/img/svg/octicon-devices.svg
index c351640dea7..178ea74a6f8 100644
--- a/public/assets/img/svg/octicon-devices.svg
+++ b/public/assets/img/svg/octicon-devices.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-diff-added.svg b/public/assets/img/svg/octicon-diff-added.svg
index 9ac76132be8..276d162129d 100644
--- a/public/assets/img/svg/octicon-diff-added.svg
+++ b/public/assets/img/svg/octicon-diff-added.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-diff-modified.svg b/public/assets/img/svg/octicon-diff-modified.svg
index 68969b68654..1c0d7296aa1 100644
--- a/public/assets/img/svg/octicon-diff-modified.svg
+++ b/public/assets/img/svg/octicon-diff-modified.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-diff-removed.svg b/public/assets/img/svg/octicon-diff-removed.svg
index 86bcb54838b..d366a107559 100644
--- a/public/assets/img/svg/octicon-diff-removed.svg
+++ b/public/assets/img/svg/octicon-diff-removed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-diff-renamed.svg b/public/assets/img/svg/octicon-diff-renamed.svg
index 96bec22a26b..f7b9eb2bdb1 100644
--- a/public/assets/img/svg/octicon-diff-renamed.svg
+++ b/public/assets/img/svg/octicon-diff-renamed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-diff.svg b/public/assets/img/svg/octicon-diff.svg
index 30bc1e95df7..4714b0fdd43 100644
--- a/public/assets/img/svg/octicon-diff.svg
+++ b/public/assets/img/svg/octicon-diff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-discussion-duplicate.svg b/public/assets/img/svg/octicon-discussion-duplicate.svg
index 8c705dbd982..ed93bf3b0fa 100644
--- a/public/assets/img/svg/octicon-discussion-duplicate.svg
+++ b/public/assets/img/svg/octicon-discussion-duplicate.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-discussion-outdated.svg b/public/assets/img/svg/octicon-discussion-outdated.svg
index 960920d6965..388dac3de15 100644
--- a/public/assets/img/svg/octicon-discussion-outdated.svg
+++ b/public/assets/img/svg/octicon-discussion-outdated.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-dot-fill.svg b/public/assets/img/svg/octicon-dot-fill.svg
index d9c61d9db55..17db30b0e00 100644
--- a/public/assets/img/svg/octicon-dot-fill.svg
+++ b/public/assets/img/svg/octicon-dot-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-dot.svg b/public/assets/img/svg/octicon-dot.svg
index 62dcc189fe9..fe03e3ded73 100644
--- a/public/assets/img/svg/octicon-dot.svg
+++ b/public/assets/img/svg/octicon-dot.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-duplicate.svg b/public/assets/img/svg/octicon-duplicate.svg
index 323c8f3df62..289ac5905f1 100644
--- a/public/assets/img/svg/octicon-duplicate.svg
+++ b/public/assets/img/svg/octicon-duplicate.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-ellipsis.svg b/public/assets/img/svg/octicon-ellipsis.svg
index 8f4da5d8054..152e6eb3249 100644
--- a/public/assets/img/svg/octicon-ellipsis.svg
+++ b/public/assets/img/svg/octicon-ellipsis.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-eye-closed.svg b/public/assets/img/svg/octicon-eye-closed.svg
index 2cfdf664065..364777d1688 100644
--- a/public/assets/img/svg/octicon-eye-closed.svg
+++ b/public/assets/img/svg/octicon-eye-closed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-eye.svg b/public/assets/img/svg/octicon-eye.svg
index 5f63e08dea5..101194041ea 100644
--- a/public/assets/img/svg/octicon-eye.svg
+++ b/public/assets/img/svg/octicon-eye.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-discussion.svg b/public/assets/img/svg/octicon-feed-discussion.svg
index 7ffa53cdca7..e8ccfff386a 100644
--- a/public/assets/img/svg/octicon-feed-discussion.svg
+++ b/public/assets/img/svg/octicon-feed-discussion.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-forked.svg b/public/assets/img/svg/octicon-feed-forked.svg
index c64a5a1a22a..65b0eb1b133 100644
--- a/public/assets/img/svg/octicon-feed-forked.svg
+++ b/public/assets/img/svg/octicon-feed-forked.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-heart.svg b/public/assets/img/svg/octicon-feed-heart.svg
index 3179473eeb1..f2d620dd47f 100644
--- a/public/assets/img/svg/octicon-feed-heart.svg
+++ b/public/assets/img/svg/octicon-feed-heart.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-issue-closed.svg b/public/assets/img/svg/octicon-feed-issue-closed.svg
index f31776e661f..ee1d4ff8a7b 100644
--- a/public/assets/img/svg/octicon-feed-issue-closed.svg
+++ b/public/assets/img/svg/octicon-feed-issue-closed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-issue-draft.svg b/public/assets/img/svg/octicon-feed-issue-draft.svg
index b50504935eb..b1f8aca8718 100644
--- a/public/assets/img/svg/octicon-feed-issue-draft.svg
+++ b/public/assets/img/svg/octicon-feed-issue-draft.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-issue-open.svg b/public/assets/img/svg/octicon-feed-issue-open.svg
index 6a6697a31ab..6d8989895b0 100644
--- a/public/assets/img/svg/octicon-feed-issue-open.svg
+++ b/public/assets/img/svg/octicon-feed-issue-open.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-issue-reopen.svg b/public/assets/img/svg/octicon-feed-issue-reopen.svg
index 6cac76da581..1ee31ec368f 100644
--- a/public/assets/img/svg/octicon-feed-issue-reopen.svg
+++ b/public/assets/img/svg/octicon-feed-issue-reopen.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-merged.svg b/public/assets/img/svg/octicon-feed-merged.svg
index 4679ea202b7..47f487167da 100644
--- a/public/assets/img/svg/octicon-feed-merged.svg
+++ b/public/assets/img/svg/octicon-feed-merged.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-person.svg b/public/assets/img/svg/octicon-feed-person.svg
index 7c9bbf4c37b..0854866216d 100644
--- a/public/assets/img/svg/octicon-feed-person.svg
+++ b/public/assets/img/svg/octicon-feed-person.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-plus.svg b/public/assets/img/svg/octicon-feed-plus.svg
index 8606bdef203..6d0286e22ea 100644
--- a/public/assets/img/svg/octicon-feed-plus.svg
+++ b/public/assets/img/svg/octicon-feed-plus.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-public.svg b/public/assets/img/svg/octicon-feed-public.svg
index 7c6c5b2529a..926f7fe26a6 100644
--- a/public/assets/img/svg/octicon-feed-public.svg
+++ b/public/assets/img/svg/octicon-feed-public.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-pull-request-closed.svg b/public/assets/img/svg/octicon-feed-pull-request-closed.svg
index 10f89d48552..b594acd9cc2 100644
--- a/public/assets/img/svg/octicon-feed-pull-request-closed.svg
+++ b/public/assets/img/svg/octicon-feed-pull-request-closed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-pull-request-draft.svg b/public/assets/img/svg/octicon-feed-pull-request-draft.svg
index 78596ff7888..1ae02e68efc 100644
--- a/public/assets/img/svg/octicon-feed-pull-request-draft.svg
+++ b/public/assets/img/svg/octicon-feed-pull-request-draft.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-pull-request-open.svg b/public/assets/img/svg/octicon-feed-pull-request-open.svg
index 82dd8e0aea5..d1349c2d6c6 100644
--- a/public/assets/img/svg/octicon-feed-pull-request-open.svg
+++ b/public/assets/img/svg/octicon-feed-pull-request-open.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-repo.svg b/public/assets/img/svg/octicon-feed-repo.svg
index 69a1989476c..fe099c52d21 100644
--- a/public/assets/img/svg/octicon-feed-repo.svg
+++ b/public/assets/img/svg/octicon-feed-repo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-rocket.svg b/public/assets/img/svg/octicon-feed-rocket.svg
index 843560a9de6..e74dfdddcce 100644
--- a/public/assets/img/svg/octicon-feed-rocket.svg
+++ b/public/assets/img/svg/octicon-feed-rocket.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-star.svg b/public/assets/img/svg/octicon-feed-star.svg
index 1688aab55db..70f6859fbad 100644
--- a/public/assets/img/svg/octicon-feed-star.svg
+++ b/public/assets/img/svg/octicon-feed-star.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-tag.svg b/public/assets/img/svg/octicon-feed-tag.svg
index c598c4d4c4b..90a796f38b5 100644
--- a/public/assets/img/svg/octicon-feed-tag.svg
+++ b/public/assets/img/svg/octicon-feed-tag.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-feed-trophy.svg b/public/assets/img/svg/octicon-feed-trophy.svg
index 6dc8d5a56ba..ed39c769c03 100644
--- a/public/assets/img/svg/octicon-feed-trophy.svg
+++ b/public/assets/img/svg/octicon-feed-trophy.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-badge.svg b/public/assets/img/svg/octicon-file-badge.svg
index 944b5227575..2f1ad34fd08 100644
--- a/public/assets/img/svg/octicon-file-badge.svg
+++ b/public/assets/img/svg/octicon-file-badge.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-binary.svg b/public/assets/img/svg/octicon-file-binary.svg
index 45f4e86fb6e..f6dd459eed5 100644
--- a/public/assets/img/svg/octicon-file-binary.svg
+++ b/public/assets/img/svg/octicon-file-binary.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-diff.svg b/public/assets/img/svg/octicon-file-diff.svg
index 6fdf5c5735e..a58df3e53db 100644
--- a/public/assets/img/svg/octicon-file-diff.svg
+++ b/public/assets/img/svg/octicon-file-diff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-directory-fill.svg b/public/assets/img/svg/octicon-file-directory-fill.svg
index f16ba39e0e8..800e6ba9528 100644
--- a/public/assets/img/svg/octicon-file-directory-fill.svg
+++ b/public/assets/img/svg/octicon-file-directory-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-directory-open-fill.svg b/public/assets/img/svg/octicon-file-directory-open-fill.svg
index ca7a4adf6b4..0d1bac328a7 100644
--- a/public/assets/img/svg/octicon-file-directory-open-fill.svg
+++ b/public/assets/img/svg/octicon-file-directory-open-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-directory-symlink.svg b/public/assets/img/svg/octicon-file-directory-symlink.svg
index ddc2e3fd670..8a6142b2299 100644
--- a/public/assets/img/svg/octicon-file-directory-symlink.svg
+++ b/public/assets/img/svg/octicon-file-directory-symlink.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-moved.svg b/public/assets/img/svg/octicon-file-moved.svg
index 86670ef6ce9..03735b0e987 100644
--- a/public/assets/img/svg/octicon-file-moved.svg
+++ b/public/assets/img/svg/octicon-file-moved.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-submodule.svg b/public/assets/img/svg/octicon-file-submodule.svg
index ba947cc988d..8eab90f8c6e 100644
--- a/public/assets/img/svg/octicon-file-submodule.svg
+++ b/public/assets/img/svg/octicon-file-submodule.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-symlink-file.svg b/public/assets/img/svg/octicon-file-symlink-file.svg
index bc712b5ba1a..5b1d9aad235 100644
--- a/public/assets/img/svg/octicon-file-symlink-file.svg
+++ b/public/assets/img/svg/octicon-file-symlink-file.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-file-zip.svg b/public/assets/img/svg/octicon-file-zip.svg
index 2f025030544..69e05f00b8f 100644
--- a/public/assets/img/svg/octicon-file-zip.svg
+++ b/public/assets/img/svg/octicon-file-zip.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-filter-remove.svg b/public/assets/img/svg/octicon-filter-remove.svg
index e4394f4453e..dd968226b17 100644
--- a/public/assets/img/svg/octicon-filter-remove.svg
+++ b/public/assets/img/svg/octicon-filter-remove.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-filter.svg b/public/assets/img/svg/octicon-filter.svg
index f93cc0159b4..63cd16e647c 100644
--- a/public/assets/img/svg/octicon-filter.svg
+++ b/public/assets/img/svg/octicon-filter.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-fiscal-host.svg b/public/assets/img/svg/octicon-fiscal-host.svg
index 67f683604bf..877850ad243 100644
--- a/public/assets/img/svg/octicon-fiscal-host.svg
+++ b/public/assets/img/svg/octicon-fiscal-host.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-flame.svg b/public/assets/img/svg/octicon-flame.svg
index 6fa5050d6b8..022f7edd237 100644
--- a/public/assets/img/svg/octicon-flame.svg
+++ b/public/assets/img/svg/octicon-flame.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-fold-down.svg b/public/assets/img/svg/octicon-fold-down.svg
index 22e6ad1d442..957a95fceac 100644
--- a/public/assets/img/svg/octicon-fold-down.svg
+++ b/public/assets/img/svg/octicon-fold-down.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-fold-up.svg b/public/assets/img/svg/octicon-fold-up.svg
index 2b7d4bdf8dc..6429cf4573b 100644
--- a/public/assets/img/svg/octicon-fold-up.svg
+++ b/public/assets/img/svg/octicon-fold-up.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-fold.svg b/public/assets/img/svg/octicon-fold.svg
index 7fd4e9d56de..5657e930c1b 100644
--- a/public/assets/img/svg/octicon-fold.svg
+++ b/public/assets/img/svg/octicon-fold.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-gear.svg b/public/assets/img/svg/octicon-gear.svg
index 6f5e36af10e..2da0cff438b 100644
--- a/public/assets/img/svg/octicon-gear.svg
+++ b/public/assets/img/svg/octicon-gear.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-gift.svg b/public/assets/img/svg/octicon-gift.svg
index 866461c4532..dd2b6dda98c 100644
--- a/public/assets/img/svg/octicon-gift.svg
+++ b/public/assets/img/svg/octicon-gift.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-branch.svg b/public/assets/img/svg/octicon-git-branch.svg
index fdd05567b4b..f97a3c96901 100644
--- a/public/assets/img/svg/octicon-git-branch.svg
+++ b/public/assets/img/svg/octicon-git-branch.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-commit.svg b/public/assets/img/svg/octicon-git-commit.svg
index 6e5b5fc07f4..6c2ac50ac3d 100644
--- a/public/assets/img/svg/octicon-git-commit.svg
+++ b/public/assets/img/svg/octicon-git-commit.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-compare.svg b/public/assets/img/svg/octicon-git-compare.svg
index 3c61c102570..6bf455942d1 100644
--- a/public/assets/img/svg/octicon-git-compare.svg
+++ b/public/assets/img/svg/octicon-git-compare.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-merge-queue.svg b/public/assets/img/svg/octicon-git-merge-queue.svg
index 4890a68d8cf..bfe39b34e6b 100644
--- a/public/assets/img/svg/octicon-git-merge-queue.svg
+++ b/public/assets/img/svg/octicon-git-merge-queue.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-merge.svg b/public/assets/img/svg/octicon-git-merge.svg
index 6aa3d4ce4e8..f6081f984ba 100644
--- a/public/assets/img/svg/octicon-git-merge.svg
+++ b/public/assets/img/svg/octicon-git-merge.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-pull-request-closed.svg b/public/assets/img/svg/octicon-git-pull-request-closed.svg
index 47b18f87e92..61a903c9180 100644
--- a/public/assets/img/svg/octicon-git-pull-request-closed.svg
+++ b/public/assets/img/svg/octicon-git-pull-request-closed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-pull-request-draft.svg b/public/assets/img/svg/octicon-git-pull-request-draft.svg
index 43ebe4569c8..74d9af987a4 100644
--- a/public/assets/img/svg/octicon-git-pull-request-draft.svg
+++ b/public/assets/img/svg/octicon-git-pull-request-draft.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-git-pull-request.svg b/public/assets/img/svg/octicon-git-pull-request.svg
index e9965677d26..2277666fe04 100644
--- a/public/assets/img/svg/octicon-git-pull-request.svg
+++ b/public/assets/img/svg/octicon-git-pull-request.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-globe.svg b/public/assets/img/svg/octicon-globe.svg
index a90f1d16ad3..b4f21b5b035 100644
--- a/public/assets/img/svg/octicon-globe.svg
+++ b/public/assets/img/svg/octicon-globe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-goal.svg b/public/assets/img/svg/octicon-goal.svg
index 46f224661f8..012a4f0c308 100644
--- a/public/assets/img/svg/octicon-goal.svg
+++ b/public/assets/img/svg/octicon-goal.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-grabber.svg b/public/assets/img/svg/octicon-grabber.svg
index 33cc2478197..9239188d424 100644
--- a/public/assets/img/svg/octicon-grabber.svg
+++ b/public/assets/img/svg/octicon-grabber.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-graph.svg b/public/assets/img/svg/octicon-graph.svg
index fa108db0a0a..075c6afa7b1 100644
--- a/public/assets/img/svg/octicon-graph.svg
+++ b/public/assets/img/svg/octicon-graph.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-heading.svg b/public/assets/img/svg/octicon-heading.svg
index 9caceb6157a..597e7949a50 100644
--- a/public/assets/img/svg/octicon-heading.svg
+++ b/public/assets/img/svg/octicon-heading.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-heart.svg b/public/assets/img/svg/octicon-heart.svg
index 9f178cfdedb..effbee4f768 100644
--- a/public/assets/img/svg/octicon-heart.svg
+++ b/public/assets/img/svg/octicon-heart.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-history.svg b/public/assets/img/svg/octicon-history.svg
index 72526f113ce..006d908d113 100644
--- a/public/assets/img/svg/octicon-history.svg
+++ b/public/assets/img/svg/octicon-history.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-horizontal-rule.svg b/public/assets/img/svg/octicon-horizontal-rule.svg
index 1cdc4a8ccf1..978874be5a4 100644
--- a/public/assets/img/svg/octicon-horizontal-rule.svg
+++ b/public/assets/img/svg/octicon-horizontal-rule.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-hubot.svg b/public/assets/img/svg/octicon-hubot.svg
index 6ba0c672e69..46418adc08c 100644
--- a/public/assets/img/svg/octicon-hubot.svg
+++ b/public/assets/img/svg/octicon-hubot.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-id-badge.svg b/public/assets/img/svg/octicon-id-badge.svg
index 927d780883b..ed3acea8bf6 100644
--- a/public/assets/img/svg/octicon-id-badge.svg
+++ b/public/assets/img/svg/octicon-id-badge.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-image.svg b/public/assets/img/svg/octicon-image.svg
index 47b70c1663a..a3ce77a876a 100644
--- a/public/assets/img/svg/octicon-image.svg
+++ b/public/assets/img/svg/octicon-image.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-infinity.svg b/public/assets/img/svg/octicon-infinity.svg
index 7e52e4ad6e7..aa94289fed7 100644
--- a/public/assets/img/svg/octicon-infinity.svg
+++ b/public/assets/img/svg/octicon-infinity.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-info.svg b/public/assets/img/svg/octicon-info.svg
index ab4b4c59708..de6616b0b7b 100644
--- a/public/assets/img/svg/octicon-info.svg
+++ b/public/assets/img/svg/octicon-info.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-closed.svg b/public/assets/img/svg/octicon-issue-closed.svg
index 51be962aac9..af0422c4463 100644
--- a/public/assets/img/svg/octicon-issue-closed.svg
+++ b/public/assets/img/svg/octicon-issue-closed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-draft.svg b/public/assets/img/svg/octicon-issue-draft.svg
index 8ec85824796..5b3f598a957 100644
--- a/public/assets/img/svg/octicon-issue-draft.svg
+++ b/public/assets/img/svg/octicon-issue-draft.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-opened.svg b/public/assets/img/svg/octicon-issue-opened.svg
index 9f60583d99e..fb0752dcf3c 100644
--- a/public/assets/img/svg/octicon-issue-opened.svg
+++ b/public/assets/img/svg/octicon-issue-opened.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-reopened.svg b/public/assets/img/svg/octicon-issue-reopened.svg
index 48eebc2e0e2..faac17d1199 100644
--- a/public/assets/img/svg/octicon-issue-reopened.svg
+++ b/public/assets/img/svg/octicon-issue-reopened.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-tracked-by.svg b/public/assets/img/svg/octicon-issue-tracked-by.svg
index 2fd4c95f3ed..3cabd7851d2 100644
--- a/public/assets/img/svg/octicon-issue-tracked-by.svg
+++ b/public/assets/img/svg/octicon-issue-tracked-by.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-issue-tracks.svg b/public/assets/img/svg/octicon-issue-tracks.svg
index 503ed5cdafc..7eb86e51519 100644
--- a/public/assets/img/svg/octicon-issue-tracks.svg
+++ b/public/assets/img/svg/octicon-issue-tracks.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-italic.svg b/public/assets/img/svg/octicon-italic.svg
index 11237486474..2f71fcc9331 100644
--- a/public/assets/img/svg/octicon-italic.svg
+++ b/public/assets/img/svg/octicon-italic.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-iterations.svg b/public/assets/img/svg/octicon-iterations.svg
index a8a6a2555ee..33e98c1de36 100644
--- a/public/assets/img/svg/octicon-iterations.svg
+++ b/public/assets/img/svg/octicon-iterations.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-kebab-horizontal.svg b/public/assets/img/svg/octicon-kebab-horizontal.svg
index faa581329fa..d744abf8d81 100644
--- a/public/assets/img/svg/octicon-kebab-horizontal.svg
+++ b/public/assets/img/svg/octicon-kebab-horizontal.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-key-asterisk.svg b/public/assets/img/svg/octicon-key-asterisk.svg
index f04c044590e..8b57e47885e 100644
--- a/public/assets/img/svg/octicon-key-asterisk.svg
+++ b/public/assets/img/svg/octicon-key-asterisk.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-key.svg b/public/assets/img/svg/octicon-key.svg
index 10c0b1aa8ac..4b9b2990890 100644
--- a/public/assets/img/svg/octicon-key.svg
+++ b/public/assets/img/svg/octicon-key.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-law.svg b/public/assets/img/svg/octicon-law.svg
index 8df6eec3bbd..9d6cfb15af1 100644
--- a/public/assets/img/svg/octicon-law.svg
+++ b/public/assets/img/svg/octicon-law.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-light-bulb.svg b/public/assets/img/svg/octicon-light-bulb.svg
index f3c58d47a5a..1833a06a889 100644
--- a/public/assets/img/svg/octicon-light-bulb.svg
+++ b/public/assets/img/svg/octicon-light-bulb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-link-external.svg b/public/assets/img/svg/octicon-link-external.svg
index 4479d3aac0a..2adda55d2c4 100644
--- a/public/assets/img/svg/octicon-link-external.svg
+++ b/public/assets/img/svg/octicon-link-external.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-list-ordered.svg b/public/assets/img/svg/octicon-list-ordered.svg
index dabed4edce4..93c3f4f453f 100644
--- a/public/assets/img/svg/octicon-list-ordered.svg
+++ b/public/assets/img/svg/octicon-list-ordered.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-list-unordered.svg b/public/assets/img/svg/octicon-list-unordered.svg
index 32640eca971..1976bd89db9 100644
--- a/public/assets/img/svg/octicon-list-unordered.svg
+++ b/public/assets/img/svg/octicon-list-unordered.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-location.svg b/public/assets/img/svg/octicon-location.svg
index 81c3ed60d4b..d4fc960d2ca 100644
--- a/public/assets/img/svg/octicon-location.svg
+++ b/public/assets/img/svg/octicon-location.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-lock.svg b/public/assets/img/svg/octicon-lock.svg
index 3e3dae06caf..b737b56f771 100644
--- a/public/assets/img/svg/octicon-lock.svg
+++ b/public/assets/img/svg/octicon-lock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-log.svg b/public/assets/img/svg/octicon-log.svg
index 21c263e7926..3bc4b5e799f 100644
--- a/public/assets/img/svg/octicon-log.svg
+++ b/public/assets/img/svg/octicon-log.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-logo-gist.svg b/public/assets/img/svg/octicon-logo-gist.svg
index 861764a6634..14092875268 100644
--- a/public/assets/img/svg/octicon-logo-gist.svg
+++ b/public/assets/img/svg/octicon-logo-gist.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-logo-github.svg b/public/assets/img/svg/octicon-logo-github.svg
index 546a7cd2529..e17a7ef3fc1 100644
--- a/public/assets/img/svg/octicon-logo-github.svg
+++ b/public/assets/img/svg/octicon-logo-github.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mail.svg b/public/assets/img/svg/octicon-mail.svg
index 6a6a036410d..03bb8e5b406 100644
--- a/public/assets/img/svg/octicon-mail.svg
+++ b/public/assets/img/svg/octicon-mail.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mark-github.svg b/public/assets/img/svg/octicon-mark-github.svg
index 0e5bf3b4d67..3b4322658aa 100644
--- a/public/assets/img/svg/octicon-mark-github.svg
+++ b/public/assets/img/svg/octicon-mark-github.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-megaphone.svg b/public/assets/img/svg/octicon-megaphone.svg
index f2a69adb7d7..14c8c74a60d 100644
--- a/public/assets/img/svg/octicon-megaphone.svg
+++ b/public/assets/img/svg/octicon-megaphone.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mention.svg b/public/assets/img/svg/octicon-mention.svg
index 60667575583..75b414e123d 100644
--- a/public/assets/img/svg/octicon-mention.svg
+++ b/public/assets/img/svg/octicon-mention.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-meter.svg b/public/assets/img/svg/octicon-meter.svg
index d60c0689877..e192d5e8e0e 100644
--- a/public/assets/img/svg/octicon-meter.svg
+++ b/public/assets/img/svg/octicon-meter.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-milestone.svg b/public/assets/img/svg/octicon-milestone.svg
index 69da41891d6..19667b613cf 100644
--- a/public/assets/img/svg/octicon-milestone.svg
+++ b/public/assets/img/svg/octicon-milestone.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mirror.svg b/public/assets/img/svg/octicon-mirror.svg
index 0acd01b01b9..05efbf2fc74 100644
--- a/public/assets/img/svg/octicon-mirror.svg
+++ b/public/assets/img/svg/octicon-mirror.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mortar-board.svg b/public/assets/img/svg/octicon-mortar-board.svg
index 871d1ae7025..6a8d634f0b8 100644
--- a/public/assets/img/svg/octicon-mortar-board.svg
+++ b/public/assets/img/svg/octicon-mortar-board.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-move-to-bottom.svg b/public/assets/img/svg/octicon-move-to-bottom.svg
index 3fb8f973915..10595b106c1 100644
--- a/public/assets/img/svg/octicon-move-to-bottom.svg
+++ b/public/assets/img/svg/octicon-move-to-bottom.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-move-to-end.svg b/public/assets/img/svg/octicon-move-to-end.svg
index d4b5cb62bf9..cd6e3e6ec9a 100644
--- a/public/assets/img/svg/octicon-move-to-end.svg
+++ b/public/assets/img/svg/octicon-move-to-end.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-move-to-start.svg b/public/assets/img/svg/octicon-move-to-start.svg
index 00a24a4c9f6..14ffc798381 100644
--- a/public/assets/img/svg/octicon-move-to-start.svg
+++ b/public/assets/img/svg/octicon-move-to-start.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-move-to-top.svg b/public/assets/img/svg/octicon-move-to-top.svg
index f0726dd9888..05316ded4ac 100644
--- a/public/assets/img/svg/octicon-move-to-top.svg
+++ b/public/assets/img/svg/octicon-move-to-top.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-multi-select.svg b/public/assets/img/svg/octicon-multi-select.svg
index cebcebce6c3..e079b24a5ed 100644
--- a/public/assets/img/svg/octicon-multi-select.svg
+++ b/public/assets/img/svg/octicon-multi-select.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-mute.svg b/public/assets/img/svg/octicon-mute.svg
index db465e41d51..a683c111523 100644
--- a/public/assets/img/svg/octicon-mute.svg
+++ b/public/assets/img/svg/octicon-mute.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-no-entry.svg b/public/assets/img/svg/octicon-no-entry.svg
index ac897b84b48..e7117cd1ca6 100644
--- a/public/assets/img/svg/octicon-no-entry.svg
+++ b/public/assets/img/svg/octicon-no-entry.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-north-star.svg b/public/assets/img/svg/octicon-north-star.svg
index 69b64feebaf..2fef71871aa 100644
--- a/public/assets/img/svg/octicon-north-star.svg
+++ b/public/assets/img/svg/octicon-north-star.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-note.svg b/public/assets/img/svg/octicon-note.svg
index d3eb92b3b54..39e7e4e7e55 100644
--- a/public/assets/img/svg/octicon-note.svg
+++ b/public/assets/img/svg/octicon-note.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-number.svg b/public/assets/img/svg/octicon-number.svg
index 22cf4684684..53c4d4e8f75 100644
--- a/public/assets/img/svg/octicon-number.svg
+++ b/public/assets/img/svg/octicon-number.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-organization.svg b/public/assets/img/svg/octicon-organization.svg
index beef876a970..d2c02261057 100644
--- a/public/assets/img/svg/octicon-organization.svg
+++ b/public/assets/img/svg/octicon-organization.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-package.svg b/public/assets/img/svg/octicon-package.svg
index aab1e40c4d4..ce79726ae4b 100644
--- a/public/assets/img/svg/octicon-package.svg
+++ b/public/assets/img/svg/octicon-package.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-passkey-fill.svg b/public/assets/img/svg/octicon-passkey-fill.svg
index bca3a247572..2394d3eaaf2 100644
--- a/public/assets/img/svg/octicon-passkey-fill.svg
+++ b/public/assets/img/svg/octicon-passkey-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-paste.svg b/public/assets/img/svg/octicon-paste.svg
index 1b3ee09ce1b..13b4d7430dc 100644
--- a/public/assets/img/svg/octicon-paste.svg
+++ b/public/assets/img/svg/octicon-paste.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-people.svg b/public/assets/img/svg/octicon-people.svg
index 14e9d75d4dd..9bf6400b649 100644
--- a/public/assets/img/svg/octicon-people.svg
+++ b/public/assets/img/svg/octicon-people.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-person-add.svg b/public/assets/img/svg/octicon-person-add.svg
index a04727ce0bf..6dcdd20d830 100644
--- a/public/assets/img/svg/octicon-person-add.svg
+++ b/public/assets/img/svg/octicon-person-add.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-person-fill.svg b/public/assets/img/svg/octicon-person-fill.svg
index aef50598071..e3cd5eedf05 100644
--- a/public/assets/img/svg/octicon-person-fill.svg
+++ b/public/assets/img/svg/octicon-person-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-person.svg b/public/assets/img/svg/octicon-person.svg
index 0c18220b418..92aa6987642 100644
--- a/public/assets/img/svg/octicon-person.svg
+++ b/public/assets/img/svg/octicon-person.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-play.svg b/public/assets/img/svg/octicon-play.svg
index 39a3650dfdc..dca65727818 100644
--- a/public/assets/img/svg/octicon-play.svg
+++ b/public/assets/img/svg/octicon-play.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-plug.svg b/public/assets/img/svg/octicon-plug.svg
index e496b584d36..aac41be9449 100644
--- a/public/assets/img/svg/octicon-plug.svg
+++ b/public/assets/img/svg/octicon-plug.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-plus-circle.svg b/public/assets/img/svg/octicon-plus-circle.svg
index d8f4cee27d6..71c55630a82 100644
--- a/public/assets/img/svg/octicon-plus-circle.svg
+++ b/public/assets/img/svg/octicon-plus-circle.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-plus.svg b/public/assets/img/svg/octicon-plus.svg
index 227b946e351..1fd3743532f 100644
--- a/public/assets/img/svg/octicon-plus.svg
+++ b/public/assets/img/svg/octicon-plus.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-project-roadmap.svg b/public/assets/img/svg/octicon-project-roadmap.svg
index a61cd569b63..a6b15c1ff2c 100644
--- a/public/assets/img/svg/octicon-project-roadmap.svg
+++ b/public/assets/img/svg/octicon-project-roadmap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-project-symlink.svg b/public/assets/img/svg/octicon-project-symlink.svg
index 0ca269236b0..bc9104a8715 100644
--- a/public/assets/img/svg/octicon-project-symlink.svg
+++ b/public/assets/img/svg/octicon-project-symlink.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-project-template.svg b/public/assets/img/svg/octicon-project-template.svg
index 8a7013a7a02..559465e7dcd 100644
--- a/public/assets/img/svg/octicon-project-template.svg
+++ b/public/assets/img/svg/octicon-project-template.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-project.svg b/public/assets/img/svg/octicon-project.svg
index 52d86d4b77d..9fb23c758da 100644
--- a/public/assets/img/svg/octicon-project.svg
+++ b/public/assets/img/svg/octicon-project.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-pulse.svg b/public/assets/img/svg/octicon-pulse.svg
index b164f2ea762..5b393ebaa86 100644
--- a/public/assets/img/svg/octicon-pulse.svg
+++ b/public/assets/img/svg/octicon-pulse.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-question.svg b/public/assets/img/svg/octicon-question.svg
index b21e8675257..fbc075a2db8 100644
--- a/public/assets/img/svg/octicon-question.svg
+++ b/public/assets/img/svg/octicon-question.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-quote.svg b/public/assets/img/svg/octicon-quote.svg
index 2647b0bf47a..c3b02f48314 100644
--- a/public/assets/img/svg/octicon-quote.svg
+++ b/public/assets/img/svg/octicon-quote.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-rel-file-path.svg b/public/assets/img/svg/octicon-rel-file-path.svg
index 4f235bae2e6..d7617487e12 100644
--- a/public/assets/img/svg/octicon-rel-file-path.svg
+++ b/public/assets/img/svg/octicon-rel-file-path.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-clone.svg b/public/assets/img/svg/octicon-repo-clone.svg
index 72e245fc342..a34eb677c07 100644
--- a/public/assets/img/svg/octicon-repo-clone.svg
+++ b/public/assets/img/svg/octicon-repo-clone.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-deleted.svg b/public/assets/img/svg/octicon-repo-deleted.svg
index 59fbeaff625..c2f0fc8cf89 100644
--- a/public/assets/img/svg/octicon-repo-deleted.svg
+++ b/public/assets/img/svg/octicon-repo-deleted.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-forked.svg b/public/assets/img/svg/octicon-repo-forked.svg
index 08bd8e5a70f..a45bee68ca0 100644
--- a/public/assets/img/svg/octicon-repo-forked.svg
+++ b/public/assets/img/svg/octicon-repo-forked.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-locked.svg b/public/assets/img/svg/octicon-repo-locked.svg
index 382a1f0a786..34aa27d5cba 100644
--- a/public/assets/img/svg/octicon-repo-locked.svg
+++ b/public/assets/img/svg/octicon-repo-locked.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-pull.svg b/public/assets/img/svg/octicon-repo-pull.svg
index 743aeec31d2..8cee37524f6 100644
--- a/public/assets/img/svg/octicon-repo-pull.svg
+++ b/public/assets/img/svg/octicon-repo-pull.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-repo-template.svg b/public/assets/img/svg/octicon-repo-template.svg
index 12da1960e08..05b951e6413 100644
--- a/public/assets/img/svg/octicon-repo-template.svg
+++ b/public/assets/img/svg/octicon-repo-template.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-report.svg b/public/assets/img/svg/octicon-report.svg
index 615c52b20d2..fc678f7c1f9 100644
--- a/public/assets/img/svg/octicon-report.svg
+++ b/public/assets/img/svg/octicon-report.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-rocket.svg b/public/assets/img/svg/octicon-rocket.svg
index e3a5f805d1b..967b2d63f41 100644
--- a/public/assets/img/svg/octicon-rocket.svg
+++ b/public/assets/img/svg/octicon-rocket.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-rows.svg b/public/assets/img/svg/octicon-rows.svg
index 9cd752698da..4596215238a 100644
--- a/public/assets/img/svg/octicon-rows.svg
+++ b/public/assets/img/svg/octicon-rows.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-rss.svg b/public/assets/img/svg/octicon-rss.svg
index d9aa600d333..757ec69e13f 100644
--- a/public/assets/img/svg/octicon-rss.svg
+++ b/public/assets/img/svg/octicon-rss.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-screen-full.svg b/public/assets/img/svg/octicon-screen-full.svg
index 040ddf9ed99..8074a22cf2d 100644
--- a/public/assets/img/svg/octicon-screen-full.svg
+++ b/public/assets/img/svg/octicon-screen-full.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-screen-normal.svg b/public/assets/img/svg/octicon-screen-normal.svg
index 1cf1e086891..98fe6a87219 100644
--- a/public/assets/img/svg/octicon-screen-normal.svg
+++ b/public/assets/img/svg/octicon-screen-normal.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-search.svg b/public/assets/img/svg/octicon-search.svg
index 5c3a88bca6a..2623d5d5946 100644
--- a/public/assets/img/svg/octicon-search.svg
+++ b/public/assets/img/svg/octicon-search.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-server.svg b/public/assets/img/svg/octicon-server.svg
index 3d80f856bad..7943abf27c2 100644
--- a/public/assets/img/svg/octicon-server.svg
+++ b/public/assets/img/svg/octicon-server.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-share-android.svg b/public/assets/img/svg/octicon-share-android.svg
index 81d0df456e7..78b3464c8da 100644
--- a/public/assets/img/svg/octicon-share-android.svg
+++ b/public/assets/img/svg/octicon-share-android.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-shield-check.svg b/public/assets/img/svg/octicon-shield-check.svg
index 13df0052fb3..68c653adaeb 100644
--- a/public/assets/img/svg/octicon-shield-check.svg
+++ b/public/assets/img/svg/octicon-shield-check.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-shield-lock.svg b/public/assets/img/svg/octicon-shield-lock.svg
index cc85d282110..ef96e9a1e8e 100644
--- a/public/assets/img/svg/octicon-shield-lock.svg
+++ b/public/assets/img/svg/octicon-shield-lock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-shield-slash.svg b/public/assets/img/svg/octicon-shield-slash.svg
index b4c2fe18df4..eb9360fbdf0 100644
--- a/public/assets/img/svg/octicon-shield-slash.svg
+++ b/public/assets/img/svg/octicon-shield-slash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-shield.svg b/public/assets/img/svg/octicon-shield.svg
index be209575db5..668979d7e5e 100644
--- a/public/assets/img/svg/octicon-shield.svg
+++ b/public/assets/img/svg/octicon-shield.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sidebar-collapse.svg b/public/assets/img/svg/octicon-sidebar-collapse.svg
index 7b307bdda27..6885cd277f0 100644
--- a/public/assets/img/svg/octicon-sidebar-collapse.svg
+++ b/public/assets/img/svg/octicon-sidebar-collapse.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-skip-fill.svg b/public/assets/img/svg/octicon-skip-fill.svg
index d3e854314e1..01a5cc8d3f0 100644
--- a/public/assets/img/svg/octicon-skip-fill.svg
+++ b/public/assets/img/svg/octicon-skip-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-skip.svg b/public/assets/img/svg/octicon-skip.svg
index 97905054381..778827da664 100644
--- a/public/assets/img/svg/octicon-skip.svg
+++ b/public/assets/img/svg/octicon-skip.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sliders.svg b/public/assets/img/svg/octicon-sliders.svg
index a76bf5180f7..940a3abde17 100644
--- a/public/assets/img/svg/octicon-sliders.svg
+++ b/public/assets/img/svg/octicon-sliders.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-smiley.svg b/public/assets/img/svg/octicon-smiley.svg
index 619b0960f76..0b3d8c9769c 100644
--- a/public/assets/img/svg/octicon-smiley.svg
+++ b/public/assets/img/svg/octicon-smiley.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sort-asc.svg b/public/assets/img/svg/octicon-sort-asc.svg
index fe05e58ed87..45d95c49e23 100644
--- a/public/assets/img/svg/octicon-sort-asc.svg
+++ b/public/assets/img/svg/octicon-sort-asc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sort-desc.svg b/public/assets/img/svg/octicon-sort-desc.svg
index b35567d75ff..1ae84a7fe7d 100644
--- a/public/assets/img/svg/octicon-sort-desc.svg
+++ b/public/assets/img/svg/octicon-sort-desc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sponsor-tiers.svg b/public/assets/img/svg/octicon-sponsor-tiers.svg
index 08e0ae6e601..a5afb85e23c 100644
--- a/public/assets/img/svg/octicon-sponsor-tiers.svg
+++ b/public/assets/img/svg/octicon-sponsor-tiers.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-square-fill.svg b/public/assets/img/svg/octicon-square-fill.svg
index 24deb106db8..06d32b3c78d 100644
--- a/public/assets/img/svg/octicon-square-fill.svg
+++ b/public/assets/img/svg/octicon-square-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-star-fill.svg b/public/assets/img/svg/octicon-star-fill.svg
index 3d5c976fef1..174ae0c2c07 100644
--- a/public/assets/img/svg/octicon-star-fill.svg
+++ b/public/assets/img/svg/octicon-star-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-star.svg b/public/assets/img/svg/octicon-star.svg
index 42e42ab5e6f..31e008b2811 100644
--- a/public/assets/img/svg/octicon-star.svg
+++ b/public/assets/img/svg/octicon-star.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-stop.svg b/public/assets/img/svg/octicon-stop.svg
index 03cdceb1f21..6838a7cead1 100644
--- a/public/assets/img/svg/octicon-stop.svg
+++ b/public/assets/img/svg/octicon-stop.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-stopwatch.svg b/public/assets/img/svg/octicon-stopwatch.svg
index b63aba3421d..6e1588ac2e0 100644
--- a/public/assets/img/svg/octicon-stopwatch.svg
+++ b/public/assets/img/svg/octicon-stopwatch.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-strikethrough.svg b/public/assets/img/svg/octicon-strikethrough.svg
index d75258995bf..4a45dfc41d4 100644
--- a/public/assets/img/svg/octicon-strikethrough.svg
+++ b/public/assets/img/svg/octicon-strikethrough.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sun.svg b/public/assets/img/svg/octicon-sun.svg
index 1abeab2d1c6..f54a4163270 100644
--- a/public/assets/img/svg/octicon-sun.svg
+++ b/public/assets/img/svg/octicon-sun.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-sync.svg b/public/assets/img/svg/octicon-sync.svg
index 146e48f379a..8b4d0c8c1e5 100644
--- a/public/assets/img/svg/octicon-sync.svg
+++ b/public/assets/img/svg/octicon-sync.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-tab-external.svg b/public/assets/img/svg/octicon-tab-external.svg
index b86888e6873..e1a979df1cc 100644
--- a/public/assets/img/svg/octicon-tab-external.svg
+++ b/public/assets/img/svg/octicon-tab-external.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-tag.svg b/public/assets/img/svg/octicon-tag.svg
index 35c4f2e8174..9aaad7f5fea 100644
--- a/public/assets/img/svg/octicon-tag.svg
+++ b/public/assets/img/svg/octicon-tag.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-tasklist.svg b/public/assets/img/svg/octicon-tasklist.svg
index a568cc8c04a..227cd8a61bc 100644
--- a/public/assets/img/svg/octicon-tasklist.svg
+++ b/public/assets/img/svg/octicon-tasklist.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-telescope.svg b/public/assets/img/svg/octicon-telescope.svg
index ccac95cd594..9ca9a6b372b 100644
--- a/public/assets/img/svg/octicon-telescope.svg
+++ b/public/assets/img/svg/octicon-telescope.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-terminal.svg b/public/assets/img/svg/octicon-terminal.svg
index 4744caec0af..065ef103930 100644
--- a/public/assets/img/svg/octicon-terminal.svg
+++ b/public/assets/img/svg/octicon-terminal.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-three-bars.svg b/public/assets/img/svg/octicon-three-bars.svg
index 2b6fc0abedb..cf97b03044c 100644
--- a/public/assets/img/svg/octicon-three-bars.svg
+++ b/public/assets/img/svg/octicon-three-bars.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-thumbsdown.svg b/public/assets/img/svg/octicon-thumbsdown.svg
index 1a22693ea0d..2d9f4d8afc1 100644
--- a/public/assets/img/svg/octicon-thumbsdown.svg
+++ b/public/assets/img/svg/octicon-thumbsdown.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-thumbsup.svg b/public/assets/img/svg/octicon-thumbsup.svg
index ed38245f05a..7871ab71dd3 100644
--- a/public/assets/img/svg/octicon-thumbsup.svg
+++ b/public/assets/img/svg/octicon-thumbsup.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-tracked-by-closed-completed.svg b/public/assets/img/svg/octicon-tracked-by-closed-completed.svg
index 7a3af6dee2b..b12638d87d0 100644
--- a/public/assets/img/svg/octicon-tracked-by-closed-completed.svg
+++ b/public/assets/img/svg/octicon-tracked-by-closed-completed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-tracked-by-closed-not-planned.svg b/public/assets/img/svg/octicon-tracked-by-closed-not-planned.svg
index bbeb817b822..e96e93a40b9 100644
--- a/public/assets/img/svg/octicon-tracked-by-closed-not-planned.svg
+++ b/public/assets/img/svg/octicon-tracked-by-closed-not-planned.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-trash.svg b/public/assets/img/svg/octicon-trash.svg
index d0c0a5f712b..e0a1e569090 100644
--- a/public/assets/img/svg/octicon-trash.svg
+++ b/public/assets/img/svg/octicon-trash.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-trophy.svg b/public/assets/img/svg/octicon-trophy.svg
index 0f1328e2e0e..ae33cff336b 100644
--- a/public/assets/img/svg/octicon-trophy.svg
+++ b/public/assets/img/svg/octicon-trophy.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unfold.svg b/public/assets/img/svg/octicon-unfold.svg
index ff4a0dd56a8..e383765b0c1 100644
--- a/public/assets/img/svg/octicon-unfold.svg
+++ b/public/assets/img/svg/octicon-unfold.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unlink.svg b/public/assets/img/svg/octicon-unlink.svg
index 0f77b14734c..778d5af83cf 100644
--- a/public/assets/img/svg/octicon-unlink.svg
+++ b/public/assets/img/svg/octicon-unlink.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unlock.svg b/public/assets/img/svg/octicon-unlock.svg
index b0739c67035..efeb0ef3838 100644
--- a/public/assets/img/svg/octicon-unlock.svg
+++ b/public/assets/img/svg/octicon-unlock.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unmute.svg b/public/assets/img/svg/octicon-unmute.svg
index 79234174e97..6ebdf38d148 100644
--- a/public/assets/img/svg/octicon-unmute.svg
+++ b/public/assets/img/svg/octicon-unmute.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unread.svg b/public/assets/img/svg/octicon-unread.svg
index 9652a18ff01..82982ef5e3c 100644
--- a/public/assets/img/svg/octicon-unread.svg
+++ b/public/assets/img/svg/octicon-unread.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-unverified.svg b/public/assets/img/svg/octicon-unverified.svg
index c4bbddfab0b..f91e66c8aff 100644
--- a/public/assets/img/svg/octicon-unverified.svg
+++ b/public/assets/img/svg/octicon-unverified.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-video.svg b/public/assets/img/svg/octicon-video.svg
index 95d92d87a63..600a42bbea1 100644
--- a/public/assets/img/svg/octicon-video.svg
+++ b/public/assets/img/svg/octicon-video.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-webhook.svg b/public/assets/img/svg/octicon-webhook.svg
index afb2e08209a..cce7537fb8b 100644
--- a/public/assets/img/svg/octicon-webhook.svg
+++ b/public/assets/img/svg/octicon-webhook.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-x-circle-fill.svg b/public/assets/img/svg/octicon-x-circle-fill.svg
index eafea6df78a..3688189a458 100644
--- a/public/assets/img/svg/octicon-x-circle-fill.svg
+++ b/public/assets/img/svg/octicon-x-circle-fill.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-x-circle.svg b/public/assets/img/svg/octicon-x-circle.svg
index 26cce460d5c..e4beb382fae 100644
--- a/public/assets/img/svg/octicon-x-circle.svg
+++ b/public/assets/img/svg/octicon-x-circle.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-x.svg b/public/assets/img/svg/octicon-x.svg
index de54c0928e7..a39b8e57b6a 100644
--- a/public/assets/img/svg/octicon-x.svg
+++ b/public/assets/img/svg/octicon-x.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-zoom-in.svg b/public/assets/img/svg/octicon-zoom-in.svg
index 88540b57668..1713ae7df11 100644
--- a/public/assets/img/svg/octicon-zoom-in.svg
+++ b/public/assets/img/svg/octicon-zoom-in.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/public/assets/img/svg/octicon-zoom-out.svg b/public/assets/img/svg/octicon-zoom-out.svg
index d03925e0df8..9d682db55f3 100644
--- a/public/assets/img/svg/octicon-zoom-out.svg
+++ b/public/assets/img/svg/octicon-zoom-out.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index b4f1a06a345..4b89d809996 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,7 +9,7 @@ python = "^3.8"
[tool.poetry.group.dev.dependencies]
djlint = "1.34.0"
-yamllint = "1.32.0"
+yamllint = "1.33.0"
[tool.djlint]
profile="golang"
diff --git a/routers/api/actions/artifacts.go b/routers/api/actions/artifacts.go
index c45dc667afc..5411237103a 100644
--- a/routers/api/actions/artifacts.go
+++ b/routers/api/actions/artifacts.go
@@ -70,6 +70,7 @@ import (
"strings"
"code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
@@ -314,7 +315,7 @@ func (ar artifactRoutes) listArtifacts(ctx *ArtifactContext) {
return
}
- artifacts, err := actions.ListArtifactsByRunID(ctx, runID)
+ artifacts, err := db.Find[actions.ActionArtifact](ctx, actions.FindArtifactsOptions{RunID: runID})
if err != nil {
log.Error("Error getting artifacts: %v", err)
ctx.Error(http.StatusInternalServerError, err.Error())
@@ -376,7 +377,10 @@ func (ar artifactRoutes) getDownloadArtifactURL(ctx *ArtifactContext) {
return
}
- artifacts, err := actions.ListArtifactsByRunIDAndArtifactName(ctx, runID, itemPath)
+ artifacts, err := db.Find[actions.ActionArtifact](ctx, actions.FindArtifactsOptions{
+ RunID: runID,
+ ArtifactName: itemPath,
+ })
if err != nil {
log.Error("Error getting artifacts: %v", err)
ctx.Error(http.StatusInternalServerError, err.Error())
diff --git a/routers/api/actions/artifacts_chunks.go b/routers/api/actions/artifacts_chunks.go
index 458d671cff6..c7ab70afa95 100644
--- a/routers/api/actions/artifacts_chunks.go
+++ b/routers/api/actions/artifacts_chunks.go
@@ -13,6 +13,7 @@ import (
"time"
"code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/storage"
)
@@ -86,7 +87,10 @@ func listChunksByRunID(st storage.ObjectStorage, runID int64) (map[int64][]*chun
func mergeChunksForRun(ctx *ArtifactContext, st storage.ObjectStorage, runID int64, artifactName string) error {
// read all db artifacts by name
- artifacts, err := actions.ListArtifactsByRunIDAndName(ctx, runID, artifactName)
+ artifacts, err := db.Find[actions.ActionArtifact](ctx, actions.FindArtifactsOptions{
+ RunID: runID,
+ ArtifactName: artifactName,
+ })
if err != nil {
return err
}
diff --git a/routers/api/actions/runner/utils.go b/routers/api/actions/runner/utils.go
index 24432ab6b20..bf913f2c057 100644
--- a/routers/api/actions/runner/utils.go
+++ b/routers/api/actions/runner/utils.go
@@ -8,6 +8,7 @@ import (
"fmt"
actions_model "code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
secret_model "code.gitea.io/gitea/models/secret"
actions_module "code.gitea.io/gitea/modules/actions"
"code.gitea.io/gitea/modules/container"
@@ -67,12 +68,12 @@ func getSecretsOfTask(ctx context.Context, task *actions_model.ActionTask) map[s
return secrets
}
- ownerSecrets, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{OwnerID: task.Job.Run.Repo.OwnerID})
+ ownerSecrets, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{OwnerID: task.Job.Run.Repo.OwnerID})
if err != nil {
log.Error("find secrets of owner %v: %v", task.Job.Run.Repo.OwnerID, err)
// go on
}
- repoSecrets, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{RepoID: task.Job.Run.RepoID})
+ repoSecrets, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{RepoID: task.Job.Run.RepoID})
if err != nil {
log.Error("find secrets of repo %v: %v", task.Job.Run.RepoID, err)
// go on
@@ -94,13 +95,13 @@ func getVariablesOfTask(ctx context.Context, task *actions_model.ActionTask) map
variables := map[string]string{}
// Org / User level
- ownerVariables, err := actions_model.FindVariables(ctx, actions_model.FindVariablesOpts{OwnerID: task.Job.Run.Repo.OwnerID})
+ ownerVariables, err := db.Find[actions_model.ActionVariable](ctx, actions_model.FindVariablesOpts{OwnerID: task.Job.Run.Repo.OwnerID})
if err != nil {
log.Error("find variables of org: %d, error: %v", task.Job.Run.Repo.OwnerID, err)
}
// Repo level
- repoVariables, err := actions_model.FindVariables(ctx, actions_model.FindVariablesOpts{RepoID: task.Job.Run.RepoID})
+ repoVariables, err := db.Find[actions_model.ActionVariable](ctx, actions_model.FindVariablesOpts{RepoID: task.Job.Run.RepoID})
if err != nil {
log.Error("find variables of repo: %d, error: %v", task.Job.Run.RepoID, err)
}
@@ -200,7 +201,7 @@ func findTaskNeeds(ctx context.Context, task *actions_model.ActionTask) (map[str
}
needs := container.SetOf(task.Job.Needs...)
- jobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{RunID: task.Job.RunID})
+ jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: task.Job.RunID})
if err != nil {
return nil, fmt.Errorf("FindRunJobs: %w", err)
}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index cadddb44c39..623c798feea 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -2,7 +2,7 @@
// Copyright 2016 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
-// Package v1 Gitea API.
+// Package v1 Gitea API
//
// This documentation describes the Gitea API.
//
@@ -1259,8 +1259,8 @@ func Routes() *web.Route {
m.Group("/{username}/{reponame}", func() {
m.Group("/issues", func() {
m.Combo("").Get(repo.ListIssues).
- Post(reqToken(), mustNotBeArchived, bind(api.CreateIssueOption{}), repo.CreateIssue)
- m.Get("/pinned", repo.ListPinnedIssues)
+ Post(reqToken(), mustNotBeArchived, bind(api.CreateIssueOption{}), reqRepoReader(unit.TypeIssues), repo.CreateIssue)
+ m.Get("/pinned", reqRepoReader(unit.TypeIssues), repo.ListPinnedIssues)
m.Group("/comments", func() {
m.Get("", repo.ListRepoIssueComments)
m.Group("/{id}", func() {
diff --git a/routers/api/v1/notify/notifications.go b/routers/api/v1/notify/notifications.go
index b22ea8a7715..c87da9399f0 100644
--- a/routers/api/v1/notify/notifications.go
+++ b/routers/api/v1/notify/notifications.go
@@ -8,6 +8,7 @@ import (
"strings"
activities_model "code.gitea.io/gitea/models/activities"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/context"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/routers/api/v1/utils"
@@ -21,7 +22,17 @@ func NewAvailable(ctx *context.APIContext) {
// responses:
// "200":
// "$ref": "#/responses/NotificationCount"
- ctx.JSON(http.StatusOK, api.NotificationCount{New: activities_model.CountUnread(ctx, ctx.Doer.ID)})
+
+ total, err := db.Count[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
+ UserID: ctx.Doer.ID,
+ Status: []activities_model.NotificationStatus{activities_model.NotificationStatusUnread},
+ })
+ if err != nil {
+ ctx.Error(http.StatusUnprocessableEntity, "db.Count[activities_model.Notification]", err)
+ return
+ }
+
+ ctx.JSON(http.StatusOK, api.NotificationCount{New: total})
}
func getFindNotificationOptions(ctx *context.APIContext) *activities_model.FindNotificationOptions {
diff --git a/routers/api/v1/notify/repo.go b/routers/api/v1/notify/repo.go
index 0e4efcc640f..55ca6ad1fd5 100644
--- a/routers/api/v1/notify/repo.go
+++ b/routers/api/v1/notify/repo.go
@@ -9,6 +9,7 @@ import (
"time"
activities_model "code.gitea.io/gitea/models/activities"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/structs"
@@ -108,18 +109,18 @@ func ListRepoNotifications(ctx *context.APIContext) {
}
opts.RepoID = ctx.Repo.Repository.ID
- totalCount, err := activities_model.CountNotifications(ctx, opts)
+ totalCount, err := db.Count[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
}
- nl, err := activities_model.GetNotifications(ctx, opts)
+ nl, err := db.Find[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
}
- err = nl.LoadAttributes(ctx)
+ err = activities_model.NotificationList(nl).LoadAttributes(ctx)
if err != nil {
ctx.InternalServerError(err)
return
@@ -202,7 +203,7 @@ func ReadRepoNotifications(ctx *context.APIContext) {
opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread"})
log.Error("%v", opts.Status)
}
- nl, err := activities_model.GetNotifications(ctx, opts)
+ nl, err := db.Find[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
diff --git a/routers/api/v1/notify/user.go b/routers/api/v1/notify/user.go
index 267b7d8ea8c..4abdfb2e925 100644
--- a/routers/api/v1/notify/user.go
+++ b/routers/api/v1/notify/user.go
@@ -8,6 +8,7 @@ import (
"time"
activities_model "code.gitea.io/gitea/models/activities"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/services/convert"
@@ -68,18 +69,18 @@ func ListNotifications(ctx *context.APIContext) {
return
}
- totalCount, err := activities_model.CountNotifications(ctx, opts)
+ totalCount, err := db.Count[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
}
- nl, err := activities_model.GetNotifications(ctx, opts)
+ nl, err := db.Find[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
}
- err = nl.LoadAttributes(ctx)
+ err = activities_model.NotificationList(nl).LoadAttributes(ctx)
if err != nil {
ctx.InternalServerError(err)
return
@@ -147,7 +148,7 @@ func ReadNotifications(ctx *context.APIContext) {
statuses := ctx.FormStrings("status-types")
opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread"})
}
- nl, err := activities_model.GetNotifications(ctx, opts)
+ nl, err := db.Find[activities_model.Notification](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go
index 5af61257735..ddc74d865b1 100644
--- a/routers/api/v1/org/action.go
+++ b/routers/api/v1/org/action.go
@@ -7,6 +7,7 @@ import (
"errors"
"net/http"
+ "code.gitea.io/gitea/models/db"
secret_model "code.gitea.io/gitea/models/secret"
"code.gitea.io/gitea/modules/context"
api "code.gitea.io/gitea/modules/structs"
@@ -48,13 +49,7 @@ func ListActionsSecrets(ctx *context.APIContext) {
ListOptions: utils.GetListOptions(ctx),
}
- count, err := secret_model.CountSecrets(ctx, opts)
- if err != nil {
- ctx.InternalServerError(err)
- return
- }
-
- secrets, err := secret_model.FindSecrets(ctx, *opts)
+ secrets, count, err := db.FindAndCount[secret_model.Secret](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go
index 6fb8ecd403a..d5fac1e5b8c 100644
--- a/routers/api/v1/org/org.go
+++ b/routers/api/v1/org/org.go
@@ -30,14 +30,9 @@ func listUserOrgs(ctx *context.APIContext, u *user_model.User) {
UserID: u.ID,
IncludePrivate: showPrivate,
}
- orgs, err := organization.FindOrgs(ctx, opts)
+ orgs, maxResults, err := db.FindAndCount[organization.Organization](ctx, opts)
if err != nil {
- ctx.Error(http.StatusInternalServerError, "FindOrgs", err)
- return
- }
- maxResults, err := organization.CountOrgs(ctx, opts)
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "CountOrgs", err)
+ ctx.Error(http.StatusInternalServerError, "db.FindAndCount[organization.Organization]", err)
return
}
diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go
index 7d0142748ac..8859e3ae236 100644
--- a/routers/api/v1/repo/hook.go
+++ b/routers/api/v1/repo/hook.go
@@ -7,6 +7,7 @@ package repo
import (
"net/http"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/perm"
access_model "code.gitea.io/gitea/models/perm/access"
"code.gitea.io/gitea/models/webhook"
@@ -58,13 +59,7 @@ func ListHooks(ctx *context.APIContext) {
RepoID: ctx.Repo.Repository.ID,
}
- count, err := webhook.CountWebhooksByOpts(ctx, opts)
- if err != nil {
- ctx.InternalServerError(err)
- return
- }
-
- hooks, err := webhook.ListWebhooksByOpts(ctx, opts)
+ hooks, count, err := db.FindAndCount[webhook.Webhook](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go
index 74e6361f6c5..0f76a4b4ff2 100644
--- a/routers/api/v1/repo/issue.go
+++ b/routers/api/v1/repo/issue.go
@@ -462,6 +462,24 @@ func ListIssues(ctx *context.APIContext) {
isPull = util.OptionalBoolNone
}
+ if isPull != util.OptionalBoolNone && !ctx.Repo.CanReadIssuesOrPulls(isPull.IsTrue()) {
+ ctx.NotFound()
+ return
+ }
+
+ if isPull == util.OptionalBoolNone {
+ canReadIssues := ctx.Repo.CanRead(unit.TypeIssues)
+ canReadPulls := ctx.Repo.CanRead(unit.TypePullRequests)
+ if !canReadIssues && !canReadPulls {
+ ctx.NotFound()
+ return
+ } else if !canReadIssues {
+ isPull = util.OptionalBoolTrue
+ } else if !canReadPulls {
+ isPull = util.OptionalBoolFalse
+ }
+ }
+
// FIXME: we should be more efficient here
createdByID := getUserIDForFilter(ctx, "created_by")
if ctx.Written() {
@@ -593,6 +611,10 @@ func GetIssue(ctx *context.APIContext) {
}
return
}
+ if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
+ ctx.NotFound()
+ return
+ }
ctx.JSON(http.StatusOK, convert.ToAPIIssue(ctx, issue))
}
diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go
index c718424f7eb..4db2c68a798 100644
--- a/routers/api/v1/repo/issue_comment.go
+++ b/routers/api/v1/repo/issue_comment.go
@@ -12,9 +12,11 @@ import (
issues_model "code.gitea.io/gitea/models/issues"
access_model "code.gitea.io/gitea/models/perm/access"
repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/convert"
@@ -71,6 +73,11 @@ func ListIssueComments(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "GetRawIssueByIndex", err)
return
}
+ if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
+ ctx.NotFound()
+ return
+ }
+
issue.Repo = ctx.Repo.Repository
opts := &issues_model.FindCommentsOptions{
@@ -271,12 +278,27 @@ func ListRepoIssueComments(ctx *context.APIContext) {
return
}
+ var isPull util.OptionalBool
+ canReadIssue := ctx.Repo.CanRead(unit.TypeIssues)
+ canReadPull := ctx.Repo.CanRead(unit.TypePullRequests)
+ if canReadIssue && canReadPull {
+ isPull = util.OptionalBoolNone
+ } else if canReadIssue {
+ isPull = util.OptionalBoolFalse
+ } else if canReadPull {
+ isPull = util.OptionalBoolTrue
+ } else {
+ ctx.NotFound()
+ return
+ }
+
opts := &issues_model.FindCommentsOptions{
ListOptions: utils.GetListOptions(ctx),
RepoID: ctx.Repo.Repository.ID,
Type: issues_model.CommentTypeComment,
Since: since,
Before: before,
+ IsPull: isPull,
}
comments, err := issues_model.FindComments(ctx, opts)
@@ -367,6 +389,11 @@ func CreateIssueComment(ctx *context.APIContext) {
return
}
+ if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
+ ctx.NotFound()
+ return
+ }
+
if issue.IsLocked && !ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull) && !ctx.Doer.IsAdmin {
ctx.Error(http.StatusForbidden, "CreateIssueComment", errors.New(ctx.Tr("repo.issues.comment_on_locked")))
return
@@ -436,6 +463,11 @@ func GetIssueComment(ctx *context.APIContext) {
return
}
+ if !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull) {
+ ctx.NotFound()
+ return
+ }
+
if comment.Type != issues_model.CommentTypeComment {
ctx.Status(http.StatusNoContent)
return
@@ -555,7 +587,17 @@ func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption)
return
}
- if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.IsAdmin()) {
+ if err := comment.LoadIssue(ctx); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadIssue", err)
+ return
+ }
+
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.Status(http.StatusNotFound)
+ return
+ }
+
+ if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) {
ctx.Status(http.StatusForbidden)
return
}
@@ -658,7 +700,17 @@ func deleteIssueComment(ctx *context.APIContext) {
return
}
- if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.IsAdmin()) {
+ if err := comment.LoadIssue(ctx); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadIssue", err)
+ return
+ }
+
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.Status(http.StatusNotFound)
+ return
+ }
+
+ if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) {
ctx.Status(http.StatusForbidden)
return
} else if comment.Type != issues_model.CommentTypeComment {
diff --git a/routers/api/v1/repo/issue_comment_attachment.go b/routers/api/v1/repo/issue_comment_attachment.go
index c327c54d101..21e2f4dabd6 100644
--- a/routers/api/v1/repo/issue_comment_attachment.go
+++ b/routers/api/v1/repo/issue_comment_attachment.go
@@ -329,6 +329,10 @@ func getIssueCommentSafe(ctx *context.APIContext) *issues_model.Comment {
return nil
}
+ if !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull) {
+ return nil
+ }
+
comment.Issue.Repo = ctx.Repo.Repository
return comment
diff --git a/routers/api/v1/repo/issue_reaction.go b/routers/api/v1/repo/issue_reaction.go
index 29c99184e76..c886bd71b76 100644
--- a/routers/api/v1/repo/issue_reaction.go
+++ b/routers/api/v1/repo/issue_reaction.go
@@ -61,6 +61,12 @@ func GetIssueCommentReactions(ctx *context.APIContext) {
if err := comment.LoadIssue(ctx); err != nil {
ctx.Error(http.StatusInternalServerError, "comment.LoadIssue", err)
+ return
+ }
+
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound()
+ return
}
if !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull) {
@@ -190,9 +196,19 @@ func changeIssueCommentReaction(ctx *context.APIContext, form api.EditReactionOp
return
}
- err = comment.LoadIssue(ctx)
- if err != nil {
+ if err = comment.LoadIssue(ctx); err != nil {
ctx.Error(http.StatusInternalServerError, "comment.LoadIssue() failed", err)
+ return
+ }
+
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound()
+ return
+ }
+
+ if !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull) {
+ ctx.NotFound()
+ return
}
if comment.Issue.IsLocked && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull) {
diff --git a/routers/api/v1/repo/key.go b/routers/api/v1/repo/key.go
index 47a4d14842d..af48c40885d 100644
--- a/routers/api/v1/repo/key.go
+++ b/routers/api/v1/repo/key.go
@@ -83,20 +83,14 @@ func ListDeployKeys(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
- opts := &asymkey_model.ListDeployKeysOptions{
+ opts := asymkey_model.ListDeployKeysOptions{
ListOptions: utils.GetListOptions(ctx),
RepoID: ctx.Repo.Repository.ID,
KeyID: ctx.FormInt64("key_id"),
Fingerprint: ctx.FormString("fingerprint"),
}
- keys, err := asymkey_model.ListDeployKeys(ctx, opts)
- if err != nil {
- ctx.InternalServerError(err)
- return
- }
-
- count, err := asymkey_model.CountDeployKeys(ctx, opts)
+ keys, count, err := db.FindAndCount[asymkey_model.DeployKey](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
@@ -159,6 +153,12 @@ func GetDeployKey(ctx *context.APIContext) {
return
}
+ // this check make it more consistent
+ if key.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound()
+ return
+ }
+
if err = key.GetContent(ctx); err != nil {
ctx.Error(http.StatusInternalServerError, "GetContent", err)
return
diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go
index 61e5bdd6794..6c70bffca33 100644
--- a/routers/api/v1/repo/release.go
+++ b/routers/api/v1/repo/release.go
@@ -49,13 +49,12 @@ func GetRelease(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
id := ctx.ParamsInt64(":id")
- release, err := repo_model.GetReleaseByID(ctx, id)
+ release, err := repo_model.GetReleaseForRepoByID(ctx, ctx.Repo.Repository.ID, id)
if err != nil && !repo_model.IsErrReleaseNotExist(err) {
- ctx.Error(http.StatusInternalServerError, "GetReleaseByID", err)
+ ctx.Error(http.StatusInternalServerError, "GetReleaseForRepoByID", err)
return
}
- if err != nil && repo_model.IsErrReleaseNotExist(err) ||
- release.IsTag || release.RepoID != ctx.Repo.Repository.ID {
+ if err != nil && repo_model.IsErrReleaseNotExist(err) || release.IsTag {
ctx.NotFound()
return
}
@@ -315,13 +314,12 @@ func EditRelease(ctx *context.APIContext) {
form := web.GetForm(ctx).(*api.EditReleaseOption)
id := ctx.ParamsInt64(":id")
- rel, err := repo_model.GetReleaseByID(ctx, id)
+ rel, err := repo_model.GetReleaseForRepoByID(ctx, ctx.Repo.Repository.ID, id)
if err != nil && !repo_model.IsErrReleaseNotExist(err) {
- ctx.Error(http.StatusInternalServerError, "GetReleaseByID", err)
+ ctx.Error(http.StatusInternalServerError, "GetReleaseForRepoByID", err)
return
}
- if err != nil && repo_model.IsErrReleaseNotExist(err) ||
- rel.IsTag || rel.RepoID != ctx.Repo.Repository.ID {
+ if err != nil && repo_model.IsErrReleaseNotExist(err) || rel.IsTag {
ctx.NotFound()
return
}
@@ -393,17 +391,16 @@ func DeleteRelease(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
id := ctx.ParamsInt64(":id")
- rel, err := repo_model.GetReleaseByID(ctx, id)
+ rel, err := repo_model.GetReleaseForRepoByID(ctx, ctx.Repo.Repository.ID, id)
if err != nil && !repo_model.IsErrReleaseNotExist(err) {
- ctx.Error(http.StatusInternalServerError, "GetReleaseByID", err)
+ ctx.Error(http.StatusInternalServerError, "GetReleaseForRepoByID", err)
return
}
- if err != nil && repo_model.IsErrReleaseNotExist(err) ||
- rel.IsTag || rel.RepoID != ctx.Repo.Repository.ID {
+ if err != nil && repo_model.IsErrReleaseNotExist(err) || rel.IsTag {
ctx.NotFound()
return
}
- if err := release_service.DeleteReleaseByID(ctx, id, ctx.Doer, false); err != nil {
+ if err := release_service.DeleteReleaseByID(ctx, ctx.Repo.Repository, rel, ctx.Doer, false); err != nil {
if models.IsErrProtectedTagName(err) {
ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
return
diff --git a/routers/api/v1/repo/release_attachment.go b/routers/api/v1/repo/release_attachment.go
index 168ef550c5e..c36bf12e6d3 100644
--- a/routers/api/v1/repo/release_attachment.go
+++ b/routers/api/v1/repo/release_attachment.go
@@ -17,6 +17,23 @@ import (
"code.gitea.io/gitea/services/convert"
)
+func checkReleaseMatchRepo(ctx *context.APIContext, releaseID int64) bool {
+ release, err := repo_model.GetReleaseByID(ctx, releaseID)
+ if err != nil {
+ if repo_model.IsErrReleaseNotExist(err) {
+ ctx.NotFound()
+ return false
+ }
+ ctx.Error(http.StatusInternalServerError, "GetReleaseByID", err)
+ return false
+ }
+ if release.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound()
+ return false
+ }
+ return true
+}
+
// GetReleaseAttachment gets a single attachment of the release
func GetReleaseAttachment(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id} repository repoGetReleaseAttachment
@@ -54,6 +71,10 @@ func GetReleaseAttachment(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
releaseID := ctx.ParamsInt64(":id")
+ if !checkReleaseMatchRepo(ctx, releaseID) {
+ return
+ }
+
attachID := ctx.ParamsInt64(":attachment_id")
attach, err := repo_model.GetAttachmentByID(ctx, attachID)
if err != nil {
@@ -176,13 +197,7 @@ func CreateReleaseAttachment(ctx *context.APIContext) {
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
- release, err := repo_model.GetReleaseByID(ctx, releaseID)
- if err != nil {
- if repo_model.IsErrReleaseNotExist(err) {
- ctx.NotFound()
- return
- }
- ctx.Error(http.StatusInternalServerError, "GetReleaseByID", err)
+ if !checkReleaseMatchRepo(ctx, releaseID) {
return
}
@@ -203,7 +218,7 @@ func CreateReleaseAttachment(ctx *context.APIContext) {
attach, err := attachment.UploadAttachment(ctx, file, setting.Repository.Release.AllowedTypes, header.Size, &repo_model.Attachment{
Name: filename,
UploaderID: ctx.Doer.ID,
- RepoID: release.RepoID,
+ RepoID: ctx.Repo.Repository.ID,
ReleaseID: releaseID,
})
if err != nil {
@@ -264,6 +279,10 @@ func EditReleaseAttachment(ctx *context.APIContext) {
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
+ if !checkReleaseMatchRepo(ctx, releaseID) {
+ return
+ }
+
attachID := ctx.ParamsInt64(":attachment_id")
attach, err := repo_model.GetAttachmentByID(ctx, attachID)
if err != nil {
@@ -328,6 +347,10 @@ func DeleteReleaseAttachment(ctx *context.APIContext) {
// Check if release exists an load release
releaseID := ctx.ParamsInt64(":id")
+ if !checkReleaseMatchRepo(ctx, releaseID) {
+ return
+ }
+
attachID := ctx.ParamsInt64(":attachment_id")
attach, err := repo_model.GetAttachmentByID(ctx, attachID)
if err != nil {
diff --git a/routers/api/v1/repo/release_tags.go b/routers/api/v1/repo/release_tags.go
index 926a713c947..9f2098df066 100644
--- a/routers/api/v1/repo/release_tags.go
+++ b/routers/api/v1/repo/release_tags.go
@@ -112,7 +112,7 @@ func DeleteReleaseByTag(ctx *context.APIContext) {
return
}
- if err = releaseservice.DeleteReleaseByID(ctx, release.ID, ctx.Doer, false); err != nil {
+ if err = releaseservice.DeleteReleaseByID(ctx, ctx.Repo.Repository, release, ctx.Doer, false); err != nil {
if models.IsErrProtectedTagName(err) {
ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
return
diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go
index dbc8df0ef81..2f19f95e66d 100644
--- a/routers/api/v1/repo/tag.go
+++ b/routers/api/v1/repo/tag.go
@@ -272,7 +272,7 @@ func DeleteTag(ctx *context.APIContext) {
return
}
- if err = releaseservice.DeleteReleaseByID(ctx, tag.ID, ctx.Doer, true); err != nil {
+ if err = releaseservice.DeleteReleaseByID(ctx, ctx.Repo.Repository, tag, ctx.Doer, true); err != nil {
if models.IsErrProtectedTagName(err) {
ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
return
diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go
index fef0240b0ff..f045fb4d5d8 100644
--- a/routers/api/v1/user/app.go
+++ b/routers/api/v1/user/app.go
@@ -12,6 +12,7 @@ import (
"strings"
auth_model "code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/context"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/web"
@@ -48,12 +49,7 @@ func ListAccessTokens(ctx *context.APIContext) {
opts := auth_model.ListAccessTokensOptions{UserID: ctx.ContextUser.ID, ListOptions: utils.GetListOptions(ctx)}
- count, err := auth_model.CountAccessTokens(ctx, opts)
- if err != nil {
- ctx.InternalServerError(err)
- return
- }
- tokens, err := auth_model.ListAccessTokens(ctx, opts)
+ tokens, count, err := db.FindAndCount[auth_model.AccessToken](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
@@ -168,7 +164,7 @@ func DeleteAccessToken(ctx *context.APIContext) {
tokenID, _ := strconv.ParseInt(token, 0, 64)
if tokenID == 0 {
- tokens, err := auth_model.ListAccessTokens(ctx, auth_model.ListAccessTokensOptions{
+ tokens, err := db.Find[auth_model.AccessToken](ctx, auth_model.ListAccessTokensOptions{
Name: token,
UserID: ctx.ContextUser.ID,
})
@@ -266,7 +262,10 @@ func ListOauth2Applications(ctx *context.APIContext) {
// "200":
// "$ref": "#/responses/OAuth2ApplicationList"
- apps, total, err := auth_model.ListOAuth2Applications(ctx, ctx.Doer.ID, utils.GetListOptions(ctx))
+ apps, total, err := db.FindAndCount[auth_model.OAuth2Application](ctx, auth_model.FindOAuth2ApplicationsOptions{
+ ListOptions: utils.GetListOptions(ctx),
+ OwnerID: ctx.Doer.ID,
+ })
if err != nil {
ctx.Error(http.StatusInternalServerError, "ListOAuth2Applications", err)
return
@@ -343,6 +342,10 @@ func GetOauth2Application(ctx *context.APIContext) {
}
return
}
+ if app.UID != ctx.Doer.ID {
+ ctx.NotFound()
+ return
+ }
app.ClientSecret = ""
diff --git a/routers/api/v1/user/gpg_key.go b/routers/api/v1/user/gpg_key.go
index 404b1d221e1..4f8bcaca3e6 100644
--- a/routers/api/v1/user/gpg_key.go
+++ b/routers/api/v1/user/gpg_key.go
@@ -112,7 +112,7 @@ func GetGPGKey(ctx *context.APIContext) {
// "404":
// "$ref": "#/responses/notFound"
- key, err := asymkey_model.GetGPGKeyByID(ctx, ctx.ParamsInt64(":id"))
+ key, err := asymkey_model.GetGPGKeyForUserByID(ctx, ctx.Doer.ID, ctx.ParamsInt64(":id"))
if err != nil {
if asymkey_model.IsErrGPGKeyNotExist(err) {
ctx.NotFound()
diff --git a/routers/api/v1/user/hook.go b/routers/api/v1/user/hook.go
index 50be519c815..e87385e4a26 100644
--- a/routers/api/v1/user/hook.go
+++ b/routers/api/v1/user/hook.go
@@ -62,6 +62,11 @@ func GetHook(ctx *context.APIContext) {
return
}
+ if !ctx.Doer.IsAdmin && hook.OwnerID != ctx.Doer.ID {
+ ctx.NotFound()
+ return
+ }
+
apiHook, err := webhook_service.ToHook(ctx.Doer.HomeLink(), hook)
if err != nil {
ctx.InternalServerError(err)
diff --git a/routers/api/v1/user/key.go b/routers/api/v1/user/key.go
index fd891699ce2..dd185aa7d62 100644
--- a/routers/api/v1/user/key.go
+++ b/routers/api/v1/user/key.go
@@ -8,6 +8,7 @@ import (
"net/http"
asymkey_model "code.gitea.io/gitea/models/asymkey"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/perm"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
@@ -56,25 +57,26 @@ func listPublicKeys(ctx *context.APIContext, user *user_model.User) {
username := ctx.Params("username")
if fingerprint != "" {
+ var userID int64 // Unrestricted
// Querying not just listing
if username != "" {
// Restrict to provided uid
- keys, err = asymkey_model.SearchPublicKey(ctx, user.ID, fingerprint)
- } else {
- // Unrestricted
- keys, err = asymkey_model.SearchPublicKey(ctx, 0, fingerprint)
+ userID = user.ID
}
+ keys, err = db.Find[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
+ OwnerID: userID,
+ Fingerprint: fingerprint,
+ })
count = len(keys)
} else {
- total, err2 := asymkey_model.CountPublicKeys(ctx, user.ID)
- if err2 != nil {
- ctx.InternalServerError(err)
- return
- }
- count = int(total)
-
+ var total int64
// Use ListPublicKeys
- keys, err = asymkey_model.ListPublicKeys(ctx, user.ID, utils.GetListOptions(ctx))
+ keys, total, err = db.FindAndCount[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
+ ListOptions: utils.GetListOptions(ctx),
+ OwnerID: user.ID,
+ NotKeytype: asymkey_model.KeyTypePrincipal,
+ })
+ count = int(total)
}
if err != nil {
diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go
index 63591383695..fb8f67d0722 100644
--- a/routers/api/v1/user/user.go
+++ b/routers/api/v1/user/user.go
@@ -54,19 +54,33 @@ func Search(ctx *context.APIContext) {
listOptions := utils.GetListOptions(ctx)
- users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{
- Actor: ctx.Doer,
- Keyword: ctx.FormTrim("q"),
- UID: ctx.FormInt64("uid"),
- Type: user_model.UserTypeIndividual,
- ListOptions: listOptions,
- })
- if err != nil {
- ctx.JSON(http.StatusInternalServerError, map[string]any{
- "ok": false,
- "error": err.Error(),
+ uid := ctx.FormInt64("uid")
+ var users []*user_model.User
+ var maxResults int64
+ var err error
+
+ switch uid {
+ case user_model.GhostUserID:
+ maxResults = 1
+ users = []*user_model.User{user_model.NewGhostUser()}
+ case user_model.ActionsUserID:
+ maxResults = 1
+ users = []*user_model.User{user_model.NewActionsUser()}
+ default:
+ users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{
+ Actor: ctx.Doer,
+ Keyword: ctx.FormTrim("q"),
+ UID: uid,
+ Type: user_model.UserTypeIndividual,
+ ListOptions: listOptions,
})
- return
+ if err != nil {
+ ctx.JSON(http.StatusInternalServerError, map[string]any{
+ "ok": false,
+ "error": err.Error(),
+ })
+ return
+ }
}
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
diff --git a/routers/api/v1/utils/hook.go b/routers/api/v1/utils/hook.go
index 362f4bfc4d3..1207be25acc 100644
--- a/routers/api/v1/utils/hook.go
+++ b/routers/api/v1/utils/hook.go
@@ -8,6 +8,7 @@ import (
"net/http"
"strings"
+ "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/models/webhook"
"code.gitea.io/gitea/modules/context"
@@ -26,13 +27,7 @@ func ListOwnerHooks(ctx *context.APIContext, owner *user_model.User) {
OwnerID: owner.ID,
}
- count, err := webhook.CountWebhooksByOpts(ctx, opts)
- if err != nil {
- ctx.InternalServerError(err)
- return
- }
-
- hooks, err := webhook.ListWebhooksByOpts(ctx, opts)
+ hooks, count, err := db.FindAndCount[webhook.Webhook](ctx, opts)
if err != nil {
ctx.InternalServerError(err)
return
diff --git a/routers/web/admin/applications.go b/routers/web/admin/applications.go
index b26912db482..b6f7bcd2a5b 100644
--- a/routers/web/admin/applications.go
+++ b/routers/web/admin/applications.go
@@ -8,6 +8,7 @@ import (
"net/http"
"code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
@@ -33,7 +34,9 @@ func Applications(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("settings.applications")
ctx.Data["PageIsAdminApplications"] = true
- apps, err := auth.GetOAuth2ApplicationsByUserID(ctx, 0)
+ apps, err := db.Find[auth.OAuth2Application](ctx, auth.FindOAuth2ApplicationsOptions{
+ IsGlobal: true,
+ })
if err != nil {
ctx.ServerError("GetOAuth2ApplicationsByUserID", err)
return
diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go
index 23946d64afa..2cf63c646d3 100644
--- a/routers/web/admin/auths.go
+++ b/routers/web/admin/auths.go
@@ -13,6 +13,7 @@ import (
"strings"
"code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/auth/pam"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
@@ -48,13 +49,12 @@ func Authentications(ctx *context.Context) {
ctx.Data["PageIsAdminAuthentications"] = true
var err error
- ctx.Data["Sources"], err = auth.FindSources(ctx, auth.FindSourcesOptions{})
+ ctx.Data["Sources"], ctx.Data["Total"], err = db.FindAndCount[auth.Source](ctx, auth.FindSourcesOptions{})
if err != nil {
ctx.ServerError("auth.Sources", err)
return
}
- ctx.Data["Total"] = auth.CountSources(ctx, auth.FindSourcesOptions{})
ctx.HTML(http.StatusOK, tplAuths)
}
@@ -284,7 +284,7 @@ func NewAuthSourcePost(ctx *context.Context) {
ctx.RenderWithErr(err.Error(), tplAuthNew, form)
return
}
- existing, err := auth.FindSources(ctx, auth.FindSourcesOptions{LoginType: auth.SSPI})
+ existing, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{LoginType: auth.SSPI})
if err != nil || len(existing) > 0 {
ctx.Data["Err_Type"] = true
ctx.RenderWithErr(ctx.Tr("admin.auths.login_source_of_type_exist"), tplAuthNew, form)
diff --git a/routers/web/admin/orgs.go b/routers/web/admin/orgs.go
index ab44f8048bf..00131c9e2f7 100644
--- a/routers/web/admin/orgs.go
+++ b/routers/web/admin/orgs.go
@@ -24,7 +24,7 @@ func Organizations(ctx *context.Context) {
ctx.Data["PageIsAdminOrganizations"] = true
if ctx.FormString("sort") == "" {
- ctx.SetFormString("sort", explore.UserSearchDefaultAdminSort)
+ ctx.SetFormString("sort", UserSearchDefaultAdminSort)
}
explore.RenderUserSearch(ctx, &user_model.SearchUserOptions{
diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go
index 630d739836b..44c4fa75125 100644
--- a/routers/web/admin/users.go
+++ b/routers/web/admin/users.go
@@ -37,6 +37,9 @@ const (
tplUserEdit base.TplName = "admin/user/edit"
)
+// UserSearchDefaultAdminSort is the default sort type for admin view
+const UserSearchDefaultAdminSort = "alphabetically"
+
// Users show all the users
func Users(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("admin.users")
@@ -56,7 +59,7 @@ func Users(ctx *context.Context) {
sortType := ctx.FormString("sort")
if sortType == "" {
- sortType = explore.UserSearchDefaultAdminSort
+ sortType = UserSearchDefaultAdminSort
ctx.SetFormString("sort", sortType)
}
ctx.PageData["adminUserListSearchForm"] = map[string]any{
@@ -90,7 +93,7 @@ func NewUser(ctx *context.Context) {
ctx.Data["login_type"] = "0-0"
- sources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: util.OptionalBoolTrue,
})
if err != nil {
@@ -111,7 +114,7 @@ func NewUserPost(ctx *context.Context) {
ctx.Data["DefaultUserVisibilityMode"] = setting.Service.DefaultUserVisibilityMode
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
- sources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: util.OptionalBoolTrue,
})
if err != nil {
@@ -234,7 +237,7 @@ func prepareUserInfo(ctx *context.Context) *user_model.User {
ctx.Data["LoginSource"] = &auth.Source{}
}
- sources, err := auth.FindSources(ctx, auth.FindSourcesOptions{})
+ sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{})
if err != nil {
ctx.ServerError("auth.Sources", err)
return nil
@@ -293,7 +296,7 @@ func ViewUser(ctx *context.Context) {
ctx.Data["Emails"] = emails
ctx.Data["EmailsTotal"] = len(emails)
- orgs, err := org_model.FindOrgs(ctx, org_model.FindOrgOptions{
+ orgs, err := db.Find[org_model.Organization](ctx, org_model.FindOrgOptions{
ListOptions: db.ListOptions{
ListAll: true,
},
diff --git a/routers/web/explore/org.go b/routers/web/explore/org.go
index e37bce6b40e..dc1318beefe 100644
--- a/routers/web/explore/org.go
+++ b/routers/web/explore/org.go
@@ -25,7 +25,7 @@ func Organizations(ctx *context.Context) {
}
if ctx.FormString("sort") == "" {
- ctx.SetFormString("sort", UserSearchDefaultSortType)
+ ctx.SetFormString("sort", setting.UI.ExploreDefaultSort)
}
RenderUserSearch(ctx, &user_model.SearchUserOptions{
diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go
index 0a217767f32..737e34f0b33 100644
--- a/routers/web/explore/repo.go
+++ b/routers/web/explore/repo.go
@@ -57,8 +57,13 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
orderBy db.SearchOrderBy
)
- ctx.Data["SortType"] = ctx.FormString("sort")
- switch ctx.FormString("sort") {
+ sortOrder := ctx.FormString("sort")
+ if sortOrder == "" {
+ sortOrder = setting.UI.ExploreDefaultSort
+ }
+ ctx.Data["SortType"] = sortOrder
+
+ switch sortOrder {
case "newest":
orderBy = db.SearchOrderByNewest
case "oldest":
diff --git a/routers/web/explore/user.go b/routers/web/explore/user.go
index c760004088e..09d31f95ef4 100644
--- a/routers/web/explore/user.go
+++ b/routers/web/explore/user.go
@@ -23,12 +23,6 @@ const (
tplExploreUsers base.TplName = "explore/users"
)
-// UserSearchDefaultSortType is the default sort type for user search
-const (
- UserSearchDefaultSortType = "recentupdate"
- UserSearchDefaultAdminSort = "alphabetically"
-)
-
var nullByte = []byte{0x00}
func isKeywordValid(keyword string) bool {
@@ -60,8 +54,13 @@ func RenderUserSearch(ctx *context.Context, opts *user_model.SearchUserOptions,
// we can not set orderBy to `models.SearchOrderByXxx`, because there may be a JOIN in the statement, different tables may have the same name columns
- ctx.Data["SortType"] = ctx.FormString("sort")
- switch ctx.FormString("sort") {
+ sortOrder := ctx.FormString("sort")
+ if sortOrder == "" {
+ sortOrder = setting.UI.ExploreDefaultSort
+ }
+ ctx.Data["SortType"] = sortOrder
+
+ switch sortOrder {
case "newest":
orderBy = "`user`.id DESC"
case "oldest":
@@ -134,7 +133,7 @@ func Users(ctx *context.Context) {
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
if ctx.FormString("sort") == "" {
- ctx.SetFormString("sort", UserSearchDefaultSortType)
+ ctx.SetFormString("sort", setting.UI.ExploreDefaultSort)
}
RenderUserSearch(ctx, &user_model.SearchUserOptions{
diff --git a/routers/web/misc/misc.go b/routers/web/misc/misc.go
index 54c93763f6a..e3519940107 100644
--- a/routers/web/misc/misc.go
+++ b/routers/web/misc/misc.go
@@ -33,6 +33,10 @@ func DummyOK(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK)
}
+func DummyBadRequest(w http.ResponseWriter, req *http.Request) {
+ w.WriteHeader(http.StatusBadRequest)
+}
+
func RobotsTxt(w http.ResponseWriter, req *http.Request) {
robotsTxt := util.FilePathJoinAbs(setting.CustomPath, "public/robots.txt")
if ok, _ := util.IsExist(robotsTxt); !ok {
diff --git a/routers/web/org/home.go b/routers/web/org/home.go
index ec866eb6b3b..a9adfdc03cd 100644
--- a/routers/web/org/home.go
+++ b/routers/web/org/home.go
@@ -13,6 +13,8 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"
@@ -155,5 +157,29 @@ func Home(ctx *context.Context) {
ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0
+ profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx, ctx.Doer)
+ defer profileClose()
+ prepareOrgProfileReadme(ctx, profileGitRepo, profileReadmeBlob)
+
ctx.HTML(http.StatusOK, tplOrgHome)
}
+
+func prepareOrgProfileReadme(ctx *context.Context, profileGitRepo *git.Repository, profileReadme *git.Blob) {
+ if profileGitRepo == nil || profileReadme == nil {
+ return
+ }
+
+ if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
+ log.Error("failed to GetBlobContent: %v", err)
+ } else {
+ if profileContent, err := markdown.RenderString(&markup.RenderContext{
+ Ctx: ctx,
+ GitRepo: profileGitRepo,
+ Metas: map[string]string{"mode": "document"},
+ }, bytes); err != nil {
+ log.Error("failed to RenderString: %v", err)
+ } else {
+ ctx.Data["ProfileReadme"] = profileContent
+ }
+ }
+}
diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go
index 439fdf644bb..03798a712c2 100644
--- a/routers/web/org/projects.go
+++ b/routers/web/org/projects.go
@@ -11,6 +11,7 @@ import (
"strconv"
"strings"
+ "code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
project_model "code.gitea.io/gitea/models/project"
attachment_model "code.gitea.io/gitea/models/repo"
@@ -59,9 +60,12 @@ func Projects(ctx *context.Context) {
} else {
projectType = project_model.TypeIndividual
}
- projects, total, err := project_model.FindProjects(ctx, project_model.SearchOptions{
+ projects, total, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptions{
+ Page: page,
+ PageSize: setting.UI.IssuePagingNum,
+ },
OwnerID: ctx.ContextUser.ID,
- Page: page,
IsClosed: util.OptionalBoolOf(isShowClosed),
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
Type: projectType,
@@ -72,7 +76,7 @@ func Projects(ctx *context.Context) {
return
}
- opTotal, err := project_model.CountProjects(ctx, project_model.SearchOptions{
+ opTotal, err := db.Count[project_model.Project](ctx, project_model.SearchOptions{
OwnerID: ctx.ContextUser.ID,
IsClosed: util.OptionalBoolOf(!isShowClosed),
Type: projectType,
diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go
index fac83b36128..f0d9259d3fe 100644
--- a/routers/web/org/setting.go
+++ b/routers/web/org/setting.go
@@ -215,7 +215,7 @@ func Webhooks(ctx *context.Context) {
ctx.Data["BaseLinkNew"] = ctx.Org.OrgLink + "/settings/hooks"
ctx.Data["Description"] = ctx.Tr("org.settings.hooks_desc")
- ws, err := webhook.ListWebhooksByOpts(ctx, &webhook.ListWebhookOptions{OwnerID: ctx.Org.Organization.ID})
+ ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Org.Organization.ID})
if err != nil {
ctx.ServerError("ListWebhooksByOpts", err)
return
diff --git a/routers/web/org/setting_oauth2.go b/routers/web/org/setting_oauth2.go
index 0045bce4c93..ca4fe09f380 100644
--- a/routers/web/org/setting_oauth2.go
+++ b/routers/web/org/setting_oauth2.go
@@ -8,6 +8,7 @@ import (
"net/http"
"code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
@@ -35,7 +36,9 @@ func Applications(ctx *context.Context) {
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsApplications"] = true
- apps, err := auth.GetOAuth2ApplicationsByUserID(ctx, ctx.Org.Organization.ID)
+ apps, err := db.Find[auth.OAuth2Application](ctx, auth.FindOAuth2ApplicationsOptions{
+ OwnerID: ctx.Org.Organization.ID,
+ })
if err != nil {
ctx.ServerError("GetOAuth2ApplicationsByUserID", err)
return
diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go
index 6284d21463f..3b10f0b9571 100644
--- a/routers/web/repo/actions/actions.go
+++ b/routers/web/repo/actions/actions.go
@@ -75,11 +75,10 @@ func List(ctx *context.Context) {
}
// Get all runner labels
- opts := actions_model.FindRunnerOptions{
+ runners, err := db.Find[actions_model.ActionRunner](ctx, actions_model.FindRunnerOptions{
RepoID: ctx.Repo.Repository.ID,
WithAvailable: true,
- }
- runners, err := actions_model.FindRunners(ctx, opts)
+ })
if err != nil {
ctx.ServerError("FindRunners", err)
return
@@ -169,7 +168,7 @@ func List(ctx *context.Context) {
opts.Status = []actions_model.Status{actions_model.Status(status)}
}
- runs, total, err := actions_model.FindRuns(ctx, opts)
+ runs, total, err := db.FindAndCount[actions_model.ActionRun](ctx, opts)
if err != nil {
ctx.Error(http.StatusInternalServerError, err.Error())
return
@@ -179,7 +178,7 @@ func List(ctx *context.Context) {
run.Repo = ctx.Repo.Repository
}
- if err := runs.LoadTriggerUser(ctx); err != nil {
+ if err := actions_model.RunList(runs).LoadTriggerUser(ctx); err != nil {
ctx.Error(http.StatusInternalServerError, err.Error())
return
}
diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index 2c69b136161..1cdae32a32f 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -512,7 +512,7 @@ func ArtifactsView(ctx *context_module.Context) {
}
for _, art := range artifacts {
status := "completed"
- if art.Status == int64(actions_model.ArtifactStatusExpired) {
+ if art.Status == actions_model.ArtifactStatusExpired {
status = "expired"
}
artifactsResponse.Artifacts = append(artifactsResponse.Artifacts, &ArtifactsViewItem{
@@ -538,7 +538,10 @@ func ArtifactsDownloadView(ctx *context_module.Context) {
return
}
- artifacts, err := actions_model.ListArtifactsByRunIDAndName(ctx, run.ID, artifactName)
+ artifacts, err := db.Find[actions_model.ActionArtifact](ctx, actions_model.FindArtifactsOptions{
+ RunID: run.ID,
+ ArtifactName: artifactName,
+ })
if err != nil {
ctx.Error(http.StatusInternalServerError, err.Error())
return
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 1f1cca897ef..52d350ff665 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -114,12 +114,12 @@ func RefBlame(ctx *context.Context) {
return
}
- commitNames, previousCommits := processBlameParts(ctx, result.Parts)
+ commitNames := processBlameParts(ctx, result.Parts)
if ctx.Written() {
return
}
- renderBlame(ctx, result.Parts, commitNames, previousCommits)
+ renderBlame(ctx, result.Parts, commitNames)
ctx.HTML(http.StatusOK, tplRepoHome)
}
@@ -185,12 +185,9 @@ func fillBlameResult(br *git.BlameReader, r *blameResult) error {
return nil
}
-func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) (map[string]*user_model.UserCommit, map[string]string) {
+func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) map[string]*user_model.UserCommit {
// store commit data by SHA to look up avatar info etc
commitNames := make(map[string]*user_model.UserCommit)
- // previousCommits contains links from SHA to parent SHA,
- // if parent also contains the current TreePath.
- previousCommits := make(map[string]string)
// and as blameParts can reference the same commits multiple
// times, we cache the lookup work locally
commits := make([]*git.Commit, 0, len(blameParts))
@@ -214,29 +211,11 @@ func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) (map[st
} else {
ctx.ServerError("Repo.GitRepo.GetCommit", err)
}
- return nil, nil
+ return nil
}
commitCache[sha] = commit
}
- // find parent commit
- if commit.ParentCount() > 0 {
- psha := commit.Parents[0]
- previousCommit, ok := commitCache[psha.String()]
- if !ok {
- previousCommit, _ = commit.Parent(0)
- if previousCommit != nil {
- commitCache[psha.String()] = previousCommit
- }
- }
- // only store parent commit ONCE, if it has the file
- if previousCommit != nil {
- if haz1, _ := previousCommit.HasFile(ctx.Repo.TreePath); haz1 {
- previousCommits[commit.ID.String()] = previousCommit.ID.String()
- }
- }
- }
-
commits = append(commits, commit)
}
@@ -245,10 +224,10 @@ func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) (map[st
commitNames[c.ID.String()] = c
}
- return commitNames, previousCommits
+ return commitNames
}
-func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames map[string]*user_model.UserCommit, previousCommits map[string]string) {
+func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames map[string]*user_model.UserCommit) {
repoLink := ctx.Repo.RepoLink
language := ""
@@ -295,7 +274,6 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m
}
commit := commitNames[part.Sha]
- previousSha := previousCommits[part.Sha]
if index == 0 {
// Count commit number
commitCnt++
@@ -313,8 +291,8 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m
br.Avatar = gotemplate.HTML(avatar)
br.RepoLink = repoLink
br.PartSha = part.Sha
- br.PreviousSha = previousSha
- br.PreviousShaURL = fmt.Sprintf("%s/blame/commit/%s/%s", repoLink, url.PathEscape(previousSha), util.PathEscapeSegments(ctx.Repo.TreePath))
+ br.PreviousSha = part.PreviousSha
+ br.PreviousShaURL = fmt.Sprintf("%s/blame/commit/%s/%s", repoLink, url.PathEscape(part.PreviousSha), util.PathEscapeSegments(part.PreviousPath))
br.CommitURL = fmt.Sprintf("%s/commit/%s", repoLink, url.PathEscape(part.Sha))
br.CommitMessage = commit.CommitMessage
br.CommitSince = commitSince
diff --git a/routers/web/repo/editor.go b/routers/web/repo/editor.go
index 1ad091b70fd..5e7cd1caa39 100644
--- a/routers/web/repo/editor.go
+++ b/routers/web/repo/editor.go
@@ -287,7 +287,7 @@ func editFilePost(ctx *context.Context, form forms.EditRepoFileForm, isNewFile b
Operation: operation,
FromTreePath: ctx.Repo.TreePath,
TreePath: form.TreePath,
- ContentReader: strings.NewReader(form.Content),
+ ContentReader: strings.NewReader(strings.ReplaceAll(form.Content, "\r", "")),
},
},
Signoff: form.Signoff,
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index 94300da8683..ba8b49774b9 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -569,21 +569,21 @@ func retrieveProjects(ctx *context.Context, repo *repo_model.Repository) {
repoOwnerType = project_model.TypeOrganization
}
var err error
- projects, _, err := project_model.FindProjects(ctx, project_model.SearchOptions{
- RepoID: repo.ID,
- Page: -1,
- IsClosed: util.OptionalBoolFalse,
- Type: project_model.TypeRepository,
+ projects, err := db.Find[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptionsAll,
+ RepoID: repo.ID,
+ IsClosed: util.OptionalBoolFalse,
+ Type: project_model.TypeRepository,
})
if err != nil {
ctx.ServerError("GetProjects", err)
return
}
- projects2, _, err := project_model.FindProjects(ctx, project_model.SearchOptions{
- OwnerID: repo.OwnerID,
- Page: -1,
- IsClosed: util.OptionalBoolFalse,
- Type: repoOwnerType,
+ projects2, err := db.Find[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptionsAll,
+ OwnerID: repo.OwnerID,
+ IsClosed: util.OptionalBoolFalse,
+ Type: repoOwnerType,
})
if err != nil {
ctx.ServerError("GetProjects", err)
@@ -592,21 +592,21 @@ func retrieveProjects(ctx *context.Context, repo *repo_model.Repository) {
ctx.Data["OpenProjects"] = append(projects, projects2...)
- projects, _, err = project_model.FindProjects(ctx, project_model.SearchOptions{
- RepoID: repo.ID,
- Page: -1,
- IsClosed: util.OptionalBoolTrue,
- Type: project_model.TypeRepository,
+ projects, err = db.Find[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptionsAll,
+ RepoID: repo.ID,
+ IsClosed: util.OptionalBoolTrue,
+ Type: project_model.TypeRepository,
})
if err != nil {
ctx.ServerError("GetProjects", err)
return
}
- projects2, _, err = project_model.FindProjects(ctx, project_model.SearchOptions{
- OwnerID: repo.OwnerID,
- Page: -1,
- IsClosed: util.OptionalBoolTrue,
- Type: repoOwnerType,
+ projects2, err = db.Find[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptionsAll,
+ OwnerID: repo.OwnerID,
+ IsClosed: util.OptionalBoolTrue,
+ Type: repoOwnerType,
})
if err != nil {
ctx.ServerError("GetProjects", err)
@@ -1319,7 +1319,7 @@ func roleDescriptor(ctx stdCtx.Context, repo *repo_model.Repository, poster *use
return roleDescriptor, err
} else if hasMergedPR {
roleDescriptor.RoleInRepo = issues_model.RoleRepoContributor
- } else {
+ } else if issue.IsPull {
// only display first time contributor in the first opening pull request
roleDescriptor.RoleInRepo = issues_model.RoleRepoFirstTimeContributor
}
@@ -3106,6 +3106,11 @@ func UpdateCommentContent(ctx *context.Context) {
return
}
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound("CompareRepoID", issues_model.ErrCommentNotExist{})
+ return
+ }
+
if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) {
ctx.Error(http.StatusForbidden)
return
@@ -3172,6 +3177,11 @@ func DeleteComment(ctx *context.Context) {
return
}
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound("CompareRepoID", issues_model.ErrCommentNotExist{})
+ return
+ }
+
if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) {
ctx.Error(http.StatusForbidden)
return
@@ -3298,6 +3308,11 @@ func ChangeCommentReaction(ctx *context.Context) {
return
}
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound("CompareRepoID", issues_model.ErrCommentNotExist{})
+ return
+ }
+
if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull)) {
if log.IsTrace() {
if ctx.IsSigned {
@@ -3441,6 +3456,21 @@ func GetCommentAttachments(ctx *context.Context) {
return
}
+ if err := comment.LoadIssue(ctx); err != nil {
+ ctx.NotFoundOrServerError("LoadIssue", issues_model.IsErrIssueNotExist, err)
+ return
+ }
+
+ if comment.Issue.RepoID != ctx.Repo.Repository.ID {
+ ctx.NotFound("CompareRepoID", issues_model.ErrCommentNotExist{})
+ return
+ }
+
+ if !ctx.Repo.Permission.CanReadIssuesOrPulls(comment.Issue.IsPull) {
+ ctx.NotFound("CanReadIssuesOrPulls", issues_model.ErrCommentNotExist{})
+ return
+ }
+
if !comment.Type.HasAttachmentSupport() {
ctx.ServerError("GetCommentAttachments", fmt.Errorf("comment type %v does not support attachments", comment.Type))
return
diff --git a/routers/web/repo/issue_content_history.go b/routers/web/repo/issue_content_history.go
index 5c378fe9d79..473ab260f3e 100644
--- a/routers/web/repo/issue_content_history.go
+++ b/routers/web/repo/issue_content_history.go
@@ -122,7 +122,7 @@ func GetContentHistoryDetail(ctx *context.Context) {
}
historyID := ctx.FormInt64("history_id")
- history, prevHistory, err := issues_model.GetIssueContentHistoryAndPrev(ctx, historyID)
+ history, prevHistory, err := issues_model.GetIssueContentHistoryAndPrev(ctx, issue.ID, historyID)
if err != nil {
ctx.JSON(http.StatusNotFound, map[string]any{
"message": "Can not find the content history",
diff --git a/routers/web/repo/middlewares.go b/routers/web/repo/middlewares.go
index b50e96be3c4..5f4a219aa33 100644
--- a/routers/web/repo/middlewares.go
+++ b/routers/web/repo/middlewares.go
@@ -16,7 +16,6 @@ import (
// SetEditorconfigIfExists set editor config as render variable
func SetEditorconfigIfExists(ctx *context.Context) {
if ctx.Repo.Repository.IsEmpty {
- ctx.Data["Editorconfig"] = nil
return
}
diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go
index 6417024f8ba..5694575b468 100644
--- a/routers/web/repo/projects.go
+++ b/routers/web/repo/projects.go
@@ -10,6 +10,7 @@ import (
"net/url"
"strings"
+ "code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/perm"
project_model "code.gitea.io/gitea/models/project"
@@ -71,9 +72,12 @@ func Projects(ctx *context.Context) {
total = repo.NumClosedProjects
}
- projects, count, err := project_model.FindProjects(ctx, project_model.SearchOptions{
+ projects, count, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{
+ ListOptions: db.ListOptions{
+ PageSize: setting.UI.IssuePagingNum,
+ Page: page,
+ },
RepoID: repo.ID,
- Page: page,
IsClosed: util.OptionalBoolOf(isShowClosed),
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
Type: project_model.TypeRepository,
@@ -464,7 +468,7 @@ func AddBoardToProjectPost(ctx *context.Context) {
return
}
- project, err := project_model.GetProjectByID(ctx, ctx.ParamsInt64(":id"))
+ project, err := project_model.GetProjectForRepoByID(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
if err != nil {
if project_model.IsErrProjectNotExist(err) {
ctx.NotFound("", nil)
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 5cbd6b3d51c..595d599fe13 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -174,6 +174,7 @@ func TagsList(ctx *context.Context) {
// Disable the showCreateNewBranch form in the dropdown on this page.
ctx.Data["CanCreateBranch"] = false
ctx.Data["HideBranchesInDropdown"] = true
+ ctx.Data["CanCreateRelease"] = ctx.Repo.CanWrite(unit.TypeReleases) && !ctx.Repo.Repository.IsArchived
listOptions := db.ListOptions{
Page: ctx.FormInt("page"),
@@ -616,7 +617,27 @@ func DeleteTag(ctx *context.Context) {
}
func deleteReleaseOrTag(ctx *context.Context, isDelTag bool) {
- if err := releaseservice.DeleteReleaseByID(ctx, ctx.FormInt64("id"), ctx.Doer, isDelTag); err != nil {
+ redirect := func() {
+ if isDelTag {
+ ctx.JSONRedirect(ctx.Repo.RepoLink + "/tags")
+ return
+ }
+
+ ctx.JSONRedirect(ctx.Repo.RepoLink + "/releases")
+ }
+
+ rel, err := repo_model.GetReleaseForRepoByID(ctx, ctx.Repo.Repository.ID, ctx.FormInt64("id"))
+ if err != nil {
+ if repo_model.IsErrReleaseNotExist(err) {
+ ctx.NotFound("GetReleaseForRepoByID", err)
+ } else {
+ ctx.Flash.Error("DeleteReleaseByID: " + err.Error())
+ redirect()
+ }
+ return
+ }
+
+ if err := releaseservice.DeleteReleaseByID(ctx, ctx.Repo.Repository, rel, ctx.Doer, isDelTag); err != nil {
if models.IsErrProtectedTagName(err) {
ctx.Flash.Error(ctx.Tr("repo.release.tag_name_protected"))
} else {
@@ -630,10 +651,5 @@ func deleteReleaseOrTag(ctx *context.Context, isDelTag bool) {
}
}
- if isDelTag {
- ctx.JSONRedirect(ctx.Repo.RepoLink + "/tags")
- return
- }
-
- ctx.JSONRedirect(ctx.Repo.RepoLink + "/releases")
+ redirect()
}
diff --git a/routers/web/repo/setting/deploy_key.go b/routers/web/repo/setting/deploy_key.go
index 579743ef3ca..3d4420006c4 100644
--- a/routers/web/repo/setting/deploy_key.go
+++ b/routers/web/repo/setting/deploy_key.go
@@ -22,7 +22,7 @@ func DeployKeys(ctx *context.Context) {
ctx.Data["PageIsSettingsKeys"] = true
ctx.Data["DisableSSH"] = setting.SSH.Disabled
- keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID})
+ keys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID})
if err != nil {
ctx.ServerError("ListDeployKeys", err)
return
@@ -39,7 +39,7 @@ func DeployKeysPost(ctx *context.Context) {
ctx.Data["PageIsSettingsKeys"] = true
ctx.Data["DisableSSH"] = setting.SSH.Disabled
- keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID})
+ keys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID})
if err != nil {
ctx.ServerError("ListDeployKeys", err)
return
diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go
index ea5abb05792..5100bf782f0 100644
--- a/routers/web/repo/setting/webhook.go
+++ b/routers/web/repo/setting/webhook.go
@@ -12,6 +12,7 @@ import (
"path"
"strings"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/perm"
access_model "code.gitea.io/gitea/models/perm/access"
user_model "code.gitea.io/gitea/models/user"
@@ -46,7 +47,7 @@ func Webhooks(ctx *context.Context) {
ctx.Data["BaseLinkNew"] = ctx.Repo.RepoLink + "/settings/hooks"
ctx.Data["Description"] = ctx.Tr("repo.settings.hooks_desc", "https://docs.gitea.com/usage/webhooks")
- ws, err := webhook.ListWebhooksByOpts(ctx, &webhook.ListWebhookOptions{RepoID: ctx.Repo.Repository.ID})
+ ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{RepoID: ctx.Repo.Repository.ID})
if err != nil {
ctx.ServerError("GetWebhooksByRepoID", err)
return
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index 89bb1839e17..ba2ac3af115 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -331,6 +331,10 @@ func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.Tr
ctx.Data["FileContent"] = buf.String()
}
+
+ if !fInfo.isLFSFile && ctx.Repo.CanEnableEditor(ctx, ctx.Doer) {
+ ctx.Data["CanEditReadmeFile"] = true
+ }
}
func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink string) {
diff --git a/routers/web/shared/actions/runners.go b/routers/web/shared/actions/runners.go
index 1da4ddf14fc..ae9a3767241 100644
--- a/routers/web/shared/actions/runners.go
+++ b/routers/web/shared/actions/runners.go
@@ -17,18 +17,13 @@ import (
// RunnersList prepares data for runners list
func RunnersList(ctx *context.Context, opts actions_model.FindRunnerOptions) {
- count, err := actions_model.CountRunners(ctx, opts)
+ runners, count, err := db.FindAndCount[actions_model.ActionRunner](ctx, opts)
if err != nil {
ctx.ServerError("CountRunners", err)
return
}
- runners, err := actions_model.FindRunners(ctx, opts)
- if err != nil {
- ctx.ServerError("FindRunners", err)
- return
- }
- if err := runners.LoadAttributes(ctx); err != nil {
+ if err := actions_model.RunnerList(runners).LoadAttributes(ctx); err != nil {
ctx.ServerError("LoadAttributes", err)
return
}
@@ -89,18 +84,13 @@ func RunnerDetails(ctx *context.Context, page int, runnerID, ownerID, repoID int
RunnerID: runner.ID,
}
- count, err := actions_model.CountTasks(ctx, opts)
+ tasks, count, err := db.FindAndCount[actions_model.ActionTask](ctx, opts)
if err != nil {
ctx.ServerError("CountTasks", err)
return
}
- tasks, err := actions_model.FindTasks(ctx, opts)
- if err != nil {
- ctx.ServerError("FindTasks", err)
- return
- }
- if err = tasks.LoadAttributes(ctx); err != nil {
+ if err = actions_model.TaskList(tasks).LoadAttributes(ctx); err != nil {
ctx.ServerError("TasksLoadAttributes", err)
return
}
diff --git a/routers/web/shared/actions/variables.go b/routers/web/shared/actions/variables.go
index 341c18f589c..07a05752078 100644
--- a/routers/web/shared/actions/variables.go
+++ b/routers/web/shared/actions/variables.go
@@ -18,7 +18,7 @@ import (
)
func SetVariablesContext(ctx *context.Context, ownerID, repoID int64) {
- variables, err := actions_model.FindVariables(ctx, actions_model.FindVariablesOpts{
+ variables, err := db.Find[actions_model.ActionVariable](ctx, actions_model.FindVariablesOpts{
OwnerID: ownerID,
RepoID: repoID,
})
diff --git a/routers/web/shared/secrets/secrets.go b/routers/web/shared/secrets/secrets.go
index 875cb0cfec7..c805da734ac 100644
--- a/routers/web/shared/secrets/secrets.go
+++ b/routers/web/shared/secrets/secrets.go
@@ -4,6 +4,7 @@
package secrets
import (
+ "code.gitea.io/gitea/models/db"
secret_model "code.gitea.io/gitea/models/secret"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
@@ -14,7 +15,7 @@ import (
)
func SetSecretsContext(ctx *context.Context, ownerID, repoID int64) {
- secrets, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{OwnerID: ownerID, RepoID: repoID})
+ secrets, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{OwnerID: ownerID, RepoID: repoID})
if err != nil {
ctx.ServerError("FindSecrets", err)
return
diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go
index 6d1901dd2bb..411d499eb4f 100644
--- a/routers/web/shared/user/header.go
+++ b/routers/web/shared/user/header.go
@@ -6,7 +6,10 @@ package user
import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/organization"
+ access_model "code.gitea.io/gitea/models/perm/access"
+ project_model "code.gitea.io/gitea/models/project"
repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
@@ -57,7 +60,7 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) {
}
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
- orgs, err := organization.FindOrgs(ctx, organization.FindOrgOptions{
+ orgs, err := db.Find[organization.Organization](ctx, organization.FindOrgOptions{
UserID: ctx.ContextUser.ID,
IncludePrivate: showPrivate,
})
@@ -84,18 +87,23 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) {
}
}
-func FindUserProfileReadme(ctx *context.Context) (profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) {
+func FindUserProfileReadme(ctx *context.Context, doer *user_model.User) (profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) {
profileDbRepo, err := repo_model.GetRepositoryByName(ctx, ctx.ContextUser.ID, ".profile")
- if err == nil && !profileDbRepo.IsEmpty && !profileDbRepo.IsPrivate {
- if profileGitRepo, err = git.OpenRepository(ctx, profileDbRepo.RepoPath()); err != nil {
- log.Error("FindUserProfileReadme failed to OpenRepository: %v", err)
- } else {
- if commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch); err != nil {
- log.Error("FindUserProfileReadme failed to GetBranchCommit: %v", err)
+ if err == nil {
+ perm, err := access_model.GetUserRepoPermission(ctx, profileDbRepo, doer)
+ if err == nil && !profileDbRepo.IsEmpty && perm.CanRead(unit.TypeCode) {
+ if profileGitRepo, err = git.OpenRepository(ctx, profileDbRepo.RepoPath()); err != nil {
+ log.Error("FindUserProfileReadme failed to OpenRepository: %v", err)
} else {
- profileReadmeBlob, _ = commit.GetBlobByPath("README.md")
+ if commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch); err != nil {
+ log.Error("FindUserProfileReadme failed to GetBranchCommit: %v", err)
+ } else {
+ profileReadmeBlob, _ = commit.GetBlobByPath("README.md")
+ }
}
}
+ } else if !repo_model.IsErrRepoNotExist(err) {
+ log.Error("FindUserProfileReadme failed to GetRepositoryByName: %v", err)
}
return profileGitRepo, profileReadmeBlob, func() {
if profileGitRepo != nil {
@@ -107,7 +115,7 @@ func FindUserProfileReadme(ctx *context.Context) (profileGitRepo *git.Repository
func RenderUserHeader(ctx *context.Context) {
prepareContextForCommonProfile(ctx)
- _, profileReadmeBlob, profileClose := FindUserProfileReadme(ctx)
+ _, profileReadmeBlob, profileClose := FindUserProfileReadme(ctx, ctx.Doer)
defer profileClose()
ctx.Data["HasProfileReadme"] = profileReadmeBlob != nil
}
@@ -127,5 +135,21 @@ func LoadHeaderCount(ctx *context.Context) error {
}
ctx.Data["RepoCount"] = repoCount
+ var projectType project_model.Type
+ if ctx.ContextUser.IsOrganization() {
+ projectType = project_model.TypeOrganization
+ } else {
+ projectType = project_model.TypeIndividual
+ }
+ projectCount, err := db.Count[project_model.Project](ctx, project_model.SearchOptions{
+ OwnerID: ctx.ContextUser.ID,
+ IsClosed: util.OptionalBoolOf(false),
+ Type: projectType,
+ })
+ if err != nil {
+ return err
+ }
+ ctx.Data["ProjectCount"] = projectCount
+
return nil
}
diff --git a/routers/web/user/home.go b/routers/web/user/home.go
index 8b9a4cd2241..b4fb25dfe0e 100644
--- a/routers/web/user/home.go
+++ b/routers/web/user/home.go
@@ -759,7 +759,9 @@ func loadRepoByIDs(ctx *context.Context, ctxUser *user_model.User, issueCountByR
// ShowSSHKeys output all the ssh keys of user by uid
func ShowSSHKeys(ctx *context.Context) {
- keys, err := asymkey_model.ListPublicKeys(ctx, ctx.ContextUser.ID, db.ListOptions{})
+ keys, err := db.Find[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
+ OwnerID: ctx.ContextUser.ID,
+ })
if err != nil {
ctx.ServerError("ListPublicKeys", err)
return
@@ -822,6 +824,11 @@ func UsernameSubRoute(ctx *context.Context) {
reloadParam := func(suffix string) (success bool) {
ctx.SetParams("username", strings.TrimSuffix(username, suffix))
context_service.UserAssignmentWeb()(ctx)
+ // check view permissions
+ if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) {
+ ctx.NotFound("user", fmt.Errorf(ctx.ContextUser.Name))
+ return false
+ }
return !ctx.Written()
}
switch {
diff --git a/routers/web/user/notification.go b/routers/web/user/notification.go
index 579287ffac6..26f77cfc3a3 100644
--- a/routers/web/user/notification.go
+++ b/routers/web/user/notification.go
@@ -42,7 +42,10 @@ func GetNotificationCount(ctx *context.Context) {
}
ctx.Data["NotificationUnreadCount"] = func() int64 {
- count, err := activities_model.GetNotificationCount(ctx, ctx.Doer, activities_model.NotificationStatusUnread)
+ count, err := db.Count[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
+ UserID: ctx.Doer.ID,
+ Status: []activities_model.NotificationStatus{activities_model.NotificationStatusUnread},
+ })
if err != nil {
if err != goctx.Canceled {
log.Error("Unable to GetNotificationCount for user:%-v: %v", ctx.Doer, err)
@@ -89,7 +92,10 @@ func getNotifications(ctx *context.Context) {
status = activities_model.NotificationStatusUnread
}
- total, err := activities_model.GetNotificationCount(ctx, ctx.Doer, status)
+ total, err := db.Count[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
+ UserID: ctx.Doer.ID,
+ Status: []activities_model.NotificationStatus{status},
+ })
if err != nil {
ctx.ServerError("ErrGetNotificationCount", err)
return
@@ -103,12 +109,21 @@ func getNotifications(ctx *context.Context) {
}
statuses := []activities_model.NotificationStatus{status, activities_model.NotificationStatusPinned}
- notifications, err := activities_model.NotificationsForUser(ctx, ctx.Doer, statuses, page, perPage)
+ nls, err := db.Find[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
+ ListOptions: db.ListOptions{
+ PageSize: perPage,
+ Page: page,
+ },
+ UserID: ctx.Doer.ID,
+ Status: statuses,
+ })
if err != nil {
- ctx.ServerError("ErrNotificationsForUser", err)
+ ctx.ServerError("db.Find[activities_model.Notification]", err)
return
}
+ notifications := activities_model.NotificationList(nls)
+
failCount := 0
repos, failures, err := notifications.LoadRepos(ctx)
@@ -409,5 +424,15 @@ func NotificationWatching(ctx *context.Context) {
// NewAvailable returns the notification counts
func NewAvailable(ctx *context.Context) {
- ctx.JSON(http.StatusOK, structs.NotificationCount{New: activities_model.CountUnread(ctx, ctx.Doer.ID)})
+ total, err := db.Count[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
+ UserID: ctx.Doer.ID,
+ Status: []activities_model.NotificationStatus{activities_model.NotificationStatusUnread},
+ })
+ if err != nil {
+ log.Error("db.Count[activities_model.Notification]", err)
+ ctx.JSON(http.StatusOK, structs.NotificationCount{New: 0})
+ return
+ }
+
+ ctx.JSON(http.StatusOK, structs.NotificationCount{New: total})
}
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go
index 48a4b94c190..ac278e300d7 100644
--- a/routers/web/user/profile.go
+++ b/routers/web/user/profile.go
@@ -64,7 +64,7 @@ func userProfile(ctx *context.Context) {
ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data)
}
- profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx)
+ profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx, ctx.Doer)
defer profileClose()
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
diff --git a/routers/web/user/setting/applications.go b/routers/web/user/setting/applications.go
index ee44d48dce5..69a93dbf03a 100644
--- a/routers/web/user/setting/applications.go
+++ b/routers/web/user/setting/applications.go
@@ -8,6 +8,7 @@ import (
"net/http"
auth_model "code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
@@ -88,7 +89,7 @@ func DeleteApplication(ctx *context.Context) {
func loadApplicationsData(ctx *context.Context) {
ctx.Data["AccessTokenScopePublicOnly"] = auth_model.AccessTokenScopePublicOnly
- tokens, err := auth_model.ListAccessTokens(ctx, auth_model.ListAccessTokensOptions{UserID: ctx.Doer.ID})
+ tokens, err := db.Find[auth_model.AccessToken](ctx, auth_model.ListAccessTokensOptions{UserID: ctx.Doer.ID})
if err != nil {
ctx.ServerError("ListAccessTokens", err)
return
@@ -97,7 +98,9 @@ func loadApplicationsData(ctx *context.Context) {
ctx.Data["EnableOAuth2"] = setting.OAuth2.Enable
ctx.Data["IsAdmin"] = ctx.Doer.IsAdmin
if setting.OAuth2.Enable {
- ctx.Data["Applications"], err = auth_model.GetOAuth2ApplicationsByUserID(ctx, ctx.Doer.ID)
+ ctx.Data["Applications"], err = db.Find[auth_model.OAuth2Application](ctx, auth_model.FindOAuth2ApplicationsOptions{
+ OwnerID: ctx.Doer.ID,
+ })
if err != nil {
ctx.ServerError("GetOAuth2ApplicationsByUserID", err)
return
diff --git a/routers/web/user/setting/keys.go b/routers/web/user/setting/keys.go
index 440885bb076..0dfb506fa96 100644
--- a/routers/web/user/setting/keys.go
+++ b/routers/web/user/setting/keys.go
@@ -260,7 +260,10 @@ func DeleteKey(ctx *context.Context) {
}
func loadKeysData(ctx *context.Context) {
- keys, err := asymkey_model.ListPublicKeys(ctx, ctx.Doer.ID, db.ListOptions{})
+ keys, err := db.Find[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
+ OwnerID: ctx.Doer.ID,
+ NotKeytype: asymkey_model.KeyTypePrincipal,
+ })
if err != nil {
ctx.ServerError("ListPublicKeys", err)
return
diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go
index 2390b0746c1..d8331fef43f 100644
--- a/routers/web/user/setting/profile.go
+++ b/routers/web/user/setting/profile.go
@@ -214,16 +214,12 @@ func Organization(ctx *context.Context) {
opts.Page = 1
}
- orgs, err := organization.FindOrgs(ctx, opts)
+ orgs, total, err := db.FindAndCount[organization.Organization](ctx, opts)
if err != nil {
ctx.ServerError("FindOrgs", err)
return
}
- total, err := organization.CountOrgs(ctx, opts)
- if err != nil {
- ctx.ServerError("CountOrgs", err)
- return
- }
+
ctx.Data["Orgs"] = orgs
pager := context.NewPagination(int(total), opts.PageSize, opts.Page, 5)
pager.SetDefaultParams(ctx)
diff --git a/routers/web/user/setting/security/security.go b/routers/web/user/setting/security/security.go
index ec269776e2b..3647d606eef 100644
--- a/routers/web/user/setting/security/security.go
+++ b/routers/web/user/setting/security/security.go
@@ -9,6 +9,7 @@ import (
"sort"
auth_model "code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
@@ -68,14 +69,17 @@ func loadSecurityData(ctx *context.Context) {
}
ctx.Data["WebAuthnCredentials"] = credentials
- tokens, err := auth_model.ListAccessTokens(ctx, auth_model.ListAccessTokensOptions{UserID: ctx.Doer.ID})
+ tokens, err := db.Find[auth_model.AccessToken](ctx, auth_model.ListAccessTokensOptions{UserID: ctx.Doer.ID})
if err != nil {
ctx.ServerError("ListAccessTokens", err)
return
}
ctx.Data["Tokens"] = tokens
- accountLinks, err := user_model.ListAccountLinks(ctx, ctx.Doer)
+ accountLinks, err := db.Find[user_model.ExternalLoginUser](ctx, user_model.FindExternalUserOptions{
+ UserID: ctx.Doer.ID,
+ OrderBy: "login_source_id DESC",
+ })
if err != nil {
ctx.ServerError("ListAccountLinks", err)
return
@@ -107,7 +111,7 @@ func loadSecurityData(ctx *context.Context) {
}
ctx.Data["AccountLinks"] = sources
- authSources, err := auth_model.FindSources(ctx, auth_model.FindSourcesOptions{
+ authSources, err := db.Find[auth_model.Source](ctx, auth_model.FindSourcesOptions{
IsActive: util.OptionalBoolNone,
LoginType: auth_model.OAuth2,
})
diff --git a/routers/web/user/setting/webhooks.go b/routers/web/user/setting/webhooks.go
index 50cebc2a3de..679b72e5011 100644
--- a/routers/web/user/setting/webhooks.go
+++ b/routers/web/user/setting/webhooks.go
@@ -6,6 +6,7 @@ package setting
import (
"net/http"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/webhook"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
@@ -24,7 +25,7 @@ func Webhooks(ctx *context.Context) {
ctx.Data["BaseLinkNew"] = setting.AppSubURL + "/user/settings/hooks"
ctx.Data["Description"] = ctx.Tr("settings.hooks.desc")
- ws, err := webhook.ListWebhooksByOpts(ctx, &webhook.ListWebhookOptions{OwnerID: ctx.Doer.ID})
+ ws, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{OwnerID: ctx.Doer.ID})
if err != nil {
ctx.ServerError("ListWebhooksByOpts", err)
return
diff --git a/routers/web/web.go b/routers/web/web.go
index a485436da5b..3a0471411f6 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -533,8 +533,10 @@ func registerRoutes(m *web.Route) {
m.Post("/authorize", web.Bind(forms.AuthorizationForm{}), auth.AuthorizeOAuth)
}, ignSignInAndCsrf, reqSignIn)
m.Get("/login/oauth/userinfo", ignSignInAndCsrf, auth.InfoOAuth)
+ m.Options("/login/oauth/access_token", CorsHandler(), misc.DummyBadRequest)
m.Post("/login/oauth/access_token", CorsHandler(), web.Bind(forms.AccessTokenForm{}), ignSignInAndCsrf, auth.AccessTokenOAuth)
m.Get("/login/oauth/keys", ignSignInAndCsrf, auth.OIDCKeys)
+ m.Options("/login/oauth/introspect", CorsHandler(), misc.DummyBadRequest)
m.Post("/login/oauth/introspect", CorsHandler(), web.Bind(forms.IntrospectTokenForm{}), ignSignInAndCsrf, auth.IntrospectOAuth)
m.Group("/user/settings", func() {
diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go
index 7c7043c42f4..67373782d5c 100644
--- a/services/actions/clear_tasks.go
+++ b/services/actions/clear_tasks.go
@@ -33,7 +33,7 @@ func StopEndlessTasks(ctx context.Context) error {
}
func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error {
- tasks, err := actions_model.FindTasks(ctx, opts)
+ tasks, err := db.Find[actions_model.ActionTask](ctx, opts)
if err != nil {
return fmt.Errorf("find tasks: %w", err)
}
@@ -74,7 +74,7 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error {
// CancelAbandonedJobs cancels the jobs which have waiting status, but haven't been picked by a runner for a long time
func CancelAbandonedJobs(ctx context.Context) error {
- jobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{
+ jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{
Statuses: []actions_model.Status{actions_model.StatusWaiting, actions_model.StatusBlocked},
UpdatedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.AbandonedJobTimeout).Unix()),
})
diff --git a/services/actions/job_emitter.go b/services/actions/job_emitter.go
index f7ec615364a..fe39312386d 100644
--- a/services/actions/job_emitter.go
+++ b/services/actions/job_emitter.go
@@ -44,7 +44,7 @@ func jobEmitterQueueHandler(items ...*jobUpdate) []*jobUpdate {
}
func checkJobsOfRun(ctx context.Context, runID int64) error {
- jobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{RunID: runID})
+ jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: runID})
if err != nil {
return err
}
diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go
index 7d5f6c6c0a3..175b8a41187 100644
--- a/services/actions/notifier_helper.go
+++ b/services/actions/notifier_helper.go
@@ -7,9 +7,11 @@ import (
"bytes"
"context"
"fmt"
+ "slices"
"strings"
actions_model "code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
packages_model "code.gitea.io/gitea/models/packages"
access_model "code.gitea.io/gitea/models/perm/access"
@@ -20,6 +22,7 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
webhook_module "code.gitea.io/gitea/modules/webhook"
"code.gitea.io/gitea/services/convert"
@@ -144,6 +147,10 @@ func notify(ctx context.Context, input *notifyInput) error {
return fmt.Errorf("gitRepo.GetCommit: %w", err)
}
+ if skipWorkflowsForCommit(input, commit) {
+ return nil
+ }
+
var detectedWorkflows []*actions_module.DetectedWorkflow
actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig()
workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, input.Event, input.Payload)
@@ -195,6 +202,25 @@ func notify(ctx context.Context, input *notifyInput) error {
return handleWorkflows(ctx, detectedWorkflows, commit, input, ref)
}
+func skipWorkflowsForCommit(input *notifyInput, commit *git.Commit) bool {
+ // skip workflow runs with a configured skip-ci string in commit message if the event is push or pull_request(_sync)
+ // https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs
+ skipWorkflowEvents := []webhook_module.HookEventType{
+ webhook_module.HookEventPush,
+ webhook_module.HookEventPullRequest,
+ webhook_module.HookEventPullRequestSync,
+ }
+ if slices.Contains(skipWorkflowEvents, input.Event) {
+ for _, s := range setting.Actions.SkipWorkflowStrings {
+ if strings.Contains(commit.CommitMessage, s) {
+ log.Debug("repo %s with commit %s: skipped run because of %s string", input.Repo.RepoPath(), commit.ID, s)
+ return true
+ }
+ }
+ }
+ return false
+}
+
func handleWorkflows(
ctx context.Context,
detectedWorkflows []*actions_module.DetectedWorkflow,
@@ -273,7 +299,7 @@ func handleWorkflows(
continue
}
- alljobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{RunID: run.ID})
+ alljobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: run.ID})
if err != nil {
log.Error("FindRunJobs: %v", err)
continue
@@ -352,7 +378,7 @@ func ifNeedApproval(ctx context.Context, run *actions_model.ActionRun, repo *rep
}
// don't need approval if the user has been approved before
- if count, err := actions_model.CountRuns(ctx, actions_model.FindRunOptions{
+ if count, err := db.Count[actions_model.ActionRun](ctx, actions_model.FindRunOptions{
RepoID: repo.ID,
TriggerUserID: user.ID,
Approved: true,
@@ -383,7 +409,7 @@ func handleSchedules(
return nil
}
- if count, err := actions_model.CountSchedules(ctx, actions_model.FindScheduleOptions{RepoID: input.Repo.ID}); err != nil {
+ if count, err := db.Count[actions_model.ActionSchedule](ctx, actions_model.FindScheduleOptions{RepoID: input.Repo.ID}); err != nil {
log.Error("CountSchedules: %v", err)
return err
} else if count > 0 {
diff --git a/services/asymkey/ssh_key_test.go b/services/asymkey/ssh_key_test.go
index 3a39a9a1db4..fbd5d13ab2d 100644
--- a/services/asymkey/ssh_key_test.go
+++ b/services/asymkey/ssh_key_test.go
@@ -67,7 +67,10 @@ ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ib
for i, kase := range testCases {
s.ID = int64(i) + 20
asymkey_model.AddPublicKeysBySource(db.DefaultContext, user, s, []string{kase.keyString})
- keys, err := asymkey_model.ListPublicKeysBySource(db.DefaultContext, user.ID, s.ID)
+ keys, err := db.Find[asymkey_model.PublicKey](db.DefaultContext, asymkey_model.FindPublicKeyOptions{
+ OwnerID: user.ID,
+ LoginSourceID: s.ID,
+ })
assert.NoError(t, err)
if err != nil {
continue
diff --git a/services/auth/httpsign.go b/services/auth/httpsign.go
index d5c8ea33aa3..b604349f80d 100644
--- a/services/auth/httpsign.go
+++ b/services/auth/httpsign.go
@@ -12,6 +12,7 @@ import (
"strings"
asymkey_model "code.gitea.io/gitea/models/asymkey"
+ "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
@@ -92,7 +93,9 @@ func VerifyPubKey(r *http.Request) (*asymkey_model.PublicKey, error) {
keyID := verifier.KeyId()
- publicKeys, err := asymkey_model.SearchPublicKey(r.Context(), 0, keyID)
+ publicKeys, err := db.Find[asymkey_model.PublicKey](r.Context(), asymkey_model.FindPublicKeyOptions{
+ Fingerprint: keyID,
+ })
if err != nil {
return nil, err
}
diff --git a/services/auth/signin.go b/services/auth/signin.go
index 2e534536817..fafe3ef3c67 100644
--- a/services/auth/signin.go
+++ b/services/auth/signin.go
@@ -86,7 +86,7 @@ func UserSignIn(ctx context.Context, username, password string) (*user_model.Use
}
}
- sources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: util.OptionalBoolTrue,
})
if err != nil {
diff --git a/services/auth/source/oauth2/init.go b/services/auth/source/oauth2/init.go
index 0ebbdaebd41..3ad6e307f10 100644
--- a/services/auth/source/oauth2/init.go
+++ b/services/auth/source/oauth2/init.go
@@ -10,6 +10,7 @@ import (
"sync"
"code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
@@ -64,7 +65,7 @@ func ResetOAuth2(ctx context.Context) error {
// initOAuth2Sources is used to load and register all active OAuth2 providers
func initOAuth2Sources(ctx context.Context) error {
- authSources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ authSources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: util.OptionalBoolTrue,
LoginType: auth.OAuth2,
})
diff --git a/services/auth/source/oauth2/providers.go b/services/auth/source/oauth2/providers.go
index 3b45b252f70..f4edb507f27 100644
--- a/services/auth/source/oauth2/providers.go
+++ b/services/auth/source/oauth2/providers.go
@@ -13,6 +13,7 @@ import (
"sort"
"code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
@@ -107,7 +108,7 @@ func CreateProviderFromSource(source *auth.Source) (Provider, error) {
// GetOAuth2Providers returns the list of configured OAuth2 providers
func GetOAuth2Providers(ctx context.Context, isActive util.OptionalBool) ([]Provider, error) {
- authSources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ authSources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: isActive,
LoginType: auth.OAuth2,
})
diff --git a/services/auth/sspi.go b/services/auth/sspi.go
index bc8ec948f29..57ba0462c57 100644
--- a/services/auth/sspi.go
+++ b/services/auth/sspi.go
@@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/avatars"
+ "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
gitea_context "code.gitea.io/gitea/modules/context"
@@ -130,7 +131,7 @@ func (s *SSPI) Verify(req *http.Request, w http.ResponseWriter, store DataStore,
// getConfig retrieves the SSPI configuration from login sources
func (s *SSPI) getConfig(ctx context.Context) (*sspi.Source, error) {
- sources, err := auth.FindSources(ctx, auth.FindSourcesOptions{
+ sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{
IsActive: util.OptionalBoolTrue,
LoginType: auth.SSPI,
})
diff --git a/services/auth/sync.go b/services/auth/sync.go
index 11a59d41ae1..7562ac812bd 100644
--- a/services/auth/sync.go
+++ b/services/auth/sync.go
@@ -15,7 +15,7 @@ import (
func SyncExternalUsers(ctx context.Context, updateExisting bool) error {
log.Trace("Doing: SyncExternalUsers")
- ls, err := auth.FindSources(ctx, auth.FindSourcesOptions{})
+ ls, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{})
if err != nil {
log.Error("SyncExternalUsers: %v", err)
return err
diff --git a/services/forms/user_form.go b/services/forms/user_form.go
index c0eb03f5547..cbab2742388 100644
--- a/services/forms/user_form.go
+++ b/services/forms/user_form.go
@@ -365,7 +365,7 @@ func (f *EditVariableForm) Validate(req *http.Request, errs binding.Errors) bind
// NewAccessTokenForm form for creating access token
type NewAccessTokenForm struct {
- Name string `binding:"Required;MaxSize(255)"`
+ Name string `binding:"Required;MaxSize(255)" locale:"settings.token_name"`
Scope []string
}
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index 1f139d233ff..b597dd0487c 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -290,8 +290,10 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
reference := createReference(ctx.Issue, nil, activities_model.ActionType(0))
var replyPayload []byte
- if ctx.Comment != nil && ctx.Comment.Type == issues_model.CommentTypeCode {
- replyPayload, err = incoming_payload.CreateReferencePayload(ctx.Comment)
+ if ctx.Comment != nil {
+ if ctx.Comment.Type.HasMailReplySupport() {
+ replyPayload, err = incoming_payload.CreateReferencePayload(ctx.Comment)
+ }
} else {
replyPayload, err = incoming_payload.CreateReferencePayload(ctx.Issue)
}
@@ -316,7 +318,7 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
listUnsubscribe := []string{"<" + ctx.Issue.HTMLURL() + ">"}
if setting.IncomingEmail.Enabled {
- if ctx.Comment != nil {
+ if replyPayload != nil {
token, err := token.CreateToken(token.ReplyHandlerType, recipient, replyPayload)
if err != nil {
log.Error("CreateToken failed: %v", err)
diff --git a/services/migrations/update.go b/services/migrations/update.go
index d466832363b..4a49206f82e 100644
--- a/services/migrations/update.go
+++ b/services/migrations/update.go
@@ -36,8 +36,7 @@ func updateMigrationPosterIDByGitService(ctx context.Context, tp structs.GitServ
}
const batchSize = 100
- var start int
- for {
+ for page := 0; ; page++ {
select {
case <-ctx.Done():
log.Warn("UpdateMigrationPosterIDByGitService(%s) cancelled", tp.Name())
@@ -45,10 +44,13 @@ func updateMigrationPosterIDByGitService(ctx context.Context, tp structs.GitServ
default:
}
- users, err := user_model.FindExternalUsersByProvider(ctx, user_model.FindExternalUserOptions{
+ users, err := db.Find[user_model.ExternalLoginUser](ctx, user_model.FindExternalUserOptions{
+ ListOptions: db.ListOptions{
+ PageSize: batchSize,
+ Page: page,
+ },
Provider: provider,
- Start: start,
- Limit: batchSize,
+ OrderBy: "login_source_id ASC, external_id ASC",
})
if err != nil {
return err
@@ -70,7 +72,6 @@ func updateMigrationPosterIDByGitService(ctx context.Context, tp structs.GitServ
if len(users) < batchSize {
break
}
- start += len(users)
}
return nil
}
diff --git a/services/pull/review.go b/services/pull/review.go
index 3f5644b0cd4..e48f3801547 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -49,16 +49,16 @@ func InvalidateCodeComments(ctx context.Context, prs issues_model.PullRequestLis
return nil
}
issueIDs := prs.GetIssueIDs()
- var codeComments []*issues_model.Comment
- if err := db.Find(ctx, &issues_model.FindCommentsOptions{
+ codeComments, err := db.Find[issues_model.Comment](ctx, issues_model.FindCommentsOptions{
ListOptions: db.ListOptions{
ListAll: true,
},
Type: issues_model.CommentTypeCode,
Invalidated: util.OptionalBoolFalse,
IssueIDs: issueIDs,
- }, &codeComments); err != nil {
+ })
+ if err != nil {
return fmt.Errorf("find code comments: %v", err)
}
for _, comment := range codeComments {
diff --git a/services/release/release.go b/services/release/release.go
index e0035d42fc2..3ba2a3f6117 100644
--- a/services/release/release.go
+++ b/services/release/release.go
@@ -301,17 +301,7 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo
}
// DeleteReleaseByID deletes a release and corresponding Git tag by given ID.
-func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, delTag bool) error {
- rel, err := repo_model.GetReleaseByID(ctx, id)
- if err != nil {
- return fmt.Errorf("GetReleaseByID: %w", err)
- }
-
- repo, err := repo_model.GetRepositoryByID(ctx, rel.RepoID)
- if err != nil {
- return fmt.Errorf("GetRepositoryByID: %w", err)
- }
-
+func DeleteReleaseByID(ctx context.Context, repo *repo_model.Repository, rel *repo_model.Release, doer *user_model.User, delTag bool) error {
if delTag {
protectedTags, err := git_model.GetProtectedTags(ctx, rel.RepoID)
if err != nil {
@@ -344,19 +334,19 @@ func DeleteReleaseByID(ctx context.Context, id int64, doer *user_model.User, del
}, repository.NewPushCommits())
notify_service.DeleteRef(ctx, doer, repo, refName)
- if err := repo_model.DeleteReleaseByID(ctx, id); err != nil {
+ if err := repo_model.DeleteReleaseByID(ctx, rel.ID); err != nil {
return fmt.Errorf("DeleteReleaseByID: %w", err)
}
} else {
rel.IsTag = true
- if err = repo_model.UpdateRelease(ctx, rel); err != nil {
+ if err := repo_model.UpdateRelease(ctx, rel); err != nil {
return fmt.Errorf("Update: %w", err)
}
}
rel.Repo = repo
- if err = rel.LoadAttributes(ctx); err != nil {
+ if err := rel.LoadAttributes(ctx); err != nil {
return fmt.Errorf("LoadAttributes: %w", err)
}
diff --git a/services/repository/delete.go b/services/repository/delete.go
index 861dfa2dcd0..08d6800ee76 100644
--- a/services/repository/delete.go
+++ b/services/repository/delete.go
@@ -54,13 +54,13 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
}
// Query the action tasks of this repo, they will be needed after they have been deleted to remove the logs
- tasks, err := actions_model.FindTasks(ctx, actions_model.FindTaskOptions{RepoID: repoID})
+ tasks, err := db.Find[actions_model.ActionTask](ctx, actions_model.FindTaskOptions{RepoID: repoID})
if err != nil {
return fmt.Errorf("find actions tasks of repo %v: %w", repoID, err)
}
// Query the artifacts of this repo, they will be needed after they have been deleted to remove artifacts files in ObjectStorage
- artifacts, err := actions_model.ListArtifactsByRepoID(ctx, repoID)
+ artifacts, err := db.Find[actions_model.ActionArtifact](ctx, actions_model.FindArtifactsOptions{RepoID: repoID})
if err != nil {
return fmt.Errorf("list actions artifacts of repo %v: %w", repoID, err)
}
@@ -75,7 +75,7 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
}
// Delete Deploy Keys
- deployKeys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: repoID})
+ deployKeys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: repoID})
if err != nil {
return fmt.Errorf("listDeployKeys: %w", err)
}
diff --git a/services/repository/hooks.go b/services/repository/hooks.go
index 8506fa34136..7b82f36b43f 100644
--- a/services/repository/hooks.go
+++ b/services/repository/hooks.go
@@ -85,7 +85,7 @@ func GenerateGitHooks(ctx context.Context, templateRepo, generateRepo *repo_mode
// GenerateWebhooks generates webhooks from a template repository
func GenerateWebhooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
- templateWebhooks, err := webhook.ListWebhooksByOpts(ctx, &webhook.ListWebhookOptions{RepoID: templateRepo.ID})
+ templateWebhooks, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{RepoID: templateRepo.ID})
if err != nil {
return err
}
diff --git a/services/repository/push.go b/services/repository/push.go
index 97da45f52b4..391c8ad4ca7 100644
--- a/services/repository/push.go
+++ b/services/repository/push.go
@@ -35,7 +35,9 @@ var pushQueue *queue.WorkerPoolQueue[[]*repo_module.PushUpdateOptions]
func handler(items ...[]*repo_module.PushUpdateOptions) [][]*repo_module.PushUpdateOptions {
for _, opts := range items {
if err := pushUpdates(opts); err != nil {
- log.Error("pushUpdate failed: %v", err)
+ // Username and repository stays the same between items in opts.
+ pushUpdate := opts[0]
+ log.Error("pushUpdate[%s/%s] failed: %v", pushUpdate.RepoUserName, pushUpdate.RepoName, err)
}
}
return nil
diff --git a/services/secrets/secrets.go b/services/secrets/secrets.go
index 1c4772d6bf9..97e15ba6c7f 100644
--- a/services/secrets/secrets.go
+++ b/services/secrets/secrets.go
@@ -15,7 +15,7 @@ func CreateOrUpdateSecret(ctx context.Context, ownerID, repoID int64, name, data
return nil, false, err
}
- s, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{
+ s, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{
OwnerID: ownerID,
RepoID: repoID,
Name: name,
@@ -40,7 +40,7 @@ func CreateOrUpdateSecret(ctx context.Context, ownerID, repoID int64, name, data
}
func DeleteSecretByID(ctx context.Context, ownerID, repoID, secretID int64) error {
- s, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{
+ s, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{
OwnerID: ownerID,
RepoID: repoID,
SecretID: secretID,
@@ -60,7 +60,7 @@ func DeleteSecretByName(ctx context.Context, ownerID, repoID int64, name string)
return err
}
- s, err := secret_model.FindSecrets(ctx, secret_model.FindSecretsOptions{
+ s, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{
OwnerID: ownerID,
RepoID: repoID,
Name: name,
diff --git a/services/user/user.go b/services/user/user.go
index 4a4908fe8e5..932e359c9f9 100644
--- a/services/user/user.go
+++ b/services/user/user.go
@@ -172,7 +172,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) error {
// An alternative option here would be write a function which would delete all organizations but it seems
// but such a function would likely get out of date
for {
- orgs, err := organization.FindOrgs(ctx, organization.FindOrgOptions{
+ orgs, err := db.Find[organization.Organization](ctx, organization.FindOrgOptions{
ListOptions: db.ListOptions{
PageSize: repo_model.RepositoryListDefaultPageSize,
Page: 1,
diff --git a/services/webhook/dingtalk_test.go b/services/webhook/dingtalk_test.go
index 7289c751f38..a03fa46f145 100644
--- a/services/webhook/dingtalk_test.go
+++ b/services/webhook/dingtalk_test.go
@@ -188,6 +188,21 @@ func TestDingTalkPayload(t *testing.T) {
assert.Equal(t, "http://localhost:3000/test/repo", parseRealSingleURL(pl.(*DingtalkPayload).ActionCard.SingleURL))
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(DingtalkPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.NotNil(t, pl)
+ require.IsType(t, &DingtalkPayload{}, pl)
+
+ assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.(*DingtalkPayload).ActionCard.Text)
+ assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.(*DingtalkPayload).ActionCard.Title)
+ assert.Equal(t, "view package", pl.(*DingtalkPayload).ActionCard.SingleTitle)
+ assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", parseRealSingleURL(pl.(*DingtalkPayload).ActionCard.SingleURL))
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/discord_test.go b/services/webhook/discord_test.go
index 6a276e9e874..b567cbc395d 100644
--- a/services/webhook/discord_test.go
+++ b/services/webhook/discord_test.go
@@ -211,6 +211,24 @@ func TestDiscordPayload(t *testing.T) {
assert.Equal(t, p.Sender.AvatarURL, pl.(*DiscordPayload).Embeds[0].Author.IconURL)
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(DiscordPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.NotNil(t, pl)
+ require.IsType(t, &DiscordPayload{}, pl)
+
+ assert.Len(t, pl.(*DiscordPayload).Embeds, 1)
+ assert.Equal(t, "Package created: GiteaContainer:latest", pl.(*DiscordPayload).Embeds[0].Title)
+ assert.Empty(t, pl.(*DiscordPayload).Embeds[0].Description)
+ assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.(*DiscordPayload).Embeds[0].URL)
+ assert.Equal(t, p.Sender.UserName, pl.(*DiscordPayload).Embeds[0].Author.Name)
+ assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.(*DiscordPayload).Embeds[0].Author.URL)
+ assert.Equal(t, p.Sender.AvatarURL, pl.(*DiscordPayload).Embeds[0].Author.IconURL)
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/feishu_test.go b/services/webhook/feishu_test.go
index a3182e82b09..98bc50dedec 100644
--- a/services/webhook/feishu_test.go
+++ b/services/webhook/feishu_test.go
@@ -144,6 +144,18 @@ func TestFeishuPayload(t *testing.T) {
assert.Equal(t, "[test/repo] Repository created", pl.(*FeishuPayload).Content.Text)
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(FeishuPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.NotNil(t, pl)
+ require.IsType(t, &FeishuPayload{}, pl)
+
+ assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.(*FeishuPayload).Content.Text)
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/general_test.go b/services/webhook/general_test.go
index a9a8c6b5212..41bac3fd04d 100644
--- a/services/webhook/general_test.go
+++ b/services/webhook/general_test.go
@@ -303,6 +303,36 @@ func repositoryTestPayload() *api.RepositoryPayload {
}
}
+func packageTestPayload() *api.PackagePayload {
+ return &api.PackagePayload{
+ Action: api.HookPackageCreated,
+ Sender: &api.User{
+ UserName: "user1",
+ AvatarURL: "http://localhost:3000/user1/avatar",
+ },
+ Repository: nil,
+ Organization: &api.User{
+ UserName: "org1",
+ AvatarURL: "http://localhost:3000/org1/avatar",
+ },
+ Package: &api.Package{
+ Owner: &api.User{
+ UserName: "user1",
+ AvatarURL: "http://localhost:3000/user1/avatar",
+ },
+ Repository: nil,
+ Creator: &api.User{
+ UserName: "user1",
+ AvatarURL: "http://localhost:3000/user1/avatar",
+ },
+ Type: "container",
+ Name: "GiteaContainer",
+ Version: "latest",
+ HTMLURL: "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest",
+ },
+ }
+}
+
func TestGetIssuesPayloadInfo(t *testing.T) {
p := issueTestPayload()
diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go
index ab7e6b72c25..602d16ef39b 100644
--- a/services/webhook/matrix.go
+++ b/services/webhook/matrix.go
@@ -212,14 +212,14 @@ func (m *MatrixPayload) Repository(p *api.RepositoryPayload) (api.Payloader, err
func (m *MatrixPayload) Package(p *api.PackagePayload) (api.Payloader, error) {
senderLink := MatrixLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName)
- repoLink := MatrixLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName)
+ packageLink := MatrixLinkFormatter(p.Package.HTMLURL, p.Package.Name)
var text string
switch p.Action {
case api.HookPackageCreated:
- text = fmt.Sprintf("[%s] Package published by %s", repoLink, senderLink)
+ text = fmt.Sprintf("[%s] Package published by %s", packageLink, senderLink)
case api.HookPackageDeleted:
- text = fmt.Sprintf("[%s] Package deleted by %s", repoLink, senderLink)
+ text = fmt.Sprintf("[%s] Package deleted by %s", packageLink, senderLink)
}
return getMatrixPayload(text, nil, m.MsgType), nil
diff --git a/services/webhook/matrix_test.go b/services/webhook/matrix_test.go
index 8c710942280..99a22fbd7eb 100644
--- a/services/webhook/matrix_test.go
+++ b/services/webhook/matrix_test.go
@@ -155,6 +155,19 @@ func TestMatrixPayload(t *testing.T) {
assert.Equal(t, `[test/repo] Repository created by user1`, pl.(*MatrixPayload).FormattedBody)
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(MatrixPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.NotNil(t, pl)
+ require.IsType(t, &MatrixPayload{}, pl)
+
+ assert.Equal(t, `[[GiteaContainer](http://localhost:3000/user1/-/packages/container/GiteaContainer/latest)] Package published by [user1](https://try.gitea.io/user1)`, pl.(*MatrixPayload).Body)
+ assert.Equal(t, `[GiteaContainer] Package published by user1`, pl.(*MatrixPayload).FormattedBody)
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go
index f58da3fe1cd..37810b4cd39 100644
--- a/services/webhook/msteams.go
+++ b/services/webhook/msteams.go
@@ -316,11 +316,12 @@ func GetMSTeamsPayload(p api.Payloader, event webhook_module.HookEventType, _ st
}
func createMSTeamsPayload(r *api.Repository, s *api.User, title, text, actionTarget string, color int, fact *MSTeamsFact) *MSTeamsPayload {
- facts := []MSTeamsFact{
- {
+ facts := make([]MSTeamsFact, 0, 2)
+ if r != nil {
+ facts = append(facts, MSTeamsFact{
Name: "Repository:",
Value: r.FullName,
- },
+ })
}
if fact != nil {
facts = append(facts, *fact)
diff --git a/services/webhook/msteams_test.go b/services/webhook/msteams_test.go
index 990a535df5c..8d1aed60408 100644
--- a/services/webhook/msteams_test.go
+++ b/services/webhook/msteams_test.go
@@ -329,6 +329,33 @@ func TestMSTeamsPayload(t *testing.T) {
assert.Equal(t, "http://localhost:3000/test/repo", pl.(*MSTeamsPayload).PotentialAction[0].Targets[0].URI)
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(MSTeamsPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.NotNil(t, pl)
+ require.IsType(t, &MSTeamsPayload{}, pl)
+
+ assert.Equal(t, "Package created: GiteaContainer:latest", pl.(*MSTeamsPayload).Title)
+ assert.Equal(t, "Package created: GiteaContainer:latest", pl.(*MSTeamsPayload).Summary)
+ assert.Len(t, pl.(*MSTeamsPayload).Sections, 1)
+ assert.Equal(t, "user1", pl.(*MSTeamsPayload).Sections[0].ActivitySubtitle)
+ assert.Empty(t, pl.(*MSTeamsPayload).Sections[0].Text)
+ assert.Len(t, pl.(*MSTeamsPayload).Sections[0].Facts, 1)
+ for _, fact := range pl.(*MSTeamsPayload).Sections[0].Facts {
+ if fact.Name == "Package:" {
+ assert.Equal(t, p.Package.Name, fact.Value)
+ } else {
+ t.Fail()
+ }
+ }
+ assert.Len(t, pl.(*MSTeamsPayload).PotentialAction, 1)
+ assert.Len(t, pl.(*MSTeamsPayload).PotentialAction[0].Targets, 1)
+ assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.(*MSTeamsPayload).PotentialAction[0].Targets[0].URI)
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/packagist_test.go b/services/webhook/packagist_test.go
index 932b56fe9b9..26d01b0555d 100644
--- a/services/webhook/packagist_test.go
+++ b/services/webhook/packagist_test.go
@@ -115,6 +115,15 @@ func TestPackagistPayload(t *testing.T) {
require.Nil(t, pl)
})
+ t.Run("Package", func(t *testing.T) {
+ p := packageTestPayload()
+
+ d := new(PackagistPayload)
+ pl, err := d.Package(p)
+ require.NoError(t, err)
+ require.Nil(t, pl)
+ })
+
t.Run("Wiki", func(t *testing.T) {
p := wikiTestPayload()
diff --git a/services/webhook/slack_test.go b/services/webhook/slack_test.go
index d9828f374f0..b1340963e23 100644
--- a/services/webhook/slack_test.go
+++ b/services/webhook/slack_test.go
@@ -144,6 +144,18 @@ func TestSlackPayload(t *testing.T) {
assert.Equal(t, "[