diff --git a/internal/index/index.go b/internal/index/index.go index e09b683f1..12ef6b18a 100644 --- a/internal/index/index.go +++ b/internal/index/index.go @@ -1,6 +1,7 @@ package index import ( + "bytes" "context" "encoding/json" "fmt" @@ -358,6 +359,24 @@ func (idx *Index) Encode(w io.Writer) error { return enc.Encode(idxJSON) } +// SaveIndex saves an index in the repository. +func (idx *Index) SaveIndex(ctx context.Context, repo restic.SaverUnpacked) (restic.ID, error) { + buf := bytes.NewBuffer(nil) + + err := idx.Encode(buf) + if err != nil { + return restic.ID{}, err + } + + id, err := repo.SaveUnpacked(ctx, restic.IndexFile, buf.Bytes()) + ierr := idx.SetID(id) + if ierr != nil { + // logic bug + panic(ierr) + } + return id, err +} + // Finalize sets the index to final. func (idx *Index) Finalize() { debug.Log("finalizing index") diff --git a/internal/index/master_index.go b/internal/index/master_index.go index 40d1e3446..8e959bed3 100644 --- a/internal/index/master_index.go +++ b/internal/index/master_index.go @@ -1,7 +1,6 @@ package index import ( - "bytes" "context" "fmt" "runtime" @@ -461,7 +460,7 @@ func (mi *MasterIndex) Rewrite(ctx context.Context, repo restic.Unpacked, exclud worker := func() error { for idx := range saveCh { idx.Finalize() - if _, err := SaveIndex(wgCtx, repo, idx); err != nil { + if _, err := idx.SaveIndex(wgCtx, repo); err != nil { return err } } @@ -551,7 +550,7 @@ func (mi *MasterIndex) SaveFallback(ctx context.Context, repo restic.SaverRemove worker := func() error { for idx := range ch { idx.Finalize() - if _, err := SaveIndex(wgCtx, repo, idx); err != nil { + if _, err := idx.SaveIndex(wgCtx, repo); err != nil { return err } } @@ -572,30 +571,12 @@ func (mi *MasterIndex) SaveFallback(ctx context.Context, repo restic.SaverRemove return err } -// SaveIndex saves an index in the repository. -func SaveIndex(ctx context.Context, repo restic.SaverUnpacked, index *Index) (restic.ID, error) { - buf := bytes.NewBuffer(nil) - - err := index.Encode(buf) - if err != nil { - return restic.ID{}, err - } - - id, err := repo.SaveUnpacked(ctx, restic.IndexFile, buf.Bytes()) - ierr := index.SetID(id) - if ierr != nil { - // logic bug - panic(ierr) - } - return id, err -} - // saveIndex saves all indexes in the backend. func (mi *MasterIndex) saveIndex(ctx context.Context, r restic.SaverUnpacked, indexes ...*Index) error { for i, idx := range indexes { debug.Log("Saving index %d", i) - sid, err := SaveIndex(ctx, r, idx) + sid, err := idx.SaveIndex(ctx, r) if err != nil { return err } diff --git a/internal/repository/repository_test.go b/internal/repository/repository_test.go index bc950d0b0..05b790e33 100644 --- a/internal/repository/repository_test.go +++ b/internal/repository/repository_test.go @@ -336,7 +336,7 @@ func benchmarkLoadIndex(b *testing.B, version uint) { } idx.Finalize() - id, err := index.SaveIndex(context.TODO(), repo, idx) + id, err := idx.SaveIndex(context.TODO(), repo) rtest.OK(b, err) b.Logf("index saved as %v", id.Str())