+47
-17
@@ -73,7 +73,15 @@ type ScanResult struct {
|
||||
}
|
||||
|
||||
func Walk(ctx context.Context, cfg Config) chan ScanResult {
|
||||
w := walker{cfg}
|
||||
return newWalker(cfg).walk(ctx)
|
||||
}
|
||||
|
||||
func WalkWithoutHashing(ctx context.Context, cfg Config) chan ScanResult {
|
||||
return newWalker(cfg).walkWithoutHashing(ctx)
|
||||
}
|
||||
|
||||
func newWalker(cfg Config) *walker {
|
||||
w := &walker{cfg}
|
||||
|
||||
if w.CurrentFiler == nil {
|
||||
w.CurrentFiler = noCurrentFiler{}
|
||||
@@ -85,7 +93,7 @@ func Walk(ctx context.Context, cfg Config) chan ScanResult {
|
||||
w.Matcher = ignore.New(w.Filesystem)
|
||||
}
|
||||
|
||||
return w.walk(ctx)
|
||||
return w
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -108,21 +116,7 @@ func (w *walker) walk(ctx context.Context) chan ScanResult {
|
||||
|
||||
// A routine which walks the filesystem tree, and sends files which have
|
||||
// been modified to the counter routine.
|
||||
go func() {
|
||||
hashFiles := w.walkAndHashFiles(ctx, toHashChan, finishedChan)
|
||||
if len(w.Subs) == 0 {
|
||||
w.Filesystem.Walk(".", hashFiles)
|
||||
} else {
|
||||
for _, sub := range w.Subs {
|
||||
if err := osutil.TraversesSymlink(w.Filesystem, filepath.Dir(sub)); err != nil {
|
||||
l.Debugf("Skip walking %v as it is below a symlink", sub)
|
||||
continue
|
||||
}
|
||||
w.Filesystem.Walk(sub, hashFiles)
|
||||
}
|
||||
}
|
||||
close(toHashChan)
|
||||
}()
|
||||
go w.scan(ctx, toHashChan, finishedChan)
|
||||
|
||||
// We're not required to emit scan progress events, just kick off hashers,
|
||||
// and feed inputs directly from the walker.
|
||||
@@ -203,6 +197,42 @@ func (w *walker) walk(ctx context.Context) chan ScanResult {
|
||||
return finishedChan
|
||||
}
|
||||
|
||||
func (w *walker) walkWithoutHashing(ctx context.Context) chan ScanResult {
|
||||
l.Debugln("Walk without hashing", w.Subs, w.Matcher)
|
||||
|
||||
toHashChan := make(chan protocol.FileInfo)
|
||||
finishedChan := make(chan ScanResult)
|
||||
|
||||
// A routine which walks the filesystem tree, and sends files which have
|
||||
// been modified to the counter routine.
|
||||
go w.scan(ctx, toHashChan, finishedChan)
|
||||
|
||||
go func() {
|
||||
for file := range toHashChan {
|
||||
finishedChan <- ScanResult{File: file}
|
||||
}
|
||||
close(finishedChan)
|
||||
}()
|
||||
|
||||
return finishedChan
|
||||
}
|
||||
|
||||
func (w *walker) scan(ctx context.Context, toHashChan chan<- protocol.FileInfo, finishedChan chan<- ScanResult) {
|
||||
hashFiles := w.walkAndHashFiles(ctx, toHashChan, finishedChan)
|
||||
if len(w.Subs) == 0 {
|
||||
w.Filesystem.Walk(".", hashFiles)
|
||||
} else {
|
||||
for _, sub := range w.Subs {
|
||||
if err := osutil.TraversesSymlink(w.Filesystem, filepath.Dir(sub)); err != nil {
|
||||
l.Debugf("Skip walking %v as it is below a symlink", sub)
|
||||
continue
|
||||
}
|
||||
w.Filesystem.Walk(sub, hashFiles)
|
||||
}
|
||||
}
|
||||
close(toHashChan)
|
||||
}
|
||||
|
||||
func (w *walker) walkAndHashFiles(ctx context.Context, toHashChan chan<- protocol.FileInfo, finishedChan chan<- ScanResult) fs.WalkFunc {
|
||||
now := time.Now()
|
||||
ignoredParent := ""
|
||||
|
||||
Reference in New Issue
Block a user