diff --git a/models/issues/review.go b/models/issues/review.go
index 1cb99dc3373ff..5835900801778 100644
--- a/models/issues/review.go
+++ b/models/issues/review.go
@@ -19,6 +19,7 @@ import (
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"
+ "code.gitea.io/gitea/modules/util"
"xorm.io/builder"
)
@@ -474,6 +475,35 @@ func SubmitReview(doer *user_model.User, issue *Issue, reviewType ReviewType, co
return review, comm, committer.Commit()
}
+// GetReviewOptions represent filter options for GetReviews
+type GetReviewOptions struct {
+ IssueID int64
+ ReviewerID int64
+ Dismissed util.OptionalBool
+}
+
+// GetReviews return reviews based on GetReviewOptions
+func GetReviews(ctx context.Context, opts *GetReviewOptions) ([]*Review, error) {
+ if opts == nil {
+ return nil, fmt.Errorf("opts are nil")
+ }
+
+ sess := db.GetEngine(ctx)
+
+ if opts.IssueID != 0 {
+ sess = sess.Where("issue_id=?", opts.IssueID)
+ }
+ if opts.ReviewerID != 0 {
+ sess = sess.Where("reviewer_id=?", opts.ReviewerID)
+ }
+ if !opts.Dismissed.IsNone() {
+ sess = sess.Where("dismissed=?", opts.Dismissed.IsTrue())
+ }
+
+ reviews := make([]*Review, 0, 4)
+ return reviews, sess.Find(&reviews)
+}
+
// GetReviewersByIssueID gets the latest review of each reviewer for a pull request
func GetReviewersByIssueID(issueID int64) ([]*Review, error) {
reviews := make([]*Review, 0, 10)
diff --git a/modules/structs/pull_review.go b/modules/structs/pull_review.go
index 6544604acbaed..7c9360a0c2200 100644
--- a/modules/structs/pull_review.go
+++ b/modules/structs/pull_review.go
@@ -97,6 +97,7 @@ type SubmitPullReviewOptions struct {
// DismissPullReviewOptions are options to dismiss a pull review
type DismissPullReviewOptions struct {
Message string `json:"message"`
+ Priors bool `json:"priors"`
}
// PullReviewRequestOptions are options to add or remove pull review requests
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 917c14bb9c3e4..1842b5c18c1ca 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -1300,6 +1300,7 @@ issues.previous=Vorherige
issues.next=Nächste
issues.open_title=Offen
issues.closed_title=Geschlossen
+issues.draft_title=Entwurf
issues.num_comments=%d Kommentare
issues.commented_at=`hat %s kommentiert`
issues.delete_comment_confirm=Bist du sicher dass du diesen Kommentar löschen möchtest?
@@ -1606,6 +1607,8 @@ pulls.auto_merge_canceled_schedule=Der Automerge dieses Pull-Requests wurde abge
pulls.auto_merge_newly_scheduled_comment=`hat einen Automerge für diesen Pull-Request %[1]s geplant`
pulls.auto_merge_canceled_schedule_comment=`hat den Automerge für diesen Pull-Request %[1]s abgebrochen`
+pulls.delete.title=Diesen Pull-Request löschen?
+pulls.delete.text=Willst du diesen Pull-Request wirklich löschen? (Dies wird den Inhalt unwiderruflich löschen. Überlege, ob du ihn nicht lieber schließen willst, um ihn zu archivieren)
milestones.new=Neuer Meilenstein
milestones.closed=Geschlossen %s
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index 65b3d736a8d4a..19bed8d21be45 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -861,7 +861,9 @@ default_branch=Προεπιλεγμένος Κλάδος
default_branch_helper=Ο προεπιλεγμένος κλάδος είναι ο βασικός κλάδος για pull requests και υποβολές κώδικα.
mirror_prune=Καθαρισμός
mirror_prune_desc=Αφαίρεση παρωχημένων αναφορών απομακρυσμένης-παρακολούθησης
+mirror_interval=Διάστημα ανανέωσης ειδώλου (έγκυρες μονάδες ώρας είναι 'h', 'm', 's'). 0 για απενεργοποίηση του αυτόματου συγχρονισμού. (Ελάχιστο διάστημα: %s)
mirror_interval_invalid=Το χρονικό διάστημα του ειδώλου δεν είναι έγκυρο.
+mirror_sync_on_commit=Συγχρονισμός κατά την ώθηση
mirror_address=Κλωνοποίηση Από Το URL
mirror_address_desc=Τοποθετήστε όλα τα απαιτούμενα διαπιστευτήρια στην ενότητα Εξουσιοδότηση.
mirror_address_url_invalid=Η διεύθυνση url που δώσατε δεν είναι έγκυρη. Πρέπει να μεταφράσετε όλα τα στοιχεία του url σωστά.
@@ -930,6 +932,7 @@ form.name_pattern_not_allowed=Το μοτίβο '%s' δεν επιτρέπετα
need_auth=Εξουσιοδότηση
migrate_options=Επιλογές Μεταφοράς
migrate_service=Υπηρεσία Μεταφοράς
+migrate_options_mirror_helper=Αυτό το αποθετήριο θα είναι είδωλο
migrate_options_lfs=Μεταφορά αρχείων LFS
migrate_options_lfs_endpoint.label=LFS Endpoint
migrate_options_lfs_endpoint.description=Η μεταφορά θα προσπαθήσει να χρησιμοποιήσει το Git remote για να καθορίσει τον διακομιστή LFS. Μπορείτε επίσης να καθορίσετε ένα δικό σας endpoint αν τα δεδομένα LFS του αποθετηρίου αποθηκεύονται κάπου αλλού.
@@ -1300,6 +1303,7 @@ issues.previous=Προηγούμενο
issues.next=Επόμενο
issues.open_title=Ανοιχτό
issues.closed_title=Κλειστό
+issues.draft_title=Προσχέδιο
issues.num_comments=%d σχόλια
issues.commented_at=`σχολίασε %s`
issues.delete_comment_confirm=Θέλετε σίγουρα να διαγράψετε αυτό το σχόλιο;
@@ -1528,6 +1532,8 @@ pulls.remove_prefix=Αφαίρεση %s προθέματος
pulls.data_broken=Αυτό το pull request είναι κατεστραμμένο λόγω των πληροφοριών του fork που λείπουν.
pulls.files_conflicted=Αυτό το pull request περιέχει αλλαγές που συγκρούονται με το κλάδο προορισμού.
pulls.is_checking=Ο έλεγχος συγκρούσεων κατά την συγχώνευση είναι σε εξέλιξη. Δοκιμάστε ξανά σε λίγα λεπτά.
+pulls.is_ancestor=Αυτός ο κλάδος περιλαμβάνεται ήδη στον κλάδο προορισμού. Δεν υπάρχει τίποτα για συγχώνευση.
+pulls.is_empty=Οι αλλαγές σε αυτόν τον κλάδο είναι ήδη στον κλάδο προορισμού. Θα είναι μια κενή υποβολή.
pulls.required_status_check_failed=Ορισμένοι απαιτούμενοι έλεγχοι δεν ήταν επιτυχείς.
pulls.required_status_check_missing=Λείπουν ορισμένοι απαιτούμενοι έλεγχοι.
pulls.required_status_check_administrator=Ως διαχειριστής, μπορείτε ακόμα να συγχωνεύσετε αυτό το pull request.
@@ -2534,6 +2540,8 @@ users.delete_account=Διαγραφή Λογαριασμού Χρήστη
users.cannot_delete_self=Δεν μπορείτε να διαγράψετε τον εαυτό σας
users.still_own_repo=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα αποθετήρια. Διαγράψτε ή μεταφέρετε αυτά τα αποθετήρια πρώτα.
users.still_has_org=Αυτός ο χρήστης είναι μέλος ενός οργανισμού. Αφαιρέστε πρώτα τον χρήστη από οποιονδήποτε οργανισμό.
+users.purge=Εκκαθάριση Χρήστη
+users.purge_help=Αναγκαστική διαγραφή χρήστη και των αποθετηρίων, οργανισμών και πακέτων που του ανήκουν. Όλα τα σχόλια επίσης θα διαγραφούν.
users.still_own_packages=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα πακέτα. Διαγράψτε πρώτα αυτά τα πακέτα.
users.deletion_success=Ο λογαριασμός χρήστη έχει διαγραφεί.
users.reset_2fa=Επαναφορά 2FA
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 167d2cc1f20c6..566a7bd167671 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1420,7 +1420,7 @@ issues.due_date_form_remove = "Remove"
issues.due_date_not_writer = "You need repository write access to update an issue's due date."
issues.due_date_not_set = "No due date set."
issues.due_date_added = "added the due date %s %s"
-issues.due_date_modified = "modified the due date to %s from %s %s"
+issues.due_date_modified = "modified the due date from %[2]s to %[1]s %[3]s"
issues.due_date_remove = "removed the due date %s %s"
issues.due_date_overdue = "Overdue"
issues.due_date_invalid = "The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'."
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index e760b6b7737ce..416f6add02935 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -1532,6 +1532,8 @@ pulls.remove_prefix=先頭の %s を除去
pulls.data_broken=このプルリクエストは、フォークの情報が見つからないため壊れています。
pulls.files_conflicted=このプルリクエストは、ターゲットブランチと競合する変更を含んでいます。
pulls.is_checking=マージのコンフリクトを確認中です。 少し待ってからもう一度実行してください。
+pulls.is_ancestor=このブランチは既にターゲットブランチに含まれています。マージするものはありません。
+pulls.is_empty=このブランチの変更は既にターゲットブランチにあります。これは空のコミットになります。
pulls.required_status_check_failed=いくつかの必要なステータスチェックが成功していません。
pulls.required_status_check_missing=必要なステータスチェックが見つかりません。
pulls.required_status_check_administrator=管理者であるため、このプルリクエストをマージすることは可能です。
@@ -2538,6 +2540,8 @@ users.delete_account=ユーザーアカウントを削除
users.cannot_delete_self=自分自身を削除することはできません
users.still_own_repo=このユーザーはまだ1つ以上のリポジトリを所有しています。 先にそれらのリポジトリを削除するか移転してください。
users.still_has_org=このユーザーは組織のメンバーになっています。 先に組織からこのユーザーを削除してください。
+users.purge=ユーザーを抹消
+users.purge_help=強制的にユーザーとそのユーザーが所有していたリポジトリ、組織、パッケージを削除します。コメントもすべて削除します。
users.still_own_packages=このユーザーはまだ1つ以上のパッケージを所有しています。最初にそれらのパッケージを削除してください。
users.deletion_success=ユーザーアカウントを削除しました。
users.reset_2fa=2要素認証をリセット
diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go
index 1b61a40222d69..f36d0586ab6b9 100644
--- a/routers/api/v1/repo/pull_review.go
+++ b/routers/api/v1/repo/pull_review.go
@@ -823,7 +823,7 @@ func DismissPullReview(ctx *context.APIContext) {
// "422":
// "$ref": "#/responses/validationError"
opts := web.GetForm(ctx).(*api.DismissPullReviewOptions)
- dismissReview(ctx, opts.Message, true)
+ dismissReview(ctx, opts.Message, true, opts.Priors)
}
// UnDismissPullReview cancel to dismiss a review for a pull request
@@ -863,10 +863,10 @@ func UnDismissPullReview(ctx *context.APIContext) {
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"
- dismissReview(ctx, "", false)
+ dismissReview(ctx, "", false, false)
}
-func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) {
+func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors bool) {
if !ctx.Repo.IsAdmin() {
ctx.Error(http.StatusForbidden, "", "Must be repo admin")
return
@@ -886,7 +886,7 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) {
return
}
- _, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss)
+ _, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss, dismissPriors)
if err != nil {
ctx.Error(http.StatusInternalServerError, "pull_service.DismissReview", err)
return
diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go
index 5a9f7a8138909..bc64f35472ea4 100644
--- a/routers/web/repo/pull_review.go
+++ b/routers/web/repo/pull_review.go
@@ -242,7 +242,7 @@ func SubmitReview(ctx *context.Context) {
// DismissReview dismissing stale review by repo admin
func DismissReview(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.DismissReviewForm)
- comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true)
+ comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true, true)
if err != nil {
ctx.ServerError("pull_service.DismissReview", err)
return
diff --git a/services/pull/review.go b/services/pull/review.go
index 22e0ae9853955..8d8903c6a9521 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -20,6 +20,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/util"
)
// CreateCodeComment creates a comment on the code line
@@ -271,7 +272,7 @@ func SubmitReview(ctx context.Context, doer *user_model.User, gitRepo *git.Repos
}
// DismissReview dismissing stale review by repo admin
-func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss bool) (comment *issues_model.Comment, err error) {
+func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss, dismissPriors bool) (comment *issues_model.Comment, err error) {
review, err := issues_model.GetReviewByID(ctx, reviewID)
if err != nil {
return
@@ -295,6 +296,22 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string,
return
}
+ if dismissPriors {
+ reviews, err := issues_model.GetReviews(ctx, &issues_model.GetReviewOptions{
+ IssueID: review.IssueID,
+ ReviewerID: review.ReviewerID,
+ Dismissed: util.OptionalBoolFalse,
+ })
+ if err != nil {
+ return nil, err
+ }
+ for _, oldReview := range reviews {
+ if err = issues_model.DismissReview(oldReview, true); err != nil {
+ return nil, err
+ }
+ }
+ }
+
if !isDismiss {
return nil, nil
}
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index 319ee33fae1f4..852c87f2f3f66 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -340,7 +340,8 @@
{{.Poster.GetDisplayName}}
- {{$.locale.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}}
+ {{$parsedDeadline := .Content | ParseDeadline}}
+ {{$.locale.Tr "repo.issues.due_date_modified" (index $parsedDeadline 0) (index $parsedDeadline 1) $createdStr | Safe}}
{{else if eq .Type 18}}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index a3bb904845652..ff0b4c6468aea 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -14864,6 +14864,10 @@
"message": {
"type": "string",
"x-go-name": "Message"
+ },
+ "priors": {
+ "type": "boolean",
+ "x-go-name": "Priors"
}
},
"x-go-package": "code.gitea.io/gitea/modules/structs"