浏览代码

Implement changes for aufs driver

Michael Crosby 11 年之前
父节点
当前提交
ed18844613
共有 3 个文件被更改,包括 89 次插入18 次删除
  1. 31 14
      aufs/aufs.go
  2. 55 0
      aufs/aufs_test.go
  3. 3 4
      aufs/dirs.go

+ 31 - 14
aufs/aufs.go

@@ -119,9 +119,13 @@ func (a *AufsDriver) Create(id, parent string) error {
 			return err
 			return err
 		}
 		}
 
 
-		fmt.Fprintln(f, parent)
+		if _, err := fmt.Fprintln(f, parent); err != nil {
+			return err
+		}
 		for _, i := range ids {
 		for _, i := range ids {
-			fmt.Fprintln(f, i)
+			if _, err := fmt.Fprintln(f, i); err != nil {
+				return err
+			}
 		}
 		}
 	}
 	}
 	return nil
 	return nil
@@ -212,7 +216,28 @@ func (a *AufsDriver) DiffSize(id string) (int64, error) {
 }
 }
 
 
 func (a *AufsDriver) Changes(id string) ([]archive.Change, error) {
 func (a *AufsDriver) Changes(id string) ([]archive.Change, error) {
-	return nil, nil
+	layers, err := a.getParentLayerPaths(id)
+	if err != nil {
+		return nil, err
+	}
+	return archive.Changes(layers, path.Join(a.rootPath(), "diff", id))
+}
+
+func (a *AufsDriver) getParentLayerPaths(id string) ([]string, error) {
+	parentIds, err := getParentIds(a.rootPath(), id)
+	if err != nil {
+		return nil, err
+	}
+	if len(parentIds) == 0 {
+		return nil, fmt.Errorf("Dir %s does not have any parent layers", id)
+	}
+	layers := make([]string, len(parentIds))
+
+	// Get the diff paths for all the parent ids
+	for i, p := range parentIds {
+		layers[i] = path.Join(a.rootPath(), "diff", p)
+	}
+	return layers, nil
 }
 }
 
 
 func (a *AufsDriver) mount(id string) error {
 func (a *AufsDriver) mount(id string) error {
@@ -221,22 +246,14 @@ func (a *AufsDriver) mount(id string) error {
 		return err
 		return err
 	}
 	}
 
 
-	parentIds, err := getParentIds(a.rootPath(), id)
-	if err != nil {
-		return err
-	}
-	if len(parentIds) == 0 {
-		return fmt.Errorf("Dir %s does not have any parent layers", id)
-	}
 	var (
 	var (
 		target = path.Join(a.rootPath(), "mnt", id)
 		target = path.Join(a.rootPath(), "mnt", id)
 		rw     = path.Join(a.rootPath(), "diff", id)
 		rw     = path.Join(a.rootPath(), "diff", id)
-		layers = make([]string, len(parentIds))
 	)
 	)
 
 
-	// Get the diff paths for all the parent ids
-	for i, p := range parentIds {
-		layers[i] = path.Join(a.rootPath(), "diff", p)
+	layers, err := a.getParentLayerPaths(id)
+	if err != nil {
+		return err
 	}
 	}
 
 
 	if err := a.aufsMount(layers, rw, target); err != nil {
 	if err := a.aufsMount(layers, rw, target); err != nil {

+ 55 - 0
aufs/aufs_test.go

@@ -1,6 +1,7 @@
 package aufs
 package aufs
 
 
 import (
 import (
+	"github.com/dotcloud/docker/archive"
 	"os"
 	"os"
 	"path"
 	"path"
 	"testing"
 	"testing"
@@ -331,6 +332,60 @@ func TestGetDiff(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestChanges(t *testing.T) {
+	d := newDriver(t)
+	defer os.RemoveAll(tmp)
+
+	if err := d.Create("1", ""); err != nil {
+		t.Fatal(err)
+	}
+	if err := d.Create("2", "1"); err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		if err := d.Cleanup(); err != nil {
+			t.Fatal(err)
+		}
+	}()
+
+	mntPoint, err := d.Get("2")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// Create a file to save in the mountpoint
+	f, err := os.Create(path.Join(mntPoint, "test.txt"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if _, err := f.WriteString("testline"); err != nil {
+		t.Fatal(err)
+	}
+	if err := f.Close(); err != nil {
+		t.Fatal(err)
+	}
+
+	changes, err := d.Changes("2")
+	if err != nil {
+		t.Fatal(err)
+	}
+	if len(changes) != 1 {
+		t.Fatalf("Dir 2 should have one change from parent got %d", len(changes))
+	}
+	change := changes[0]
+
+	expectedPath := "/test.txt"
+	if change.Path != expectedPath {
+		t.Fatalf("Expected path %s got %s", expectedPath, change.Path)
+	}
+
+	if change.Kind != archive.ChangeAdd {
+		t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind)
+	}
+}
+
 /* FIXME: How to properly test this?
 /* FIXME: How to properly test this?
 func TestDiffSize(t *testing.T) {
 func TestDiffSize(t *testing.T) {
 	d := newDriver(t)
 	d := newDriver(t)

+ 3 - 4
aufs/dirs.go

@@ -38,10 +38,9 @@ func getParentIds(root, id string) ([]string, error) {
 	s := bufio.NewScanner(f)
 	s := bufio.NewScanner(f)
 
 
 	for s.Scan() {
 	for s.Scan() {
-		if err := s.Err(); err != nil {
-			return nil, err
+		if t := s.Text(); t != "" {
+			out = append(out, s.Text())
 		}
 		}
-		out = append(out, s.Text())
 	}
 	}
-	return out, nil
+	return out, s.Err()
 }
 }