[bridge/github] improve export label change function

Amine Hilaly created

[bridge/core] rename `EventStatus` to `ExportEvent`

Change summary

bridge/core/export.go   | 48 +++++++++++-----------
bridge/github/export.go | 91 ++++++++++++++++++++++++++----------------
2 files changed, 81 insertions(+), 58 deletions(-)

Detailed changes

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,
 	}
 }

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"))
 }