code: func (zh *zipHandler) blobsFromDir(dirPath string, dirBlob blob.Ref) ([]*blobFile, error) {
  	var list []*blobFile
  	dr, err := schema.NewDirReader(context.TODO(), zh.fetcher, dirBlob)
  	if err != nil {
  		return nil, fmt.Errorf("Could not read dir blob %v: %v", dirBlob, err)
  	}
  	ent, err := dr.Readdir(context.TODO(), -1)
  	if err != nil {
  		return nil, fmt.Errorf("Could not read dir entries: %v", err)
  	}
  	for _, v := range ent {
  		fullpath := path.Join(dirPath, v.FileName())
  		switch v.CamliType() {
  		case "file":
  			list = append(list, &blobFile{v.BlobRef(), fullpath})
  		case "directory":
  			children, err := zh.blobsFromDir(fullpath, v.BlobRef())
  			if err != nil {
  				return nil, fmt.Errorf("Could not get list of blobs from %v: %v", v.BlobRef(), err)
  			}
  			list = append(list, children...)
  		}
  	}
  	return list, nil
  }
docs: // blobsFromDir returns the list of file blobs in directory dirBlob.
  // It only traverses permanode directories.