func (container *Container) Copy(resource string) (io.ReadCloser, error) { if err := container.Mount(); err != nil { return nil, err } var filter []string basePath, err := container.getResourcePath(resource) if err != nil { container.Unmount() return nil, err } stat, err := os.Stat(basePath) if err != nil { container.Unmount() return nil, err } if !stat.IsDir() { d, f := path.Split(basePath) basePath = d filter = []string{f} } else { filter = []string{path.Base(basePath)} basePath = path.Dir(basePath) } archive, err := archive.TarWithOptions(basePath, &archive.TarOptions{ Compression: archive.Uncompressed, Includes: filter, }) if err != nil { container.Unmount() return nil, err } return utils.NewReadCloserWrapper(archive, func() error { err := archive.Close() container.Unmount() return err }), nil }
func Pack(repo, dir, branch string) (hash string, err error) { db, err := libpack.Init(repo, branch) if err != nil { return "", err } a, err := archive.TarWithOptions(dir, &archive.TarOptions{Excludes: []string{".git"}}) if err != nil { return "", err } if err := db.SetTar(a); err != nil { return "", err } if err := db.Commit("imported tar filesystem tree"); err != nil { return "", err } head := db.Head() if head != nil { hash = head.String() } return }
// Returns an archive of the contents for the id func (a *Driver) Diff(id string) (archive.Archive, error) { return archive.TarWithOptions(path.Join(a.rootPath(), "diff", id), &archive.TarOptions{ Compression: archive.Uncompressed, }) }
// Diff produces an archive of the changes between the specified // layer and its parent layer which may be "". func (a *Driver) Diff(id, parent string) (archive.Archive, error) { // AUFS doesn't need the parent layer to produce a diff. return archive.TarWithOptions(path.Join(a.rootPath(), "diff", id), &archive.TarOptions{ Compression: archive.Uncompressed, }) }