Skip to content

Commit f12563a

Browse files
authored
Merge pull request #390 from erizocosmico/fix/cancel-squash
gitbase: make squash iterators cancellable
2 parents 51bee59 + 9509183 commit f12563a

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

squash_iterator.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ func (i *squashReposIter) Repository() *Repository { return i.repo }
8080
func (i *squashReposIter) Row() sql.Row { return i.row }
8181
func (i *squashReposIter) Advance() error {
8282
for {
83+
select {
84+
case <-i.ctx.Done():
85+
return ErrSessionCanceled.New()
86+
default:
87+
}
88+
8389
var err error
8490
i.repo, err = i.iter.Next()
8591
if err != nil {
@@ -167,6 +173,12 @@ func (i *squashRemoteIter) Repository() *Repository { return i.repo }
167173
func (i *squashRemoteIter) Row() sql.Row { return i.row }
168174
func (i *squashRemoteIter) Advance() error {
169175
for {
176+
select {
177+
case <-i.ctx.Done():
178+
return ErrSessionCanceled.New()
179+
default:
180+
}
181+
170182
if i.repo == nil {
171183
var err error
172184
i.repo, err = i.repos.Next()
@@ -443,6 +455,12 @@ func (i *squashRefIter) Row() sql.Row {
443455

444456
func (i *squashRefIter) Advance() error {
445457
for {
458+
select {
459+
case <-i.ctx.Done():
460+
return ErrSessionCanceled.New()
461+
default:
462+
}
463+
446464
if i.repo == nil {
447465
var err error
448466
i.repo, err = i.repos.Next()
@@ -1254,6 +1272,12 @@ func (i *squashCommitsIter) Row() sql.Row {
12541272

12551273
func (i *squashCommitsIter) Advance() error {
12561274
for {
1275+
select {
1276+
case <-i.ctx.Done():
1277+
return ErrSessionCanceled.New()
1278+
default:
1279+
}
1280+
12571281
if i.repo == nil {
12581282
var err error
12591283
i.repo, err = i.repos.Next()
@@ -2219,6 +2243,12 @@ func (i *squashTreeEntriesIter) New(ctx *sql.Context, pool *RepositoryPool) (Cha
22192243
func (i *squashTreeEntriesIter) Row() sql.Row { return i.row }
22202244
func (i *squashTreeEntriesIter) Advance() error {
22212245
for {
2246+
select {
2247+
case <-i.ctx.Done():
2248+
return ErrSessionCanceled.New()
2249+
default:
2250+
}
2251+
22222252
if i.repo == nil {
22232253
var err error
22242254
i.repo, err = i.repos.Next()

squash_iterator_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,36 @@ func TestAllReposIter(t *testing.T) {
1818
require.Len(chainableIterRows(t, ctx, NewAllReposIter(nil)), 2)
1919
}
2020

21+
func TestSquashContextCancelled(t *testing.T) {
22+
require := require.New(t)
23+
ctx, cleanup := setupIter(t)
24+
defer cleanup()
25+
26+
var cancel context.CancelFunc
27+
ctx.Context, cancel = context.WithCancel(ctx.Context)
28+
cancel()
29+
30+
iters := []ChainableIter{
31+
NewAllReposIter(nil),
32+
NewAllRemotesIter(nil),
33+
NewAllRefsIter(nil, false),
34+
NewAllCommitsIter(nil, false),
35+
NewAllTreeEntriesIter(nil),
36+
}
37+
38+
session, err := getSession(ctx)
39+
require.NoError(err)
40+
41+
for _, it := range iters {
42+
iter, err := it.New(ctx, session.Pool)
43+
require.NoError(err)
44+
45+
err = iter.Advance()
46+
require.Error(err)
47+
require.True(ErrSessionCanceled.Is(err))
48+
}
49+
}
50+
2151
func TestAllRemotesIter(t *testing.T) {
2252
require := require.New(t)
2353
ctx, cleanup := setupIter(t)

0 commit comments

Comments
 (0)