func TestShortPack(t *testing.T) { k := crypto.NewRandomKey() bufs, packData, packSize := newPack(t, k, []int{23}) b := mem.New() id := restic.Hash(packData) handle := restic.Handle{Type: restic.DataFile, Name: id.String()} OK(t, b.Save(handle, packData)) verifyBlobs(t, bufs, k, restic.ReaderAt(b, handle), packSize) }
func TestUnpackReadSeeker(t *testing.T) { // create random keys k := crypto.NewRandomKey() bufs, packData, packSize := newPack(t, k, testLens) b := mem.New() id := restic.Hash(packData) handle := restic.Handle{Type: restic.DataFile, Name: id.String()} OK(t, b.Save(handle, packData)) verifyBlobs(t, bufs, k, restic.ReaderAt(b, handle), packSize) }
// ListPack returns the list of blobs saved in the pack id and the length of // the file as stored in the backend. func (r *Repository) ListPack(id restic.ID) ([]restic.Blob, int64, error) { h := restic.Handle{Type: restic.DataFile, Name: id.String()} blobInfo, err := r.Backend().Stat(h) if err != nil { return nil, 0, err } blobs, err := pack.List(r.Key(), restic.ReaderAt(r.Backend(), h), blobInfo.Size) if err != nil { return nil, 0, err } return blobs, blobInfo.Size, nil }
func printPacks(repo *repository.Repository, wr io.Writer) error { done := make(chan struct{}) defer close(done) f := func(job worker.Job, done <-chan struct{}) (interface{}, error) { name := job.Data.(string) h := restic.Handle{Type: restic.DataFile, Name: name} blobInfo, err := repo.Backend().Stat(h) if err != nil { return nil, err } blobs, err := pack.List(repo.Key(), restic.ReaderAt(repo.Backend(), h), blobInfo.Size) if err != nil { return nil, err } return blobs, nil } jobCh := make(chan worker.Job) resCh := make(chan worker.Job) wp := worker.New(dumpPackWorkers, f, jobCh, resCh) go func() { for name := range repo.Backend().List(restic.DataFile, done) { jobCh <- worker.Job{Data: name} } close(jobCh) }() for job := range resCh { name := job.Data.(string) if job.Error != nil { fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", name, job.Error) continue } entries := job.Result.([]restic.Blob) p := Pack{ Name: name, Blobs: make([]Blob, len(entries)), } for i, blob := range entries { p.Blobs[i] = Blob{ Type: blob.Type, Length: blob.Length, ID: blob.ID, Offset: blob.Offset, } } prettyPrintJSON(os.Stdout, p) } wp.Wait() return nil }