From 399ce367a1dbc531b52fe228ee4212008c9a1091 Mon Sep 17 00:00:00 2001 From: Yusef Napora Date: Mon, 19 Jul 2021 10:34:25 -0400 Subject: [PATCH] fix: make "ipfs resolve" cli command recursive by default (#3707) This changes the default behaviour of the `jsipfs resolve` cli command to be recursive by default. Closes #3692. ```shell # in packages/ipfs node src/cli.js resolve /ipns/ipfs.io /ipfs/bafybeiagozluzfopjadeigrjlsmktseozde2xc5prvighob7452imnk76a ``` BREAKING CHANGE: resolve is now recursive by default Co-authored-by: Alex Potsides --- .../src/miscellaneous/resolve.js | 19 +++++++++++++++++-- packages/ipfs-cli/src/commands/resolve.js | 2 +- packages/ipfs-cli/test/resolve.js | 15 ++++++--------- packages/ipfs-core/src/components/resolve.js | 4 ++-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/interface-ipfs-core/src/miscellaneous/resolve.js b/packages/interface-ipfs-core/src/miscellaneous/resolve.js index 425d6dda48..48c94e6c49 100644 --- a/packages/interface-ipfs-core/src/miscellaneous/resolve.js +++ b/packages/interface-ipfs-core/src/miscellaneous/resolve.js @@ -85,7 +85,7 @@ module.exports = (common, options) => { expect(isIpfs.ipfsPath(resolved)).to.be.true() }) - it('should resolve IPNS link recursively', async function () { + it('should resolve IPNS link recursively by default', async function () { this.timeout(20 * 1000) // webworkers are not dialable because webrtc is not available const node = (await common.spawn({ type: isWebWorker ? 'go' : undefined })).api @@ -96,8 +96,23 @@ module.exports = (common, options) => { await ipfs.name.publish(path, { allowOffline: true }) await ipfs.name.publish(`/ipns/${ipfs.peerId.id}`, { allowOffline: true, key: 'key-name', resolve: false }) - return expect(await ipfs.resolve(`/ipns/${keyId}`, { recursive: true })) + return expect(await ipfs.resolve(`/ipns/${keyId}`)) .to.eq(`/ipfs/${path}`) }) + + it('should resolve IPNS link non-recursively if recursive==false', async function () { + this.timeout(20 * 1000) + // webworkers are not dialable because webrtc is not available + const node = (await common.spawn({ type: isWebWorker ? 'go' : undefined })).api + await ipfs.swarm.connect(node.peerId.addresses[0]) + const { path } = await ipfs.add(uint8ArrayFromString('should resolve an IPNS key if recursive === false')) + const { id: keyId } = await ipfs.key.gen('new-key-name', { type: 'rsa', size: 2048 }) + + await ipfs.name.publish(path, { allowOffline: true }) + await ipfs.name.publish(`/ipns/${ipfs.peerId.id}`, { allowOffline: true, key: 'new-key-name', resolve: false }) + + return expect(await ipfs.resolve(`/ipns/${keyId}`, { recursive: false })) + .to.eq(`/ipns/${ipfs.peerId.id}`) + }) }) } diff --git a/packages/ipfs-cli/src/commands/resolve.js b/packages/ipfs-cli/src/commands/resolve.js index da40571c03..28c2011350 100644 --- a/packages/ipfs-cli/src/commands/resolve.js +++ b/packages/ipfs-cli/src/commands/resolve.js @@ -14,7 +14,7 @@ module.exports = { recursive: { alias: 'r', type: 'boolean', - default: false + default: true }, 'cid-base': { describe: 'Number base to display CIDs in.', diff --git a/packages/ipfs-cli/test/resolve.js b/packages/ipfs-cli/test/resolve.js index 7ab661a997..1da6e699cd 100644 --- a/packages/ipfs-cli/test/resolve.js +++ b/packages/ipfs-cli/test/resolve.js @@ -7,7 +7,7 @@ const cli = require('./utils/cli') const sinon = require('sinon') const defaultOptions = { - recursive: false, + recursive: true, cidBase: 'base58btc', timeout: undefined } @@ -31,27 +31,24 @@ describe('resolve', () => { expect(out).to.equal(resolved + '\n') }) - it('resolves a CID recursively', async () => { + it('resolves a CID recursively by default', async () => { const resolved = `/ipfs/${cid}` - ipfs.resolve.withArgs(cid.toString(), { - ...defaultOptions, - recursive: true - }).resolves(resolved) + ipfs.resolve.withArgs(cid.toString(), defaultOptions).resolves(resolved) const out = await cli(`resolve ${cid} --recursive`, { ipfs }) expect(out).to.equal(resolved + '\n') }) - it('resolves a CID recursively (short option)', async () => { + it('allows non-recursive lookups with flag', async () => { const resolved = `/ipfs/${cid}` ipfs.resolve.withArgs(cid.toString(), { ...defaultOptions, - recursive: true + recursive: false }).resolves(resolved) - const out = await cli(`resolve ${cid} -r`, { ipfs }) + const out = await cli(`resolve ${cid} --recursive=false`, { ipfs }) expect(out).to.equal(resolved + '\n') }) diff --git a/packages/ipfs-core/src/components/resolve.js b/packages/ipfs-core/src/components/resolve.js index 9ad17151a5..fb8b408892 100644 --- a/packages/ipfs-core/src/components/resolve.js +++ b/packages/ipfs-core/src/components/resolve.js @@ -27,13 +27,13 @@ module.exports = ({ repo, codecs, bases, name }) => { } } - const [, , hash, ...rest] = path.split('/') // ['', 'ipfs', 'hash', ...path] + const [, schema, hash, ...rest] = path.split('/') // ['', 'ipfs', 'hash', ...path] const cid = CID.parse(hash) const base = opts.cidBase ? await bases.getBase(opts.cidBase) : undefined // nothing to resolve return the input if (rest.length === 0) { - return `/ipfs/${cid.toString(base && base.encoder)}` + return `/${schema}/${cid.toString(base && base.encoder)}` } path = rest.join('/')