diff options
author | Amine Hilaly <hilalyamine@gmail.com> | 2019-08-13 19:51:14 +0200 |
---|---|---|
committer | Amine Hilaly <hilalyamine@gmail.com> | 2019-08-18 00:14:22 +0200 |
commit | 5ca326af83b90531d4d0c502bb1beabbe1b48c55 (patch) | |
tree | 6b7a32f2db9ab7321e9965c0ef4c715c6c517178 /commands | |
parent | 6428352bd14828f670206b60862de7f71c52d235 (diff) | |
download | git-bug-5ca326af83b90531d4d0c502bb1beabbe1b48c55.tar.gz |
bridge/core: add context.Context to ImportAll and ExportAll signatures
bridge/core: add ImportResult objects to stream import events
bridge/core: launchpad support asynchronous import
bridge/github: cancellable export and import functions
bridge/gitlab: cancellable export and import functions
commands: bridge pull/push gracefull kill
bridge/github: fix github import
bridge/github: use simple context for imports
bridge/core: name parameters in interfaces
github/core: Add EventError to export and import events types
bridge/gitlab: add context support in gitlab requests functions
bridge/gitlab: remove imported events count from importer logic
bridge/github: remove imported events count from importer logic
bridge/github: add context support in query and muration requets
bridge/github: fix bug duplicate editions after multiple calls
bridge/core: import import and export events String methods
bridge/gitlab: fix error handling in note import events
commands/bridge: Add statistics about imports and exports
bridge/gitlab: properly handle context cancellation
bridge/github: improve error handling
bridge: break iterators on context cancel or timeout
bridge: add context timeout support
bridge: improve event formating and error handling
commands: handle interrupt and switch cases
bridge/github: add export mutation timeouts
bridge: fix race condition bug in the github and gitlab importers
bridge/github: improve context error handling
Diffstat (limited to 'commands')
-rw-r--r-- | commands/bridge_pull.go | 53 | ||||
-rw-r--r-- | commands/bridge_push.go | 50 |
2 files changed, 96 insertions, 7 deletions
diff --git a/commands/bridge_pull.go b/commands/bridge_pull.go index 2edabfaf..0f3b8413 100644 --- a/commands/bridge_pull.go +++ b/commands/bridge_pull.go @@ -1,6 +1,10 @@ package commands import ( + "context" + "fmt" + "os" + "sync" "time" "github.com/spf13/cobra" @@ -31,12 +35,59 @@ func runBridgePull(cmd *cobra.Command, args []string) error { return err } + parentCtx := context.Background() + ctx, cancel := context.WithCancel(parentCtx) + defer cancel() + + // buffered channel to avoid send block at the end + done := make(chan struct{}, 1) + + var mu sync.Mutex + interruptCount := 0 + interrupt.RegisterCleaner(func() error { + mu.Lock() + if interruptCount > 0 { + fmt.Println("Received another interrupt before graceful stop, terminating...") + os.Exit(0) + } + + interruptCount++ + mu.Unlock() + + fmt.Println("Received interrupt signal, stopping the import...\n(Hit ctrl-c again to kill the process.)") + + // send signal to stop the importer + cancel() + + // block until importer gracefully shutdown + <-done + return nil + }) + // TODO: by default import only new events - err = b.ImportAll(time.Time{}) + events, err := b.ImportAll(ctx, time.Time{}) if err != nil { return err } + importedIssues := 0 + importedIdentities := 0 + for result := range events { + fmt.Println(result.String()) + + switch result.Event { + case core.ImportEventBug: + importedIssues++ + case core.ImportEventIdentity: + importedIdentities++ + } + } + + // send done signal + close(done) + + fmt.Printf("Successfully imported %d issues and %d identities with %s bridge\n", importedIssues, importedIdentities, b.Name) + return nil } diff --git a/commands/bridge_push.go b/commands/bridge_push.go index 11f5ca82..77fe8b29 100644 --- a/commands/bridge_push.go +++ b/commands/bridge_push.go @@ -1,7 +1,10 @@ package commands import ( + "context" "fmt" + "os" + "sync" "time" "github.com/spf13/cobra" @@ -32,20 +35,55 @@ func runBridgePush(cmd *cobra.Command, args []string) error { return err } + parentCtx := context.Background() + ctx, cancel := context.WithCancel(parentCtx) + defer cancel() + + done := make(chan struct{}, 1) + + var mu sync.Mutex + interruptCount := 0 + interrupt.RegisterCleaner(func() error { + mu.Lock() + if interruptCount > 0 { + fmt.Println("Received another interrupt before graceful stop, terminating...") + os.Exit(0) + } + + interruptCount++ + mu.Unlock() + + fmt.Println("Received interrupt signal, stopping the import...\n(Hit ctrl-c again to kill the process.)") + + // send signal to stop the importer + cancel() + + // block until importer gracefully shutdown + <-done + return nil + }) + // TODO: by default export only new events - out, err := b.ExportAll(time.Time{}) + events, err := b.ExportAll(ctx, time.Time{}) if err != nil { return err } - for result := range out { - if result.Err != nil { - fmt.Println(result.Err, result.Reason) - } else { - fmt.Printf("%s: %s\n", result.String(), result.ID) + exportedIssues := 0 + for result := range events { + fmt.Println(result.String()) + + switch result.Event { + case core.ExportEventBug: + exportedIssues++ } } + // send done signal + close(done) + + fmt.Printf("Successfully exported %d issues with %s bridge\n", exportedIssues, b.Name) + return nil } |