Skip to content
This repository was archived by the owner on Aug 12, 2020. It is now read-only.

Commit 8dcdac6

Browse files
committed
fix: exporter: when subtree is specified, result paths are not complete
1 parent 62cc871 commit 8dcdac6

File tree

4 files changed

+58
-31
lines changed

4 files changed

+58
-31
lines changed

src/exporter/dir-flat.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@ const cat = require('pull-cat')
1010
module.exports = dirExporter
1111

1212
function dirExporter (node, name, pathRest, ipldResolver, resolve, parent) {
13-
const accepts = pathRest.shift()
13+
const accepts = pathRest[0]
1414

1515
const dir = {
1616
path: name,
1717
hash: node.multihash
1818
}
1919

20-
return cat([
21-
pull.values([dir]),
20+
const streams = [
2221
pull(
2322
pull.values(node.links),
2423
pull.map((link) => ({
@@ -32,9 +31,18 @@ function dirExporter (node, name, pathRest, ipldResolver, resolve, parent) {
3231
return cb(err)
3332
}
3433

35-
cb(null, resolve(n.value, item.path, pathRest, ipldResolver, name, parent))
34+
cb(null, resolve(n.value, accepts || item.path, pathRest, ipldResolver, name, parent))
3635
})),
3736
pull.flatten()
3837
)
39-
])
38+
]
39+
40+
// place dir before if not specifying subtree
41+
if (!pathRest.length) {
42+
streams.unshift(pull.values([dir]))
43+
}
44+
45+
pathRest.shift()
46+
47+
return cat(streams)
4048
}

src/exporter/dir-hamt-sharded.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,23 @@ function shardedDirExporter (node, name, pathRest, ipldResolver, resolve, parent
1919
}]
2020
}
2121

22-
return cat([
23-
pull.values(dir),
22+
const streams = [
2423
pull(
2524
pull.values(node.links),
2625
pull.map((link) => {
2726
// remove the link prefix (2 chars for the bucket index)
2827
const p = link.name.substring(2)
2928
const pp = p ? path.join(name, p) : name
3029
let accept = true
30+
let fromPathRest = false
3131

3232
if (p && pathRest.length) {
33+
fromPathRest = true
3334
accept = (p === pathRest[0])
3435
}
3536
if (accept) {
3637
return {
38+
fromPathRest: fromPathRest,
3739
name: p,
3840
path: pp,
3941
hash: link.multihash,
@@ -49,9 +51,22 @@ function shardedDirExporter (node, name, pathRest, ipldResolver, resolve, parent
4951
return cb(err)
5052
}
5153

52-
cb(null, resolve(n.value, item.path, item.pathRest, ipldResolver, (dir && dir[0]) || parent))
54+
cb(
55+
null,
56+
resolve(
57+
n.value,
58+
item.fromPathRest ? item.name : item.path,
59+
item.pathRest,
60+
ipldResolver,
61+
(dir && dir[0]) || parent))
5362
})),
5463
pull.flatten()
5564
)
56-
])
65+
]
66+
67+
if (!pathRest.length) {
68+
streams.unshift(pull.values(dir))
69+
}
70+
71+
return cat(streams)
5772
}

test/test-dirbuilder-sharding.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,15 +344,12 @@ module.exports = (repo) => {
344344

345345
function collected (err, nodes) {
346346
expect(err).to.not.exist()
347-
expect(nodes.length).to.equal(4)
347+
expect(nodes.length).to.equal(1)
348348
expect(nodes.map((node) => node.path)).to.deep.equal([
349-
'QmTm3ZdKxyDLvcEePEvGfB2QReXsiAF7f39yjRcWwWrA6d',
350-
'QmTm3ZdKxyDLvcEePEvGfB2QReXsiAF7f39yjRcWwWrA6d/big',
351-
'QmTm3ZdKxyDLvcEePEvGfB2QReXsiAF7f39yjRcWwWrA6d/big/big',
352-
'QmTm3ZdKxyDLvcEePEvGfB2QReXsiAF7f39yjRcWwWrA6d/big/big/2000'
349+
'2000'
353350
])
354351
pull(
355-
nodes[3].content,
352+
nodes[0].content,
356353
pull.collect((err, content) => {
357354
expect(err).to.not.exist()
358355
expect(content.toString()).to.equal('2000')

test/test-export-subtree.js

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,27 @@ module.exports = (repo) => {
3232
pull(
3333
exporter(hash, ipldResolver),
3434
pull.collect((err, files) => {
35+
expect(err).to.not.exist()
36+
expect(files.length).to.equal(1)
37+
expect(files[0].path).to.equal('200Bytes.txt')
38+
fileEql(files[0], smallFile, done)
39+
})
40+
)
41+
})
42+
43+
it('export dir 1 level down', (done) => {
44+
const hash = 'QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN/level-1'
45+
46+
pull(
47+
exporter(hash, ipldResolver),
48+
pull.collect((err, files) => {
49+
console.log(files)
3550
expect(err).to.not.exist()
3651
expect(files.length).to.equal(3)
37-
expect(files[0].path).to.equal('QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN')
38-
expect(files[0].content).to.not.exist()
39-
expect(files[1].path).to.equal('QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN/level-1')
40-
expect(files[1].content).to.not.exist()
41-
expect(files[2].path).to.equal('QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN/level-1/200Bytes.txt')
42-
fileEql(files[2], smallFile, done)
52+
expect(files[0].path).to.equal('level-1')
53+
expect(files[1].path).to.equal('level-1/200Bytes.txt')
54+
expect(files[2].path).to.equal('level-1/level-2')
55+
fileEql(files[1], smallFile, done)
4356
})
4457
)
4558
})
@@ -51,9 +64,7 @@ module.exports = (repo) => {
5164
exporter(hash, ipldResolver),
5265
pull.collect((err, files) => {
5366
expect(err).to.not.exist()
54-
expect(files.length).to.equal(1)
55-
expect(files[0].path).to.equal('QmWChcSFMNcFkfeJtNd8Yru1rE6PhtCRfewi1tMwjkwKjN')
56-
expect(files[0].content).to.not.exist()
67+
expect(files.length).to.equal(0)
5768
done()
5869
})
5970
)
@@ -69,13 +80,9 @@ module.exports = (repo) => {
6980
exporter(nodeCID + '/a/file/level-1/200Bytes.txt', ipldResolver),
7081
pull.collect((err, files) => {
7182
expect(err).to.not.exist()
72-
expect(files.length).to.equal(3)
73-
expect(files[0].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file')
74-
expect(files[0].content).to.not.exist()
75-
expect(files[1].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file/level-1')
76-
expect(files[1].content).to.not.exist()
77-
expect(files[2].path).to.equal('zdpuAzp9okHgbLQdmusXn8cRjr9js6nAM4JrvKDeqp2XEkFzD/a/file/level-1/200Bytes.txt')
78-
fileEql(files[2], smallFile, done)
83+
expect(files.length).to.equal(1)
84+
expect(files[0].path).to.equal('200Bytes.txt')
85+
fileEql(files[0], smallFile, done)
7986
})
8087
)
8188
})

0 commit comments

Comments
 (0)