diff --git a/.gitattributes b/.gitattributes
index 05dde22cccb4a..4e83849e03e7e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,7 @@
* text=auto eol=lf
/vendor/** -text -eol linguist-vendored
/public/vendor/** -text -eol linguist-vendored
+/web_src/js/vendor/** -text -eol linguist-vendored
/templates/**/*.tmpl linguist-language=Handlebars
/.eslintrc linguist-language=YAML
/.stylelintrc linguist-language=YAML
diff --git a/cmd/serv.go b/cmd/serv.go
index e42213cb9854f..b4ef37f1dc6c8 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -253,10 +253,9 @@ func runServ(c *cli.Context) error {
now := time.Now()
claims := lfs.Claims{
- // FIXME: we need to migrate to RegisteredClaims
- StandardClaims: jwt.StandardClaims{ // nolint
- ExpiresAt: now.Add(setting.LFS.HTTPAuthExpiry).Unix(),
- NotBefore: now.Unix(),
+ RegisteredClaims: jwt.RegisteredClaims{
+ ExpiresAt: jwt.NewNumericDate(now.Add(setting.LFS.HTTPAuthExpiry)),
+ NotBefore: jwt.NewNumericDate(now),
},
RepoID: results.RepoID,
Op: lfsVerb,
diff --git a/models/issue_comment.go b/models/issue_comment.go
index bf36881a00bec..34541dc3cdf1c 100644
--- a/models/issue_comment.go
+++ b/models/issue_comment.go
@@ -99,7 +99,7 @@ const (
// 28 merge pull request
CommentTypeMergePull
// 29 push to PR head branch
- CommentTypePullPush
+ CommentTypePullRequestPush
// 30 Project changed
CommentTypeProject
// 31 Project board changed
@@ -725,7 +725,7 @@ func (c *Comment) CodeCommentURL() string {
// LoadPushCommits Load push commits
func (c *Comment) LoadPushCommits(ctx context.Context) (err error) {
- if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullPush {
+ if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullRequestPush {
return nil
}
@@ -1325,7 +1325,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *Pul
}
ops := &CreateCommentOptions{
- Type: CommentTypePullPush,
+ Type: CommentTypePullRequestPush,
Doer: pusher,
Repo: pr.BaseRepo,
}
diff --git a/models/user/setting.go b/models/user/setting.go
index 5ff18f8265400..fbb6fbab30337 100644
--- a/models/user/setting.go
+++ b/models/user/setting.go
@@ -31,8 +31,8 @@ func init() {
db.RegisterModel(new(Setting))
}
-// GetSettings returns specific settings from user
-func GetSettings(uid int64, keys []string) (map[string]*Setting, error) {
+// GetUserSettings returns specific settings from user
+func GetUserSettings(uid int64, keys []string) (map[string]*Setting, error) {
settings := make([]*Setting, 0, len(keys))
if err := db.GetEngine(db.DefaultContext).
Where("user_id=?", uid).
@@ -62,21 +62,53 @@ func GetUserAllSettings(uid int64) (map[string]*Setting, error) {
return settingsMap, nil
}
-// DeleteSetting deletes a specific setting for a user
-func DeleteSetting(setting *Setting) error {
- _, err := db.GetEngine(db.DefaultContext).Delete(setting)
+func validateUserSettingKey(key string) error {
+ if len(key) == 0 {
+ return fmt.Errorf("setting key must be set")
+ }
+ if strings.ToLower(key) != key {
+ return fmt.Errorf("setting key should be lowercase")
+ }
+ return nil
+}
+
+// GetUserSetting gets a specific setting for a user
+func GetUserSetting(userID int64, key string, def ...string) (string, error) {
+ if err := validateUserSettingKey(key); err != nil {
+ return "", err
+ }
+ setting := &Setting{UserID: userID, SettingKey: key}
+ has, err := db.GetEngine(db.DefaultContext).Get(setting)
+ if err != nil {
+ return "", err
+ }
+ if !has {
+ if len(def) == 1 {
+ return def[0], nil
+ }
+ return "", nil
+ }
+ return setting.SettingValue, nil
+}
+
+// DeleteUserSetting deletes a specific setting for a user
+func DeleteUserSetting(userID int64, key string) error {
+ if err := validateUserSettingKey(key); err != nil {
+ return err
+ }
+ _, err := db.GetEngine(db.DefaultContext).Delete(&Setting{UserID: userID, SettingKey: key})
return err
}
-// SetSetting updates a users' setting for a specific key
-func SetSetting(setting *Setting) error {
- if strings.ToLower(setting.SettingKey) != setting.SettingKey {
- return fmt.Errorf("setting key should be lowercase")
+// SetUserSetting updates a users' setting for a specific key
+func SetUserSetting(userID int64, key, value string) error {
+ if err := validateUserSettingKey(key); err != nil {
+ return err
}
- return upsertSettingValue(setting.UserID, setting.SettingKey, setting.SettingValue)
+ return upsertUserSettingValue(userID, key, value)
}
-func upsertSettingValue(userID int64, key, value string) error {
+func upsertUserSettingValue(userID int64, key, value string) error {
return db.WithTx(func(ctx context.Context) error {
e := db.GetEngine(ctx)
diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go
new file mode 100644
index 0000000000000..458b78e357f0c
--- /dev/null
+++ b/models/user/setting_keys.go
@@ -0,0 +1,10 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package user
+
+const (
+ // SettingsKeyHiddenCommentTypes is the settings key for hidden comment types
+ SettingsKeyHiddenCommentTypes = "issue.hidden_comment_types"
+)
diff --git a/models/user/setting_test.go b/models/user/setting_test.go
index 81445a9f6f782..0b42e0fe2a1d9 100644
--- a/models/user/setting_test.go
+++ b/models/user/setting_test.go
@@ -19,21 +19,29 @@ func TestSettings(t *testing.T) {
newSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Gitea User Setting Test"}
// create setting
- err := SetSetting(newSetting)
+ err := SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
assert.NoError(t, err)
// test about saving unchanged values
- err = SetSetting(newSetting)
+ err = SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
assert.NoError(t, err)
// get specific setting
- settings, err := GetSettings(99, []string{keyName})
+ settings, err := GetUserSettings(99, []string{keyName})
assert.NoError(t, err)
assert.Len(t, settings, 1)
assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue)
+ settingValue, err := GetUserSetting(99, keyName)
+ assert.NoError(t, err)
+ assert.EqualValues(t, newSetting.SettingValue, settingValue)
+
+ settingValue, err = GetUserSetting(99, "no_such")
+ assert.NoError(t, err)
+ assert.EqualValues(t, "", settingValue)
+
// updated setting
updatedSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"}
- err = SetSetting(updatedSetting)
+ err = SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue)
assert.NoError(t, err)
// get all settings
@@ -43,7 +51,7 @@ func TestSettings(t *testing.T) {
assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue)
// delete setting
- err = DeleteSetting(&Setting{UserID: 99, SettingKey: keyName})
+ err = DeleteUserSetting(99, keyName)
assert.NoError(t, err)
settings, err = GetUserAllSettings(99)
assert.NoError(t, err)
diff --git a/modules/context/form.go b/modules/context/form.go
index 8d185909737c7..4f48d746b95c8 100644
--- a/modules/context/form.go
+++ b/modules/context/form.go
@@ -46,9 +46,11 @@ func (ctx *Context) FormInt64(key string) int64 {
return v
}
-// FormBool returns true if the value for the provided key in the form is "1" or "true"
+// FormBool returns true if the value for the provided key in the form is "1", "true" or "on"
func (ctx *Context) FormBool(key string) bool {
- v, _ := strconv.ParseBool(ctx.Req.FormValue(key))
+ s := ctx.Req.FormValue(key)
+ v, _ := strconv.ParseBool(s)
+ v = v || strings.EqualFold(s, "on")
return v
}
@@ -59,6 +61,8 @@ func (ctx *Context) FormOptionalBool(key string) util.OptionalBool {
if len(value) == 0 {
return util.OptionalBoolNone
}
- v, _ := strconv.ParseBool(ctx.Req.FormValue(key))
+ s := ctx.Req.FormValue(key)
+ v, _ := strconv.ParseBool(s)
+ v = v || strings.EqualFold(s, "on")
return util.OptionalBoolOf(v)
}
diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go
index 94ee16ff8c158..21709d9454c47 100644
--- a/modules/notification/mail/mail.go
+++ b/modules/notification/mail/mail.go
@@ -42,7 +42,7 @@ func (m *mailNotifier) NotifyCreateIssueComment(doer *user_model.User, repo *rep
act = models.ActionCommentIssue
} else if comment.Type == models.CommentTypeCode {
act = models.ActionCommentIssue
- } else if comment.Type == models.CommentTypePullPush {
+ } else if comment.Type == models.CommentTypePullRequestPush {
act = 0
}
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 4f5a58bf76229..c82f11e7bd649 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -41,6 +41,7 @@ webauthn_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden
webauthn_error=Dein Sicherheitsschlüssel konnte nicht gelesen werden.
webauthn_unsupported_browser=Dein Browser unterstützt derzeit keinen WebAuthn.
webauthn_error_unknown=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut.
+webauthn_error_insecure=WebAuthn unterstützt nur sichere Verbindungen. Zum Testen über HTTP kannst du "localhost" oder "127.0.0.1" als Host verwenden
webauthn_error_unable_to_process=Der Server konnte deine Anfrage nicht bearbeiten.
webauthn_error_duplicated=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist.
webauthn_error_timeout=Das Zeitlimit wurde erreicht, bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite erneut.
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index f96e6da796f7d..fc57b9e400685 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -549,6 +549,22 @@ continue = Continue
cancel = Cancel
language = Language
ui = Theme
+hidden_comment_types = Hidden comment types
+comment_type_group_reference = Reference
+comment_type_group_label = Label
+comment_type_group_milestone = Milestone
+comment_type_group_assignee = Assignee
+comment_type_group_title = Title
+comment_type_group_branch = Branch
+comment_type_group_time_tracking = Time Tracking
+comment_type_group_deadline = Deadline
+comment_type_group_dependency = Dependency
+comment_type_group_lock = Lock Status
+comment_type_group_review_request = Review request
+comment_type_group_pull_request_push = Added commits
+comment_type_group_project = Project
+comment_type_group_issue_ref = Issue reference
+saved_successfully = Your settings were saved successfully.
privacy = Privacy
keep_activity_private = Hide the activity from the profile page
keep_activity_private_popup = Makes the activity visible only for you and the admins
diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini
deleted file mode 100644
index 402f994d591c6..0000000000000
--- a/options/locale/locale_sr-SP.ini
+++ /dev/null
@@ -1,731 +0,0 @@
-home=Почетна
-dashboard=Контролни панел
-explore=Преглед
-help=Помоћ
-sign_in=Пријавите Се
-sign_out=Одјава
-register=Регистрација
-website=Веб-страница
-version=Верзија
-page=Страница
-template=Шаблон
-language=Језик
-signed_in_as=Пријављени сте као
-
-username=Корисничко име
-password=Лозинка
-
-
-repository=Спремиште
-organization=Организација
-mirror=Огледало
-new_repo=Ново спремиште
-new_migrate=Нова миграција
-new_mirror=Ново огледало
-new_org=Нова организација
-manage_org=Управљање организацијама
-account_settings=Подешавања налога
-settings=Подешавања
-
-
-activities=Активности
-pull_requests=Захтеви за спајање
-issues=Дискусије
-
-cancel=Откажи
-
-
-
-
-
-
-[error]
-
-[startpage]
-
-[install]
-install=Инсталација
-db_title=Подешавања базе
-db_type=Тип базе података
-host=Хост
-password=Лозинка
-db_name=Име базе података
-path=Пут
-
-repo_path=Пут до корена спремишта
-log_root_path=Пут до журнала
-
-optional_title=Напредна подешавања
-smtp_host=SMTP сервер
-federated_avatar_lookup_popup=Омогућите federated avatars lookup да би сте користили федеративни сервис помоћу libravatar.
-enable_captcha_popup=Тражи Captcha приликом регистрације корисника.
-admin_password=Лозинка
-confirm_password=Потврдите лозинку
-install_btn_confirm=Успостави Gitea
-test_git_failed=Команда 'git' није успела: %v
-
-[home]
-password_holder=Лозинка
-switch_dashboard_context=Пребаците контекст контролној панели
-collaborative_repos=Заједничка спремишта
-my_orgs=Моје организације
-my_mirrors=Моја огледала
-view_home=Прикажи %s
-
-
-
-issues.in_your_repos=У вашим спремиштима
-
-[explore]
-repos=Спремишта
-users=Корисници
-search=Претрага
-
-[auth]
-register_helper_msg=Већ имате налог? Пријавите се!
-active_your_account=Активирајте ваш налог
-has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
-resend_mail=Кликните овде да поново пошаљете писмо
-
-[mail]
-
-activate_account=Молимо вас активирајте ваш налог
-
-activate_email=Потврдите вашу адресу е-поште
-
-
-
-
-
-
-
-
-
-[modal]
-yes=Да
-no=Не
-
-[form]
-UserName=Корисничко име
-RepoName=Име спремишта
-Email=Адреса ел. поште
-Password=Лозинка
-SSHTitle=Име SSH кључа
-HttpsUrl=HTTPS URL адреса
-PayloadUrl=URL адреса за слање
-TeamName=Име тима
-AuthName=Ауторизацијско име
-AdminEmail=Адреса е-поште администратора
-
-NewBranchName=Име нове гране
-CommitSummary=Опис за ревизију
-CommitMessage=Ревизни текст
-CommitChoice=Избор ревизије
-TreeName=Пут до датотеке
-Content=Садржај
-
-
-require_error=` не може бити празно.`
-size_error=` мора бити величине %s.`
-min_size_error=` мора да садржи најмање %s карактера.`
-max_size_error=` мора да садржи највише %s карактера.`
-email_error=` није важећа адреса е-поште.`
-url_error=` није исправна URL адреса.`
-include_error=` мора да садржи текст '%s'.`
-unknown_error=Непозната грешка:
-
-
-auth_failed=Грешка идентитета: %v
-
-
-target_branch_not_exist=Ова грана не постоји.
-
-[user]
-join_on=Регистриран
-repositories=Спремишта
-activity=Активности
-followers=Пратиоци
-following=Пратим
-follow=Прати
-unfollow=Престани да пратиш
-
-
-[settings]
-profile=Профил
-password=Лозинка
-avatar=Аватар
-social=Налози на друштвеним мрежама
-delete=Уклоните налог
-
-public_profile=Јавни профил
-full_name=Име и презиме
-website=Веб страница
-location=Локација
-update_profile=Ажурирај профил
-continue=Настави
-cancel=Откажи
-
-federated_avatar_lookup=Federated Avatar претрага
-enable_custom_avatar=Укључи ваш аватар
-choose_new_avatar=Изаберите нови аватар
-delete_current_avatar=Обришите тренутни аватар
-
-old_password=Тренутна лозинка
-new_password=Нова лозинка
-
-emails=Адреса ел. поште
-email_desc=Ваша главна адреса ће се користити за обавештења и других операција.
-primary=Главно
-
-manage_ssh_keys=Управљање SSH кључева
-add_key=Додај кључ
-add_new_key=Додај SSH кључ
-key_name=Име кључа
-key_content=Садржај
-add_on=Додато
-last_used=Задње корршћено
-no_activity=Нема недавних активности
-manage_social=Управљање прикључених друштвеним мрежама
-
-generate_new_token=Генериши нови токен
-token_name=Име токена
-generate_token=Генериши токен
-delete_token=Уклони
-
-
-
-
-
-
-
-delete_account=Уклоните ваш налог
-confirm_delete_account=Потврдите брисање
-
-
-
-[repo]
-owner=Власник
-repo_name=Име спремишта
-visibility=Видљивост
-fork_repo=Креирај огранак спремишта
-fork_from=Огранак од
-repo_desc=Опис
-repo_lang=Језик
-license=Лиценца
-create_repo=Ново спремиште
-default_branch=Главна грана
-mirror_prune=Очисти
-watchers=Посматрачи
-stargazers=Пратиоци
-forks=Огранци
-
-
-
-
-
-
-migrate_repo=Мигрирајте спремиште
-migrate.permission_denied=Немате права на увезете локално спремиште.
-migrate.failed=Миграција није успела: %v
-
-mirror_from=огледало од
-forked_from=изданак од
-unwatch=Престани пратити
-watch=Прати
-unstar=Улкони звезду
-star=Волим
-fork=Креирај огранак
-
-no_desc=Нема описа
-quick_guide=Кратак водич
-clone_this_repo=Клонирај спремиште
-
-code=Код
-branch=Грана
-tree=Дрво
-filter_branch_and_tag=Профилтрирај по грани или ознаци
-branches=Гране
-tags=Ознаке
-issues=Дискусије
-pulls=Захтеви за спајање
-labels=Лабеле
-
-milestones=Фазе
-commits=Комити
-releases=Издања
-file_raw=Датотека
-file_history=Историја
-file_view_raw=Прегледај саму датотеку
-file_permalink=Пермалинк
-
-
-editor.preview_changes=Преглед промена
-editor.or=или
-editor.commit_changes=Изврши комит промена
-editor.add=Додај '%s'
-editor.update=Ажурирај '%s'
-editor.delete=Уклони '%s'
-editor.commit_directly_to_this_branch=Изврши комит директно на %s грану.
-editor.create_new_branch=Креирај нову грану за овај комит и поднеси захтев за спајање.
-editor.cancel=Откажи
-editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
-editor.no_changes_to_show=Нема никаквих промена.
-editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
-editor.upload_files_to_dir=Пошаљи датотеке на '%s'
-
-commits.commits=Комити
-commits.author=Аутор
-commits.message=Порука
-commits.date=Датум
-commits.older=Старије
-commits.newer=Новије
-
-
-
-issues.new=Нови задатак
-issues.new.labels=Лавеле
-issues.new.no_label=Нема лабеле
-issues.new.clear_labels=Уклони лабеле
-issues.new.milestone=Фаза
-issues.new.no_milestone=Нема фазе
-issues.new.clear_milestone=Уклони фазу
-issues.new.open_milestone=Отворене фазе
-issues.new.closed_milestone=Затворене фазе
-issues.create=Додај задатак
-issues.new_label=Нова лабела
-issues.create_label=Креирај лабелу
-issues.label_templates.title=Преузмите унапред дефинисани скуп лабела
-issues.label_templates.helper=Изаберите скуп лабела
-issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v
-issues.open_tab=%d отворено
-issues.close_tab=%d затворено
-issues.filter_label=Лабела
-issues.filter_milestone=Фаза
-issues.filter_assignee=Одговорни
-issues.filter_type=Тип
-issues.filter_type.all_issues=Сви задаци
-issues.filter_type.assigned_to_you=Заказано вама
-issues.filter_type.created_by_you=креирано од вас
-issues.filter_type.mentioning_you=Помењује вас
-issues.filter_sort=Сортирај
-issues.filter_sort.latest=Најновије
-issues.filter_sort.oldest=Најстарије
-issues.filter_sort.recentupdate=Недавно ажурирано
-issues.filter_sort.leastupdate=Давно ажуриано
-issues.filter_sort.mostcomment=Највише коментара
-issues.filter_sort.leastcomment=Најмање коментара
-issues.opened_by=отворено %[1]s од %[3]s
-issues.previous=Претходна
-issues.next=Следеће
-issues.open_title=Отворено
-issues.closed_title=Затворено
-issues.num_comments=%d коментара
-issues.commented_at=`коментирира %s`
-issues.delete_comment_confirm=Да ли желите да избришете овај коментар?
-issues.no_content=Још нема садржаја.
-issues.close_issue=Затвори
-issues.reopen_issue=Поново отвори
-issues.create_comment=Коментирај
-issues.commit_ref_at=`поменуо овај задатак у комит %[2]s`
-issues.poster=Аутор
-issues.collaborator=Коаутор
-issues.owner=Власник
-issues.sign_in_require_desc=Пријавите се да се прикључе у овом разговору.
-issues.edit=Уреди
-issues.cancel=Откажи
-issues.save=Сачувај
-issues.label_title=Име лабеле
-issues.label_color=Боја лабеле
-issues.label_count=%d лабела
-issues.label_open_issues=%d отворених задатака
-issues.label_edit=Уреди
-issues.label_delete=Уклони
-issues.num_participants=%d учесника
-issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору`
-issues.attachment.download=`Кликните да преузмете "%s"`
-
-
-pulls.new=Нови захтев за спајање
-pulls.filter_branch=Филтер по грани
-pulls.no_results=Нема резултата.
-pulls.create=Поднеси захтев за спајање
-pulls.merged_title_desc=споји(ла) %[1]d комит(е) из %[2]s
у %[3]s
%[4]s
-pulls.tab_conversation=Дискусија
-pulls.tab_commits=Комити
-pulls.merged=Спојено
-pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски.
-
-; %[2]s
-
-
-milestones.new=Нова фаза
-milestones.open_tab=%d отворено
-milestones.close_tab=%d затворено
-milestones.closed=Затворено %s
-milestones.no_due_date=Рок није наведен
-milestones.open=Отвори
-milestones.close=Затвори
-milestones.create=Креирај фазу
-milestones.title=Наслов
-milestones.desc=Опис
-milestones.due_date=Датум завршетка (опционо)
-milestones.clear=Уклони
-milestones.edit=Ажурирај фазу
-milestones.cancel=Откажи
-
-
-
-wiki=Вики
-wiki.page=Страница
-wiki.filter_page=Филтер странице
-wiki.save_page=Сачувај страницу
-wiki.last_commit_info=%s урећивао ову страницу %s
-wiki.edit_page_button=Уреди
-wiki.new_page_button=Нова страница
-wiki.delete_page_button=Уклони страницу
-wiki.page_already_exists=Страница са овим именом већ постоји.
-wiki.pages=Странице
-wiki.last_updated=Последње ажурирано %s
-
-
-
-settings=Подешавања
-settings.collaboration.write=За писање
-settings.collaboration.read=Читање
-settings.collaboration.undefined=Није дефинисано
-settings.githooks=Git хуки
-settings.basic_settings=Основна подешавања
-settings.mirror_settings=Подешавања огледала
-settings.update_settings=Примени промене
-settings.advanced_settings=Напредна подешавања
-settings.external_wiki_url=URL адреса спољног Вики
-settings.tracker_url_format=Спољни формат везе система за праћење грешака
-settings.tracker_issue_style.numeric=Нумерично
-settings.tracker_issue_style.alphanumeric=Алфанумерично
-settings.danger_zone=Опасна зона
-settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име.
-settings.transfer=Пренеси власништво
-settings.transfer_owner=Нови власник
-settings.delete=Уклони ово спремиште
-settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута.
-settings.add_webhook=Додај Webhook
-settings.webhook.test_delivery=Провери испоруку
-settings.webhook.request=Захтев
-settings.webhook.response=Одговор
-settings.webhook.headers=Наслови
-settings.webhook.body=Тело
-settings.githook_edit_desc=Aко Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
-settings.githook_name=Име Hook-а
-settings.githook_content=Садржај Hook-а
-settings.update_githook=Ажурирај Hook
-settings.secret=Тајна
-settings.slack_username=Корисничко име
-settings.slack_icon_url=URL адреса иконице
-settings.event_create=Креирај
-settings.event_pull_request=Захтев за спајање
-settings.update_webhook=Ажурирај Webhook
-settings.recent_deliveries=Недавне испоруке
-settings.hook_type=Тип Hook-а
-settings.slack_token=Токен
-settings.slack_domain=Домен
-settings.slack_channel=Канал
-settings.deploy_keys=Кључеви за распоређивање
-settings.add_deploy_key=Додај кључ за распоређивање
-settings.title=Наслов
-settings.deploy_key_content=Садржај
-
-diff.browse_source=Преглед изворни кода
-diff.parent=родитељ
-diff.commit=комит
-diff.show_split_view=Подељен поглед
-diff.show_unified_view=Један поглед
-diff.stats_desc= %d измењених фајлова са %d додато и %d уклоњено
-diff.view_file=Прегледај датотеку
-diff.file_suppressed=Разлика између датотеке није приказан због своје велике величине
-
-release.releases=Издања
-release.new_release=Ново издање
-release.draft=Нацрт
-release.prerelease=Пред-верзија
-release.stable=Стабилно
-release.edit=уреди
-release.source_code=Изворни код
-release.tag_name=Име ознаке
-release.target=Циљ
-release.title=Наслов
-release.content=Садржај
-release.cancel=Откажи
-release.publish=Објави издање
-release.save_draft=Сачувај нацрт
-release.downloads=Преузимања
-
-
-
-
-
-[org]
-org_name_holder=Име организације
-org_full_name_holder=Пун назив организације
-create_org=Створи Организацију
-repo_updated=Ажурирано
-people=Особе
-teams=Тимови
-lower_members=чланови
-lower_repositories=спремишта
-org_desc=Опис
-team_name=Име тима
-team_desc=Опис
-
-
-settings=Подешавања
-settings.full_name=Пуно име
-settings.website=Саит
-settings.location=Локација
-
-settings.update_settings=Ажурирај подешавања
-settings.delete=Уклони организацију
-settings.delete_account=Уклони ову организацију
-settings.confirm_delete_account=Потврди брисање
-
-
-members.membership_visibility=Видљивост:
-members.member_role=Улога учесника:
-members.owner=Власник
-members.member=Члан
-members.remove=Уклони
-members.leave=Изађи
-members.invite_desc=Додја новог члана %s:
-members.invite_now=Позовите сада
-
-teams.join=Придружи се
-teams.leave=Изаћи
-teams.no_desc=Овај тим нема описа
-teams.settings=Подешавања
-teams.members=Чланови тима
-teams.update_settings=Примени промене
-teams.add_team_member=Додај члан тиму
-teams.repositories=Тимска спремишта
-teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите.
-
-[admin]
-dashboard=Контролни панел
-organizations=Организације
-repositories=Спремишта
-config=Подешавања
-notices=Системска обавештења
-monitor=Праћење
-first_page=Први
-last_page=Последњи
-total=Укупно: %d
-
-dashboard.operation_name=Име операције
-dashboard.operation_switch=Пребаци
-dashboard.operation_run=Покрени
-dashboard.server_uptime=Време непрекидног рада сервера
-dashboard.current_goroutine=Тренутнe Goroutine
-dashboard.current_memory_usage=Тренутна употреба меморије
-dashboard.total_memory_allocated=Укупно меморије алоцирано
-dashboard.memory_obtained=Коришћена меморија
-dashboard.pointer_lookup_times=Захтева показивача
-dashboard.current_heap_usage=Тренутна употреба динамичке меморије
-dashboard.heap_memory_obtained=Слободно динамичке меморије
-dashboard.heap_memory_idle=Неактиво динамичке меморије
-dashboard.heap_memory_in_use=Динамичка меморија у употреби
-dashboard.heap_memory_released=Ослобођено динамичке меморије
-dashboard.heap_objects=Објекти динамичке меморије
-dashboard.bootstrap_stack_usage=Коришћење стек меморије
-dashboard.stack_memory_obtained=Слободно стек меморије
-dashboard.mspan_structures_usage=Употреба структуре MSpan
-dashboard.mspan_structures_obtained=Добијено структуре MSpan
-dashboard.mcache_structures_usage=Употреба структурa MCache
-dashboard.mcache_structures_obtained=Добијено структурa MCache
-dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket
-dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа
-dashboard.other_system_allocation_obtained=Добијено друга системска меморија
-dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа
-dashboard.last_gc_time=Времена од прошлог cакупљању смећа
-dashboard.total_gc_time=Укупно време cакупљању смећа
-dashboard.total_gc_pause=Укупно време cакупљању смећа
-dashboard.last_gc_pause=Задња пауза у cакупљању смећа
-dashboard.gc_times=Времена cакупљању смећа
-
-users.activated=Активиран
-users.admin=Администратор
-users.repos=Спремишта
-users.created=Креирано
-users.edit=Уреди
-users.auth_source=Извор аутентикације
-users.local=Локално
-
-
-orgs.name=Име
-orgs.teams=Тимови
-orgs.members=Чланови
-
-repos.owner=Власник
-repos.name=Име
-repos.private=Приватно
-repos.stars=Фаворити
-repos.issues=Задаци
-
-
-
-auths.name=Име
-auths.type=Тип
-auths.enabled=Омогућено
-auths.updated=Ажурирано
-auths.auth_type=Врста провере аутентичности
-auths.auth_name=Име провере аутентичности
-auths.security_protocol=Протокол безбедности
-auths.domain=Домен
-auths.host=Хост
-auths.port=Порт
-auths.bind_password=Bind лозинкa
-auths.user_base=База претраживање корисника
-auths.user_dn=DN корисника
-auths.filter=Филтер корисника
-auths.admin_filter=Филтер администратора
-auths.smtp_auth=Тип SMTP аутентикације
-auths.smtphost=SMTP хост
-auths.smtpport=SMTP порт
-auths.allowed_domains=Дозвољени домени
-auths.skip_tls_verify=Прескочи TLS проверу
-auths.pam_service_name=Назив PAM сервиса
-auths.enable_auto_register=Омогући аутоматску регистрацију
-auths.tips=Савети
-
-config.server_config=Конфигурација сервера
-config.disable_router_log=Онемогући журнал рутера
-config.run_mode=Режим извршавања
-config.repo_root_path=Пут до корена спремишта
-config.static_file_root_path=Пут до статичке датотеке
-config.script_type=Врста скрипта
-config.reverse_auth_user=Корисничко име при обрнуту аутентикацију
-
-config.ssh_config=SSH конфигурација
-config.ssh_enabled=Омогућено
-config.ssh_port=Порт
-config.ssh_listen_port=Порт за слушање
-config.ssh_root_path=Основни пут
-config.ssh_key_test_path=Пут до кључу
-config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen')
-config.ssh_minimum_key_size_check=Минимална величина провера кључа
-config.ssh_minimum_key_sizes=Минимална величина кључева
-
-
-config.db_config=Конфигурација базе података
-config.db_type=Тип
-config.db_host=Хост
-config.db_name=Име
-config.db_path=Пут
-
-config.service_config=Подешавања сервиса
-config.show_registration_button=Прикажи дугме за регистрацију
-config.disable_key_size_check=Онемогући проверу на минималној величини кључа
-config.active_code_lives=Дужина живота активних кодова
-
-config.webhook_config=Подешавања Webhook
-config.queue_length=Дужина реда
-config.deliver_timeout=Време до отказивање слања
-
-config.mailer_enabled=Омогућено
-config.mailer_disable_helo=Онемогући HELO
-config.mailer_name=Име
-config.mailer_host=Хост
-config.mailer_user=Корисник
-
-config.oauth_config=Подешавања OAuth
-config.oauth_enabled=Укључено
-
-config.cache_config=Подешавања кеша
-config.cache_adapter=Кеш адаптер
-config.cache_interval=Кеш интервал
-config.cache_conn=Кеш на вези
-
-config.session_config=Подешавања сесије
-config.session_provider=Добављач сесија
-config.provider_config=Конфигурација на добављачу
-config.cookie_name=Име датотеке cookie
-config.gc_interval_time=Интервал cакупљања смећа
-config.session_life_time=Дужина живота сесјие
-config.https_only=Само HTTPS
-config.cookie_life_time=Дужина живота датотеке cookie
-
-config.picture_service=Услуга за слике
-config.disable_gravatar=Онемогући Gravatar
-config.enable_federated_avatar=Омогући Federated Avatars
-
-config.git_config=Git конфигурација
-config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике
-config.git_max_diff_lines=Максималан број различитих редова (у датотеци)
-config.git_max_diff_line_characters=Максималан број различитих карактера (у реду)
-config.git_max_diff_files=Максималан број измењених датотека (приказаних)
-config.git_gc_args=Аргументи на cакупљање смећа
-config.git_migrate_timeout=Време до отказања миграције
-config.git_mirror_timeout=Време до отазање синхронизацији огледала
-config.git_clone_timeout=Време до отказивања клонирањем
-config.git_pull_timeout=Време до отказивања pull операцији
-config.git_gc_timeout=Време до отказивања cакупљање смећа
-
-config.log_config=Kонфигурација журнала
-config.log_mode=Режим журналовања
-
-monitor.cron=Cron задаци
-monitor.name=Име
-monitor.schedule=Распоред
-monitor.next=Следећи пут
-monitor.previous=Претходни пут
-monitor.process=Покренути процеси
-monitor.desc=Опис
-monitor.start=Почетно време
-monitor.execute_time=Време извршивања
-
-
-
-notices.system_notice_list=Системска обавештавања
-notices.actions=Акције
-notices.select_all=Изабери све
-notices.deselect_all=Уклоните избор свих
-notices.inverse_selection=Обрна селекција
-notices.delete_selected=Избриши изабране
-notices.delete_all=Уклони сва обавештења
-notices.type=Тип
-notices.type_1=Спремиште
-notices.desc=Опис
-notices.op=Oп.
-
-[action]
-create_repo=креира спремиште %s
-rename_repo=преимензје спремиште од
%[3]s%[1]s
на %[3]s
-transfer_repo=преноси спремиште %s
на %s
-
-[tool]
-ago=пре %s
-from_now=од сада %s
-now=сада
-1s=1 секунд
-1m=1 минут
-1h=1 час
-1d=1 дан
-1w=1 недеља
-1mon=1 месец
-1y=1 година
-seconds=%d секунди
-minutes=%d минута
-hours=%d часа
-days=%d дана
-weeks=%d недеља
-months=%d месеци
-years=%d година
-raw_seconds=секунди
-raw_minutes=минута
-
-[dropzone]
-remove_file=Уклони датотеку
-
-[notification]
-
-[gpg]
-
-[units]
-
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 25eb059ca4dfa..891517d57f438 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -61,7 +61,7 @@ forks=Форки
activities=Дії
pull_requests=Запити на злиття
-issues=Проблеми
+issues=Задачі
milestones=Етапи
ok=OK
@@ -346,7 +346,7 @@ reset_password.text=Перейдіть за цим посиланням, щоб
register_success=Реєстрація успішна
issue_assigned.pull=@%[1]s призначив вам запит злиття %[2]s в репозиторії %[3]s.
-issue_assigned.issue=@%[1]s призначив вам завдання %[2]s у репозиторії %[3]s.
+issue_assigned.issue=@%[1]s призначив вам задачу %[2]s у репозиторії %[3]s.
issue.x_mentioned_you=@%s згадав вас:
issue.action.force_push=%[1]s force-pushed %[2]s з %[3]s в %[4]s.
@@ -774,8 +774,8 @@ repo_desc_helper=Введіть короткий опис (опціональн
repo_lang=Мова
repo_gitignore_helper=Виберіть шаблон .gitignore.
repo_gitignore_helper_desc=Оберіть з списку мовних шаблонів файли, які не будуть відстежуватись. Типові артефакти, які генеруються за допомогою інструментів побудови кожної мови, за замовчуванням включені до .gitignor.
-issue_labels=Мітки проблем
-issue_labels_helper=Вибрати мітку для проблеми.
+issue_labels=Мітки задачі
+issue_labels_helper=Вибрати мітку для задачі.
license=Ліцензія
license_helper=Виберіть ліцензійний файл.
license_helper_desc=Ліцензія регулює те, що інші можуть і не можуть робити з вашим кодом. Не впевнені, що саме підходить для вашого проекту? Дивіться Виберіть ліцензію.
@@ -846,12 +846,12 @@ template.git_hooks=Перехоплювачі Git
template.webhooks=Webhook'и
template.topics=Теми
template.avatar=Аватар
-template.issue_labels=Мітки проблем
+template.issue_labels=Мітки задачі
template.one_item=Слід обрати хоча б один елемент шаблону
template.invalid=Слід обрати шаблонний репозиторій
-archive.title=Це архівний репозитарій. Ви можете переглядати і клонувати файли, але не можете робити пуш або відкривати питання/запити.
-archive.issue.nocomment=Це архівний репозитарій. Ви не можете коментувати запити.
+archive.title=Цей репозиторій архівовано. Ви можете переглядати файли та клонувати його, але не можете виконувати push чи відкривати задачі та запити злиття.
+archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі.
archive.pull.nocomment=Це архівний репозитарій. Ви не можете коментувати пулл-реквести.
form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв.
@@ -873,7 +873,7 @@ migrate_items=Деталі міграції
migrate_items_wiki=Вікі
migrate_items_milestones=Етапи
migrate_items_labels=Мітки
-migrate_items_issues=Проблеми
+migrate_items_issues=Задачі
migrate_items_pullrequests=Запити на злиття
migrate_items_merge_requests=Запити на злиття
migrate_items_releases=Релізи
@@ -906,7 +906,7 @@ migrate.migrating_topics=Міграція тем
migrate.migrating_milestones=Міграція етапів
migrate.migrating_labels=Міграція міток
migrate.migrating_releases=Міграція релізів
-migrate.migrating_issues=Міграція проблем
+migrate.migrating_issues=Міграція задач
migrate.migrating_pulls=Міграція запитів на злиття
mirror_from=дзеркало
@@ -939,7 +939,7 @@ filter_branch_and_tag=Фільтрувати гілку або тег
find_tag=Знайти тег
branches=Гілки
tags=Теги
-issues=Проблеми
+issues=Задачі
pulls=Запити на злиття
project_board=Проєкти
labels=Мітки
@@ -1053,10 +1053,11 @@ commits.signed_by_untrusted_user=Підписаний недовіреним к
commits.signed_by_untrusted_user_unmatched=Підписаний недовіреним користувачем, який не відповідає комітеру
commits.gpg_key_id=Ідентифікатор GPG ключа
-ext_issues.desc=Посилання на зовнішню систему відстеження проблем.
+ext_issues=Доступ до зовнішніх задач
+ext_issues.desc=Посилання на зовнішню систему відстеження задач.
projects=Проєкти
-projects.desc=Керуйте проблемами та запитами злиття на дошках проєкту.
+projects.desc=Керуйте задачами та запитами злиття на дошках проєкту.
projects.description=Опис (необов'язково)
projects.description_placeholder=Опис
projects.create=Створити проєкт
@@ -1065,10 +1066,10 @@ projects.new=Новий проєкт
projects.new_subheader=Координуйте, відстежуйте та оновлюйте інформацію про виконувану роботу в одному місці, аби проєкти залишалися прозорими та за розкладом.
projects.create_success=Проєкт '%s' створено.
projects.deletion=Видалити проєкт
-projects.deletion_desc=Видалення проєкту видаляє його з усіх пов'язаних проблем. Продовжити?
+projects.deletion_desc=Видалення проєкту видаляє його з усіх пов'язаних задач. Продовжити?
projects.deletion_success=Проєкт видалено.
projects.edit=Редагувати проєкти
-projects.edit_subheader=Проєкти призначені для організації проблем та відстеження поступу.
+projects.edit_subheader=Проєкти організовують задачі та відстежують прогрес.
projects.modify=Оновити проєкт
projects.edit_success=Проєкт '%s' оновлено.
projects.type.none=Відсутній
@@ -1083,9 +1084,9 @@ projects.board.new_title=Назва нової дошки
projects.board.new_submit=Створити
projects.board.new=Нова дошка
projects.board.set_default=Встановити за замовчуванням
-projects.board.set_default_desc=Встановити цю дошку за замовчуванням для проблем без категорії та витягувань
+projects.board.set_default_desc=Встановити цю дошку за замовчуванням для задач без категорії та витягувань
projects.board.delete=Видалити дошку
-projects.board.deletion_desc=Видалення дошки проєкту перенесе всі пов'язані проблеми в дошку 'Без категорії'. Продовжити?
+projects.board.deletion_desc=Видалення дошки проєкту перенесе всі пов'язані задачі в дошку 'Без категорії'. Продовжити?
projects.board.color=Колір
projects.open=Відкрити
projects.close=Закрити
@@ -1096,7 +1097,7 @@ issues.filter_milestones=Фільтр етапів
issues.filter_projects=Фільтр проєктів
issues.filter_labels=Фільтр міток
issues.filter_reviewers=Фільтр рецензентів
-issues.new=Нова проблема
+issues.new=Нова задача
issues.new.title_empty=Заголовок не може бути пустим
issues.new.labels=Мітки
issues.new.add_labels_title=Застосувати мітки
@@ -1125,7 +1126,7 @@ issues.choose.get_started=Початок роботи
issues.choose.blank=Типово
issues.choose.blank_about=Створити задачу із шаблону за замовчуванням.
issues.no_ref=Не вказана гілка або тег
-issues.create=Створити проблему
+issues.create=Створити задачу
issues.new_label=Нова мітка
issues.new_label_placeholder=Назва мітки
issues.new_label_desc_placeholder=Опис
@@ -1167,7 +1168,7 @@ issues.filter_milestone_no_select=Всі етапи
issues.filter_assignee=Виконавець
issues.filter_assginee_no_select=Всі виконавці
issues.filter_type=Тип
-issues.filter_type.all_issues=Всі проблеми
+issues.filter_type.all_issues=Всі задачі
issues.filter_type.assigned_to_you=Призначене вам
issues.filter_type.created_by_you=Створено вами
issues.filter_type.mentioning_you=Вас згадано
@@ -1203,7 +1204,7 @@ issues.commented_at=`прокоментував(ла) %s`
issues.delete_comment_confirm=Ви впевнені, що хочете видалити цей коментар?
issues.context.copy_link=Скопіювати посилання
issues.context.quote_reply=Цитувати відповідь
-issues.context.reference_issue=Посилання в новій проблемі
+issues.context.reference_issue=Посилання в новій задачі
issues.context.edit=Редагувати
issues.context.delete=Видалити
issues.no_content=Тут ще немає жодного змісту.
@@ -1214,15 +1215,15 @@ issues.close_comment_issue=Прокоментувати і закрити
issues.reopen_issue=Відкрити знову
issues.reopen_comment_issue=Прокоментувати та відкрити знову
issues.create_comment=Коментар
-issues.closed_at=`закрив цю проблему %[2]s`
-issues.reopened_at=`повторно відкрив цю проблему %[2]s`
-issues.commit_ref_at=`згадано цю проблему в коміті %[2]s`
-issues.ref_issue_from=`послався на цю проблему %[4]s %[2]s`
+issues.closed_at=`закрив цю задачу %[2]s`
+issues.reopened_at=`повторно відкрив цю задачу %[2]s`
+issues.commit_ref_at=`згадано цю задачу в коміті %[2]s`
+issues.ref_issue_from=`посилання на цю задачу %[4] %[2]s`
issues.ref_pull_from=`послався на цей запит злиття %[4]s %[2]s`
-issues.ref_closing_from=`послався на запит злиття %[4]s, який закриває цю проблему %[2]s`
-issues.ref_reopening_from=`послався на запит злиття %[4]s, який повторно відкриває цю проблему %[2]s`
-issues.ref_closed_from=`закрив цю проблему %[4]s %[2]s`
-issues.ref_reopened_from=`повторно відкрив цю проблему %[4]s %[2]s`
+issues.ref_closing_from=`згадав запит на злиття %[4]с, які закриють цю задачу %[2]s`
+issues.ref_reopening_from=`згадав запит на злиття %[4]с, які повторно відкриють цю задачу %[2]s`
+issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s`
+issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s`
issues.ref_from=`із %[1]s`
issues.poster=Автор
issues.collaborator=Співавтор
@@ -1241,12 +1242,12 @@ issues.label_title=Назва мітки
issues.label_description=Опис мітки
issues.label_color=Колір мітки
issues.label_count=%d міток
-issues.label_open_issues=%d відкритих проблем
+issues.label_open_issues=%d відкритих задач
issues.label_edit=Редагувати
issues.label_delete=Видалити
issues.label_modify=Редагувати мітку
issues.label_deletion=Видалити мітку
-issues.label_deletion_desc=Видалення мітки видаляє її з усіх обговорень. Продовжити?
+issues.label_deletion_desc=Видалення мітки видаляє її з усіх задач. Продовжити?
issues.label_deletion_success=Мітку було видалено.
issues.label.filter_sort.alphabetically=За алфавітом
issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту
@@ -1259,29 +1260,29 @@ issues.subscribe=Підписатися
issues.unsubscribe=Відписатися
issues.lock=Блокування обговорення
issues.unlock=Розблокування обговорення
-issues.lock.unknown_reason=Неможливо заблокувати проблему з невідомою причиною.
-issues.lock_duplicate=Проблема не може бути заблокованим двічі.
-issues.unlock_error=Не можливо розблокувати проблему, яка не заблокована.
+issues.lock.unknown_reason=Неможливо заблокувати задачу з невідомою причиною.
+issues.lock_duplicate=Задача не може бути заблокованим двічі.
+issues.unlock_error=Не можливо розблокувати задачу, яка не заблокована.
issues.lock_with_reason=заблоковано як %s та обмежене обговорення для співавторів %s
issues.lock_no_reason=заблоковано та обмежене обговорення для співавторів %s
issues.unlock_comment=розблоковане обговорення %s
issues.lock_confirm=Заблокувати
issues.unlock_confirm=Розблокувати
-issues.lock.notice_1=- Інші користувачі не можуть додавати нові коментарі до цієї проблеми.
+issues.lock.notice_1=- Інші користувачі не можуть додавати нові коментарі до цієї задачі.
issues.lock.notice_2=- Ви й інші співавтори, які мають доступ до цього репозиторію, можете залишати коментарі, які інші можуть бачити.
-issues.lock.notice_3=- Ви завжди зможете розблокувати цю проблему в майбутньому.
-issues.unlock.notice_1=- Кожен зможе прокоментувати це питання ще раз.
-issues.unlock.notice_2=- Ви завжди зможете заблокувати цю проблему в майбутньому.
+issues.lock.notice_3=- Ви завжди зможете розблокувати цю задачу в майбутньому.
+issues.unlock.notice_1=- Кожен зможе прокоментувати цю задачу ще раз.
+issues.unlock.notice_2=- Ви завжди зможете заблокувати цю задачу в майбутньому.
issues.lock.reason=Причина блокування
-issues.lock.title=Заблокувати обговорення цієї проблеми.
-issues.unlock.title=Розблокувати обговорення цієї проблеми.
-issues.comment_on_locked=Ви не можете коментувати заблоковану проблему.
+issues.lock.title=Заблокувати обговорення цієї задачі.
+issues.unlock.title=Розблокувати обговорення цієї задачі.
+issues.comment_on_locked=Ви не можете коментувати заблоковану задачу.
issues.tracker=Відстеження часу
issues.start_tracking_short=Запустити таймер
issues.start_tracking=Почати відстеження часу
issues.start_tracking_history=`почав працювати %s`
-issues.tracker_auto_close=Таймер буде автоматично зупинено, коли ця проблема буде закрита
-issues.tracking_already_started=`Ви вже почали відстежувати час для іншої проблеми!`
+issues.tracker_auto_close=Таймер буде автоматично зупинено, коли ця задача буде закрита
+issues.tracking_already_started=`Ви вже почали відстежувати час для іншої задачі!`
issues.stop_tracking=Зупинити таймер
issues.stop_tracking_history=`перестав(-ла) працювати %s`
issues.cancel_tracking=Скасувати
@@ -1308,7 +1309,7 @@ issues.due_date_form=рррр-мм-дд
issues.due_date_form_add=Додати дату завершення
issues.due_date_form_edit=Редагувати
issues.due_date_form_remove=Видалити
-issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення проблем.
+issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення задач.
issues.due_date_not_set=Термін виконання не встановлений.
issues.due_date_added=додав(ла) дату завершення %s %s
issues.due_date_modified=термін змінено з %s %s на %s
@@ -1316,7 +1317,7 @@ issues.due_date_remove=видалив(ла) дату завершення %s %s
issues.due_date_overdue=Прострочено
issues.due_date_invalid=Термін дії не дійсний або знаходиться за межами допустимого діапазону. Будь ласка використовуйте формат 'yyyy-mm-dd'.
issues.dependency.title=Залежності
-issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей.
+issues.dependency.issue_no_dependencies=Ця задача тепер не має залежностей.
issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей.
issues.dependency.add=Додати залежність…
issues.dependency.cancel=Відмінити
@@ -1324,24 +1325,24 @@ issues.dependency.remove=Видалити
issues.dependency.remove_info=Видалити цю залежність
issues.dependency.added_dependency=`додав нову залежність %s`
issues.dependency.removed_dependency=`видалив залежність %s`
-issues.dependency.pr_closing_blockedby=Закриття цього запиту злиття заблоковано наступними проблемами
-issues.dependency.issue_closing_blockedby=Закриття цієї проблеми заблоковано наступними проблемами
-issues.dependency.issue_close_blocks=Ця проблема блокує закриття залежних проблем
-issues.dependency.pr_close_blocks=Цей пулл-реквест блокує закриття залежних проблем
-issues.dependency.issue_close_blocked=Вам потрібно закрити всі проблеми, що блокують цю проблему, перед її закриттям.
-issues.dependency.pr_close_blocked=Вам потрібно закрити всі проблеми, що блокують цей пулл-реквест, перед його злиттям.
+issues.dependency.pr_closing_blockedby=Закриття цього запиту злиття заблоковано наступними задачами
+issues.dependency.issue_closing_blockedby=Закриття цієї задачи заблоковано наступними задачами
+issues.dependency.issue_close_blocks=Ця задача блокує закриття залежних задач
+issues.dependency.pr_close_blocks=Цей запит на злиття блокує закриття залежних задач
+issues.dependency.issue_close_blocked=Вам потрібно закрити всі задачі, що блокують цю задачу, перед її закриттям.
+issues.dependency.pr_close_blocked=Вам потрібно закрити всі задачі, що блокують цей запит, перед його злиттям.
issues.dependency.blocks_short=Блоки
issues.dependency.blocked_by_short=Залежить від
issues.dependency.remove_header=Видалити залежність
-issues.dependency.issue_remove_text=Це призведе до видалення залежності з цієї проблеми. Продовжити?
+issues.dependency.issue_remove_text=Це призведе до видалення залежності з цієї задачі. Продовжити?
issues.dependency.pr_remove_text=Це призведе до видалення залежності з цього пулл-реквесту. Продовжити?
-issues.dependency.setting=Увімкнути залежності для проблем та пулл-реквестів
-issues.dependency.add_error_same_issue=Ви не можете зробити проблему залежною від себе.
-issues.dependency.add_error_dep_issue_not_exist=Залежність для проблеми не існує.
+issues.dependency.setting=Увімкнути залежності для задач та запитів на злиття
+issues.dependency.add_error_same_issue=Ви не можете зробити задачу залежною від себе.
+issues.dependency.add_error_dep_issue_not_exist=Залежність для задачі не існує.
issues.dependency.add_error_dep_not_exist=Залежність не існує.
issues.dependency.add_error_dep_exists=Залежність уже існує.
-issues.dependency.add_error_cannot_create_circular=Ви не можете створити залежність з двома проблемами, які блокують одна одну.
-issues.dependency.add_error_dep_not_same_repo=Обидві проблеми повинні бути в одному репозиторії.
+issues.dependency.add_error_cannot_create_circular=Ви не можете створити залежність з двома задачами, які блокують одна одну.
+issues.dependency.add_error_dep_not_same_repo=Обидві задачі повинні бути в одному репозиторії.
issues.review.self.approval=Ви не можете схвалити власний пулл-реквест.
issues.review.self.rejection=Ви не можете надіслати запит на зміну на власний пулл-реквест.
issues.review.approve=зміни затверджено %s
@@ -1486,7 +1487,7 @@ milestones.update_ago=Оновлено %s назад
milestones.no_due_date=Немає дати завершення
milestones.open=Відкрити
milestones.close=Закрити
-milestones.new_subheader=Створюйте етапи для організації ваших завдань.
+milestones.new_subheader=Створюйте етапи для організації ваших задач.
milestones.completeness=%d%% завершено
milestones.create=Створити етап
milestones.title=Заголовок
@@ -1496,19 +1497,19 @@ milestones.clear=Очистити
milestones.invalid_due_date_format=Дата завершення має бути в форматі 'рррр-мм-дд'.
milestones.create_success=Етап '%s' створений.
milestones.edit=Редагувати етап
-milestones.edit_subheader=Використовуйте кращий опис контрольної точки, щоб уникнути нерозуміння з боку інших людей.
+milestones.edit_subheader=Створюйте етапи для організації ваших задач.
milestones.cancel=Відмінити
milestones.modify=Оновити етап
milestones.edit_success=Етап '%s' був оновлений.
milestones.deletion=Видалити етап
-milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних завдань. Продовжити?
+milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних задач. Продовжити?
milestones.deletion_success=Етап успішно видалено.
milestones.filter_sort.closest_due_date=Найближче за датою
milestones.filter_sort.furthest_due_date=Далі за датою
milestones.filter_sort.least_complete=Менш повне
milestones.filter_sort.most_complete=Більш повне
-milestones.filter_sort.most_issues=Найбільш проблем
-milestones.filter_sort.least_issues=Найменш проблем
+milestones.filter_sort.most_issues=Найбільш задач
+milestones.filter_sort.least_issues=Найменш задач
signing.will_sign=Цей коміт буде підписано ключем '%s'
signing.wont_sign.error=Під час підписання коміту, сталася помилка
@@ -1575,20 +1576,20 @@ activity.title.prs_opened_by=%s запропоновано %s
activity.merged_prs_label=Злито
activity.opened_prs_label=Запропоновано
activity.active_issues_count_1=%d Активна проблема
-activity.active_issues_count_n=%d Активні проблеми
+activity.active_issues_count_n=%d Активні задачі
activity.closed_issues_count_1=Закрита проблема
-activity.closed_issues_count_n=Закриті проблеми
+activity.closed_issues_count_n=Закриті задачі
activity.title.issues_1=%d Проблема
-activity.title.issues_n=%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=Нова Проблема
-activity.new_issues_count_n=%d Проблем
+activity.new_issues_count_n=Нові Задачі
activity.new_issue_label=Відкриті
activity.title.unresolved_conv_1=%d Незавершене обговорення
activity.title.unresolved_conv_n=%d Незавершених обговорень
-activity.unresolved_conv_desc=Список всіх старих тікетів і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих.
+activity.unresolved_conv_desc=Список всіх старих задач і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих.
activity.unresolved_conv_label=Відкрити
activity.title.releases_1=%d Реліз
activity.title.releases_n=%d Релізів
@@ -1665,7 +1666,7 @@ settings.use_internal_issue_tracker=Використовувати вбудов
settings.use_external_issue_tracker=Використовувати зовнішню систему обліку завдань
settings.external_tracker_url=URL зовнішньої системи відстеження проблем
settings.external_tracker_url_error=URL зовнішнього баг-трекера не є допустимою URL-адресою.
-settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Проблеми'.
+settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Задачі'.
settings.tracker_url_format=Формат URL зовнішнього трекера задач
settings.tracker_url_format_error=Неправильний формат URL-адреси зовнішнього баг-трекера.
settings.tracker_issue_style=Формат номеру для зовнішньої системи обліку задач
@@ -1736,7 +1737,7 @@ settings.wiki_deletion_success=Дані wiki були видалені.
settings.delete=Видалити цей репозиторій
settings.delete_desc=Будьте уважні! Як тільки ви видалите репозиторій - шляху назад не буде.
settings.delete_notices_1=- Цю операцію НЕ МОЖНА відмінити.
-settings.delete_notices_2=- Ця операція назавжди видалить все з репозиторію %s, включаючи дані Git, пов'язані з ним завдання, коментарі і права доступу для співробітників.
+settings.delete_notices_2=- Ця операція остаточно видалить %s репозиторій, включаючи код, задачі, коментарі, вікі та налаштування співавторів.
settings.delete_notices_fork_1=- Всі форки стануть незалежними репозиторіями після видалення.
settings.deletion_success=Репозиторій успішно видалено.
settings.update_settings_success=Налаштування репозиторію було оновлено.
@@ -1806,7 +1807,7 @@ settings.event_push_desc=Git push до репозиторію.
settings.event_repository=Репозиторій
settings.event_repository_desc=Репозиторій створений або видалено.
settings.event_header_issue=Події задачі
-settings.event_issues=Проблеми
+settings.event_issues=Задачі
settings.event_issues_desc=Проблема відкрита, закрита, повторно відкрита або відредагована.
settings.event_issue_assign=Проблема прив'язана
settings.event_issue_assign_desc=Проблема призначена або скасована.
@@ -1942,7 +1943,7 @@ settings.matrix.access_token=Токен Доступу
settings.matrix.message_type=Тип повідомлення
settings.archive.button=Архівний репозиторій
settings.archive.header=Відправити репозиторій в архів
-settings.archive.text=Архівування репозиторія зробить його доступним лише для читання. Він не відображається на панелі, в нього не можуть вноситись зміни і не можна створювати запити з проблем та пулл-реквести.
+settings.archive.text=Архівування репозиторія зробить його доступним лише для читання. Він не відображається на панелі, в нього не можуть вноситись зміни і не можна створювати запити з задач та пулл-реквести.
settings.archive.success=Репозиторію успішно присвоєно статус архівного.
settings.archive.error=Сталася помилка при спробі архівувати репозиторій. Докладнішу інформацію див. у журналі.
settings.archive.error_ismirror=Неможливо архівувати дзеркальний репозиротрій.
@@ -1950,7 +1951,7 @@ settings.archive.branchsettings_unavailable=Параметри гілки не
settings.archive.tagsettings_unavailable=Параметри міток недоступні, якщо репозиторій архівний.
settings.unarchive.button=Зняти архівний статус
settings.unarchive.header=Зняти архівний статус для репозиторія
-settings.unarchive.text=Зняття статусу архівного відновить запис в репозиторій, а також відкриє можливість створювати запити з нових проблем та пулл-запити.
+settings.unarchive.text=Зняття статусу архівного відновить запис в репозиторій, а також відкриє можливість створювати запити з нових задачах та пулл-запити.
settings.unarchive.success=Статус архівний успішно знято.
settings.unarchive.error=Сталася помилка при спробі скасувати архівний статус репозиторія. Докладнішу інформацію див. у журналі.
settings.update_avatar_success=Аватар репозиторію оновлений.
@@ -2175,7 +2176,7 @@ settings.delete_org_title=Видалити організацію
settings.delete_org_desc=Ця організація буде безповоротно видалена. Продовжити?
settings.hooks_desc=Додайте webhooks, який буде викликатися для всіх репозиторіїв якими володіє ця організація.
-settings.labels_desc=Додайте мітки, які можуть використовуватися для всіх репозиторіїв цієї органцізації.
+settings.labels_desc=Додати мітки, які можуть бути використані для задач для всіх репозиторіїв в цій організації.
members.membership_visibility=Видимість учасника:
members.public=Показувати
@@ -2400,7 +2401,7 @@ repos.private=Приватний
repos.watches=Стежать
repos.stars=В обраному
repos.forks=Форки
-repos.issues=Проблеми
+repos.issues=Задачі
repos.size=Розмір
defaulthooks=Веб-хуки за замовчуванням
diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go
index 7bf1adf308c5e..7793a408d84f7 100644
--- a/routers/web/auth/oauth.go
+++ b/routers/web/auth/oauth.go
@@ -149,9 +149,8 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2
accessToken := &oauth2.Token{
GrantID: grant.ID,
Type: oauth2.TypeAccessToken,
- // FIXME: Migrate to RegisteredClaims
- StandardClaims: jwt.StandardClaims{ //nolint
- ExpiresAt: expirationDate.AsTime().Unix(),
+ RegisteredClaims: jwt.RegisteredClaims{
+ ExpiresAt: jwt.NewNumericDate(expirationDate.AsTime()),
},
}
signedAccessToken, err := accessToken.SignToken(serverKey)
@@ -163,14 +162,13 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2
}
// generate refresh token to request an access token after it expired later
- refreshExpirationDate := timeutil.TimeStampNow().Add(setting.OAuth2.RefreshTokenExpirationTime * 60 * 60).AsTime().Unix()
+ refreshExpirationDate := timeutil.TimeStampNow().Add(setting.OAuth2.RefreshTokenExpirationTime * 60 * 60).AsTime()
refreshToken := &oauth2.Token{
GrantID: grant.ID,
Counter: grant.Counter,
Type: oauth2.TypeRefreshToken,
- // FIXME: Migrate to RegisteredClaims
- StandardClaims: jwt.StandardClaims{ // nolint
- ExpiresAt: refreshExpirationDate,
+ RegisteredClaims: jwt.RegisteredClaims{ // nolint
+ ExpiresAt: jwt.NewNumericDate(refreshExpirationDate),
},
}
signedRefreshToken, err := refreshToken.SignToken(serverKey)
@@ -207,11 +205,10 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2
}
idToken := &oauth2.OIDCToken{
- // FIXME: migrate to RegisteredClaims
- StandardClaims: jwt.StandardClaims{ //nolint
- ExpiresAt: expirationDate.AsTime().Unix(),
+ RegisteredClaims: jwt.RegisteredClaims{
+ ExpiresAt: jwt.NewNumericDate(expirationDate.AsTime()),
Issuer: setting.AppURL,
- Audience: app.ClientID,
+ Audience: []string{app.ClientID},
Subject: fmt.Sprint(grant.UserID),
},
Nonce: grant.Nonce,
@@ -329,8 +326,7 @@ func IntrospectOAuth(ctx *context.Context) {
var response struct {
Active bool `json:"active"`
Scope string `json:"scope,omitempty"`
- // FIXME: Migrate to RegisteredClaims
- jwt.StandardClaims //nolint
+ jwt.RegisteredClaims
}
form := web.GetForm(ctx).(*forms.IntrospectTokenForm)
@@ -344,7 +340,7 @@ func IntrospectOAuth(ctx *context.Context) {
response.Active = true
response.Scope = grant.Scope
response.Issuer = setting.AppURL
- response.Audience = app.ClientID
+ response.Audience = []string{app.ClientID}
response.Subject = fmt.Sprint(grant.UserID)
}
}
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index aff5fa8498554..4f2716763acd3 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -10,6 +10,7 @@ import (
"errors"
"fmt"
"io"
+ "math/big"
"net/http"
"net/url"
"path"
@@ -1465,7 +1466,7 @@ func ViewIssue(ctx *context.Context) {
ctx.ServerError("LoadResolveDoer", err)
return
}
- } else if comment.Type == models.CommentTypePullPush {
+ } else if comment.Type == models.CommentTypePullRequestPush {
participants = addParticipant(comment.Poster, participants)
if err = comment.LoadPushCommits(ctx); err != nil {
ctx.ServerError("LoadPushCommits", err)
@@ -1650,6 +1651,20 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin)
ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons
ctx.Data["RefEndName"] = git.RefEndName(issue.Ref)
+
+ var hiddenCommentTypes *big.Int
+ if ctx.IsSigned {
+ val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes)
+ if err != nil {
+ ctx.ServerError("GetUserSetting", err)
+ return
+ }
+ hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here
+ }
+ ctx.Data["ShouldShowCommentType"] = func(commentType models.CommentType) bool {
+ return hiddenCommentTypes == nil || hiddenCommentTypes.Bit(int(commentType)) == 0
+ }
+
ctx.HTML(http.StatusOK, tplIssueView)
}
diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go
index 3a61f2f92a616..e77e02348c6e1 100644
--- a/routers/web/user/setting/profile.go
+++ b/routers/web/user/setting/profile.go
@@ -9,6 +9,7 @@ import (
"errors"
"fmt"
"io"
+ "math/big"
"net/http"
"os"
"path/filepath"
@@ -358,6 +359,18 @@ func Appearance(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("settings")
ctx.Data["PageIsSettingsAppearance"] = true
+ var hiddenCommentTypes *big.Int
+ val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes)
+ if err != nil {
+ ctx.ServerError("GetUserSetting", err)
+ return
+ }
+ hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here
+
+ ctx.Data["IsCommentTypeGroupChecked"] = func(commentTypeGroup string) bool {
+ return forms.IsUserHiddenCommentTypeGroupChecked(commentTypeGroup, hiddenCommentTypes)
+ }
+
ctx.HTML(http.StatusOK, tplSettingsAppearance)
}
@@ -416,3 +429,16 @@ func UpdateUserLang(ctx *context.Context) {
ctx.Flash.Success(i18n.Tr(ctx.User.Language, "settings.update_language_success"))
ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
}
+
+// UpdateUserHiddenComments update a user's shown comment types
+func UpdateUserHiddenComments(ctx *context.Context) {
+ err := user_model.SetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes, forms.UserHiddenCommentTypesFromRequest(ctx).String())
+ if err != nil {
+ ctx.ServerError("SetUserSetting", err)
+ return
+ }
+
+ log.Trace("User settings updated: %s", ctx.User.Name)
+ ctx.Flash.Success(ctx.Tr("settings.saved_successfully"))
+ ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
+}
diff --git a/routers/web/web.go b/routers/web/web.go
index 830b8bb054ee3..401238d54fb00 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -323,6 +323,7 @@ func RegisterRoutes(m *web.Route) {
m.Group("/appearance", func() {
m.Get("", user_setting.Appearance)
m.Post("/language", bindIgnErr(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang)
+ m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments)
m.Post("/theme", bindIgnErr(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost)
})
m.Group("/security", func() {
diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go
index fcff5313e3920..42c91fac37593 100644
--- a/services/auth/oauth2.go
+++ b/services/auth/oauth2.go
@@ -44,7 +44,7 @@ func CheckOAuthAccessToken(accessToken string) int64 {
if token.Type != oauth2.TypeAccessToken {
return 0
}
- if token.ExpiresAt < time.Now().Unix() || token.IssuedAt > time.Now().Unix() {
+ if token.ExpiresAt.Before(time.Now()) || token.IssuedAt.After(time.Now()) {
return 0
}
return grant.UserID
diff --git a/services/auth/source/oauth2/token.go b/services/auth/source/oauth2/token.go
index 944b8da387cfd..0c69913ff4890 100644
--- a/services/auth/source/oauth2/token.go
+++ b/services/auth/source/oauth2/token.go
@@ -37,8 +37,7 @@ type Token struct {
GrantID int64 `json:"gnt"`
Type TokenType `json:"tt"`
Counter int64 `json:"cnt,omitempty"`
- // FIXME: Migrate to registered claims
- jwt.StandardClaims
+ jwt.RegisteredClaims
}
// ParseToken parses a signed jwt string
@@ -62,7 +61,7 @@ func ParseToken(jwtToken string, signingKey JWTSigningKey) (*Token, error) {
// SignToken signs the token with the JWT secret
func (token *Token) SignToken(signingKey JWTSigningKey) (string, error) {
- token.IssuedAt = time.Now().Unix()
+ token.IssuedAt = jwt.NewNumericDate(time.Now())
jwtToken := jwt.NewWithClaims(signingKey.SigningMethod(), token)
signingKey.PreProcessToken(jwtToken)
return jwtToken.SignedString(signingKey.SignKey())
@@ -70,8 +69,7 @@ func (token *Token) SignToken(signingKey JWTSigningKey) (string, error) {
// OIDCToken represents an OpenID Connect id_token
type OIDCToken struct {
- // FIXME: Migrate to RegisteredClaims
- jwt.StandardClaims
+ jwt.RegisteredClaims
Nonce string `json:"nonce,omitempty"`
// Scope profile
@@ -93,7 +91,7 @@ type OIDCToken struct {
// SignToken signs an id_token with the (symmetric) client secret key
func (token *OIDCToken) SignToken(signingKey JWTSigningKey) (string, error) {
- token.IssuedAt = time.Now().Unix()
+ token.IssuedAt = jwt.NewNumericDate(time.Now())
jwtToken := jwt.NewWithClaims(signingKey.SigningMethod(), token)
signingKey.PreProcessToken(jwtToken)
return jwtToken.SignedString(signingKey.SignKey())
diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go
new file mode 100644
index 0000000000000..e0c26e8ddf880
--- /dev/null
+++ b/services/forms/user_form_hidden_comments.go
@@ -0,0 +1,105 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package forms
+
+import (
+ "math/big"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/log"
+)
+
+type hiddenCommentTypeGroupsType map[string][]models.CommentType
+
+// hiddenCommentTypeGroups maps the group names to comment types, these group names comes from the Web UI (appearance.tmpl)
+var hiddenCommentTypeGroups = hiddenCommentTypeGroupsType{
+ "reference": {
+ /*3*/ models.CommentTypeIssueRef,
+ /*4*/ models.CommentTypeCommitRef,
+ /*5*/ models.CommentTypeCommentRef,
+ /*6*/ models.CommentTypePullRef,
+ },
+ "label": {
+ /*7*/ models.CommentTypeLabel,
+ },
+ "milestone": {
+ /*8*/ models.CommentTypeMilestone,
+ },
+ "assignee": {
+ /*9*/ models.CommentTypeAssignees,
+ },
+ "title": {
+ /*10*/ models.CommentTypeChangeTitle,
+ },
+ "branch": {
+ /*11*/ models.CommentTypeDeleteBranch,
+ /*25*/ models.CommentTypeChangeTargetBranch,
+ },
+ "time_tracking": {
+ /*12*/ models.CommentTypeStartTracking,
+ /*13*/ models.CommentTypeStopTracking,
+ /*14*/ models.CommentTypeAddTimeManual,
+ /*15*/ models.CommentTypeCancelTracking,
+ /*26*/ models.CommentTypeDeleteTimeManual,
+ },
+ "deadline": {
+ /*16*/ models.CommentTypeAddedDeadline,
+ /*17*/ models.CommentTypeModifiedDeadline,
+ /*18*/ models.CommentTypeRemovedDeadline,
+ },
+ "dependency": {
+ /*19*/ models.CommentTypeAddDependency,
+ /*20*/ models.CommentTypeRemoveDependency,
+ },
+ "lock": {
+ /*23*/ models.CommentTypeLock,
+ /*24*/ models.CommentTypeUnlock,
+ },
+ "review_request": {
+ /*27*/ models.CommentTypeReviewRequest,
+ },
+ "pull_request_push": {
+ /*29*/ models.CommentTypePullRequestPush,
+ },
+ "project": {
+ /*30*/ models.CommentTypeProject,
+ /*31*/ models.CommentTypeProjectBoard,
+ },
+ "issue_ref": {
+ /*33*/ models.CommentTypeChangeIssueRef,
+ },
+}
+
+// UserHiddenCommentTypesFromRequest parse the form to hidden comment types bitset
+func UserHiddenCommentTypesFromRequest(ctx *context.Context) *big.Int {
+ bitset := new(big.Int)
+ for group, commentTypes := range hiddenCommentTypeGroups {
+ if ctx.FormBool(group) {
+ for _, commentType := range commentTypes {
+ bitset = bitset.SetBit(bitset, int(commentType), 1)
+ }
+ }
+ }
+ return bitset
+}
+
+// IsUserHiddenCommentTypeGroupChecked check whether a hidden comment type group is "enabled" (checked on UI)
+func IsUserHiddenCommentTypeGroupChecked(group string, hiddenCommentTypes *big.Int) (ret bool) {
+ commentTypes, ok := hiddenCommentTypeGroups[group]
+ if !ok {
+ log.Critical("the group map for hidden comment types is out of sync, unknown group: %v", group)
+ return
+ }
+ if hiddenCommentTypes == nil {
+ return false
+ }
+ for _, commentType := range commentTypes {
+ if hiddenCommentTypes.Bit(int(commentType)) == 1 {
+ return true
+ }
+ }
+ return false
+}
diff --git a/services/lfs/server.go b/services/lfs/server.go
index cdce0046b3fd3..7c3f88e57bec1 100644
--- a/services/lfs/server.go
+++ b/services/lfs/server.go
@@ -45,8 +45,7 @@ type Claims struct {
RepoID int64
Op string
UserID int64
- // FIXME: Migrate to RegisteredClaims
- jwt.StandardClaims
+ jwt.RegisteredClaims
}
// DownloadLink builds a URL to download the object.
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index 5244cd043301e..e5aa2500837b6 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -449,7 +449,7 @@ func actionToTemplate(issue *models.Issue, actionType models.ActionType,
name = "code"
case models.CommentTypeAssignees:
name = "assigned"
- case models.CommentTypePullPush:
+ case models.CommentTypePullRequestPush:
name = "push"
default:
name = "default"
diff --git a/services/mailer/mail_comment.go b/services/mailer/mail_comment.go
index a42458b2c2c82..baecd2a101664 100644
--- a/services/mailer/mail_comment.go
+++ b/services/mailer/mail_comment.go
@@ -21,7 +21,7 @@ func MailParticipantsComment(ctx context.Context, c *models.Comment, opType mode
}
content := c.Content
- if c.Type == models.CommentTypePullPush {
+ if c.Type == models.CommentTypePullRequestPush {
content = ""
}
if err := mailIssueCommentToParticipants(
diff --git a/services/pull/pull.go b/services/pull/pull.go
index 4f691c0eba0eb..10fbc124ac671 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -108,7 +108,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *mode
}
ops := &models.CreateCommentOptions{
- Type: models.CommentTypePullPush,
+ Type: models.CommentTypePullRequestPush,
Doer: pull.Poster,
Repo: repo,
Issue: pr.Issue,
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index 73057248c7e20..e7c161a3f3ba5 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -1,835 +1,837 @@
{{ template "base/alert" }}
{{range .Issue.Comments}}
- {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }}
+ {{if call $.ShouldShowCommentType .Type}}
+ {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }}
-
- {{if eq .Type 0}}
-
{{end}} - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr $refTr (.EventTag|Escape) $createdStr (.RefCommentHTMLURL|Escape) $refFrom | Safe}} - - {{if eq .RefAction 3}}{{end}} - -{{end}} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr $refTr (.EventTag|Escape) $createdStr (.RefCommentHTMLURL|Escape) $refFrom | Safe}} + + {{if eq .RefAction 3}}{{end}} + ++ {{.i18n.Tr "settings.hidden_comment_types"}} +
+