129
129
:db/doc " filename of a tree node"
130
130
:db.install/_attribute :db.part/db }
131
131
132
+ {:db/id #db/id[:db.part/db ]
133
+ :db/ident :git/paths
134
+ :db/valueType :db.type/ref
135
+ :db/cardinality :db.cardinality/many
136
+ :db/doc " paths of a tree node"
137
+ :db.install/_attribute :db.part/db }
138
+
132
139
{:db/id #db/id[:db.part/db ]
133
140
:db/ident :git/object
134
141
:db/valueType :db.type/ref
280
287
authorid (email->id author)
281
288
committerid (email->id committer)
282
289
cid (d/tempid :db.part/user )
283
- tx-data (fn f [[sha type filename]]
284
- (let [id (sha->id sha)
290
+ tx-data (fn f [inpath [sha type filename]]
291
+ (let [path (str inpath filename)
292
+ id (sha->id sha)
285
293
filenameid (filename->id filename)
294
+ pathid (filename->id path)
286
295
nodeid (or (and (not (tempid? id))
287
296
(not (tempid? filenameid))
288
297
(ffirst (d/q '[:find ?e :in $ ?filename ?id
289
298
:where [?e :git/filename ?filename] [?e :git/object ?id]]
290
299
db filenameid id)))
291
300
(d/tempid :db.part/user ))
301
+ newpath (or (tempid? pathid) (tempid? nodeid)
302
+ (not (ffirst (d/q '[:find ?node :in $ ?path
303
+ :where [?node :git/paths ?path]]
304
+ db pathid))))
292
305
data (cond-> []
293
306
(tempid? filenameid) (conj [:db/add filenameid :file/name filename])
307
+ (tempid? pathid) (conj [:db/add pathid :file/name path])
294
308
(tempid? nodeid) (conj {:db/id nodeid :git/filename filenameid :git/object id})
309
+ newpath (conj [:db/add nodeid :git/paths pathid])
295
310
(tempid? id) (conj {:db/id id :git/sha sha :git/type type}))
296
- data (if (and ( tempid? id) (= type :tree ))
311
+ data (if (and newpath (= type :tree ))
297
312
(let [es (dir sha)]
298
313
(reduce (fn [data child]
299
- (let [[cid cdata] (f child)
314
+ (let [[cid cdata] (f ( str path " / " ) child)
300
315
data (into data cdata)]
301
- (conj data [:db/add id :git/nodes cid])))
316
+ (cond-> data
317
+ (tempid? id) (conj [:db/add id :git/nodes cid]))))
302
318
data es))
303
319
data)]
304
320
[nodeid data]))
305
- [treeid treedata] (tx-data [tree :tree repo-name])
321
+ [treeid treedata] (tx-data nil [tree :tree repo-name])
306
322
tx (into treedata
307
323
[[:db/add repo :git/commits cid]
308
324
{:db/id (d/tempid :db.part/tx )
404
420
(def conn (d/connect uri))
405
421
(def db (d/db conn))
406
422
(seq (d/datoms db :aevt :file/name ))
407
- (seq (d/datoms db :aevt :git/tree ))
423
+ (seq (d/datoms db :aevt :git/object ))
408
424
(d/q '[:find ?e :where [?f :file/name " core.clj" ] [?n :git/filename ?f] [?n :git/object ?e]] db)
409
425
)
0 commit comments