diff options
Diffstat (limited to 'bridge')
-rw-r--r-- | bridge/core/export.go | 48 | ||||
-rw-r--r-- | bridge/github/export.go | 91 |
2 files changed, 81 insertions, 58 deletions
diff --git a/bridge/core/export.go b/bridge/core/export.go index 51149430..080ced80 100644 --- a/bridge/core/export.go +++ b/bridge/core/export.go @@ -2,41 +2,41 @@ package core import "fmt" -type EventStatus int +type ExportEvent int const ( - _ EventStatus = iota - EventStatusBug - EventStatusComment - EventStatusCommentEdition - EventStatusStatusChange - EventStatusTitleEdition - EventStatusLabelChange - EventStatusNothing + _ ExportEvent = iota + ExportEventBug + ExportEventComment + ExportEventCommentEdition + ExportEventStatusChange + ExportEventTitleEdition + ExportEventLabelChange + ExportEventNothing ) type ExportResult struct { Err error - Event EventStatus + Event ExportEvent ID string Reason string } func (er ExportResult) String() string { switch er.Event { - case EventStatusBug: + case ExportEventBug: return "new issue" - case EventStatusComment: + case ExportEventComment: return "new comment" - case EventStatusCommentEdition: + case ExportEventCommentEdition: return "updated comment" - case EventStatusStatusChange: + case ExportEventStatusChange: return "changed status" - case EventStatusTitleEdition: + case ExportEventTitleEdition: return "changed title" - case EventStatusLabelChange: + case ExportEventLabelChange: return "changed label" - case EventStatusNothing: + case ExportEventNothing: return fmt.Sprintf("no event: %v", er.Reason) default: panic("unknown export result") @@ -54,48 +54,48 @@ func NewExportNothing(id string, reason string) ExportResult { return ExportResult{ ID: id, Reason: reason, - Event: EventStatusNothing, + Event: ExportEventNothing, } } func NewExportBug(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusBug, + Event: ExportEventBug, } } func NewExportComment(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusComment, + Event: ExportEventComment, } } func NewExportCommentEdition(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusCommentEdition, + Event: ExportEventCommentEdition, } } func NewExportStatusChange(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusStatusChange, + Event: ExportEventStatusChange, } } func NewExportLabelChange(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusLabelChange, + Event: ExportEventLabelChange, } } func NewExportTitleEdition(id string) ExportResult { return ExportResult{ ID: id, - Event: EventStatusTitleEdition, + Event: ExportEventTitleEdition, } } diff --git a/bridge/github/export.go b/bridge/github/export.go index 5e5b1a21..c4ca42da 100644 --- a/bridge/github/export.go +++ b/bridge/github/export.go @@ -7,6 +7,8 @@ import ( "fmt" "io/ioutil" "net/http" + "strings" + "sync" "time" "github.com/pkg/errors" @@ -671,7 +673,7 @@ func updateGithubIssueStatus(gc *githubv4.Client, id string, status bug.Status) case bug.OpenStatus: state = githubv4.IssueStateOpen case bug.ClosedStatus: - state = githubv4.IssueStateOpen + state = githubv4.IssueStateClosed default: panic("unknown bug state") } @@ -730,49 +732,70 @@ func updateGithubIssueTitle(gc *githubv4.Client, id, title string) error { // update github issue labels func (ge *githubExporter) updateGithubIssueLabels(gc *githubv4.Client, labelableID string, added, removed []bug.Label) error { - addedIDs, err := ge.getLabelsIDs(gc, labelableID, added) - if err != nil { - return errors.Wrap(err, "getting added labels ids") - } - - m := &addLabelsToLabelableMutation{} - inputAdd := githubv4.AddLabelsToLabelableInput{ - LabelableID: labelableID, - LabelIDs: addedIDs, - } + var errs []string + var wg sync.WaitGroup parentCtx := context.Background() - ctx, cancel := context.WithTimeout(parentCtx, defaultTimeout) - // add labels - if err := gc.Mutate(ctx, m, inputAdd, nil); err != nil { - cancel() - return err - } - cancel() + if len(added) > 0 { + wg.Add(1) + go func() { + defer wg.Done() - if len(removed) == 0 { - return nil - } + addedIDs, err := ge.getLabelsIDs(gc, labelableID, added) + if err != nil { + errs = append(errs, errors.Wrap(err, "getting added labels ids").Error()) + return + } - removedIDs, err := ge.getLabelsIDs(gc, labelableID, removed) - if err != nil { - return errors.Wrap(err, "getting added labels ids") + m := &addLabelsToLabelableMutation{} + inputAdd := githubv4.AddLabelsToLabelableInput{ + LabelableID: labelableID, + LabelIDs: addedIDs, + } + + ctx, cancel := context.WithTimeout(parentCtx, defaultTimeout) + defer cancel() + + // add labels + if err := gc.Mutate(ctx, m, inputAdd, nil); err != nil { + errs = append(errs, err.Error()) + } + }() } - m2 := &removeLabelsFromLabelableMutation{} - inputRemove := githubv4.RemoveLabelsFromLabelableInput{ - LabelableID: labelableID, - LabelIDs: removedIDs, + if len(removed) > 0 { + wg.Add(1) + go func() { + defer wg.Done() + + removedIDs, err := ge.getLabelsIDs(gc, labelableID, removed) + if err != nil { + errs = append(errs, errors.Wrap(err, "getting added labels ids").Error()) + return + } + + m2 := &removeLabelsFromLabelableMutation{} + inputRemove := githubv4.RemoveLabelsFromLabelableInput{ + LabelableID: labelableID, + LabelIDs: removedIDs, + } + + ctx, cancel := context.WithTimeout(parentCtx, defaultTimeout) + defer cancel() + + // remove label labels + if err := gc.Mutate(ctx, m2, inputRemove, nil); err != nil { + errs = append(errs, err.Error()) + } + }() } - ctx, cancel = context.WithTimeout(parentCtx, defaultTimeout) - defer cancel() + wg.Wait() - // remove label labels - if err := gc.Mutate(ctx, m2, inputRemove, nil); err != nil { - return err + if len(errs) == 0 { + return nil } - return nil + return fmt.Errorf("label change error: %v", strings.Join(errs, "\n")) } |