Skip to content

Commit

Permalink
support repos, associate commits with repo, root tree is named by repo
Browse files Browse the repository at this point in the history
  • Loading branch information
richhickey committed Oct 4, 2012
1 parent 2fcd551 commit 6cf1230
Showing 1 changed file with 64 additions and 13 deletions.
77 changes: 64 additions & 13 deletions src/datomic/codeq/core.clj
Expand Up @@ -48,6 +48,21 @@
:db/unique :db.unique/identity
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :git/commits
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/doc "Associate repo with these git commits"
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :git/repo
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "A git repo uri"
:db/unique :db.unique/identity
:db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/db]
:db/ident :git/parents
:db/valueType :db.type/ref
Expand Down Expand Up @@ -180,6 +195,27 @@
;;040000 tree 6b880666740300ac57361d5aee1a90488ba1305c src
;;040000 tree 407924e4812c72c880b011b5a1e0b9cb4eb68cfa test

;; example git remote origin
;;RichMacPro:codeq rich$ git remote show -n origin
;;* remote origin
;; Fetch URL: https://github.com/Datomic/codeq.git
;; Push URL: https://github.com/Datomic/codeq.git
;; HEAD branch: (not queried)

(defn get-repo-uri
"returns [uri name]"
[]
(with-open [s (exec-stream (str "git remote show -n origin"))]
(let [es (line-seq s)
^String line (second es)
uri (subs line (inc (.lastIndexOf line " ")))
noff (.lastIndexOf uri "/")
noff (if (not (pos? noff)) (.lastIndexOf uri ":") noff)
name (subs uri (inc noff))
_ (assert (and (pos? (count name)) (.endsWith name ".git")) "Can't find remote origin")
name (subs name 0 (.indexOf name "."))]
[uri name])))

(defn dir
"Returns [[sha :type filename] ...]"
[tree]
Expand Down Expand Up @@ -236,7 +272,7 @@
~g)))

(defn commit-tx-data
[db {:keys [sha msg tree parents author authored committer committed] :as commit}]
[db repo repo-name {:keys [sha msg tree parents author authored committer committed] :as commit}]
(let [tempid? map? ;;todo - better pred
sha->id (index->id-fn db :git/sha)
email->id (index->id-fn db :email/address)
Expand Down Expand Up @@ -266,9 +302,10 @@
data es))
data)]
[nodeid data]))
[treeid treedata] (tx-data [tree :tree ""])
[treeid treedata] (tx-data [tree :tree repo-name])
tx (into treedata
[{:db/id (d/tempid :db.part/tx)
[[:db/add repo :git/commits cid]
{:db/id (d/tempid :db.part/tx)
:git/commit cid
:codeq/op :import}
(cond-> {:db/id cid
Expand Down Expand Up @@ -324,18 +361,30 @@
conn))

(defn import-git
[conn commits]
(doseq [commit commits]
(let [db (d/db conn)]
(println "Importing commit:" (:sha commit))
(d/transact conn (commit-tx-data db commit))))
(d/request-index conn)
(println "Import complete!"))
[conn repo-uri repo-name commits]
;;todo - add already existing commits to new repo if it includes them
(println "Importing repo:" repo-uri "as:" repo-name)
(let [db (d/db conn)
repo
(or (ffirst (d/q '[:find ?e :in $ ?uri :where [?e :git/repo ?uri]] db repo-uri))
(let [temp (d/tempid :db.part/user)
tx-ret @(d/transact conn [[:db/add temp :git/repo repo-uri]])
repo (d/resolve-tempid (d/db conn) (:tempids tx-ret) temp)]
(println "Adding repo" repo-uri)
repo))]
(doseq [commit commits]
(let [db (d/db conn)]
(println "Importing commit:" (:sha commit))
(d/transact conn (commit-tx-data db repo repo-name commit))))
(d/request-index conn)
(println "Import complete!")))

(defn main [& [db-uri commit]]
(if db-uri
(let [conn (ensure-db db-uri)]
(import-git conn (unimported-commits (d/db conn) commit)))
(let [conn (ensure-db db-uri)
[repo-uri repo-name] (get-repo-uri)]
;(prn repo-uri)
(import-git conn repo-uri repo-name (unimported-commits (d/db conn) commit)))
(println "Usage: datomic.codeq.core db-uri [commit-name]")))

(defn -main
Expand All @@ -346,7 +395,7 @@


(comment
(def uri "datomic:mem://codeq")
(def uri "datomic:mem://git")
;;(def uri "datomic:free://localhost:4334/codeq")
(datomic.codeq.core/main uri "c3bd979cfe65da35253b25cb62aad4271430405c")
(datomic.codeq.core/main uri "20f8db11804afc8c5a1752257d5fdfcc2d131d08")
Expand All @@ -355,4 +404,6 @@
(def conn (d/connect uri))
(def db (d/db conn))
(seq (d/datoms db :aevt :file/name))
(seq (d/datoms db :aevt :git/tree))
(d/q '[:find ?e :where [?f :file/name "core.clj"] [?n :git/filename ?f] [?n :git/object ?e]] db)
)

0 comments on commit 6cf1230

Please sign in to comment.