Skip to content
This repository has been archived by the owner on Aug 11, 2021. It is now read-only.

Commit

Permalink
feat: add git support!
Browse files Browse the repository at this point in the history
  • Loading branch information
magik6k authored and daviddias committed Sep 2, 2017
1 parent d9069c8 commit 97d8fc3
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 2 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"ipld-dag-cbor": "~0.11.1",
"ipld-dag-pb": "~0.11.0",
"ipld-eth-star": "^1.4.1",
"ipld-git": "^0.1.0",
"is-ipfs": "~0.3.0",
"lodash.flatten": "^4.4.0",
"lodash.includes": "^4.3.0",
Expand All @@ -73,4 +74,4 @@
"kumavis <kumavis@users.noreply.github.com>",
"wanderer <mjbecze@gmail.com>"
]
}
}
7 changes: 6 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const MemoryStore = require('interface-datastore').MemoryDatastore

const dagPB = require('ipld-dag-pb')
const dagCBOR = require('ipld-dag-cbor')
const ipldGit = require('ipld-git')
const ipldEthAccountSnapshot = require('ipld-eth-star').ethAccountSnapshot
const ipldEthBlock = require('ipld-eth-star').ethBlock
const ipldEthBlockList = require('ipld-eth-star').ethBlockList
Expand Down Expand Up @@ -55,7 +56,7 @@ class IPLDResolver {
}
}

// Support by default dag-pb, dag-cbor, and eth-*
// Support by default dag-pb, dag-cbor, git, and eth-*
this.support.add(dagPB.resolver.multicodec,
dagPB.resolver,
dagPB.util)
Expand All @@ -64,6 +65,10 @@ class IPLDResolver {
dagCBOR.resolver,
dagCBOR.util)

this.support.add(ipldGit.resolver.multicodec,
ipldGit.resolver,
ipldGit.util)

