Follow symlinks in repo

This commit is contained in:
Jakob Borg 2013-12-15 21:20:50 +01:00
parent bef9ccfa71
commit 251b109d14
3 changed files with 46 additions and 17 deletions

View File

@ -46,9 +46,10 @@ The following features are _currently implemented and working_:
* Handling of deleted files. Deletes can be propagated or ignored per * Handling of deleted files. Deletes can be propagated or ignored per
client. client.
The following features are _not yet implemented but planned_: * Synchronizing multiple unrelated directory tries by following
symlinks directly below the repository level.
* Syncing multiple directories from the same syncthing instance. The following features are _not yet implemented but planned_:
* Change detection by listening to file system notifications instead of * Change detection by listening to file system notifications instead of
periodic scanning. periodic scanning.
@ -58,6 +59,8 @@ The following features are _not yet implemented but planned_:
The following features are _not implemented but may be implemented_ in The following features are _not implemented but may be implemented_ in
the future: the future:
* Syncing multiple directories from the same syncthing instance.
* Automatic remote node discovery using a DHT. This is not technically * Automatic remote node discovery using a DHT. This is not technically
very difficult but requires one or more globally reachable root very difficult but requires one or more globally reachable root
nodes. This is open for discussion -- perhaps we can piggyback on an nodes. This is open for discussion -- perhaps we can piggyback on an

View File

@ -34,7 +34,7 @@ Options:
--ro Local repository is read only --ro Local repository is read only
--scan-intv <s> Repository scan interval, in seconds [default: 60] --scan-intv <s> Repository scan interval, in seconds [default: 60]
--conn-intv <s> Node reconnect interval, in seconds [default: 15] --conn-intv <s> Node reconnect interval, in seconds [default: 15]
--no-stats Don't print transfer statistics --no-symlinks Don't follow first level symlinks in the repo
Help Options: Help Options:
-h, --help Show this help -h, --help Show this help
@ -63,8 +63,8 @@ var (
traceNet bool traceNet bool
traceFile bool traceFile bool
traceIdx bool traceIdx bool
printStats bool
doDelete bool doDelete bool
followSymlinks bool
) )
func main() { func main() {
@ -95,7 +95,7 @@ func main() {
traceFile = arguments["--trace-file"].(bool) traceFile = arguments["--trace-file"].(bool)
traceNet = arguments["--trace-net"].(bool) traceNet = arguments["--trace-net"].(bool)
traceIdx = arguments["--trace-idx"].(bool) traceIdx = arguments["--trace-idx"].(bool)
printStats = !arguments["--no-stats"].(bool) followSymlinks = !arguments["--no-symlinks"].(bool)
// Ensure that our home directory exists and that we have a certificate and key. // Ensure that our home directory exists and that we have a certificate and key.
@ -302,7 +302,7 @@ func connect(myID string, addr string, nodeAddrs map[string][]string, m *Model,
} }
func updateLocalModel(m *Model) { func updateLocalModel(m *Model) {
files := Walk(m.Dir(), m) files := Walk(m.Dir(), m, followSymlinks)
m.ReplaceLocal(files) m.ReplaceLocal(files)
saveIndex(m) saveIndex(m)
} }

28
walk.go
View File

@ -89,13 +89,39 @@ func genWalker(base string, res *[]File, model *Model) filepath.WalkFunc {
} }
} }
func Walk(dir string, model *Model) []File { func Walk(dir string, model *Model, followSymlinks bool) []File {
var files []File var files []File
fn := genWalker(dir, &files, model) fn := genWalker(dir, &files, model)
err := filepath.Walk(dir, fn) err := filepath.Walk(dir, fn)
if err != nil { if err != nil {
warnln(err) warnln(err)
} }
if followSymlinks {
d, err := os.Open(dir)
if err != nil {
warnln(err)
return files
}
fis, err := d.Readdir(-1)
if err != nil {
warnln(err)
return files
}
d.Close()
for _, fi := range fis {
if fi.Mode()&os.ModeSymlink != 0 {
if traceFile {
debugf("Following symlink %q", fi.Name())
}
err := filepath.Walk(path.Join(dir, fi.Name())+"/", fn)
if err != nil {
warnln(err)
}
}
}
}
return files return files
} }