mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Implement "conversation lock" for issue comments (#5073)
This commit is contained in:
		@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/routers/utils"
 | 
			
		||||
 | 
			
		||||
	"github.com/Unknwon/com"
 | 
			
		||||
@@ -308,6 +309,32 @@ func (f *ReactionForm) Validate(ctx *macaron.Context, errs binding.Errors) bindi
 | 
			
		||||
	return validate(errs, ctx.Data, f, ctx.Locale)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IssueLockForm form for locking an issue
 | 
			
		||||
type IssueLockForm struct {
 | 
			
		||||
	Reason string `binding:"Required"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Validate validates the fields
 | 
			
		||||
func (i *IssueLockForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
 | 
			
		||||
	return validate(errs, ctx.Data, i, ctx.Locale)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasValidReason checks to make sure that the reason submitted in
 | 
			
		||||
// the form matches any of the values in the config
 | 
			
		||||
func (i IssueLockForm) HasValidReason() bool {
 | 
			
		||||
	if strings.TrimSpace(i.Reason) == "" {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, v := range setting.Repository.Issue.LockReasons {
 | 
			
		||||
		if v == i.Reason {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//    _____  .__.__                   __
 | 
			
		||||
//   /     \ |__|  |   ____   _______/  |_  ____   ____   ____
 | 
			
		||||
//  /  \ /  \|  |  | _/ __ \ /  ___/\   __\/  _ \ /    \_/ __ \
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ package auth
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -39,3 +40,27 @@ func TestSubmitReviewForm_IsEmpty(t *testing.T) {
 | 
			
		||||
		assert.Equal(t, v.expected, v.form.HasEmptyContent())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestIssueLock_HasValidReason(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// Init settings
 | 
			
		||||
	_ = setting.Repository
 | 
			
		||||
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		form     IssueLockForm
 | 
			
		||||
		expected bool
 | 
			
		||||
	}{
 | 
			
		||||
		{IssueLockForm{""}, true}, // an empty reason is accepted
 | 
			
		||||
		{IssueLockForm{"Off-topic"}, true},
 | 
			
		||||
		{IssueLockForm{"Too heated"}, true},
 | 
			
		||||
		{IssueLockForm{"Spam"}, true},
 | 
			
		||||
		{IssueLockForm{"Resolved"}, true},
 | 
			
		||||
 | 
			
		||||
		{IssueLockForm{"ZZZZ"}, false},
 | 
			
		||||
		{IssueLockForm{"I want to lock this issue"}, false},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, v := range cases {
 | 
			
		||||
		assert.Equal(t, v.expected, v.form.HasValidReason())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -227,6 +227,11 @@ var (
 | 
			
		||||
		PullRequest struct {
 | 
			
		||||
			WorkInProgressPrefixes []string
 | 
			
		||||
		} `ini:"repository.pull-request"`
 | 
			
		||||
 | 
			
		||||
		// Issue Setting
 | 
			
		||||
		Issue struct {
 | 
			
		||||
			LockReasons []string
 | 
			
		||||
		} `ini:"repository.issue"`
 | 
			
		||||
	}{
 | 
			
		||||
		AnsiCharset:                             "",
 | 
			
		||||
		ForcePrivate:                            false,
 | 
			
		||||
@@ -279,6 +284,13 @@ var (
 | 
			
		||||
		}{
 | 
			
		||||
			WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// Issue settings
 | 
			
		||||
		Issue: struct {
 | 
			
		||||
			LockReasons []string
 | 
			
		||||
		}{
 | 
			
		||||
			LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	RepoRootPath string
 | 
			
		||||
	ScriptType   = "bash"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user