mirror of https://github.com/go-gitea/gitea.git
Support updating labels
This commit is contained in:
parent
698d6be490
commit
fb82294fc6
|
@ -237,15 +237,33 @@ func NewLabels(labels ...*Label) error {
|
|||
|
||||
// UpdateLabel updates label information.
|
||||
func UpdateLabel(l *Label) error {
|
||||
return updateLabel(db.DefaultContext, l)
|
||||
}
|
||||
|
||||
func updateLabel(ctx context.Context, l *Label) error {
|
||||
if !LabelColorPattern.MatchString(l.Color) {
|
||||
return fmt.Errorf("bad color code: %s", l.Color)
|
||||
}
|
||||
return updateLabelCols(db.DefaultContext, l, "name", "description", "color")
|
||||
return updateLabelCols(ctx, l, "name", "description", "color")
|
||||
}
|
||||
|
||||
// DeleteLabel delete a label
|
||||
func DeleteLabel(id, labelID int64) error {
|
||||
label, err := GetLabelByID(db.DefaultContext, labelID)
|
||||
ctx, committer, err := db.TxContext()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer committer.Close()
|
||||
|
||||
if err = deleteLabel(ctx, id, labelID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return committer.Commit()
|
||||
}
|
||||
|
||||
func deleteLabel(ctx context.Context, id, labelID int64) error {
|
||||
label, err := GetLabelByID(ctx, labelID)
|
||||
if err != nil {
|
||||
if IsErrLabelNotExist(err) {
|
||||
return nil
|
||||
|
@ -253,12 +271,6 @@ func DeleteLabel(id, labelID int64) error {
|
|||
return err
|
||||
}
|
||||
|
||||
ctx, committer, err := db.TxContext()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer committer.Close()
|
||||
|
||||
sess := db.GetEngine(ctx)
|
||||
|
||||
if label.BelongsToOrg() && label.OrgID != id {
|
||||
|
@ -281,7 +293,7 @@ func DeleteLabel(id, labelID int64) error {
|
|||
return err
|
||||
}
|
||||
|
||||
return committer.Commit()
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetLabelByID returns a label by given ID.
|
||||
|
@ -416,6 +428,72 @@ func GetLabelsByRepoID(ctx context.Context, repoID int64, sortType string, listO
|
|||
return labels, sess.Find(&labels)
|
||||
}
|
||||
|
||||
// UpdateLabels adds, updates, and deletes relevant labels for the given repository.
|
||||
func UpdateLabelsByRepoID(repoID int64, labels ...*Label) error {
|
||||
ctx, committer, err := db.TxContext()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer committer.Close()
|
||||
|
||||
existingLabels, err := GetLabelsByRepoID(ctx, repoID, "", db.ListOptions{})
|
||||
labelsToAdd := make([]*Label, 0)
|
||||
labelsToUpdate := make([]*Label, 0)
|
||||
labelsToDelete := make([]*Label, 0)
|
||||
|
||||
for _, label := range labels {
|
||||
if !LabelColorPattern.MatchString(label.Color) {
|
||||
return fmt.Errorf("bad color code: %s", label.Color)
|
||||
}
|
||||
|
||||
found := false
|
||||
for _, existingLabel := range existingLabels {
|
||||
if existingLabel.ID == label.ID {
|
||||
found = true
|
||||
if existingLabel.Name != label.Name || existingLabel.Description != label.Description ||
|
||||
existingLabel.Color != label.Color {
|
||||
labelsToUpdate = append(labelsToUpdate, label)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
labelsToAdd = append(labelsToAdd, label)
|
||||
}
|
||||
}
|
||||
|
||||
for _, existingLabel := range existingLabels {
|
||||
found := false
|
||||
for _, label := range labels {
|
||||
if label.ID == existingLabel.ID {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
labelsToDelete = append(labelsToDelete, existingLabel)
|
||||
}
|
||||
}
|
||||
|
||||
for _, label := range labelsToAdd {
|
||||
if err = NewLabel(ctx, label); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, label := range labelsToUpdate {
|
||||
if err = updateLabel(ctx, label); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, label := range labelsToDelete {
|
||||
if err = deleteLabel(ctx, repoID, label.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// CountLabelsByRepoID count number of all labels that belong to given repository by ID.
|
||||
func CountLabelsByRepoID(repoID int64) (int64, error) {
|
||||
return db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID).Count(&Label{})
|
||||
|
@ -718,7 +796,7 @@ func DeleteIssueLabel(ctx context.Context, issue *Issue, label *Label, doer *use
|
|||
return issue.LoadLabels(ctx)
|
||||
}
|
||||
|
||||
// DeleteLabelsByRepoID deletes labels of some repository
|
||||
// DeleteLabelsByRepoID deletes labels of some repository
|
||||
func DeleteLabelsByRepoID(ctx context.Context, repoID int64) error {
|
||||
deleteCond := builder.Select("id").From("label").Where(builder.Eq{"label.repo_id": repoID})
|
||||
|
||||
|
|
|
@ -222,18 +222,8 @@ func (g *GiteaLocalUploader) CreateMilestones(milestones ...*base.Milestone) err
|
|||
|
||||
// CreateLabels creates labels
|
||||
func (g *GiteaLocalUploader) CreateLabels(labels ...*base.Label) error {
|
||||
lbs := make([]*issues_model.Label, 0, len(labels))
|
||||
for _, label := range labels {
|
||||
lbs = append(lbs, &issues_model.Label{
|
||||
RepoID: g.repo.ID,
|
||||
Name: label.Name,
|
||||
Description: label.Description,
|
||||
Color: fmt.Sprintf("#%s", label.Color),
|
||||
})
|
||||
}
|
||||
|
||||
err := issues_model.NewLabels(lbs...)
|
||||
if err != nil {
|
||||
lbs := convertLabels(g.repo.ID, labels...)
|
||||
if err := issues_model.NewLabels(lbs...); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, lb := range lbs {
|
||||
|
@ -242,6 +232,19 @@ func (g *GiteaLocalUploader) CreateLabels(labels ...*base.Label) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func convertLabels(repoID int64, labels ...*base.Label) []*issues_model.Label {
|
||||
lbs := make([]*issues_model.Label, 0, len(labels))
|
||||
for _, label := range labels {
|
||||
lbs = append(lbs, &issues_model.Label{
|
||||
RepoID: repoID,
|
||||
Name: label.Name,
|
||||
Description: label.Description,
|
||||
Color: fmt.Sprintf("#%s", label.Color),
|
||||
})
|
||||
}
|
||||
return lbs
|
||||
}
|
||||
|
||||
// CreateReleases creates releases
|
||||
func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
|
||||
rels := make([]*models.Release, 0, len(releases))
|
||||
|
@ -822,6 +825,13 @@ func (g *GiteaLocalUploader) UpdateReleases(releases ...*base.Release) error {
|
|||
}
|
||||
|
||||
func (g *GiteaLocalUploader) UpdateLabels(labels ...*base.Label) error {
|
||||
lbs := convertLabels(g.repo.ID, labels...)
|
||||
if err := issues_model.UpdateLabelsByRepoID(g.repo.ID, lbs...); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, lb := range lbs {
|
||||
g.labels[lb.Name] = lb
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue