Browse code

Makes directory pkg compilable on Windows.

Also makes the test cases platform independent.

Signed-off-by: Rick Wieman <git@rickw.nl>

Rick Wieman authored on 2015/03/12 23:16:16
Showing 4 changed files
1 1
deleted file mode 100644
... ...
@@ -1,39 +0,0 @@
1
-// +build linux
2
-
3
-package directory
4
-
5
-import (
6
-	"os"
7
-	"path/filepath"
8
-	"syscall"
9
-)
10
-
11
-// Size walks a directory tree and returns its total size in bytes.
12
-func Size(dir string) (size int64, err error) {
13
-	data := make(map[uint64]struct{})
14
-	err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
15
-		// Ignore directory sizes
16
-		if fileInfo == nil {
17
-			return nil
18
-		}
19
-
20
-		s := fileInfo.Size()
21
-		if fileInfo.IsDir() || s == 0 {
22
-			return nil
23
-		}
24
-
25
-		// Check inode to handle hard links correctly
26
-		inode := fileInfo.Sys().(*syscall.Stat_t).Ino
27
-		// inode is not a uint64 on all platforms. Cast it to avoid issues.
28
-		if _, exists := data[uint64(inode)]; exists {
29
-			return nil
30
-		}
31
-		// inode is not a uint64 on all platforms. Cast it to avoid issues.
32
-		data[uint64(inode)] = struct{}{}
33
-
34
-		size += s
35
-
36
-		return nil
37
-	})
38
-	return
39
-}
40 1
new file mode 100644
... ...
@@ -0,0 +1,39 @@
0
+// +build linux
1
+
2
+package directory
3
+
4
+import (
5
+	"os"
6
+	"path/filepath"
7
+	"syscall"
8
+)
9
+
10
+// Size walks a directory tree and returns its total size in bytes.
11
+func Size(dir string) (size int64, err error) {
12
+	data := make(map[uint64]struct{})
13
+	err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
14
+		// Ignore directory sizes
15
+		if fileInfo == nil {
16
+			return nil
17
+		}
18
+
19
+		s := fileInfo.Size()
20
+		if fileInfo.IsDir() || s == 0 {
21
+			return nil
22
+		}
23
+
24
+		// Check inode to handle hard links correctly
25
+		inode := fileInfo.Sys().(*syscall.Stat_t).Ino
26
+		// inode is not a uint64 on all platforms. Cast it to avoid issues.
27
+		if _, exists := data[uint64(inode)]; exists {
28
+			return nil
29
+		}
30
+		// inode is not a uint64 on all platforms. Cast it to avoid issues.
31
+		data[uint64(inode)] = struct{}{}
32
+
33
+		size += s
34
+
35
+		return nil
36
+	})
37
+	return
38
+}
... ...
@@ -1,49 +1,54 @@
1 1
 package directory
2 2
 
3 3
 import (
4
+	"io/ioutil"
4 5
 	"os"
5 6
 	"testing"
6 7
 )
7 8
 
8 9
 // Size of an empty directory should be 0
