diff --git a/modules/label/label.go b/modules/label/label.go index ce028aa9f3b25..8e6f659fa782c 100644 --- a/modules/label/label.go +++ b/modules/label/label.go @@ -21,6 +21,19 @@ type Label struct { ExclusiveOrder int `yaml:"exclusive_order,omitempty"` } +type ErrInvalidLabelColor struct { + Color string +} + +func (e *ErrInvalidLabelColor) Error() string { + return fmt.Sprintf("invalid label color: %s", e.Color) +} + +func IsErrInvalidLabelColor(err error) bool { + _, ok := err.(*ErrInvalidLabelColor) + return ok +} + // NormalizeColor normalizes a color string to a 6-character hex code func NormalizeColor(color string) (string, error) { // normalize case @@ -32,7 +45,9 @@ func NormalizeColor(color string) (string, error) { } if !colorPattern.MatchString(color) { - return "", fmt.Errorf("bad color code: %s", color) + return "", &ErrInvalidLabelColor{ + Color: color, + } } // convert 3-character shorthand into 6-character version diff --git a/routers/web/org/org_labels.go b/routers/web/org/org_labels.go index 456ed3f01ed3b..a68b6cf9703dd 100644 --- a/routers/web/org/org_labels.go +++ b/routers/web/org/org_labels.go @@ -52,7 +52,12 @@ func NewLabel(ctx *context.Context) { ExclusiveOrder: form.ExclusiveOrder, } if err := issues_model.NewLabel(ctx, l); err != nil { - ctx.ServerError("NewLabel", err) + if label.IsErrInvalidLabelColor(err) { + ctx.Flash.Error(err.Error()) + ctx.Redirect(ctx.Org.OrgLink + "/settings/labels") + } else { + ctx.ServerError("NewLabel", err) + } return } ctx.Redirect(ctx.Org.OrgLink + "/settings/labels") @@ -79,7 +84,12 @@ func UpdateLabel(ctx *context.Context) { l.Color = form.Color l.SetArchived(form.IsArchived) if err := issues_model.UpdateLabel(ctx, l); err != nil { - ctx.ServerError("UpdateLabel", err) + if label.IsErrInvalidLabelColor(err) { + ctx.Flash.Error(err.Error()) + ctx.Redirect(ctx.Org.OrgLink + "/settings/labels") + } else { + ctx.ServerError("UpdateLabel", err) + } return } ctx.Redirect(ctx.Org.OrgLink + "/settings/labels") diff --git a/routers/web/repo/issue_label.go b/routers/web/repo/issue_label.go index f9c41adbcfd33..21c2d77c0a1b9 100644 --- a/routers/web/repo/issue_label.go +++ b/routers/web/repo/issue_label.go @@ -119,7 +119,12 @@ func NewLabel(ctx *context.Context) { Color: form.Color, } if err := issues_model.NewLabel(ctx, l); err != nil { - ctx.ServerError("NewLabel", err) + if label.IsErrInvalidLabelColor(err) { + ctx.Flash.Error(err.Error()) + ctx.Redirect(ctx.Repo.RepoLink + "/labels") + } else { + ctx.ServerError("NewLabel", err) + } return } ctx.Redirect(ctx.Repo.RepoLink + "/labels") @@ -146,7 +151,12 @@ func UpdateLabel(ctx *context.Context) { l.SetArchived(form.IsArchived) if err := issues_model.UpdateLabel(ctx, l); err != nil { - ctx.ServerError("UpdateLabel", err) + if label.IsErrInvalidLabelColor(err) { + ctx.Flash.Error(err.Error()) + ctx.Redirect(ctx.Repo.RepoLink + "/labels") + } else { + ctx.ServerError("UpdateLabel", err) + } return } ctx.Redirect(ctx.Repo.RepoLink + "/labels")