Decide once and for all to return filepath.SkipDir or nil

This commit is contained in:
Jakob Borg 2015-03-19 07:44:43 +01:00
parent 8311162be3
commit e947223aaa

View File

@ -108,11 +108,18 @@ func (w *Walker) Walk() (chan protocol.FileInfo, error) {
func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFunc {
now := time.Now()
return func(p string, info os.FileInfo, err error) error {
// Return value used when we are returning early and don't want to
// process the item. For directories, this means do-not-descend.
var skip error // nil
if info.IsDir() {
skip = filepath.SkipDir
}
if err != nil {
if debug {
l.Debugln("error:", p, info, err)
}
return nil
return skip
}
rn, err := filepath.Rel(w.Dir, p)
@ -120,7 +127,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if debug {
l.Debugln("rel error:", p, err)
}
return nil
return skip
}
if rn == "." {
@ -147,18 +154,12 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if debug {
l.Debugln("ignored:", rn)
}
if info.IsDir() {
return filepath.SkipDir
}
return nil
return skip
}
if !utf8.ValidString(rn) {
l.Warnf("File name %q is not in UTF8 encoding; skipping.", rn)
if info.IsDir() {
return filepath.SkipDir
}
return nil
return skip
}
var normalizedRn string
@ -179,10 +180,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
// We're not authorized to do anything about it, so complain and skip.
l.Warnf("File name %q is not in the correct UTF8 normalization form; skipping.", rn)
if info.IsDir() {
return filepath.SkipDir
}
return nil
return skip
}
// We will attempt to normalize it.
@ -191,20 +189,14 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
// Nothing exists with the normalized filename. Good.
if err = os.Rename(p, normalizedPath); err != nil {
l.Infof(`Error normalizing UTF8 encoding of file "%s": %v`, rn, err)
if info.IsDir() {
return filepath.SkipDir
}
return nil
return skip
}
l.Infof(`Normalized UTF8 encoding of file name "%s".`, rn)
} else {
// There is something already in the way at the normalized
// file name.
l.Infof(`File "%s" has UTF8 encoding conflict with another file; ignoring.`, rn)
if info.IsDir() {
return filepath.SkipDir
}
return nil
return skip
}
rn = normalizedRn
@ -213,19 +205,11 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
// Index wise symlinks are always files, regardless of what the target
// is, because symlinks carry their target path as their content.
if info.Mode()&os.ModeSymlink == os.ModeSymlink {
var rval error
// If the target is a directory, do NOT descend down there. This
// will cause files to get tracked, and removing the symlink will
// as a result remove files in their real location. But do not
// SkipDir if the target is not a directory, as it will stop
// scanning the current directory.
if info.IsDir() {
rval = filepath.SkipDir
}
// If we don't support symlinks, skip.
// as a result remove files in their real location.
if !symlinks.Supported {
return rval
return skip
}
// We always rehash symlinks as they have no modtime or
@ -239,7 +223,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if debug {
l.Debugln("readlink error:", p, err)
}
return rval
return skip
}
blocks, err := Blocks(strings.NewReader(target), w.BlockSize, 0)
@ -247,7 +231,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if debug {
l.Debugln("hash link error:", p, err)
}
return rval
return skip
}
if w.CurrentFiler != nil {
@ -260,7 +244,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
// - the block list (i.e. hash of target) was the same
cf, ok := w.CurrentFiler.CurrentFile(rn)
if ok && !cf.IsDeleted() && cf.IsSymlink() && !cf.IsInvalid() && SymlinkTypeEqual(flags, cf.Flags) && BlocksEqual(cf.Blocks, blocks) {
return rval
return skip
}
}
@ -278,7 +262,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
fchan <- f
return rval
return skip
}
if info.Mode().IsDir() {