9 10
 func TestSizeEmpty(t *testing.T) {
11
+	var dir string
10 12
 	var err error
11
-	if err = os.Mkdir("/tmp/testSizeEmptyDirectory", 0777); err != nil {
13
+	if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyDirectory"); err != nil {
12 14
 		t.Fatalf("failed to create directory: %s", err)
13 15
 	}
14 16
 
15 17
 	var size int64
16
-	if size, _ = Size("/tmp/testSizeEmptyDirectory"); size != 0 {
18
+	if size, _ = Size(dir); size != 0 {
17 19
 		t.Fatalf("empty directory has size: %d", size)
18 20
 	}
19 21
 }
20 22
 
21 23
 // Size of a directory with one empty file should be 0
22 24
 func TestSizeEmptyFile(t *testing.T) {
25
+	var dir string
23 26
 	var err error
24
-	if err = os.Mkdir("/tmp/testSizeEmptyFile", 0777); err != nil {
27
+	if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyFile"); err != nil {
25 28
 		t.Fatalf("failed to create directory: %s", err)
26 29
 	}
27 30
 
28
-	if _, err = os.Create("/tmp/testSizeEmptyFile/file"); err != nil {
31
+	var file *os.File
32
+	if file, err = ioutil.TempFile(dir, "file"); err != nil {
29 33
 		t.Fatalf("failed to create file: %s", err)
30 34
 	}
31 35
 
32 36
 	var size int64
33
-	if size, _ = Size("/tmp/testSizeEmptyFile"); size != 0 {
37
+	if size, _ = Size(file.Name()); size != 0 {
34 38
 		t.Fatalf("directory with one file has size: %d", size)
35 39
 	}
36 40
 }
37 41
 
38 42
 // Size of a directory with one 5-byte file should be 5
39 43
 func TestSizeNonemptyFile(t *testing.T) {
44
+	var dir string
40 45
 	var err error
41
-	if err = os.Mkdir("/tmp/testSizeNonemptyFile", 0777); err != nil {
46
+	if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNonemptyFile"); err != nil {
42 47
 		t.Fatalf("failed to create directory: %s", err)
43 48
 	}
44 49
 
45 50
 	var file *os.File
46
-	if file, err = os.Create("/tmp/testSizeNonemptyFile/file"); err != nil {
51
+	if file, err = ioutil.TempFile(dir, "file"); err != nil {
47 52
 		t.Fatalf("failed to create file: %s", err)
48 53
 	}
49 54
 
... ...
@@ -51,33 +56,41 @@ func TestSizeNonemptyFile(t *testing.T) {
51 51
 	file.Write(d)
52 52
 
53 53
 	var size int64
54
-	if size, _ = Size("/tmp/testSizeNonemptyFile"); size != 5 {
54
+	if size, _ = Size(file.Name()); size != 5 {
55 55
 		t.Fatalf("directory with one 5-byte file has size: %d", size)
56 56
 	}
57 57
 }
58 58
 
59 59
 // Size of a directory with one empty directory should be 0
60 60
 func TestSizeNestedDirectoryEmpty(t *testing.T) {
61
+	var dir string
61 62
 	var err error
62
-	if err = os.MkdirAll("/tmp/testSizeNestedDirectoryEmpty/nested", 0777); err != nil {
63
+	if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNestedDirectoryEmpty"); err != nil {
63 64
 		t.Fatalf("failed to create directory: %s", err)
64 65
 	}
66
+	if dir, err = ioutil.TempDir(dir, "nested"); err != nil {
67
+		t.Fatalf("failed to create nested directory: %s", err)
68
+	}
65 69
 
66 70
 	var size int64
67
-	if size, _ = Size("/tmp/testSizeNestedDirectoryEmpty"); size != 0 {
71
+	if size, _ = Size(dir); size != 0 {
68 72
 		t.Fatalf("directory with one empty directory has size: %d", size)
69 73
 	}
70 74
 }
71 75
 
72 76
 // Test directory with 1 file and 1 empty directory
73 77
 func TestSizeFileAndNestedDirectoryEmpty(t *testing.T) {
78
+	var dir string
74 79
 	var err error
75
-	if err = os.MkdirAll("/tmp/testSizeFileAndNestedDirectoryEmpty/nested", 0777); err != nil {
80
+	if dir, err = ioutil.TempDir(os.TempDir(), "testSizeFileAndNestedDirectoryEmpty"); err != nil {
76 81
 		t.Fatalf("failed to create directory: %s", err)
77 82
 	}
83
+	if dir, err = ioutil.TempDir(dir, "nested"); err != nil {
84
+		t.Fatalf("failed to create nested directory: %s", err)
85
+	}
78 86
 
79 87
 	var file *os.File
80
-	if file, err = os.Create("/tmp/testSizeFileAndNestedDirectoryEmpty/file"); err != nil {
88
+	if file, err = ioutil.TempFile(dir, "file"); err != nil {
81 89
 		t.Fatalf("failed to create file: %s", err)
82 90
 	}
83 91
 
... ...
@@ -85,20 +98,24 @@ func TestSizeFileAndNestedDirectoryEmpty(t *testing.T) {
85 85
 	file.Write(d)
86 86
 
87 87
 	var size int64
88
-	if size, _ = Size("/tmp/testSizeFileAndNestedDirectoryEmpty"); size != 6 {
88
+	if size, _ = Size(dir); size != 6 {
89 89
 		t.Fatalf("directory with 6-byte file and empty directory has size: %d", size)
90 90
 	}
91 91
 }
92 92
 
93 93
 // Test directory with 1 file and 1 non-empty directory
94 94
 func TestSizeFileAndNestedDirectoryNonempty(t *testing.T) {
95
+	var dir, dirNested string
95 96
 	var err error
96
-	if err = os.MkdirAll("/tmp/testSizeFileAndNestedDirectoryEmpty/nested", 0777); err != nil {
97
+	if dir, err = ioutil.TempDir(os.TempDir(), "TestSizeFileAndNestedDirectoryNonempty"); err != nil {
97 98
 		t.Fatalf("failed to create directory: %s", err)
98 99
 	}
100
+	if dirNested, err = ioutil.TempDir(dir, "nested"); err != nil {
101
+		t.Fatalf("failed to create nested directory: %s", err)
102
+	}
99 103
 
100 104
 	var file *os.File
101
-	if file, err = os.Create("/tmp/testSizeFileAndNestedDirectoryEmpty/file"); err != nil {
105
+	if file, err = ioutil.TempFile(dir, "file"); err != nil {
102 106
 		t.Fatalf("failed to create file: %s", err)
103 107
 	}
104 108
 
... ...
@@ -106,15 +123,15 @@ func TestSizeFileAndNestedDirectoryNonempty(t *testing.T) {
106 106
 	file.Write(data)
107 107
 
108 108
 	var nestedFile *os.File
109
-	if nestedFile, err = os.Create("/tmp/testSizeFileAndNestedDirectoryEmpty/nested/file"); err != nil {
110
-		t.Fatalf("failed to create file: %s", err)
109
+	if nestedFile, err = ioutil.TempFile(dirNested, "file"); err != nil {
110
+		t.Fatalf("failed to create file in nested directory: %s", err)
111 111
 	}
112 112
 
113 113
 	nestedData := []byte{100, 111, 99, 107, 101, 114}
114 114
 	nestedFile.Write(nestedData)
115 115
 
116 116
 	var size int64
117
-	if size, _ = Size("/tmp/testSizeFileAndNestedDirectoryEmpty"); size != 12 {
118
-		t.Fatalf("directory with 6-byte file and empty directory has size: %d", size)
117
+	if size, _ = Size(dir); size != 12 {
118
+		t.Fatalf("directory with 6-byte file and nested directory with 6-byte file has size: %d", size)
119 119
 	}
120 120
 }
121 121
new file mode 100644
... ...
@@ -0,0 +1,28 @@
0
+// +build windows
1
+
2
+package directory
3
+
4
+import (
5
+	"os"
6
+	"path/filepath"
7
+)
8
+
9
+// Size walks a directory tree and returns its total size in bytes.
10
+func Size(dir string) (size int64, err error) {
11
+	err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
12
+		// Ignore directory sizes
13
+		if fileInfo == nil {
14
+			return nil
15
+		}
16
+
17
+		s := fileInfo.Size()
18
+		if fileInfo.IsDir() || s == 0 {
19
+			return nil
20
+		}
21
+
22
+		size += s
23
+
24
+		return nil
25
+	})
26
+	return
27
+}