Skip to content

Instantly share code, notes, and snippets.

@masiulaniec
Last active November 10, 2017 05:03
Show Gist options
  • Save masiulaniec/e0b3a133db1b808a5c80e92cda76c970 to your computer and use it in GitHub Desktop.
Save masiulaniec/e0b3a133db1b808a5c80e92cda76c970 to your computer and use it in GitHub Desktop.

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))
                 }
         }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment