Browse code

cp's -T and --reflink=auto are only available on GNU coreutils

Docker-DCO-1.1-Signed-off-by: Kato Kazuyoshi <kato.kazuyoshi@gmail.com> (github: kzys)

Kato Kazuyoshi authored on 2014/06/21 18:50:52
Showing 1 changed files
... ...
@@ -1,6 +1,7 @@
1 1
 package vfs
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"fmt"
5 6
 	"github.com/dotcloud/docker/daemon/graphdriver"
6 7
 	"os"
... ...
@@ -35,8 +36,24 @@ func (d *Driver) Cleanup() error {
35 35
 	return nil
36 36
 }
37 37
 
38
+func isGNUcoreutils() bool {
39
+	if stdout, err := exec.Command("cp", "--version").Output(); err == nil {
40
+		return bytes.Contains(stdout, []byte("GNU coreutils"))
41
+	}
42
+
43
+	return false
44
+}
45
+
38 46
 func copyDir(src, dst string) error {
39
-	if output, err := exec.Command("cp", "-aT", "--reflink=auto", src, dst).CombinedOutput(); err != nil {
47
+	argv := make([]string, 0, 4)
48
+
49
+	if isGNUcoreutils() {
50
+		argv = append(argv, "-aT", "--reflink=auto", src, dst)
51
+	} else {
52
+		argv = append(argv, "-a", src+"/.", dst+"/.")
53
+	}
54
+
55
+	if output, err := exec.Command("cp", argv...).CombinedOutput(); err != nil {
40 56
 		return fmt.Errorf("Error VFS copying directory: %s (%s)", err, output)
41 57
 	}
42 58
 	return nil