commit
						a3536fc55e
					
				
							
								
								
									
										41
									
								
								walker.go
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								walker.go
									
									
									
									
									
								
							| @ -1,10 +1,7 @@ | |||||||
| package ftp | package ftp | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"os" |  | ||||||
| 	"path" | 	"path" | ||||||
| 	"strings" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| //Walker traverses the directory tree of a remote FTP server | //Walker traverses the directory tree of a remote FTP server | ||||||
| @ -26,38 +23,27 @@ type item struct { | |||||||
| // which will then be available through the Path, Stat, and Err methods. | // which will then be available through the Path, Stat, and Err methods. | ||||||
| // It returns false when the walk stops at the end of the tree. | // It returns false when the walk stops at the end of the tree. | ||||||
| func (w *Walker) Next() bool { | func (w *Walker) Next() bool { | ||||||
| 	var isRoot bool | 	// check if we need to init cur, maybe this should be inside Walk | ||||||
| 	if w.cur == nil { | 	if w.cur == nil { | ||||||
| 		w.cur = &item{ | 		w.cur = &item{ | ||||||
| 			path: strings.Trim(w.root, string(os.PathSeparator)), | 			path: w.root, | ||||||
| 		} | 			entry: &Entry{ | ||||||
| 
 | 				Type: EntryTypeFolder, | ||||||
| 		isRoot = true | 			}, | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if w.descend && w.cur.entry.Type == EntryTypeFolder { | ||||||
| 		entries, err := w.serverConn.List(w.cur.path) | 		entries, err := w.serverConn.List(w.cur.path) | ||||||
|  | 
 | ||||||
|  | 		// an error occured, drop out and stop walking | ||||||
|  | 		if err != nil { | ||||||
| 			w.cur.err = err | 			w.cur.err = err | ||||||
| 	if err == nil { |  | ||||||
| 		if len(entries) == 0 { |  | ||||||
| 			w.cur.err = fmt.Errorf("no such file or directory: %s", w.cur.path) |  | ||||||
| 
 |  | ||||||
| 			return false | 			return false | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if isRoot && len(entries) == 1 && entries[0].Type == EntryTypeFile { | 		for _, entry := range entries { | ||||||
| 			w.cur.err = fmt.Errorf("root is not a directory: %s", w.cur.path) | 			if entry.Name == "." || entry.Name == ".." { | ||||||
| 
 |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		for i, entry := range entries { |  | ||||||
| 			if entry.Name == "." || (i == 0 && entry.Type == EntryTypeFile) { |  | ||||||
| 				entry.Name = path.Base(w.cur.path) |  | ||||||
| 				w.cur.entry = entry |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			if entry.Name == ".." || !w.descend { |  | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -74,9 +60,12 @@ func (w *Walker) Next() bool { | |||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// update cur | ||||||
| 	i := len(w.stack) - 1 | 	i := len(w.stack) - 1 | ||||||
| 	w.cur = w.stack[i] | 	w.cur = w.stack[i] | ||||||
| 	w.stack = w.stack[:i] | 	w.stack = w.stack[:i] | ||||||
|  | 
 | ||||||
|  | 	// reset SkipDir | ||||||
| 	w.descend = true | 	w.descend = true | ||||||
| 
 | 
 | ||||||
| 	return true | 	return true | ||||||
|  | |||||||
| @ -184,3 +184,26 @@ func TestCurAndStackSetCorrectly(t *testing.T) { | |||||||
| 	assert.Equal(0, len(w.stack)) | 	assert.Equal(0, len(w.stack)) | ||||||
| 	assert.Equal("file", w.cur.entry.Name) | 	assert.Equal("file", w.cur.entry.Name) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestCurInit(t *testing.T) { | ||||||
|  | 	mock, err := newFtpMock(t, "127.0.0.1") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	defer mock.Close() | ||||||
|  | 
 | ||||||
|  | 	c, cErr := Connect(mock.Addr()) | ||||||
|  | 	if cErr != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	w := c.Walk("/root") | ||||||
|  | 
 | ||||||
|  | 	result := w.Next() | ||||||
|  | 
 | ||||||
|  | 	// mock fs has one file 'lo' | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, true, result, "Result should return false") | ||||||
|  | 	assert.Equal(t, 0, len(w.stack)) | ||||||
|  | 	assert.Equal(t, "/root/lo", w.Path()) | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user