aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoramine <hilalyamine@gmail.com>2019-10-25 16:42:48 +0200
committeramine <hilalyamine@gmail.com>2019-11-03 17:21:27 +0100
commit614bc5a2c53409a8e9c85ab31a104428069aa7b3 (patch)
treeed0b7ff3ede31828510492c3266c351741033cf2
parent16bd116971bb7abc7308e95c474b433512672432 (diff)
downloadgit-bug-614bc5a2c53409a8e9c85ab31a104428069aa7b3.tar.gz
commands: support bridge imports after a given date and resumable imports
-rw-r--r--bridge/core/bridge.go79
-rw-r--r--commands/bridge_pull.go34
-rw-r--r--commands/bridge_push.go17
-rw-r--r--doc/man/git-bug-bridge-pull.18
-rw-r--r--doc/md/git-bug_bridge_pull.md4
-rw-r--r--misc/bash_completion/git-bug7
-rw-r--r--misc/powershell_completion/git-bug4
-rw-r--r--misc/zsh_completion/git-bug4
8 files changed, 125 insertions, 32 deletions
diff --git a/bridge/core/bridge.go b/bridge/core/bridge.go
index 47a89389..0165994a 100644
--- a/bridge/core/bridge.go
+++ b/bridge/core/bridge.go
@@ -7,6 +7,7 @@ import (
"reflect"
"regexp"
"sort"
+ "strconv"
"strings"
"time"
@@ -291,7 +292,7 @@ func (b *Bridge) ensureInit() error {
return nil
}
-func (b *Bridge) ImportAll(ctx context.Context, since time.Time) (<-chan ImportResult, error) {
+func (b *Bridge) startImportSince(ctx context.Context, since time.Time) (<-chan ImportResult, error) {
importer := b.getImporter()
if importer == nil {
return nil, ErrImportNotSupported
@@ -307,24 +308,88 @@ func (b *Bridge) ImportAll(ctx context.Context, since time.Time) (<-chan ImportR
return nil, err
}
- return importer.ImportAll(ctx, b.repo, since)
+ events, err := importer.ImportAll(ctx, b.repo, since)
+ if err != nil {
+ return nil, err
+ }
+
+ return events, nil
+}
+
+func (b *Bridge) ImportAllSince(ctx context.Context, since time.Time) (<-chan ImportResult, error) {
+ if since.Equal(time.Time{}) {
+ lastImportTimeStr, err := b.repo.LocalConfig().ReadString(fmt.Sprintf("git-bug.bridge.%s.lastImportTime", b.Name))
+ if err == nil {
+ lastImportTime, err := strconv.Atoi(lastImportTimeStr)
+ if err != nil {
+ return nil, err
+ }
+ since = time.Unix(int64(lastImportTime), 0)
+ }
+ }
+
+ importStartTime := time.Now().Unix()
+
+ events, err := b.startImportSince(ctx, since)
+ if err != nil {
+ return nil, err
+ }
+
+ out := make(chan ImportResult)
+ go func() {
+ defer close(out)
+
+ for event := range events {
+ out <- event
+ }
+
+ // do not store last import time if context was cancelled
+ if ctx.Err() == nil {
+ err = b.repo.LocalConfig().StoreString(fmt.Sprintf("git-bug.bridge.%s.lastImportTime", b.Name), strconv.Itoa(int(importStartTime)))
+ }
+
+ }()
+
+ return out, nil
}
-func (b *Bridge) ExportAll(ctx context.Context, since time.Time) (<-chan ExportResult, error) {
+func (b *Bridge) ImportAll(ctx context.Context) (<-chan ImportResult, error) {
+ return b.startImportSince(ctx, time.Time{})
+}
+
+func (b *Bridge) ExportAll(ctx context.Context, since time.Time) error {
exporter := b.getExporter()
if exporter == nil {
- return nil, ErrExportNotSupported
+ return ErrExportNotSupported
}
err := b.ensureConfig()
if err != nil {
- return nil, err
+ return err
}
err = b.ensureInit()
if err != nil {
- return nil, err
+ return err
+ }
+
+ events, err := exporter.ExportAll(ctx, b.repo, since)
+ if err != nil {
+ return err
}
- return exporter.ExportAll(ctx, b.repo, since)
+ exportedIssues := 0
+ for result := range events {
+ if result.Event != ExportEventNothing {
+ fmt.Println(result.String())
+ }
+
+ switch result.Event {
+ case ExportEventBug:
+ exportedIssues++
+ }
+ }
+
+ fmt.Printf("exported %d issues with %s bridge\n", exportedIssues, b.Name)
+ return nil
}
diff --git a/commands/bridge_pull.go b/commands/bridge_pull.go
index 2bdd24c3..2ba11209 100644
--- a/commands/bridge_pull.go
+++ b/commands/bridge_pull.go
@@ -15,7 +15,16 @@ import (
"github.com/MichaelMure/git-bug/util/interrupt"
)
+var (
+ importSince int64
+ noResume bool
+)
+
func runBridgePull(cmd *cobra.Command, args []string) error {
+ if noResume && importSince != 0 {
+ return fmt.Errorf("only one of --no-resume and --since flags should be used")
+ }
+
backend, err := cache.NewRepoCache(repo)
if err != nil {
return err
@@ -64,10 +73,19 @@ func runBridgePull(cmd *cobra.Command, args []string) error {
return nil
})
- // TODO: by default import only new events
- events, err := b.ImportAll(ctx, time.Time{})
- if err != nil {
- return err
+ var events <-chan core.ImportResult
+ if noResume {
+ events, err = b.ImportAll(ctx)
+ } else {
+ var since time.Time
+ if importSince != 0 {
+ since = time.Unix(importSince, 0)
+ }
+
+ events, err = b.ImportAllSince(ctx, since)
+ if err != nil {
+ return err
+ }
}
importedIssues := 0
@@ -85,12 +103,12 @@ func runBridgePull(cmd *cobra.Command, args []string) error {
}
}
+ fmt.Printf("imported %d issues and %d identities with %s bridge\n", importedIssues, importedIdentities, b.Name)
+
// send done signal
close(done)
- fmt.Printf("Successfully imported %d issues and %d identities with %s bridge\n", importedIssues, importedIdentities, b.Name)
-
- return nil
+ return err
}
var bridgePullCmd = &cobra.Command{
@@ -103,4 +121,6 @@ var bridgePullCmd = &cobra.Command{
func init() {
bridgeCmd.AddCommand(bridgePullCmd)
+ bridgePullCmd.Flags().BoolVarP(&noResume, "no-resume", "n", false, "force importing all bugs")
+ bridgePullCmd.Flags().Int64VarP(&importSince, "since", "s", 0, "import only bugs updated after the given date (must be a unix timestamp)")
}
diff --git a/commands/bridge_push.go b/commands/bridge_push.go
index 00413f06..26f42dc4 100644
--- a/commands/bridge_push.go
+++ b/commands/bridge_push.go
@@ -63,28 +63,13 @@ func runBridgePush(cmd *cobra.Command, args []string) error {
return nil
})
- // TODO: by default export only new events
- events, err := b.ExportAll(ctx, time.Time{})
+ err = b.ExportAll(ctx, time.Time{})
if err != nil {
return err
}
- exportedIssues := 0
- for result := range events {
- if result.Event != core.ExportEventNothing {
- 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
}
diff --git a/doc/man/git-bug-bridge-pull.1 b/doc/man/git-bug-bridge-pull.1
index 10b129c7..0c210aac 100644
--- a/doc/man/git-bug-bridge-pull.1
+++ b/doc/man/git-bug-bridge-pull.1
@@ -23,6 +23,14 @@ Pull updates.
\fB\-h\fP, \fB\-\-help\fP[=false]
help for pull
+.PP
+\fB\-n\fP, \fB\-\-no\-resume\fP[=false]
+ force importing all bugs
+
+.PP
+\fB\-s\fP, \fB\-\-since\fP=0
+ import only bugs updated after the given date (must be a unix timestamp)
+
.SH SEE ALSO
.PP
diff --git a/doc/md/git-bug_bridge_pull.md b/doc/md/git-bug_bridge_pull.md
index 14b62f60..2483710d 100644
--- a/doc/md/git-bug_bridge_pull.md
+++ b/doc/md/git-bug_bridge_pull.md
@@ -13,7 +13,9 @@ git-bug bridge pull [<name>] [flags]
### Options
```
- -h, --help help for pull
+ -h, --help help for pull
+ -n, --no-resume force importing all bugs
+ -s, --since int import only bugs updated after the given date (must be a unix timestamp)
```
### SEE ALSO
diff --git a/misc/bash_completion/git-bug b/misc/bash_completion/git-bug
index bbeb6335..2088fd4d 100644
--- a/misc/bash_completion/git-bug
+++ b/misc/bash_completion/git-bug
@@ -347,6 +347,13 @@ _git-bug_bridge_pull()
flags_with_completion=()
flags_completion=()
+ flags+=("--no-resume")
+ flags+=("-n")
+ local_nonpersistent_flags+=("--no-resume")
+ flags+=("--since=")
+ two_word_flags+=("--since")
+ two_word_flags+=("-s")
+ local_nonpersistent_flags+=("--since=")
must_have_one_flag=()
must_have_one_noun=()
diff --git a/misc/powershell_completion/git-bug b/misc/powershell_completion/git-bug
index 9e0805f3..3a72cb26 100644
--- a/misc/powershell_completion/git-bug
+++ b/misc/powershell_completion/git-bug
@@ -71,6 +71,10 @@ Register-ArgumentCompleter -Native -CommandName 'git-bug' -ScriptBlock {
break
}
'git-bug;bridge;pull' {
+ [CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'force importing all bugs')
+ [CompletionResult]::new('--no-resume', 'no-resume', [CompletionResultType]::ParameterName, 'force importing all bugs')
+ [CompletionResult]::new('-s', 's', [CompletionResultType]::ParameterName, 'import only bugs updated after the given date (must be a unix timestamp)')
+ [CompletionResult]::new('--since', 'since', [CompletionResultType]::ParameterName, 'import only bugs updated after the given date (must be a unix timestamp)')
break
}
'git-bug;bridge;push' {
diff --git a/misc/zsh_completion/git-bug b/misc/zsh_completion/git-bug
index 8eaaf694..7bbd9001 100644
--- a/misc/zsh_completion/git-bug
+++ b/misc/zsh_completion/git-bug
@@ -151,7 +151,9 @@ function _git-bug_bridge_configure {
}
function _git-bug_bridge_pull {
- _arguments
+ _arguments \
+ '(-n --no-resume)'{-n,--no-resume}'[force importing all bugs]' \
+ '(-s --since)'{-s,--since}'[import only bugs updated after the given date (must be a unix timestamp)]:'
}
function _git-bug_bridge_push {