diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-07-05 09:28:34 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-07-06 11:53:49 +0300 |
commit | 3122a2d6e750d5a3e7938875825fb6b8827a433c (patch) | |
tree | e587d68c2ac6f7a95b5464d4deeea4d4ec6e68a5 | |
parent | 8c79cea06c7546ce97d6d27d33e79a5b626a41e9 (diff) |
gitpipe: Extract function to send revision results
The code to send RevisionResults down the pipeline is kind of convoluted
given that we need to watch out for context cancellation. Pull it out
into a standalone function such that it can easily be reused by future
callers.
-rw-r--r-- | internal/git/gitpipe/revision.go | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/internal/git/gitpipe/revision.go b/internal/git/gitpipe/revision.go index 70fabc36b..21954cc48 100644 --- a/internal/git/gitpipe/revision.go +++ b/internal/git/gitpipe/revision.go @@ -168,15 +168,6 @@ func Revlist( go func() { defer close(resultChan) - sendResult := func(result RevisionResult) bool { - select { - case resultChan <- result: - return false - case <-ctx.Done(): - return true - } - } - flags := []git.Option{} if cfg.objects { @@ -247,7 +238,7 @@ func Revlist( Args: revisions, }) if err != nil { - sendResult(RevisionResult{err: err}) + sendRevisionResult(ctx, resultChan, RevisionResult{err: err}) return } @@ -267,20 +258,20 @@ func Revlist( result.ObjectName = oidAndName[1] } - if isDone := sendResult(result); isDone { + if isDone := sendRevisionResult(ctx, resultChan, result); isDone { return } } if err := scanner.Err(); err != nil { - sendResult(RevisionResult{ + sendRevisionResult(ctx, resultChan, RevisionResult{ err: fmt.Errorf("scanning rev-list output: %w", err), }) return } if err := revlist.Wait(); err != nil { - sendResult(RevisionResult{ + sendRevisionResult(ctx, resultChan, RevisionResult{ err: fmt.Errorf("rev-list pipeline command: %w", err), }) return @@ -304,18 +295,14 @@ func RevisionFilter(ctx context.Context, it RevisionIterator, filter func(Revisi for it.Next() { result := it.Result() if filter(result) { - select { - case resultChan <- result: - case <-ctx.Done(): + if sendRevisionResult(ctx, resultChan, result) { return } } } if err := it.Err(); err != nil { - select { - case resultChan <- RevisionResult{err: err}: - case <-ctx.Done(): + if sendRevisionResult(ctx, resultChan, RevisionResult{err: err}) { return } } @@ -325,3 +312,12 @@ func RevisionFilter(ctx context.Context, it RevisionIterator, filter func(Revisi ch: resultChan, } } + +func sendRevisionResult(ctx context.Context, ch chan<- RevisionResult, result RevisionResult) bool { + select { + case ch <- result: + return false + case <-ctx.Done(): + return true + } +} |