summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2009-10-15 16:34:05 -0700
committerRobert Griesemer <gri@golang.org>2009-10-15 16:34:05 -0700
commit73089ca4dad1dac613192c007ad4a674e92b2e83 (patch)
tree5083ec531b1772f4f8e766be6697d8c3976f84a0 /src
parentd8bbdc0b283b4324ec7df08e41514e37c0f1d842 (diff)
downloadgolang-73089ca4dad1dac613192c007ad4a674e92b2e83.tar.gz
- implemented utility functions for directory reading/traversal
- added tests R=rsc DELTA=62 (61 added, 1 deleted, 0 changed) OCL=35788 CL=35802
Diffstat (limited to 'src')
-rw-r--r--src/pkg/io/utils.go30
-rw-r--r--src/pkg/io/utils_test.go32
2 files changed, 61 insertions, 1 deletions
diff --git a/src/pkg/io/utils.go b/src/pkg/io/utils.go
index 78b8320ec..bdf234874 100644
--- a/src/pkg/io/utils.go
+++ b/src/pkg/io/utils.go
@@ -9,6 +9,7 @@ package io
import (
"bytes";
"os";
+ "sort";
)
// ReadAll reads from r until an error or EOF and returns the data it read.
@@ -37,9 +38,36 @@ func WriteFile(filename string, data []byte, perm int) os.Error {
return err;
}
n, err := f.Write(data);
+ f.Close();
if err == nil && n < len(data) {
err = ErrShortWrite;
}
- f.Close();
return err;
}
+
+// A dirList implements sort.Interface.
+type dirList []*os.Dir
+
+func (d dirList) Len() int { return len(d); }
+func (d dirList) Less(i, j int) bool { return d[i].Name < d[j].Name; }
+func (d dirList) Swap(i, j int) { d[i], d[j] = d[j], d[i]; }
+
+// ReadDir reads the directory named by dirname and returns
+// a list of sorted directory entries.
+func ReadDir(dirname string) ([]*os.Dir, os.Error) {
+ f, err := os.Open(dirname, os.O_RDONLY, 0);
+ if err != nil {
+ return nil, err;
+ }
+ list, err := f.Readdir(-1);
+ f.Close();
+ if err != nil {
+ return nil, err;
+ }
+ dirs := make(dirList, len(list));
+ for i := range list {
+ dirs[i] = &list[i];
+ }
+ sort.Sort(dirs);
+ return dirs, nil;
+}
diff --git a/src/pkg/io/utils_test.go b/src/pkg/io/utils_test.go
index 9153fb199..085e0167e 100644
--- a/src/pkg/io/utils_test.go
+++ b/src/pkg/io/utils_test.go
@@ -59,3 +59,35 @@ func TestWriteFile(t *testing.T) {
// cleanup
os.Remove(filename); // ignore error
}
+
+
+func TestReadDir(t *testing.T) {
+ dirname := "rumpelstilzchen";
+ _, err := ReadDir(dirname);
+ if err == nil {
+ t.Fatalf("ReadDir %s: error expected, none found", dirname);
+ }
+
+ dirname = ".";
+ list, err := ReadDir(dirname);
+ if err != nil {
+ t.Fatalf("ReadDir %s: %v", dirname, err);
+ }
+
+ foundTest := false;
+ foundObj := false;
+ for _, dir := range list {
+ switch {
+ case dir.IsRegular() && dir.Name == "utils_test.go":
+ foundTest = true;
+ case dir.IsDirectory() && dir.Name == "_obj":
+ foundObj = true;
+ }
+ }
+ if !foundTest {
+ t.Fatalf("ReadDir %s: test file not found", dirname);
+ }
+ if !foundObj {
+ t.Fatalf("ReadDir %s: _obj directory not found", dirname);
+ }
+}