this.support.add(ipldEthAccountSnapshot.resolver.multicodec,
ipldEthAccountSnapshot.resolver,
ipldEthAccountSnapshot.util)
Expand Down
1 change: 1 addition & 0 deletions test/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ describe('Browser', () => {
require('./basics')(repo)
require('./ipld-dag-pb')(repo)
require('./ipld-dag-cbor')(repo)
require('./ipld-git')(repo)
require('./ipld-eth-block')(repo)
require('./ipld-eth-star')(repo)
require('./ipld-all')
Expand Down
253 changes: 253 additions & 0 deletions test/ipld-git.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
/* eslint-env mocha */
'use strict'

const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const BlockService = require('ipfs-block-service')
const ipldGit = require('ipld-git')
const series = require('async/series')
const each = require('async/each')
const pull = require('pull-stream')

const IPLDResolver = require('../src')

module.exports = (repo) => {
describe('IPLD Resolver with ipld-git', () => {
let resolver

let blobNode
let treeNode
let commitNode
let commit2Node
let tagNode

let blobCid
let treeCid
let commitCid
let commit2Cid
let tagCid

before((done) => {
const bs = new BlockService(repo)

resolver = new IPLDResolver(bs)

series([
(cb) => {
blobNode = new Buffer('626c6f62203800736f6d6564617461', 'hex') // blob 8\0somedata

ipldGit.util.cid(blobNode, (err, cid) => {
expect(err).to.not.exist()
blobCid = cid
cb()
})
},
(cb) => {
treeNode = {
somefile: {
hash: {'/': blobCid.buffer},
mode: '100644'
}
}

ipldGit.util.cid(treeNode, (err, cid) => {
expect(err).to.not.exist()
treeCid = cid
cb()
})
},
(cb) => {
commitNode = {
gitType: 'commit',
tree: {'/': treeCid.buffer},
parents: [],
author: {
name: 'John Doe',
email: 'johndoe@example.com',
date: '1497302532 +0200'
},
committer: {
name: 'John Doe',
email: 'johndoe@example.com',
date: '1497302532 +0200'
},
message: 'Initial commit\n'
}

ipldGit.util.cid(commitNode, (err, cid) => {
expect(err).to.not.exist()
commitCid = cid
cb()
})
},
(cb) => {
commit2Node = {
gitType: 'commit',
tree: {'/': treeCid.buffer},
parents: [
{'/': commitCid.buffer}
],
author: {
name: 'John Doe',
email: 'johndoe@example.com',
date: '1497302533 +0200'
},
committer: {
name: 'John Doe',
email: 'johndoe@example.com',
date: '1497302533 +0200'
},
message: 'Change nothing\n'
}

ipldGit.util.cid(commit2Node, (err, cid) => {
expect(err).to.not.exist()
commit2Cid = cid
cb()
})
},
(cb) => {
tagNode = {
gitType: 'tag',
object: {'/': commit2Cid.buffer},
type: 'commit',
tag: 'v0.0.0',
tagger: {
name: 'John Doe',
email: 'johndoe@example.com',
date: '1497302534 +0200'
},
message: 'First release\n'
}

ipldGit.util.cid(tagNode, (err, cid) => {
expect(err).to.not.exist()
tagCid = cid
cb()
})
}
], store)

function store () {
pull(
pull.values([
{ node: blobNode, cid: blobCid },
{ node: treeNode, cid: treeCid },
{ node: commitNode, cid: commitCid },
{ node: commit2Node, cid: commit2Cid },
{ node: tagNode, cid: tagCid }
]),
pull.asyncMap((nac, cb) => resolver.put(nac.node, { cid: nac.cid }, cb)),
pull.onEnd(done)
)
}
})

describe('internals', () => {
it('resolver._put', (done) => {
each([
{ node: blobNode, cid: blobCid },
{ node: treeNode, cid: treeCid },
{ node: commitNode, cid: commitCid },
{ node: commit2Node, cid: commit2Cid },
{ node: tagNode, cid: tagCid }
], (nc, cb) => {
resolver._put(nc.cid, nc.node, cb)
}, done)
})

it('resolver._get', (done) => {
resolver.put(blobNode, { cid: blobCid }, (err) => {
expect(err).to.not.exist()
resolver.get(blobCid, (err, result) => {
expect(err).to.not.exist()
expect(blobNode.toString('hex')).to.eql(result.value.toString('hex'))
done()
})
})
})
})

describe('public api', () => {
it('resolver.put', (done) => {
resolver.put(blobNode, { cid: blobCid }, done)
})

it('resolver.get root path', (done) => {
resolver.get(blobCid, '/', (err, result) => {
expect(err).to.not.exist()

ipldGit.util.cid(result.value, (err, cid) => {
expect(err).to.not.exist()
expect(cid).to.eql(blobCid)
done()
})
})
})

it('value within 1st node scope', (done) => {
resolver.get(commitCid, 'message', (err, result) => {
expect(err).to.not.exist()
expect(result.value).to.eql('Initial commit\n')
done()
})
})

it('value within nested node scope (commit/tree)', (done) => {
resolver.get(commitCid, 'tree/somefile/mode', (err, result) => {
expect(err).to.not.exist()
expect(result.value).to.eql('100644')
done()
})
})

it('value within nested node scope (commit/tree/blob)', (done) => {
resolver.get(commitCid, 'tree/somefile/hash', (err, result) => {
expect(err).to.not.exist()
expect(blobNode.toString('hex')).to.eql(result.value.toString('hex'))
done()
})
})

it('value within nested node scope (commit/commit/tree/blob)', (done) => {
resolver.get(commit2Cid, 'parents/0/tree/somefile/hash', (err, result) => {
expect(err).to.not.exist()
expect(blobNode.toString('hex')).to.eql(result.value.toString('hex'))
done()
})
})

it('value within nested node scope (tag/commit/commit/tree/blob)', (done) => {
resolver.get(tagCid, 'object/parents/0/tree/somefile/hash', (err, result) => {
expect(err).to.not.exist()
expect(blobNode.toString('hex')).to.eql(result.value.toString('hex'))
done()
})
})

it('resolver.remove', (done) => {
resolver.put(blobNode, { cid: blobCid }, (err) => {
expect(err).to.not.exist()
resolver.get(blobCid, (err, result) => {
expect(err).to.not.exist()
const node = result.value
expect(blobNode.toString('hex')).to.eql(node.toString('hex'))
remove()
})
})

function remove () {
resolver.remove(blobCid, (err) => {
expect(err).to.not.exist()
resolver.get(blobCid, (err) => {
expect(err).to.exist()
done()
})
})
}
})
})
})
}
1 change: 1 addition & 0 deletions test/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ describe('Node.js', () => {
require('./basics')(repo)
require('./ipld-dag-pb')(repo)
require('./ipld-dag-cbor')(repo)
require('./ipld-git')(repo)
require('./ipld-eth-block')(repo)
require('./ipld-eth-star')(repo)
require('./ipld-all')
Expand Down

0 comments on commit 97d8fc3

Please sign in to comment.