Approach 1: Empty upspin.Event as an indicator of receipt of full tree:
func mirror(upath upspin.PathName, events <-chan upspin.Event) {
// localPath maps the given upspin path to a path in a local file system
localPath := func(remote upspin.Path) string {
... // irrelevant detail
}
os.RemoveAll(localPath(upath))
for e := range events {
de := e.Entry
if e.IsZero() {
println("got full tree")
} else if e.Delete {
os.Remove(localPath(de.Name))
} else if de.IsDir() {
os.Mkdir(localPath(de.Name), 0777)
} else {
download(de, localPath(de.Name))
}
}
}
Approach 2: Root upspin.Event received last as an indicator of receipt of full tree.
func mirror(upath upspin.PathName, events <-chan upspin.Event) {
// localPath maps the given upspin path to a path in a local file system
localPath := func(remote upspin.Path) string {
... // irrelevant detail
}
// samePath reports if two upspin path are syntactically equivalent
samePath := func(a, b upspin.PathName) bool {
return path.Clean(a) == path.Clean(b)
}
os.RemoveAll(localPath(upath))
seenFull := false
for e := range events {
de := e.Entry
if !seenFull && samePath(de.Name, upath) {
seenFull = true
println("got full tree")
} else if e.Delete {
os.Remove(localPath(de.Name))
} else if de.IsDir() {
os.MkdirAll(localPath(de.Name), 0777)
} else {
os.Mkdir(filepath.Dir(localPath(de.Name)), 0777)
download(de, localPath(de.Name))
}
}
}
Diff:
--- a 2017-11-09 21:02:02.000000000 -0800
+++ b 2017-11-09 21:02:10.000000000 -0800
@@ -4,17 +4,25 @@
... // irrelevant detail
}
+ // samePath reports if two upspin path are syntactically equivalent
+ samePath := func(a, b upspin.PathName) bool {
+ return path.Clean(a) == path.Clean(b)
+ }
+
os.RemoveAll(localPath(upath))
+ seenFull := false
for e := range events {
de := e.Entry
- if e.IsZero() {
+ if !seenFull && samePath(de.Name, upath) {
+ seenFull = true
println("got full tree")
} else if e.Delete {
os.Remove(localPath(de.Name))
} else if de.IsDir() {
- os.Mkdir(localPath(de.Name), 0777)
+ os.MkdirAll(localPath(de.Name), 0777)
} else {
+ os.Mkdir(filepath.Dir(localPath(de.Name)), 0777)
download(de, localPath(de.Name))
}
}