[API] Fix inconsistent label color format (#10129)
* update and use labelColorPattern * add TestCases * fix lint * # optional for templates * fix typo * some more * fix lint of **master**
This commit is contained in:
parent
74a4a1e17f
commit
e273817154
9 changed files with 170 additions and 54 deletions
|
@ -18,47 +18,8 @@ import (
|
|||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
var labelColorPattern = regexp.MustCompile("#([a-fA-F0-9]{6})")
|
||||
|
||||
// GetLabelTemplateFile loads the label template file by given name,
|
||||
// then parses and returns a list of name-color pairs and optionally description.
|
||||
func GetLabelTemplateFile(name string) ([][3]string, error) {
|
||||
data, err := GetRepoInitFile("label", name)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetRepoInitFile: %v", err)
|
||||
}
|
||||
|
||||
lines := strings.Split(string(data), "\n")
|
||||
list := make([][3]string, 0, len(lines))
|
||||
for i := 0; i < len(lines); i++ {
|
||||
line := strings.TrimSpace(lines[i])
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
parts := strings.SplitN(line, ";", 2)
|
||||
|
||||
fields := strings.SplitN(parts[0], " ", 2)
|
||||
if len(fields) != 2 {
|
||||
return nil, fmt.Errorf("line is malformed: %s", line)
|
||||
}
|
||||
|
||||
if !labelColorPattern.MatchString(fields[0]) {
|
||||
return nil, fmt.Errorf("bad HTML color code in line: %s", line)
|
||||
}
|
||||
|
||||
var description string
|
||||
|
||||
if len(parts) > 1 {
|
||||
description = strings.TrimSpace(parts[1])
|
||||
}
|
||||
|
||||
fields[1] = strings.TrimSpace(fields[1])
|
||||
list = append(list, [3]string{fields[1], fields[0], description})
|
||||
}
|
||||
|
||||
return list, nil
|
||||
}
|
||||
// LabelColorPattern is a regexp witch can validate LabelColor
|
||||
var LabelColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$")
|
||||
|
||||
// Label represents a label of repository for issues.
|
||||
type Label struct {
|
||||
|
@ -86,6 +47,50 @@ func (label *Label) APIFormat() *api.Label {
|
|||
}
|
||||
}
|
||||
|
||||
// GetLabelTemplateFile loads the label template file by given name,
|
||||
// then parses and returns a list of name-color pairs and optionally description.
|
||||
func GetLabelTemplateFile(name string) ([][3]string, error) {
|
||||
data, err := GetRepoInitFile("label", name)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetRepoInitFile: %v", err)
|
||||
}
|
||||
|
||||
lines := strings.Split(string(data), "\n")
|
||||
list := make([][3]string, 0, len(lines))
|
||||
for i := 0; i < len(lines); i++ {
|
||||
line := strings.TrimSpace(lines[i])
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
parts := strings.SplitN(line, ";", 2)
|
||||
|
||||
fields := strings.SplitN(parts[0], " ", 2)
|
||||
if len(fields) != 2 {
|
||||
return nil, fmt.Errorf("line is malformed: %s", line)
|
||||
}
|
||||
|
||||
color := strings.Trim(fields[0], " ")
|
||||
if len(color) == 6 {
|
||||
color = "#" + color
|
||||
}
|
||||
if !LabelColorPattern.MatchString(color) {
|
||||
return nil, fmt.Errorf("bad HTML color code in line: %s", line)
|
||||
}
|
||||
|
||||
var description string
|
||||
|
||||
if len(parts) > 1 {
|
||||
description = strings.TrimSpace(parts[1])
|
||||
}
|
||||
|
||||
fields[1] = strings.TrimSpace(fields[1])
|
||||
list = append(list, [3]string{fields[1], color, description})
|
||||
}
|
||||
|
||||
return list, nil
|
||||
}
|
||||
|
||||
// CalOpenIssues calculates the open issues of label.
|
||||
func (label *Label) CalOpenIssues() {
|
||||
label.NumOpenIssues = label.NumIssues - label.NumClosedIssues
|
||||
|
@ -152,7 +157,7 @@ func LoadLabelsFormatted(labelTemplate string) (string, error) {
|
|||
return strings.Join(labels, ", "), err
|
||||
}
|
||||
|
||||
func initalizeLabels(e Engine, repoID int64, labelTemplate string) error {
|
||||
func initializeLabels(e Engine, repoID int64, labelTemplate string) error {
|
||||
list, err := GetLabelTemplateFile(labelTemplate)
|
||||
if err != nil {
|
||||
return ErrIssueLabelTemplateLoad{labelTemplate, err}
|
||||
|
@ -175,9 +180,9 @@ func initalizeLabels(e Engine, repoID int64, labelTemplate string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// InitalizeLabels adds a label set to a repository using a template
|
||||
func InitalizeLabels(ctx DBContext, repoID int64, labelTemplate string) error {
|
||||
return initalizeLabels(ctx.e, repoID, labelTemplate)
|
||||
// InitializeLabels adds a label set to a repository using a template
|
||||
func InitializeLabels(ctx DBContext, repoID int64, labelTemplate string) error {
|
||||
return initializeLabels(ctx.e, repoID, labelTemplate)
|
||||
}
|
||||
|
||||
func newLabel(e Engine, label *Label) error {
|
||||
|
@ -187,6 +192,9 @@ func newLabel(e Engine, label *Label) error {
|
|||
|
||||
// NewLabel creates a new label for a repository
|
||||
func NewLabel(label *Label) error {
|
||||
if !LabelColorPattern.MatchString(label.Color) {
|
||||
return fmt.Errorf("bad color code: %s", label.Color)
|
||||
}
|
||||
return newLabel(x, label)
|
||||
}
|
||||
|
||||
|
@ -198,6 +206,9 @@ func NewLabels(labels ...*Label) error {
|
|||
return err
|
||||
}
|
||||
for _, label := range labels {
|
||||
if !LabelColorPattern.MatchString(label.Color) {
|
||||
return fmt.Errorf("bad color code: %s", label.Color)
|
||||
}
|
||||
if err := newLabel(sess, label); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -359,6 +370,9 @@ func updateLabel(e Engine, l *Label) error {
|
|||
|
||||
// UpdateLabel updates label information.
|
||||
func UpdateLabel(l *Label) error {
|
||||
if !LabelColorPattern.MatchString(l.Color) {
|
||||
return fmt.Errorf("bad color code: %s", l.Color)
|
||||
}
|
||||
return updateLabel(x, l)
|
||||
}
|
||||
|
||||
|
|
|
@ -45,8 +45,11 @@ func TestNewLabels(t *testing.T) {
|
|||
assert.NoError(t, PrepareTestDatabase())
|
||||
labels := []*Label{
|
||||
{RepoID: 2, Name: "labelName2", Color: "#123456"},
|
||||
{RepoID: 3, Name: "labelName3", Color: "#234567"},
|
||||
{RepoID: 3, Name: "labelName3", Color: "#23456F"},
|
||||
}
|
||||
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: "#12345G"}))
|
||||
for _, label := range labels {
|
||||
AssertNotExistsBean(t, label)
|
||||
}
|
||||
|
|
|
@ -1044,7 +1044,7 @@ func ChangeUserName(u *User, newUserName string) (err error) {
|
|||
} else if isExist {
|
||||
return ErrUserAlreadyExist{newUserName}
|
||||
}
|
||||
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue