   (def xdb3 (rels->pldb [r-tree] (fress/read (fress/write (pldb-rels xdb1)))))
   (pldb/with-db xdb3 (l/run* [a] (r-tree a :b :c :d)))
 
-  (time (def db (apply pldb/db (git-logic-tuples "<git repo>"))))
-  (time (fress-spit-seq "tmp.frs" (pldb-rels db)))
-  (time (def db2
+  (time (def db (apply pldb/db (git-logic-tuples (io/file voom-repos "lein-voom")))))
+  (time (def db2 (add-r-projs (io/file voom-repos "lein-voom") db)))
+  (time (fress-spit-seq "tmp.frs" (pldb-rels db2)))
+  (time (def db3
           (rels->pldb [r-branch r-commit r-commit-parent r-tree r-proj]
                       (fress/read "tmp.frs" :handlers my-read-handlers))))
   (time (def x (fress/read "tmp.frs" :handlers my-read-handlers)))

  (time
   (let [fname "core.clj"]
     (doall
      (pldb/with-db db
        (l/run 10 [c-sha tree-path obj-sha]
               (l/fresh [tree-sha ctime p-sha p-ctime p-tree-sha p-obj-sha]
                        (r-commit c-sha ctime tree-sha)

      (when-not (= 128 (:exit (ex-data e)))
        (println "Ignoring error:" (pr-str e)))
      nil)))
(defn robust-read-proj-blob
  [gitdir blob-sha]
  ;; Hack to work around crazy project.clj files
  (binding [slurp (patch-fn slurp "{}")
            load-file (patch-fn load-file {})]
    (let [tmp-file (File/createTempFile ".project-" ".clj")]
      (try
        (spit tmp-file
              (:out (git {:gitdir gitdir} "cat-file" "-p" (str blob-sha))))
        (project/read (str tmp-file))
        (catch Exception e
          ;; It was really just a best effort anyway. Silently ignore.
          nil)
        (finally
         (.delete tmp-file))))))

(defn origin-branches
  [gitdir]
