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 := backend.Handle{Type: backend.Data, Name: name} rd := backend.NewReadSeeker(repo.Backend(), h) unpacker, err := pack.NewUnpacker(repo.Key(), rd) if err != nil { return nil, err } return unpacker.Entries, 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(backend.Data, 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.([]pack.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 }
// ListPack returns the list of blobs saved in the pack id. func (r *Repository) ListPack(id backend.ID) ([]pack.Blob, error) { h := backend.Handle{Type: backend.Data, Name: id.String()} rd := backend.NewReadSeeker(r.Backend(), h) unpacker, err := pack.NewUnpacker(r.Key(), rd) if err != nil { return nil, err } return unpacker.Entries, nil }
func TestUnpackReadSeeker(t *testing.T) { // create random keys k := crypto.NewRandomKey() bufs, packData, packSize := newPack(t, k) b := mem.New() id := backend.Hash(packData) handle := backend.Handle{Type: backend.Data, Name: id.String()} OK(t, b.Save(handle, packData)) rd := backend.NewReadSeeker(b, handle) verifyBlobs(t, bufs, k, rd, packSize) }
func TestReadSeeker(t *testing.T) { b := mem.New() length := rand.Intn(1<<24) + 2000 data := Random(23, length) id := backend.Hash(data) handle := backend.Handle{Type: backend.Data, Name: id.String()} err := b.Save(handle, data) if err != nil { t.Fatalf("Save() error: %v", err) } for i := 0; i < 50; i++ { l := rand.Intn(length + 2000) o := rand.Intn(length + 2000) if rand.Float32() > 0.5 { o = -o } d := data if o > 0 && o < len(d) { d = d[o:] } else { o = len(d) d = d[:0] } if l > 0 && l < len(d) { d = d[:l] } rd := backend.NewReadSeeker(b, handle) loadAndCompare(t, rd, len(data), int64(o), d) } }