diff --git a/internal/repository/index.go b/internal/repository/index.go index 8978b60d5..28863436b 100644 --- a/internal/repository/index.go +++ b/internal/repository/index.go @@ -276,10 +276,10 @@ func (idx *Index) EachByPack(ctx context.Context, packBlacklist restic.IDSet) <- m := &idx.byType[typ] m.foreach(func(e *indexEntry) bool { packID := idx.packs[e.packIndex] - if _, ok := byPack[packID]; !ok { - byPack[packID] = make([][]*indexEntry, restic.NumBlobTypes) - } if !idx.final || !packBlacklist.Has(packID) { + if _, ok := byPack[packID]; !ok { + byPack[packID] = make([][]*indexEntry, restic.NumBlobTypes) + } byPack[packID][typ] = append(byPack[packID][typ], e) } return true diff --git a/internal/repository/index_test.go b/internal/repository/index_test.go index 233dde030..6bc7afca2 100644 --- a/internal/repository/index_test.go +++ b/internal/repository/index_test.go @@ -613,3 +613,37 @@ func TestMixedEachByPack(t *testing.T) { } rtest.Equals(t, expected, reported) } + +func TestEachByPackIgnoes(t *testing.T) { + idx := repository.NewIndex() + + ignores := restic.NewIDSet() + expected := make(map[restic.ID]int) + // create 50 packs with one blob each + for i := 0; i < 50; i++ { + packID := restic.NewRandomID() + if i < 3 { + ignores.Insert(packID) + } else { + expected[packID] = 1 + } + blobs := []restic.Blob{ + { + BlobHandle: restic.BlobHandle{Type: restic.DataBlob, ID: restic.NewRandomID()}, + Offset: 0, + Length: 42, + }, + } + idx.StorePack(packID, blobs) + } + idx.Finalize() + + reported := make(map[restic.ID]int) + for bp := range idx.EachByPack(context.TODO(), ignores) { + reported[bp.PackID]++ + rtest.Equals(t, 1, len(bp.Blobs)) // correct blob count + b0 := bp.Blobs[0] + rtest.Assert(t, b0.Type == restic.DataBlob && b0.Offset == 0 && b0.Length == 42, "wrong blob", b0) + } + rtest.Equals(t, expected, reported) +}