Codebase list golang-github-spf13-afero / e40ec75
New upstream version 1.0.0 Dr. Tobias Quathamer 6 years ago
13 changed file(s) with 298 addition(s) and 47 deletion(s). Raw diff Collapse all Expand all
1515 fast_finish: true
1616
1717 script:
18 - go test -v ./...
1918 - go build
19 - go test -race -v ./...
20
6060
6161 First define a package variable and set it to a pointer to a filesystem.
6262 ```go
63 var AppFs afero.Fs = afero.NewMemMapFs()
63 var AppFs = afero.NewMemMapFs()
6464
6565 or
6666
67 var AppFs afero.Fs = afero.NewOsFs()
67 var AppFs = afero.NewOsFs()
6868 ```
6969 It is important to note that if you repeat the composite literal you
7070 will be using a completely new and isolated filesystem. In the case of
8080 ```go
8181 os.Open('/tmp/foo')
8282 ```
83 We would replace it with a call to `AppFs.Open('/tmp/foo')`.
83 We would replace it with:
84 ```go
85 AppFs.Open('/tmp/foo')
86 ```
8487
8588 `AppFs` being the variable we defined above.
8689
165168 ### Calling via Afero
166169
167170 ```go
168 fs := afero.NewMemMapFs
169 afs := &Afero{Fs: fs}
171 fs := afero.NewMemMapFs()
172 afs := &afero.Afero{Fs: fs}
170173 f, err := afs.TempFile("", "ioutil-test")
171174 ```
172175
1111
1212 go build github.com/spf13/afero
1313 test_script:
14 - cmd: go test -v github.com/spf13/afero
14 - cmd: go test -race -v github.com/spf13/afero/...
6363 return cacheHit, lfi, nil
6464 }
6565
66 if err == syscall.ENOENT {
66 if err == syscall.ENOENT || os.IsNotExist(err) {
6767 return cacheMiss, nil, nil
6868 }
69 var ok bool
70 if err, ok = err.(*os.PathError); ok {
71 if err == os.ErrNotExist {
72 return cacheMiss, nil, nil
73 }
74 }
69
7570 return cacheMiss, nil, err
7671 }
7772
00 package afero
11
22 import (
3 "bytes"
34 "fmt"
45 "io/ioutil"
56 "os"
365366 t.Errorf("cache time failed: <%s>", data)
366367 }
367368 }
369
370 func TestCacheOnReadFsNotInLayer(t *testing.T) {
371 base := NewMemMapFs()
372 layer := NewMemMapFs()
373 fs := NewCacheOnReadFs(base, layer, 0)
374
375 fh, err := base.Create("/file.txt")
376 if err != nil {
377 t.Fatal("unable to create file: ", err)
378 }
379
380 txt := []byte("This is a test")
381 fh.Write(txt)
382 fh.Close()
383
384 fh, err = fs.Open("/file.txt")
385 if err != nil {
386 t.Fatal("could not open file: ", err)
387 }
388
389 b, err := ReadAll(fh)
390 fh.Close()
391
392 if err != nil {
393 t.Fatal("could not read file: ", err)
394 } else if !bytes.Equal(txt, b) {
395 t.Fatalf("wanted file text %q, got %q", txt, b)
396 }
397
398 fh, err = layer.Open("/file.txt")
399 if err != nil {
400 t.Fatal("could not open file from layer: ", err)
401 }
402 fh.Close()
403 }
7979 if e, ok := err.(*os.PathError); ok {
8080 err = e.Err
8181 }
82 if err == syscall.ENOENT || err == syscall.ENOTDIR {
82 if err == os.ErrNotExist || err == syscall.ENOENT || err == syscall.ENOTDIR {
8383 return u.base.Stat(name)
8484 }
8585 return nil, origErr
2020 }
2121
2222 }
23
24 func TestCopyOnWriteFileInMemMapBase(t *testing.T) {
25 base := &MemMapFs{}
26 layer := &MemMapFs{}
27
28 if err := WriteFile(base, "base.txt", []byte("base"), 0755); err != nil {
29 t.Fatalf("Failed to write file: %s", err)
30 }
31
32 ufs := NewCopyOnWriteFs(base, layer)
33
34 _, err := ufs.Stat("base.txt")
35 if err != nil {
36 t.Fatal(err)
37 }
38 }
7373 }
7474
7575 func ChangeFileName(f *FileData, newname string) {
76 f.Lock()
7677 f.name = newname
78 f.Unlock()
7779 }
7880
7981 func SetMode(f *FileData, mode os.FileMode) {
82 f.Lock()
8083 f.mode = mode
84 f.Unlock()
8185 }
8286
8387 func SetModTime(f *FileData, mtime time.Time) {
88 f.Lock()
89 setModTime(f, mtime)
90 f.Unlock()
91 }
92
93 func setModTime(f *FileData, mtime time.Time) {
8494 f.modtime = mtime
8595 }
8696
101111 f.fileData.Lock()
102112 f.closed = true
103113 if !f.readOnly {
104 SetModTime(f.fileData, time.Now())
114 setModTime(f.fileData, time.Now())
105115 }
106116 f.fileData.Unlock()
107117 return nil
196206 } else {
197207 f.fileData.data = f.fileData.data[0:size]
198208 }
199 SetModTime(f.fileData, time.Now())
209 setModTime(f.fileData, time.Now())
200210 return nil
201211 }
202212
235245 f.fileData.data = append(f.fileData.data[:cur], b...)
236246 f.fileData.data = append(f.fileData.data, tail...)
237247 }
238 SetModTime(f.fileData, time.Now())
248 setModTime(f.fileData, time.Now())
239249
240250 atomic.StoreInt64(&f.at, int64(len(f.fileData.data)))
241251 return
260270
261271 // Implements os.FileInfo
262272 func (s *FileInfo) Name() string {
273 s.Lock()
263274 _, name := filepath.Split(s.name)
275 s.Unlock()
264276 return name
265277 }
266 func (s *FileInfo) Mode() os.FileMode { return s.mode }
267 func (s *FileInfo) ModTime() time.Time { return s.modtime }
268 func (s *FileInfo) IsDir() bool { return s.dir }
269 func (s *FileInfo) Sys() interface{} { return nil }
278 func (s *FileInfo) Mode() os.FileMode {
279 s.Lock()
280 defer s.Unlock()
281 return s.mode
282 }
283 func (s *FileInfo) ModTime() time.Time {
284 s.Lock()
285 defer s.Unlock()
286 return s.modtime
287 }
288 func (s *FileInfo) IsDir() bool {
289 s.Lock()
290 defer s.Unlock()
291 return s.dir
292 }
293 func (s *FileInfo) Sys() interface{} { return nil }
270294 func (s *FileInfo) Size() int64 {
271295 if s.IsDir() {
272296 return int64(42)
273297 }
298 s.Lock()
299 defer s.Unlock()
274300 return int64(len(s.data))
275301 }
276302
0 package mem
1
2 import (
3 "testing"
4 "time"
5 )
6
7 func TestFileDataNameRace(t *testing.T) {
8 t.Parallel()
9 const someName = "someName"
10 const someOtherName = "someOtherName"
11 d := FileData{
12 name: someName,
13 }
14
15 if d.Name() != someName {
16 t.Errorf("Failed to read correct Name, was %v", d.Name())
17 }
18
19 ChangeFileName(&d, someOtherName)
20 if d.Name() != someOtherName {
21 t.Errorf("Failed to set Name, was %v", d.Name())
22 }
23
24 go func() {
25 ChangeFileName(&d, someName)
26 }()
27
28 if d.Name() != someName && d.Name() != someOtherName {
29 t.Errorf("Failed to read either Name, was %v", d.Name())
30 }
31 }
32
33 func TestFileDataModTimeRace(t *testing.T) {
34 t.Parallel()
35 someTime := time.Now()
36 someOtherTime := someTime.Add(1 * time.Minute)
37
38 d := FileData{
39 modtime: someTime,
40 }
41
42 s := FileInfo{
43 FileData: &d,
44 }
45
46 if s.ModTime() != someTime {
47 t.Errorf("Failed to read correct value, was %v", s.ModTime())
48 }
49
50 SetModTime(&d, someOtherTime)
51 if s.ModTime() != someOtherTime {
52 t.Errorf("Failed to set ModTime, was %v", s.ModTime())
53 }
54
55 go func() {
56 SetModTime(&d, someTime)
57 }()
58
59 if s.ModTime() != someTime && s.ModTime() != someOtherTime {
60 t.Errorf("Failed to read either modtime, was %v", s.ModTime())
61 }
62 }
63
64 func TestFileDataModeRace(t *testing.T) {
65 t.Parallel()
66 const someMode = 0777
67 const someOtherMode = 0660
68
69 d := FileData{
70 mode: someMode,
71 }
72
73 s := FileInfo{
74 FileData: &d,
75 }
76
77 if s.Mode() != someMode {
78 t.Errorf("Failed to read correct value, was %v", s.Mode())
79 }
80
81 SetMode(&d, someOtherMode)
82 if s.Mode() != someOtherMode {
83 t.Errorf("Failed to set Mode, was %v", s.Mode())
84 }
85
86 go func() {
87 SetMode(&d, someMode)
88 }()
89
90 if s.Mode() != someMode && s.Mode() != someOtherMode {
91 t.Errorf("Failed to read either mode, was %v", s.Mode())
92 }
93 }
94
95 func TestFileDataIsDirRace(t *testing.T) {
96 t.Parallel()
97
98 d := FileData{
99 dir: true,
100 }
101
102 s := FileInfo{
103 FileData: &d,
104 }
105
106 if s.IsDir() != true {
107 t.Errorf("Failed to read correct value, was %v", s.IsDir())
108 }
109
110 go func() {
111 s.Lock()
112 d.dir = false
113 s.Unlock()
114 }()
115
116 //just logging the value to trigger a read:
117 t.Logf("Value is %v", s.IsDir())
118 }
119
120 func TestFileDataSizeRace(t *testing.T) {
121 t.Parallel()
122
123 const someData = "Hello"
124 const someOtherDataSize = "Hello World"
125
126 d := FileData{
127 data: []byte(someData),
128 dir: false,
129 }
130
131 s := FileInfo{
132 FileData: &d,
133 }
134
135 if s.Size() != int64(len(someData)) {
136 t.Errorf("Failed to read correct value, was %v", s.Size())
137 }
138
139 go func() {
140 s.Lock()
141 d.data = []byte(someOtherDataSize)
142 s.Unlock()
143 }()
144
145 //just logging the value to trigger a read:
146 t.Logf("Value is %v", s.Size())
147
148 //Testing the Dir size case
149 d.dir = true
150 if s.Size() != int64(42) {
151 t.Errorf("Failed to read correct value for dir, was %v", s.Size())
152 }
153 }
140140 m.registerWithParent(item)
141141 m.mu.Unlock()
142142
143 m.Chmod(name, perm)
143 m.Chmod(name, perm|os.ModeDir)
144144
145145 return nil
146146 }
150150 if err != nil {
151151 if err.(*os.PathError).Err == ErrFileExists {
152152 return nil
153 } else {
154 return err
155 }
153 }
154 return err
156155 }
157156 return nil
158157 }
109109 const dirPathAll = "/my/path/to/dir"
110110
111111 const fileMode = os.FileMode(0765)
112 // directories will also have the directory bit set
113 const dirMode = fileMode | os.ModeDir
112114
113115 fs := NewMemMapFs()
114116
131133 }
132134
133135 // Test Mkdir
134 err = fs.Mkdir(dirPath, fileMode)
136 err = fs.Mkdir(dirPath, dirMode)
135137 if err != nil {
136138 t.Errorf("MkDir Create failed: %s", err)
137139 return
141143 t.Errorf("Stat failed: %s", err)
142144 return
143145 }
144 if s.Mode().String() != fileMode.String() {
145 t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), fileMode.String())
146 // sets File
147 if s.Mode().String() != dirMode.String() {
148 t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), dirMode.String())
146149 return
147150 }
148151
149152 // Test MkdirAll
150 err = fs.MkdirAll(dirPathAll, fileMode)
153 err = fs.MkdirAll(dirPathAll, dirMode)
151154 if err != nil {
152155 t.Errorf("MkDir Create failed: %s", err)
153156 return
157160 t.Errorf("Stat failed: %s", err)
158161 return
159162 }
160 if s.Mode().String() != fileMode.String() {
161 t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), fileMode.String())
163 if s.Mode().String() != dirMode.String() {
164 t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), dirMode.String())
162165 return
163166 }
164167 }
383386 }
384387 }
385388 }
389
390 func TestMemFsDirMode(t *testing.T) {
391 fs := NewMemMapFs()
392 err := fs.Mkdir("/testDir1", 0644)
393 if err != nil {
394 t.Error(err)
395 }
396 err = fs.MkdirAll("/sub/testDir2", 0644)
397 if err != nil {
398 t.Error(err)
399 }
400 info, err := fs.Stat("/testDir1")
401 if err != nil {
402 t.Error(err)
403 }
404 if !info.IsDir() {
405 t.Error("should be a directory")
406 }
407 if !info.Mode().IsDir() {
408 t.Error("FileMode is not directory")
409 }
410 info, err = fs.Stat("/sub/testDir2")
411 if err != nil {
412 t.Error(err)
413 }
414 if !info.IsDir() {
415 t.Error("should be a directory")
416 }
417 if !info.Mode().IsDir() {
418 t.Error("FileMode is not directory")
419 }
420 }
+0
-14
memradix.go less more
0 // Copyright © 2014 Steve Francia <spf@spf13.com>.
1 //
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 // http://www.apache.org/licenses/LICENSE-2.0
6 //
7 // Unless required by applicable law or agreed to in writing, software
8 // distributed under the License is distributed on an "AS IS" BASIS,
9 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 // See the License for the specific language governing permissions and
11 // limitations under the License.
12
13 package afero
156156 return string(target)
157157 }
158158
159 // Transform characters with accents into plan forms
159 // Transform characters with accents into plain forms.
160160 func NeuterAccents(s string) string {
161161 t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
162162 result, _, _ := transform.String(t, string(s))