From 94fa3c7bb5cadc31b64630b0fe8abfaeba0644aa Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 5 Sep 2013 22:14:19 +0200 Subject: [PATCH] Implement container.ExportRW() on device-mapper --- container.go | 10 +++++++++- image.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/container.go b/container.go index bd1d5a41a5..fcbad17c86 100644 --- a/container.go +++ b/container.go @@ -1110,7 +1110,15 @@ func (container *Container) Resize(h, w int) error { } func (container *Container) ExportRw() (Archive, error) { - return Tar(container.rwPath(), Uncompressed) + if err := container.EnsureMounted(); err != nil { + return nil, err + } + + image, err := container.GetImage() + if err != nil { + return nil, err + } + return image.ExportChanges(container.runtime, container.RootfsPath(), container.rwPath(), container.ID) } func (container *Container) RwChecksum() (string, error) { diff --git a/image.go b/image.go index 119e07c70e..546c54a577 100644 --- a/image.go +++ b/image.go @@ -523,6 +523,37 @@ func (image *Image) Changes(runtime *Runtime, root, rw, id string) ([]Change, er return nil, fmt.Errorf("No supported Changes implementation") } +func (image *Image) ExportChanges(runtime *Runtime, root, rw, id string) (Archive, error) { + switch runtime.GetMountMethod() { + case MountMethodAUFS: + return Tar(rw, Uncompressed) + + case MountMethodDeviceMapper: + changes, err := image.Changes(runtime, root, rw, id) + if err != nil { + return nil, err + } + + files := make([]string, 0) + deletions := make([]string, 0) + for _, change := range changes { + if change.Kind == ChangeModify || change.Kind == ChangeAdd { + files = append(files, change.Path) + } + if change.Kind == ChangeDelete { + base := filepath.Base(change.Path) + dir := filepath.Dir(change.Path) + deletions = append(deletions, filepath.Join(dir, ".wh."+base)) + } + } + + return TarFilter(root, Uncompressed, files, false, deletions) + } + + return nil, fmt.Errorf("No supported Changes implementation") +} + + func (image *Image) ShortID() string { return utils.TruncateID(image.ID) }