mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Be more lenient with label colors (#17752)
Accept 12-bit color specifications.
This commit is contained in:
		@@ -22,7 +22,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LabelColorPattern is a regexp witch can validate LabelColor
 | 
					// LabelColorPattern is a regexp witch can validate LabelColor
 | 
				
			||||||
var LabelColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$")
 | 
					var LabelColorPattern = regexp.MustCompile("^#?(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})$")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Label represents a label of repository for issues.
 | 
					// Label represents a label of repository for issues.
 | 
				
			||||||
type Label struct {
 | 
					type Label struct {
 | 
				
			||||||
@@ -258,6 +258,23 @@ func NewLabel(label *Label) error {
 | 
				
			|||||||
	if !LabelColorPattern.MatchString(label.Color) {
 | 
						if !LabelColorPattern.MatchString(label.Color) {
 | 
				
			||||||
		return fmt.Errorf("bad color code: %s", label.Color)
 | 
							return fmt.Errorf("bad color code: %s", label.Color)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// normalize case
 | 
				
			||||||
 | 
						label.Color = strings.ToLower(label.Color)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// add leading hash
 | 
				
			||||||
 | 
						if label.Color[0] != '#' {
 | 
				
			||||||
 | 
							label.Color = "#" + label.Color
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// convert 3-character shorthand into 6-character version
 | 
				
			||||||
 | 
						if len(label.Color) == 4 {
 | 
				
			||||||
 | 
							r := label.Color[1]
 | 
				
			||||||
 | 
							g := label.Color[2]
 | 
				
			||||||
 | 
							b := label.Color[3]
 | 
				
			||||||
 | 
							label.Color = fmt.Sprintf("#%c%c%c%c%c%c", r, r, g, g, b, b)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return newLabel(db.GetEngine(db.DefaultContext), label)
 | 
						return newLabel(db.GetEngine(db.DefaultContext), label)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,11 +38,15 @@ func TestNewLabels(t *testing.T) {
 | 
				
			|||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
	labels := []*Label{
 | 
						labels := []*Label{
 | 
				
			||||||
		{RepoID: 2, Name: "labelName2", Color: "#123456"},
 | 
							{RepoID: 2, Name: "labelName2", Color: "#123456"},
 | 
				
			||||||
		{RepoID: 3, Name: "labelName3", Color: "#23456F"},
 | 
							{RepoID: 3, Name: "labelName3", Color: "#123"},
 | 
				
			||||||
 | 
							{RepoID: 4, Name: "labelName4", Color: "ABCDEF"},
 | 
				
			||||||
 | 
							{RepoID: 5, Name: "labelName5", Color: "DEF"},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: ""}))
 | 
						assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: ""}))
 | 
				
			||||||
	assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "123456"}))
 | 
						assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#45G"}))
 | 
				
			||||||
	assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"}))
 | 
						assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"}))
 | 
				
			||||||
 | 
						assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "45G"}))
 | 
				
			||||||
 | 
						assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "12345G"}))
 | 
				
			||||||
	for _, label := range labels {
 | 
						for _, label := range labels {
 | 
				
			||||||
		unittest.AssertNotExistsBean(t, label)
 | 
							unittest.AssertNotExistsBean(t, label)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -549,7 +549,7 @@ type CreateLabelForm struct {
 | 
				
			|||||||
	ID          int64
 | 
						ID          int64
 | 
				
			||||||
	Title       string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_title"`
 | 
						Title       string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_title"`
 | 
				
			||||||
	Description string `binding:"MaxSize(200)" locale:"repo.issues.label_description"`
 | 
						Description string `binding:"MaxSize(200)" locale:"repo.issues.label_description"`
 | 
				
			||||||
	Color       string `binding:"Required;Size(7)" locale:"repo.issues.label_color"`
 | 
						Color       string `binding:"Required;MaxSize(7)" locale:"repo.issues.label_color"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the fields
 | 
					// Validate validates the fields
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user