From 230b2264f9671686037739917e914400d580f286 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 21 Nov 2019 12:44:05 -0600 Subject: [PATCH 01/18] feat: support UnixFSv1.5 metadata Adds metadata support. Specifying metadata: ```console $ jsipfs add --mode=0777 --mtime=100000 ./foo.txt ``` Respecting exsting metadata: ```console $ jsipfs add --preserve-mode --preserve-mtime ./foo.txt ``` Displaying metadata: ```console $ jsipfs ls Qmfoo -rw-r--r-- Nov 21, 2019, 09:46:23 AM CST bar.txt Qbar 0 ``` --- package.json | 2 +- src/cli/commands/add.js | 36 ++++++++++++++++- src/cli/commands/ls.js | 4 ++ src/core/components/files-mfs.js | 45 +++++++++++++++++++++- src/core/components/files-regular/utils.js | 4 +- src/http/api/resources/files-regular.js | 4 +- 6 files changed, 90 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index affff2aa55..cf9da6996a 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "ipfs-mfs": "^0.13.2", "ipfs-multipart": "^0.2.0", "ipfs-repo": "^0.30.0", - "ipfs-unixfs": "~0.1.16", + "ipfs-unixfs": "^0.2.0", "ipfs-unixfs-exporter": "^0.38.0", "ipfs-unixfs-importer": "^0.42.0", "ipfs-utils": "~0.4.0", diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index e60e0c78c0..c76e9a2b24 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -8,6 +8,7 @@ const multibase = require('multibase') const { createProgressBar } = require('../utils') const { cidToString } = require('../../utils/cid') const globSource = require('ipfs-utils/src/files/glob-source') +const errcode = require('err-code') async function getTotalBytes (paths) { const sizes = await Promise.all(paths.map(p => getFolderSize(p))) @@ -122,6 +123,32 @@ module.exports = { type: 'boolean', default: false, describe: 'Include files that are hidden. Only takes effect on recursive add.' + }, + 'preserve-mode': { + type: 'boolean', + default: false, + describe: 'Apply permissions to created UnixFS entries' + }, + 'preserve-mtime': { + type: 'boolean', + default: false, + describe: 'Apply modification time to created UnixFS entries' + }, + 'mode': { + type: 'number', + coerce: (value) => parseInt(value, 8), + describe: 'File mode to apply to created UnixFS entries' + }, + 'mtime': { + type: 'number', + coerce: (value) => { + value = parseInt(value) + + if (isNaN(value)) { + throw errcode(new Error('mtime must be a number'), 'ERR_BAD_MTIME') + } + }, + describe: 'Modification in seconds before or since the Unix Epoch to apply to created UnixFS entries' } }, @@ -172,7 +199,14 @@ module.exports = { } const source = argv.file - ? globSource(argv.file, { recursive: argv.recursive, hidden: argv.hidden }) + ? globSource(argv.file, { + recursive: argv.recursive, + hidden: argv.hidden, + preserveMode: argv.preserveMode, + preserveMtime: argv.preserveMtime, + mode: argv.mode, + mtime: argv.mtime + }) : process.stdin // Pipe directly to ipfs.add let finalHash diff --git a/src/cli/commands/ls.js b/src/cli/commands/ls.js index c79eaeee04..5f8d8be42b 100644 --- a/src/cli/commands/ls.js +++ b/src/cli/commands/ls.js @@ -3,6 +3,8 @@ const multibase = require('multibase') const { rightpad } = require('../utils') const { cidToString } = require('../../utils/cid') +const formatMode = require('ipfs-utils/src/files/format-mode') +const formatMtime = require('ipfs-utils/src/files/format-mtime') module.exports = { command: 'ls ', @@ -69,6 +71,8 @@ module.exports = { const padding = Math.max(link.depth - pathParts.length, 0) print( + rightpad(formatMode(link.mode, link.type === 'dir'), 11) + + rightpad(formatMtime(link.mtime), 30) + rightpad(link.hash, multihashWidth + 1) + rightpad(link.size || '-', sizeWidth + 1) + ' '.repeat(padding) + fileName diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index 2a17d9e39c..0cb20e3967 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -28,7 +28,9 @@ const mapLsFile = (options) => { hash: long ? cidToString(file.cid, { base: options.cidBase }) : '', name: file.name, type: long ? file.type : 0, - size: long ? file.size || 0 : 0 + size: long ? file.size || 0 : 0, + mode: file.mode, + mtime: file.mtime } } } @@ -64,6 +66,27 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { } return { + /** + * Change mode + * + * @param {String} path - The path(s) of the source to modify. + * @param {Number} mode - The desired file mode + * @param {Object} [opts] - Options for copy. + * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) + * @param {String} [opts.format=dag-pb] - Format of nodes to write any newly created directories as. (default: dag-pb) + * @param {String} [opts.hashAlg=sha2-256] - Algorithm to use when creating CIDs for newly created directories. (default: sha2-256) {@link https://github.com/multiformats/js-multihash/blob/master/src/constants.js#L5-L343 The list of all possible values} + * @param {boolean} [opts.flush=true] - Whether or not to immediately flush MFS changes to disk (default: true). + * @param {function(Error): void} [cb] - Callback function. + * @returns {Promise | void} When callback is provided nothing is returned. + */ + chmod: (path, mode, opts, cb) => { + if (typeof opts === 'function') { + cb = opts + opts = {} + } + return nodeify(methods.chmod(path, mode, opts), cb) + }, + /** * Copy files * @@ -208,6 +231,26 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { */ readPullStream: (path, opts = {}) => toPullStream.source(methods.read(path, opts)), + /** + * Update modification time + * + * @param {String} path - The path(s) of the source to modify. + * @param {Object} [opts] - Options for copy. + * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) + * @param {String} [opts.format=dag-pb] - Format of nodes to write any newly created directories as. (default: dag-pb) + * @param {String} [opts.hashAlg=sha2-256] - Algorithm to use when creating CIDs for newly created directories. (default: sha2-256) {@link https://github.com/multiformats/js-multihash/blob/master/src/constants.js#L5-L343 The list of all possible values} + * @param {boolean} [opts.flush=true] - Whether or not to immediately flush MFS changes to disk (default: true). + * @param {function(Error): void} [cb] - Callback function. + * @returns {Promise | void} When callback is provided nothing is returned. + */ + touch: (path, opts, cb) => { + if (typeof opts === 'function') { + cb = opts + opts = {} + } + return nodeify(methods.touch(path, opts), cb) + }, + /** * Write to a file. * diff --git a/src/core/components/files-regular/utils.js b/src/core/components/files-regular/utils.js index 8cd05f45d4..5dc0a1d28a 100644 --- a/src/core/components/files-regular/utils.js +++ b/src/core/components/files-regular/utils.js @@ -115,7 +115,9 @@ const mapFile = (file, options) => { name: file.name, depth: file.path.split('/').length, size, - type + type, + mtime: file.unixfs.mtime, + mode: file.unixfs.mode } if (options.includeContent && file.unixfs && file.unixfs.type === 'file') { diff --git a/src/http/api/resources/files-regular.js b/src/http/api/resources/files-regular.js index 4c466f6959..c4aa4ef496 100644 --- a/src/http/api/resources/files-regular.js +++ b/src/http/api/resources/files-regular.js @@ -299,7 +299,9 @@ exports.ls = { Hash: cidToString(file.hash, { base: cidBase }), Size: file.size, Type: toTypeCode(file.type), - Depth: file.depth + Depth: file.depth, + Mode: file.mode.toString(8).padStart(4, '0'), + Mtime: file.mtime })) }] }) From 6f8cc48f45873e7f70cccdb7c54eb0b3b6d8b4c8 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 27 Nov 2019 14:40:00 +0000 Subject: [PATCH 02/18] chore: update dep paths and jsdocs --- package.json | 4 ++-- src/cli/commands/add.js | 6 +++--- src/core/components/files-mfs.js | 30 ++++++++++++++++++++++++------ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index cf9da6996a..03789da049 100644 --- a/package.json +++ b/package.json @@ -100,13 +100,13 @@ "ipfs-block-service": "~0.16.0", "ipfs-http-client": "^40.1.0", "ipfs-http-response": "~0.4.0", - "ipfs-mfs": "^0.13.2", + "ipfs-mfs": "ipfs/js-ipfs-mfs#add-metadata-support", "ipfs-multipart": "^0.2.0", "ipfs-repo": "^0.30.0", "ipfs-unixfs": "^0.2.0", "ipfs-unixfs-exporter": "^0.38.0", "ipfs-unixfs-importer": "^0.42.0", - "ipfs-utils": "~0.4.0", + "ipfs-utils": "ipfs/js-ipfs-utils#support-unixfs-metadata", "ipld": "~0.25.0", "ipld-bitcoin": "~0.3.0", "ipld-dag-cbor": "~0.15.0", diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index c76e9a2b24..ba6f2f4e26 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -134,18 +134,18 @@ module.exports = { default: false, describe: 'Apply modification time to created UnixFS entries' }, - 'mode': { + mode: { type: 'number', coerce: (value) => parseInt(value, 8), describe: 'File mode to apply to created UnixFS entries' }, - 'mtime': { + mtime: { type: 'number', coerce: (value) => { value = parseInt(value) if (isNaN(value)) { - throw errcode(new Error('mtime must be a number'), 'ERR_BAD_MTIME') + throw new Error('mtime must be a number') } }, describe: 'Modification in seconds before or since the Unix Epoch to apply to created UnixFS entries' diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index 0cb20e3967..26af9e09d0 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -67,15 +67,13 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { return { /** - * Change mode + * Change file mode * * @param {String} path - The path(s) of the source to modify. - * @param {Number} mode - The desired file mode - * @param {Object} [opts] - Options for copy. - * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) - * @param {String} [opts.format=dag-pb] - Format of nodes to write any newly created directories as. (default: dag-pb) - * @param {String} [opts.hashAlg=sha2-256] - Algorithm to use when creating CIDs for newly created directories. (default: sha2-256) {@link https://github.com/multiformats/js-multihash/blob/master/src/constants.js#L5-L343 The list of all possible values} + * @param {Object} [opts] - Options for modification. + * @param {boolean} [opts.recursive=false] - Whether to change modes recursively. (default: false) * @param {boolean} [opts.flush=true] - Whether or not to immediately flush MFS changes to disk (default: true). + * @param {number} [opts.shardSplitThreshold] - If the modified path has more than this many links it will be turned into a HAMT shard * @param {function(Error): void} [cb] - Callback function. * @returns {Promise | void} When callback is provided nothing is returned. */ @@ -251,6 +249,26 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { return nodeify(methods.touch(path, opts), cb) }, + /** + * Update modification time + * + * @param {String} path - The path(s) of the source to modify. + * @param {number} mtime - Time to use as the new modification time in seconds since (+ve) or before (-ve) the Unix Epoch + * @param {Object} [opts] - Options for touch. + * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) + * @param {Object} [opts.cidVersion=0] - CID version to use with the newly updated node + * @param {number} [opts.shardSplitThreshold] - If the modified path has more than this many links it will be turned into a HAMT shard + * @param {function(Error): void} [cb] - Callback function. + * @returns {Promise | void} When callback is provided nothing is returned. + */ + touch: (path, mtime, opts, cb) => { + if (typeof opts === 'function') { + cb = opts + opts = {} + } + return nodeify(methods.touch(path, mtime, opts), cb) + }, + /** * Write to a file. * From d5554b2b6b3806a980a68ff60e3347cba1941ec6 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 27 Nov 2019 14:57:56 +0000 Subject: [PATCH 03/18] chore: fix linting --- src/cli/commands/add.js | 1 - src/core/components/files-mfs.js | 25 +++---------------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index ba6f2f4e26..90f1a355a5 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -8,7 +8,6 @@ const multibase = require('multibase') const { createProgressBar } = require('../utils') const { cidToString } = require('../../utils/cid') const globSource = require('ipfs-utils/src/files/glob-source') -const errcode = require('err-code') async function getTotalBytes (paths) { const sizes = await Promise.all(paths.map(p => getFolderSize(p))) diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index 26af9e09d0..9b9a6f3996 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -69,7 +69,8 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { /** * Change file mode * - * @param {String} path - The path(s) of the source to modify. + * @param {String} path - The path of the source to modify. + * @param {Object} mode - The mode to set the path * @param {Object} [opts] - Options for modification. * @param {boolean} [opts.recursive=false] - Whether to change modes recursively. (default: false) * @param {boolean} [opts.flush=true] - Whether or not to immediately flush MFS changes to disk (default: true). @@ -229,30 +230,10 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { */ readPullStream: (path, opts = {}) => toPullStream.source(methods.read(path, opts)), - /** - * Update modification time - * - * @param {String} path - The path(s) of the source to modify. - * @param {Object} [opts] - Options for copy. - * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) - * @param {String} [opts.format=dag-pb] - Format of nodes to write any newly created directories as. (default: dag-pb) - * @param {String} [opts.hashAlg=sha2-256] - Algorithm to use when creating CIDs for newly created directories. (default: sha2-256) {@link https://github.com/multiformats/js-multihash/blob/master/src/constants.js#L5-L343 The list of all possible values} - * @param {boolean} [opts.flush=true] - Whether or not to immediately flush MFS changes to disk (default: true). - * @param {function(Error): void} [cb] - Callback function. - * @returns {Promise | void} When callback is provided nothing is returned. - */ - touch: (path, opts, cb) => { - if (typeof opts === 'function') { - cb = opts - opts = {} - } - return nodeify(methods.touch(path, opts), cb) - }, - /** * Update modification time * - * @param {String} path - The path(s) of the source to modify. + * @param {String} path - The path of the source to modify. * @param {number} mtime - Time to use as the new modification time in seconds since (+ve) or before (-ve) the Unix Epoch * @param {Object} [opts] - Options for touch. * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) From c045aec06723a51e565da45d4f6d41d95e38784b Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 28 Nov 2019 08:42:58 +0000 Subject: [PATCH 04/18] fix: expose metadata in http api --- src/http/api/resources/files-regular.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/http/api/resources/files-regular.js b/src/http/api/resources/files-regular.js index c4aa4ef496..01ed32345d 100644 --- a/src/http/api/resources/files-regular.js +++ b/src/http/api/resources/files-regular.js @@ -196,7 +196,9 @@ exports.add = { yield { path: entry.name, - content: entry.content + content: entry.content, + mode: entry.mode, + mtime: entry.mtime } } @@ -234,7 +236,9 @@ exports.add = { output.write(JSON.stringify({ Name: file.path, Hash: cidToString(file.hash, { base: request.query['cid-base'] }), - Size: file.size + Size: file.size, + Mode: file.mode, + Mtime: file.mtime }) + '\n') } } @@ -300,7 +304,7 @@ exports.ls = { Size: file.size, Type: toTypeCode(file.type), Depth: file.depth, - Mode: file.mode.toString(8).padStart(4, '0'), + Mode: file.mode, Mtime: file.mtime })) }] From 6b6251d264241acb2d8c66d9b5c8729804410319 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 10:25:46 +0000 Subject: [PATCH 05/18] test: interface tests passing --- package.json | 8 +- src/cli/commands/daemon.js | 1 + src/cli/commands/ls.js | 15 ++- src/core/components/files-mfs.js | 11 ++- src/core/components/files-regular/utils.js | 28 +++--- src/http/api/resources/file.js | 6 ++ src/http/api/resources/files-regular.js | 31 ++++-- test/cli/ls.js | 108 ++++++++++----------- 8 files changed, 119 insertions(+), 89 deletions(-) diff --git a/package.json b/package.json index 03789da049..05e54c40ed 100644 --- a/package.json +++ b/package.json @@ -100,13 +100,13 @@ "ipfs-block-service": "~0.16.0", "ipfs-http-client": "^40.1.0", "ipfs-http-response": "~0.4.0", - "ipfs-mfs": "ipfs/js-ipfs-mfs#add-metadata-support", + "ipfs-mfs": "^0.13.2", "ipfs-multipart": "^0.2.0", "ipfs-repo": "^0.30.0", "ipfs-unixfs": "^0.2.0", - "ipfs-unixfs-exporter": "^0.38.0", + "ipfs-unixfs-exporter": "^0.39.0", "ipfs-unixfs-importer": "^0.42.0", - "ipfs-utils": "ipfs/js-ipfs-utils#support-unixfs-metadata", + "ipfs-utils": "^0.4.1", "ipld": "~0.25.0", "ipld-bitcoin": "~0.3.0", "ipld-dag-cbor": "~0.15.0", @@ -137,7 +137,7 @@ "libp2p-floodsub": "^0.18.0", "libp2p-gossipsub": "~0.0.5", "libp2p-kad-dht": "~0.16.0", - "libp2p-keychain": "^0.5.2", + "libp2p-keychain": "^0.5.4", "libp2p-mdns": "~0.12.0", "libp2p-record": "~0.7.0", "libp2p-secio": "~0.11.0", diff --git a/src/cli/commands/daemon.js b/src/cli/commands/daemon.js index f018362e99..2c345221b3 100644 --- a/src/cli/commands/daemon.js +++ b/src/cli/commands/daemon.js @@ -48,6 +48,7 @@ module.exports = { handler (argv) { argv.resolve((async () => { const { print } = argv + print('Initializing IPFS daemon...') print(`js-ipfs version: ${require('../../../package.json').version}`) print(`System version: ${os.arch()}/${os.platform()}`) diff --git a/src/cli/commands/ls.js b/src/cli/commands/ls.js index 5f8d8be42b..56fc6a3685 100644 --- a/src/cli/commands/ls.js +++ b/src/cli/commands/ls.js @@ -41,14 +41,21 @@ module.exports = { const ipfs = await getIpfs() let links = await ipfs.ls(key, { recursive }) - links = links.map(file => Object.assign(file, { hash: cidToString(file.hash, { base: cidBase }) })) + links = links.map(file => { + return Object.assign(file, { + hash: cidToString(file.hash, { base: cidBase }), + mode: formatMode(file.mode, file.type === 'dir'), + mtime: formatMtime(file.mtime) + }) + }) if (headers) { - links = [{ hash: 'Hash', size: 'Size', name: 'Name' }].concat(links) + links = [{ mode: 'Mode', mtime: 'Mtime', hash: 'Hash', size: 'Size', name: 'Name' }].concat(links) } const multihashWidth = Math.max.apply(null, links.map((file) => file.hash.length)) const sizeWidth = Math.max.apply(null, links.map((file) => String(file.size).length)) + const mtimeWidth = Math.max.apply(null, links.map((file) => file.mtime.length)) // replace multiple slashes key = key.replace(/\/(\/+)/g, '/') @@ -71,8 +78,8 @@ module.exports = { const padding = Math.max(link.depth - pathParts.length, 0) print( - rightpad(formatMode(link.mode, link.type === 'dir'), 11) + - rightpad(formatMtime(link.mtime), 30) + + rightpad(link.mode, 11) + + rightpad(link.mtime || '-', mtimeWidth + 1) + rightpad(link.hash, multihashWidth + 1) + rightpad(link.size || '-', sizeWidth + 1) + ' '.repeat(padding) + fileName diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index 9b9a6f3996..d670e81ea6 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -24,14 +24,19 @@ const mapLsFile = (options) => { const long = options.long || options.l return (file) => { - return { + const output = { hash: long ? cidToString(file.cid, { base: options.cidBase }) : '', name: file.name, type: long ? file.type : 0, size: long ? file.size || 0 : 0, - mode: file.mode, - mtime: file.mtime + mode: file.mode } + + if (file.mtime !== undefined) { + output.mtime = file.mtime + } + + return output } } diff --git a/src/core/components/files-regular/utils.js b/src/core/components/files-regular/utils.js index 5dc0a1d28a..b889d73075 100644 --- a/src/core/components/files-regular/utils.js +++ b/src/core/components/files-regular/utils.js @@ -101,27 +101,27 @@ const parseChunkSize = (str, name) => { const mapFile = (file, options) => { options = options || {} - let size = 0 - let type = 'dir' - - if (file.unixfs && file.unixfs.type === 'file') { - size = file.unixfs.fileSize() - type = 'file' - } - const output = { hash: cidToString(file.cid, { base: options.cidBase }), path: file.path, name: file.name, depth: file.path.split('/').length, - size, - type, - mtime: file.unixfs.mtime, - mode: file.unixfs.mode + size: 0, + type: 'dir' } - if (options.includeContent && file.unixfs && file.unixfs.type === 'file') { - output.content = file.content + if (file.unixfs) { + if (file.unixfs.type === 'file') { + output.size = file.unixfs.fileSize() + output.type = 'file' + + if (options.includeContent) { + output.content = file.content + } + } + + output.mode = file.unixfs.mode + output.mtime = file.unixfs.mtime } return output diff --git a/src/http/api/resources/file.js b/src/http/api/resources/file.js index 7418a512e1..5fb5960981 100644 --- a/src/http/api/resources/file.js +++ b/src/http/api/resources/file.js @@ -20,6 +20,12 @@ function toFileObject (file) { if (fo.Hash !== file.name) { fo.Name = file.name } + if (file.mtime) { + fo.Mtime = Math.round(file.mtime.getTime() / 1000) + } + if (file.mode) { + fo.Mode = file.mode + } return fo } diff --git a/src/http/api/resources/files-regular.js b/src/http/api/resources/files-regular.js index 01ed32345d..294349199c 100644 --- a/src/http/api/resources/files-regular.js +++ b/src/http/api/resources/files-regular.js @@ -237,7 +237,7 @@ exports.add = { Name: file.path, Hash: cidToString(file.hash, { base: request.query['cid-base'] }), Size: file.size, - Mode: file.mode, + Mode: file.mode === undefined ? undefined : file.mode.toString(8).padStart(4, '0'), Mtime: file.mtime }) + '\n') } @@ -298,15 +298,26 @@ exports.ls = { return h.response({ Objects: [{ Hash: key, - Links: files.map((file) => ({ - Name: file.name, - Hash: cidToString(file.hash, { base: cidBase }), - Size: file.size, - Type: toTypeCode(file.type), - Depth: file.depth, - Mode: file.mode, - Mtime: file.mtime - })) + Links: files.map((file) => { + const output = { + Name: file.name, + Hash: cidToString(file.hash, { base: cidBase }), + Size: file.size, + Type: toTypeCode(file.type), + Depth: file.depth, + Mode: file.mode.toString(8).padStart(4, '0') + } + + if (file.mtime) { + output.Mtime = file.mtime.secs + + if (file.mtime.nsecs !== null && file.mtime.nsecs !== undefined) { + output.MtimeNsecs = file.mtime.nsecs + } + } + + return output + }) }] }) } diff --git a/test/cli/ls.js b/test/cli/ls.js index dc4d1de661..d59bcd8e75 100644 --- a/test/cli/ls.js +++ b/test/cli/ls.js @@ -17,11 +17,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z') expect(out).to.eql( - 'QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - 'QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - 'QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -29,11 +29,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/') expect(out).to.eql( - 'QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - 'QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - 'QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -41,11 +41,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///') expect(out).to.eql( - 'QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - 'QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - 'QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -53,14 +53,14 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///init-docs') expect(out).to.eql( - 'QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - 'QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - 'QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - 'QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - 'QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - 'QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -68,8 +68,8 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls -r Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/blocks/CIQLB') expect(out).to.eql( - 'QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + - 'QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' + '-rw-r--r-- - QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + + '-rw-r--r-- - QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' ) }) @@ -90,12 +90,12 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z -v') expect(out).to.eql( - 'Hash Size Name\n' + - 'QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - 'QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - 'QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'Mode Mtime Hash Size Name\n' + + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -104,14 +104,14 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - 'QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - 'QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - 'QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - 'QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - 'QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - 'QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -121,16 +121,16 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls -r /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - 'QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - 'QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - 'QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + - 'QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - 'QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - 'QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - 'QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + - 'QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + + '-rw-r--r-- - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' ) }) @@ -139,11 +139,11 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z --cid-base=base64') expect(out).to.eql( - 'mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + - 'mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + - 'mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + - 'mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + - 'mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' + 'drwxr-xr-x - mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + + '-rw-r--r-- - mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + + 'drwxr-xr-x - mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + + 'drwxr-xr-x - mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + + '-rw-r--r-- - mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' ) }) })) From 122c38e8d48563e08b06000b8cbf87bd970df27a Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 16:55:08 +0000 Subject: [PATCH 06/18] chore: update package.json with branches --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 05e54c40ed..a41a971aba 100644 --- a/package.json +++ b/package.json @@ -95,18 +95,18 @@ "hashlru": "^2.3.0", "human-to-milliseconds": "^2.0.0", "interface-datastore": "~0.8.0", - "ipfs-bitswap": "^0.26.0", + "ipfs-bitswap": "^0.26.2", "ipfs-block": "~0.8.1", "ipfs-block-service": "~0.16.0", "ipfs-http-client": "^40.1.0", "ipfs-http-response": "~0.4.0", - "ipfs-mfs": "^0.13.2", - "ipfs-multipart": "^0.2.0", + "ipfs-mfs": "ipfs/js-ipfs-mfs#add-metadata-support", + "ipfs-multipart": "ipfs/js-ipfs-multipart#store-mtime-as-timespec", "ipfs-repo": "^0.30.0", - "ipfs-unixfs": "^0.2.0", + "ipfs-unixfs": "ipfs/js-ipfs-unixfs#store-mtime-as-timespec", "ipfs-unixfs-exporter": "^0.39.0", - "ipfs-unixfs-importer": "^0.42.0", - "ipfs-utils": "^0.4.1", + "ipfs-unixfs-importer": "ipfs/js-ipfs-unixfs-importer#mtime-passed-as-timespec", + "ipfs-utils": "ipfs/js-ipfs-utils#format-mtime-as-timespec", "ipld": "~0.25.0", "ipld-bitcoin": "~0.3.0", "ipld-dag-cbor": "~0.15.0", @@ -204,7 +204,7 @@ "execa": "^3.0.0", "form-data": "^3.0.0", "hat": "0.0.3", - "interface-ipfs-core": "^0.125.0", + "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-unixfs-metadata-tests-and-docs", "ipfs-interop": "^0.1.1", "ipfsd-ctl": "^1.0.2", "libp2p-websocket-star": "~0.10.2", From 05709a9f1a69e9ed13feae9df215e997b2b3e6fc Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 18:28:26 +0000 Subject: [PATCH 07/18] fix: support mtime as timespec --- package.json | 2 +- src/cli/commands/add.js | 2 +- src/cli/commands/block/put.js | 2 +- src/cli/commands/dag/put.js | 4 +- src/cli/commands/object/patch/append-data.js | 2 +- src/cli/commands/object/patch/set-data.js | 2 +- src/cli/parser.js | 1 + src/core/components/files-mfs.js | 11 +- src/http/api/resources/file.js | 4 +- test/cli/ls.js | 108 +++++++++---------- 10 files changed, 68 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index a41a971aba..566a2d3c80 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "ipfs-bitswap": "^0.26.2", "ipfs-block": "~0.8.1", "ipfs-block-service": "~0.16.0", - "ipfs-http-client": "^40.1.0", + "ipfs-http-client": "ipfs/js-ipfs-http-client#support-unixfs-metadata", "ipfs-http-response": "~0.4.0", "ipfs-mfs": "ipfs/js-ipfs-mfs#add-metadata-support", "ipfs-multipart": "ipfs/js-ipfs-multipart#store-mtime-as-timespec", diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index 90f1a355a5..5767208bdd 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -206,7 +206,7 @@ module.exports = { mode: argv.mode, mtime: argv.mtime }) - : process.stdin // Pipe directly to ipfs.add + : argv.getStdin() // Pipe directly to ipfs.add let finalHash diff --git a/src/cli/commands/block/put.js b/src/cli/commands/block/put.js index 78bfac9fe0..6d3862da80 100644 --- a/src/cli/commands/block/put.js +++ b/src/cli/commands/block/put.js @@ -44,7 +44,7 @@ module.exports = { data = await promisify(fs.readFile)(argv.block) } else { data = await new Promise((resolve, reject) => { - process.stdin.pipe(bl((err, input) => { + argv.getStdin().pipe(bl((err, input) => { if (err) return reject(err) resolve(input) })) diff --git a/src/cli/commands/dag/put.js b/src/cli/commands/dag/put.js index 5c469d8c6c..1234fe993c 100644 --- a/src/cli/commands/dag/put.js +++ b/src/cli/commands/dag/put.js @@ -79,7 +79,7 @@ module.exports = { } }, - handler ({ data, format, inputEncoding, pin, hashAlg, cidVersion, cidBase, preload, onlyHash, getIpfs, print, resolve }) { + handler ({ data, format, inputEncoding, pin, hashAlg, cidVersion, cidBase, preload, onlyHash, getIpfs, print, resolve, getStdin }) { resolve((async () => { const ipfs = await getIpfs() @@ -101,7 +101,7 @@ module.exports = { // pipe from stdin source = Buffer.alloc(0) - for await (const buf of process.stdin) { + for await (const buf of getStdin()) { source = Buffer.concat([source, buf]) } } else { diff --git a/src/cli/commands/object/patch/append-data.js b/src/cli/commands/object/patch/append-data.js index 94a34eb31b..a931212d30 100644 --- a/src/cli/commands/object/patch/append-data.js +++ b/src/cli/commands/object/patch/append-data.js @@ -26,7 +26,7 @@ module.exports = { data = fs.readFileSync(argv.data) } else { data = await new Promise((resolve, reject) => { - process.stdin.pipe(bl((err, input) => { + argv.getStdin().pipe(bl((err, input) => { if (err) return reject(err) resolve(input) })) diff --git a/src/cli/commands/object/patch/set-data.js b/src/cli/commands/object/patch/set-data.js index b61534f768..c18496b512 100644 --- a/src/cli/commands/object/patch/set-data.js +++ b/src/cli/commands/object/patch/set-data.js @@ -26,7 +26,7 @@ module.exports = { data = fs.readFileSync(argv.data) } else { data = await new Promise((resolve, reject) => { - process.stdin.pipe(bl((err, input) => { + argv.getStdin().pipe(bl((err, input) => { if (err) return reject(err) resolve(input) })) diff --git a/src/cli/parser.js b/src/cli/parser.js index f28979feec..767e07fd21 100644 --- a/src/cli/parser.js +++ b/src/cli/parser.js @@ -36,6 +36,7 @@ const parser = yargs .commandDir('commands') .middleware(argv => Object.assign(argv, { getIpfs: utils.singleton(cb => utils.getIPFS(argv, cb)), + getStdin: () => process.stdin, print: utils.print, isDaemonOn: utils.isDaemonOn, getRepoPath: utils.getRepoPath diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index d670e81ea6..9b9a6f3996 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -24,19 +24,14 @@ const mapLsFile = (options) => { const long = options.long || options.l return (file) => { - const output = { + return { hash: long ? cidToString(file.cid, { base: options.cidBase }) : '', name: file.name, type: long ? file.type : 0, size: long ? file.size || 0 : 0, - mode: file.mode + mode: file.mode, + mtime: file.mtime } - - if (file.mtime !== undefined) { - output.mtime = file.mtime - } - - return output } } diff --git a/src/http/api/resources/file.js b/src/http/api/resources/file.js index 5fb5960981..e28fb36cc7 100644 --- a/src/http/api/resources/file.js +++ b/src/http/api/resources/file.js @@ -15,7 +15,9 @@ function toFileObject (file) { const fo = { Hash: toB58String(file.hash), Size: file.size, - Type: fileTypeMap[file.type] || file.type + Type: fileTypeMap[file.type] || file.type, + Mode: file.mode, + Mtime: file.mtime } if (fo.Hash !== file.name) { fo.Name = file.name diff --git a/test/cli/ls.js b/test/cli/ls.js index d59bcd8e75..76af7f8f87 100644 --- a/test/cli/ls.js +++ b/test/cli/ls.js @@ -17,11 +17,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z') expect(out).to.eql( - 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -29,11 +29,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/') expect(out).to.eql( - 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -41,11 +41,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///') expect(out).to.eql( - 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -53,14 +53,14 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///init-docs') expect(out).to.eql( - '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -68,8 +68,8 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls -r Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/blocks/CIQLB') expect(out).to.eql( - '-rw-r--r-- - QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + - '-rw-r--r-- - QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' ) }) @@ -90,12 +90,12 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z -v') expect(out).to.eql( - 'Mode Mtime Hash Size Name\n' + - 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + 'Mode Mtime Hash Size Name\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -104,14 +104,14 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -121,16 +121,16 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls -r /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + - '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + - '-rw-r--r-- - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' ) }) @@ -139,11 +139,11 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z --cid-base=base64') expect(out).to.eql( - 'drwxr-xr-x - mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + - '-rw-r--r-- - mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + - 'drwxr-xr-x - mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + - 'drwxr-xr-x - mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + - '-rw-r--r-- - mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + + 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + + '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' ) }) })) From 91c791adbebc8a0704b2be01d170ad706f8e4ee0 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 18:59:30 +0000 Subject: [PATCH 08/18] fix: check mtime formatting in timezone agnostic way --- test/cli/ls.js | 110 +++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/test/cli/ls.js b/test/cli/ls.js index 76af7f8f87..f737aab8d4 100644 --- a/test/cli/ls.js +++ b/test/cli/ls.js @@ -4,6 +4,8 @@ const { expect } = require('interface-ipfs-core/src/utils/mocha') const runOnAndOff = require('../utils/on-and-off') const delay = require('delay') +const formatMtime = require('ipfs-utils/src/files/format-mtime') +const formattedMtime = formatMtime() describe('ls', () => runOnAndOff((thing) => { let ipfs @@ -17,11 +19,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z') expect(out).to.eql( - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -29,11 +31,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/') expect(out).to.eql( - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -41,11 +43,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///') expect(out).to.eql( - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -53,14 +55,14 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///init-docs') expect(out).to.eql( - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` ) }) @@ -68,8 +70,8 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls -r Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/blocks/CIQLB') expect(out).to.eql( - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' + `-rw-r--r-- ${formattedMtime} QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n` + + `-rw-r--r-- ${formattedMtime} QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n` ) }) @@ -90,12 +92,12 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z -v') expect(out).to.eql( - 'Mode Mtime Hash Size Name\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' + `Mode ${'Mtime'.padEnd(formattedMtime.length, ' ')} Hash Size Name\n` + + `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -104,14 +106,14 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` ) }) @@ -121,16 +123,16 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls -r /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' + `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- ${formattedMtime} QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n` + + `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + + `-rw-r--r-- ${formattedMtime} QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n` ) }) @@ -139,11 +141,11 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z --cid-base=base64') expect(out).to.eql( - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + - 'drwxr-xr-x Jan 1, 1970, 1:00:00 AM GMT+1 mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + - '-rw-r--r-- Jan 1, 1970, 1:00:00 AM GMT+1 mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' + `drwxr-xr-x ${formattedMtime} mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n` + + `-rw-r--r-- ${formattedMtime} mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n` + + `drwxr-xr-x ${formattedMtime} mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n` + + `drwxr-xr-x ${formattedMtime} mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n` + + `-rw-r--r-- ${formattedMtime} mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n` ) }) })) From e4710a886bf746a02f277813c4e8b5d02e95cd66 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 19:21:03 +0000 Subject: [PATCH 09/18] fix: do not run hrtime tests in the browser --- test/core/interface.spec.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/core/interface.spec.js b/test/core/interface.spec.js index 5a8fefcb1b..0b14ef3671 100644 --- a/test/core/interface.spec.js +++ b/test/core/interface.spec.js @@ -56,10 +56,24 @@ describe('interface-ipfs-core tests', function () { }, { name: 'addFromFs', reason: 'Not designed to run in the browser' + }, { + name: 'should add with mtime as hrtime', + reason: 'Not designed to run in the browser' }] }) - tests.filesMFS(commonFactory) + tests.filesMFS(commonFactory, { + skip: isNode ? null : [{ + name: 'should make directory and specify mtime as hrtime', + reason: 'Not designed to run in the browser' + }, { + name: 'should set mtime as hrtime', + reason: 'Not designed to run in the browser' + }, { + name: 'should write file and specify mtime as hrtime', + reason: 'Not designed to run in the browser' + }] + }) tests.key(commonFactory) From 7a557b146f9cfa32e9e643ebd7b26e684bd01d95 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 21:13:48 +0000 Subject: [PATCH 10/18] chore: upgrade interop tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 566a2d3c80..73c455c1fb 100644 --- a/package.json +++ b/package.json @@ -205,7 +205,7 @@ "form-data": "^3.0.0", "hat": "0.0.3", "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-unixfs-metadata-tests-and-docs", - "ipfs-interop": "^0.1.1", + "ipfs-interop": "^0.2.0", "ipfsd-ctl": "^1.0.2", "libp2p-websocket-star": "~0.10.2", "lodash": "^4.17.15", From a7353f99e367be79f7a0f412d8fdb610f56bc7fc Mon Sep 17 00:00:00 2001 From: achingbrain Date: Mon, 23 Dec 2019 21:25:01 +0000 Subject: [PATCH 11/18] chore: symlink ipfs dir for interop tests --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index ff1813beb8..6f52b43c89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -76,12 +76,16 @@ jobs: - stage: test name: interop - node script: + - mkdir -p node_modules/ipfs-interop/node_modules + - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs - cd node_modules/ipfs-interop - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t node --bail - stage: test name: interop - browser script: + - mkdir -p node_modules/ipfs-interop/node_modules + - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs - cd node_modules/ipfs-interop - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t browser --bail @@ -89,6 +93,8 @@ jobs: name: interop - electron-main os: osx script: + - mkdir -p node_modules/ipfs-interop/node_modules + - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs - cd node_modules/ipfs-interop - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t electron-main -f ./test/node.js --bail --timeout 10000 @@ -96,6 +102,8 @@ jobs: name: interop - electron-renderer os: osx script: + - mkdir -p node_modules/ipfs-interop/node_modules + - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs - cd node_modules/ipfs-interop - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t electron-renderer -f ./test/browser.js --bail --timeout 10000 From 3e369861f3029312b0b15fb5c2a1ccf33ec1f540 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Tue, 24 Dec 2019 08:09:27 +0000 Subject: [PATCH 12/18] fix: build ipfs before running examples --- .travis.yml | 18 ++++++++++++++++++ examples/running-multiple-nodes/test.js | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6f52b43c89..e686d66788 100644 --- a/.travis.yml +++ b/.travis.yml @@ -150,6 +150,7 @@ jobs: - stage: test name: example - browser-add-readable-stream script: + - npm run build - cd examples - npm install - npm run test -- browser-add-readable-stream @@ -157,6 +158,7 @@ jobs: - stage: test name: example - browser-browserify script: + - npm run build - cd examples - npm install - npm run test -- browser-browserify @@ -164,6 +166,7 @@ jobs: - stage: test name: example - browser-create-react-app script: + - npm run build - cd examples - npm install - npm run test -- browser-create-react-app @@ -171,6 +174,7 @@ jobs: - stage: test name: example - browser-mfs script: + - npm run build - cd examples - npm install - npm run test -- browser-mfs @@ -178,6 +182,7 @@ jobs: - stage: test name: example - browser-parceljs script: + - npm run build - cd examples - npm install - npm run test -- browser-parceljs @@ -185,6 +190,7 @@ jobs: - stage: test name: example - browser-readablestream script: + - npm run build - cd examples - npm install - npm run test -- browser-readablestream @@ -192,6 +198,7 @@ jobs: - stage: test name: example - browser-script-tag script: + - npm run build - cd examples - npm install - npm run test -- browser-script-tag @@ -199,6 +206,7 @@ jobs: - stage: test name: example - browser-video-streaming script: + - npm run build - cd examples - npm install - npm run test -- browser-video-streaming @@ -206,6 +214,7 @@ jobs: - stage: test name: example - browser-vue script: + - npm run build - cd examples - npm install - npm run test -- browser-vue @@ -213,6 +222,7 @@ jobs: - stage: test name: example - browser-webpack script: + - npm run build - cd examples - npm install - npm run test -- browser-webpack @@ -220,6 +230,7 @@ jobs: - stage: test name: example - circuit-relaying script: + - npm run build - cd examples - npm install - npm run test -- circuit-relaying @@ -227,6 +238,7 @@ jobs: - stage: test name: example - custom-ipfs-repo script: + - npm run build - cd examples - npm install - npm run test -- custom-ipfs-repo @@ -234,6 +246,7 @@ jobs: - stage: test name: example - custom-libp2p script: + - npm run build - cd examples - npm install - npm run test -- custom-libp2p @@ -241,6 +254,7 @@ jobs: - stage: test name: example - exchange-files-in-browser script: + - npm run build - cd examples - npm install - npm run test -- exchange-files-in-browser @@ -248,6 +262,7 @@ jobs: - stage: test name: example - explore-ethereum-blockchain script: + - npm run build - cd examples - npm install - npm run test -- explore-ethereum-blockchain @@ -255,6 +270,7 @@ jobs: - stage: test name: example - ipfs-101 script: + - npm run build - cd examples - npm install - npm run test -- ipfs-101 @@ -262,6 +278,7 @@ jobs: - stage: test name: example - running-multiple-nodes script: + - npm run build - cd examples - npm install - npm run test -- running-multiple-nodes @@ -269,6 +286,7 @@ jobs: - stage: test name: example - traverse-ipld-graphs script: + - npm run build - cd examples - npm install - npm run test -- traverse-ipld-graphs diff --git a/examples/running-multiple-nodes/test.js b/examples/running-multiple-nodes/test.js index ea0871d7d1..76eefe9cf2 100644 --- a/examples/running-multiple-nodes/test.js +++ b/examples/running-multiple-nodes/test.js @@ -1,6 +1,6 @@ 'use strict' -const IPFS = require('ipfs') +const IPFS = require('../../') const execa = require('execa') const os = require('os') From 825b94606a90dc9da1eb5a5c8b38dc8ef88ef965 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Tue, 24 Dec 2019 09:28:31 +0000 Subject: [PATCH 13/18] fix: expose mtime-nsecs to cli and add tests --- src/cli/commands/add.js | 35 ++++++++++++++++++++++++++++++-- src/core/components/files-mfs.js | 2 +- test/cli/files.js | 24 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index 5767208bdd..dba24c6567 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -146,8 +146,27 @@ module.exports = { if (isNaN(value)) { throw new Error('mtime must be a number') } + + return value + }, + describe: 'Modification time in seconds before or since the Unix Epoch to apply to created UnixFS entries' + }, + 'mtime-nsecs': { + type: 'number', + coerce: (value) => { + value = parseInt(value) + + if (isNaN(value)) { + throw new Error('mtime-nsecs must be a number') + } + + if (value < 0 || value > 999999999) { + throw new Error('mtime-nsecs must be in the range [0,999999999]') + } + + return value }, - describe: 'Modification in seconds before or since the Unix Epoch to apply to created UnixFS entries' + describe: 'Modification time fraction in nanoseconds' } }, @@ -197,6 +216,18 @@ module.exports = { } } + let mtime + + if (argv.mtime != null) { + mtime = { + secs: argv.mtime + } + + if (argv.mtimeNsecs != null) { + mtime.nsecs = argv.mtimeNsecs + } + } + const source = argv.file ? globSource(argv.file, { recursive: argv.recursive, @@ -204,7 +235,7 @@ module.exports = { preserveMode: argv.preserveMode, preserveMtime: argv.preserveMtime, mode: argv.mode, - mtime: argv.mtime + mtime }) : argv.getStdin() // Pipe directly to ipfs.add diff --git a/src/core/components/files-mfs.js b/src/core/components/files-mfs.js index 9b9a6f3996..d2d93290ab 100644 --- a/src/core/components/files-mfs.js +++ b/src/core/components/files-mfs.js @@ -237,7 +237,7 @@ module.exports = (/** @type { import("../index") } */ ipfs) => { * @param {number} mtime - Time to use as the new modification time in seconds since (+ve) or before (-ve) the Unix Epoch * @param {Object} [opts] - Options for touch. * @param {boolean} [opts.parents=false] - Whether or not to make the parent directories if they don't exist. (default: false) - * @param {Object} [opts.cidVersion=0] - CID version to use with the newly updated node + * @param {number} [opts.cidVersion=0] - CID version to use with the newly updated node * @param {number} [opts.shardSplitThreshold] - If the modified path has more than this many links it will be turned into a HAMT shard * @param {function(Error): void} [cb] - Callback function. * @returns {Promise | void} When callback is provided nothing is returned. diff --git a/test/cli/files.js b/test/cli/files.js index b1376b7d59..6264b614fc 100644 --- a/test/cli/files.js +++ b/test/cli/files.js @@ -342,6 +342,30 @@ describe('files', () => runOnAndOff((thing) => { await clean(filePath) }) + it('add with mtime', async function () { + this.timeout(30 * 1000) + + const out = await ipfs('add --mtime 5 src/init-files/init-docs/readme') + expect(out) + .to.eql('added Qmd7enmVy7ZZnSMQnsCKnMkLXfCYq11naCTiqXqHKe6YRg readme\n') + }) + + it('add with mtime-nsecs', async function () { + this.timeout(30 * 1000) + + const out = await ipfs('add --mtime 5 --mtime-nsecs 100 src/init-files/init-docs/readme') + expect(out) + .to.eql('added QmV4urwzA1Z8JxHN3fCjXSeQzRvy3SdpX7U11tyjascyjx readme\n') + }) + + it('add with mode', async function () { + this.timeout(30 * 1000) + + const out = await ipfs('add --mode 0655 src/init-files/init-docs/readme') + expect(out) + .to.eql('added QmUkGGwA3MvnutubCDQmW9MUC9oSHbZw58PcJERy4bNnDW readme\n') + }) + HASH_ALGS.forEach((name) => { it(`add with hash=${name} and raw-leaves=false`, async function () { this.timeout(30 * 1000) From a0f8df346ffbdefcfdd77d4c96d0bd850af9400c Mon Sep 17 00:00:00 2001 From: achingbrain Date: Tue, 24 Dec 2019 10:54:59 +0000 Subject: [PATCH 14/18] fix: export path to js-ipfs binary --- .travis.yml | 16 ++++++++++++---- src/cli/commands/add.js | 3 +-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index e686d66788..1672d57a02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -78,16 +78,20 @@ jobs: script: - mkdir -p node_modules/ipfs-interop/node_modules - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs + - export IPFS_JS_EXEC=`pwd`/src/cli/bin.js + - export IPFS_REUSEPORT=false - cd node_modules/ipfs-interop - - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t node --bail + - npx aegir test -t node --bail - stage: test name: interop - browser script: - mkdir -p node_modules/ipfs-interop/node_modules - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs + - export IPFS_JS_EXEC=`pwd`/src/cli/bin.js + - export IPFS_REUSEPORT=false - cd node_modules/ipfs-interop - - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t browser --bail + - npx aegir test -t browser --bail - stage: test name: interop - electron-main @@ -95,8 +99,10 @@ jobs: script: - mkdir -p node_modules/ipfs-interop/node_modules - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs + - export IPFS_JS_EXEC=`pwd`/src/cli/bin.js + - export IPFS_REUSEPORT=false - cd node_modules/ipfs-interop - - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t electron-main -f ./test/node.js --bail --timeout 10000 + - npx aegir test -t electron-main -f ./test/node.js --bail --timeout 10000 - stage: test name: interop - electron-renderer @@ -104,8 +110,10 @@ jobs: script: - mkdir -p node_modules/ipfs-interop/node_modules - ln -s `pwd` node_modules/ipfs-interop/node_modules/ipfs + - export IPFS_JS_EXEC=`pwd`/src/cli/bin.js + - export IPFS_REUSEPORT=false - cd node_modules/ipfs-interop - - IPFS_JS_EXEC=./../../src/cli/bin.js IPFS_REUSEPORT=false npx aegir test -t electron-renderer -f ./test/browser.js --bail --timeout 10000 + - npx aegir test -t electron-renderer -f ./test/browser.js --bail --timeout 10000 - stage: test name: external - ipfs-companion diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index dba24c6567..052982e3f5 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -134,8 +134,7 @@ module.exports = { describe: 'Apply modification time to created UnixFS entries' }, mode: { - type: 'number', - coerce: (value) => parseInt(value, 8), + type: 'string', describe: 'File mode to apply to created UnixFS entries' }, mtime: { From 8fa59ac699925bcf36cf806b48281cb085714f63 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Jan 2020 15:02:14 +0000 Subject: [PATCH 15/18] fix: support optional mtime --- package.json | 18 ++++---- test/cli/files.js | 2 +- test/cli/ls.js | 110 +++++++++++++++++++++++----------------------- 3 files changed, 64 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index 73c455c1fb..0d717433e5 100644 --- a/package.json +++ b/package.json @@ -98,15 +98,15 @@ "ipfs-bitswap": "^0.26.2", "ipfs-block": "~0.8.1", "ipfs-block-service": "~0.16.0", - "ipfs-http-client": "ipfs/js-ipfs-http-client#support-unixfs-metadata", + "ipfs-http-client": "^40.2.0", "ipfs-http-response": "~0.4.0", - "ipfs-mfs": "ipfs/js-ipfs-mfs#add-metadata-support", - "ipfs-multipart": "ipfs/js-ipfs-multipart#store-mtime-as-timespec", + "ipfs-mfs": "^0.14.0", + "ipfs-multipart": "^0.3.0", "ipfs-repo": "^0.30.0", - "ipfs-unixfs": "ipfs/js-ipfs-unixfs#store-mtime-as-timespec", - "ipfs-unixfs-exporter": "^0.39.0", - "ipfs-unixfs-importer": "ipfs/js-ipfs-unixfs-importer#mtime-passed-as-timespec", - "ipfs-utils": "ipfs/js-ipfs-utils#format-mtime-as-timespec", + "ipfs-unixfs": "^0.3.0", + "ipfs-unixfs-exporter": "^0.40.0", + "ipfs-unixfs-importer": "^0.43.0", + "ipfs-utils": "^0.4.2", "ipld": "~0.25.0", "ipld-bitcoin": "~0.3.0", "ipld-dag-cbor": "~0.15.0", @@ -154,7 +154,7 @@ "multiaddr": "^6.1.1", "multiaddr-to-uri": "^5.0.0", "multibase": "~0.6.0", - "multicodec": "~0.5.5", + "multicodec": "^1.0.0", "multihashes": "~0.4.14", "multihashing-async": "^0.8.0", "node-fetch": "^2.3.0", @@ -204,7 +204,7 @@ "execa": "^3.0.0", "form-data": "^3.0.0", "hat": "0.0.3", - "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-unixfs-metadata-tests-and-docs", + "interface-ipfs-core": "^0.126.0", "ipfs-interop": "^0.2.0", "ipfsd-ctl": "^1.0.2", "libp2p-websocket-star": "~0.10.2", diff --git a/test/cli/files.js b/test/cli/files.js index 6264b614fc..e418dabfcd 100644 --- a/test/cli/files.js +++ b/test/cli/files.js @@ -355,7 +355,7 @@ describe('files', () => runOnAndOff((thing) => { const out = await ipfs('add --mtime 5 --mtime-nsecs 100 src/init-files/init-docs/readme') expect(out) - .to.eql('added QmV4urwzA1Z8JxHN3fCjXSeQzRvy3SdpX7U11tyjascyjx readme\n') + .to.eql('added QmXbVCG5go62V1g7UQtyrJ3svYArc53stCxLx9CNtv1GGT readme\n') }) it('add with mode', async function () { diff --git a/test/cli/ls.js b/test/cli/ls.js index f737aab8d4..e9e968cd81 100644 --- a/test/cli/ls.js +++ b/test/cli/ls.js @@ -4,8 +4,6 @@ const { expect } = require('interface-ipfs-core/src/utils/mocha') const runOnAndOff = require('../utils/on-and-off') const delay = require('delay') -const formatMtime = require('ipfs-utils/src/files/format-mtime') -const formattedMtime = formatMtime() describe('ls', () => runOnAndOff((thing) => { let ipfs @@ -19,11 +17,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z') expect(out).to.eql( - `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -31,11 +29,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/') expect(out).to.eql( - `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -43,11 +41,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///') expect(out).to.eql( - `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -55,14 +53,14 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///init-docs') expect(out).to.eql( - `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` ) }) @@ -70,8 +68,8 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls -r Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/blocks/CIQLB') expect(out).to.eql( - `-rw-r--r-- ${formattedMtime} QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n` + - `-rw-r--r-- ${formattedMtime} QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n` + `-rw-r--r-- - QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n` + + `-rw-r--r-- - QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n` ) }) @@ -92,12 +90,12 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z -v') expect(out).to.eql( - `Mode ${'Mtime'.padEnd(formattedMtime.length, ' ')} Hash Size Name\n` + - `drwxr-xr-x ${formattedMtime} QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- ${formattedMtime} QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x ${formattedMtime} QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x ${formattedMtime} QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- ${formattedMtime} QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + `Mode Mtime Hash Size Name\n` + + `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + + `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + + `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + + `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + + `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` ) }) @@ -106,14 +104,14 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` ) }) @@ -123,16 +121,16 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls -r /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - `-rw-r--r-- ${formattedMtime} QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- ${formattedMtime} QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x ${formattedMtime} QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- ${formattedMtime} QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n` + - `-rw-r--r-- ${formattedMtime} QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- ${formattedMtime} QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- ${formattedMtime} QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- ${formattedMtime} QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x ${formattedMtime} QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + - `-rw-r--r-- ${formattedMtime} QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n` + `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + + `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + + `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + + `-rw-r--r-- - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n` + + `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + + `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + + `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + + `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + + `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + + `-rw-r--r-- - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n` ) }) @@ -141,11 +139,11 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z --cid-base=base64') expect(out).to.eql( - `drwxr-xr-x ${formattedMtime} mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n` + - `-rw-r--r-- ${formattedMtime} mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n` + - `drwxr-xr-x ${formattedMtime} mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n` + - `drwxr-xr-x ${formattedMtime} mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n` + - `-rw-r--r-- ${formattedMtime} mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n` + `drwxr-xr-x - mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n` + + `-rw-r--r-- - mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n` + + `drwxr-xr-x - mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n` + + `drwxr-xr-x - mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n` + + `-rw-r--r-- - mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n` ) }) })) From 2d36d6bf21f1451ebb1075a7c69c5a3077b6d43b Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Jan 2020 15:23:14 +0000 Subject: [PATCH 16/18] fix: linting --- test/cli/ls.js | 108 ++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/test/cli/ls.js b/test/cli/ls.js index e9e968cd81..d59bcd8e75 100644 --- a/test/cli/ls.js +++ b/test/cli/ls.js @@ -17,11 +17,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z') expect(out).to.eql( - `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -29,11 +29,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/') expect(out).to.eql( - `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -41,11 +41,11 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///') expect(out).to.eql( - `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -53,14 +53,14 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z///init-docs') expect(out).to.eql( - `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -68,8 +68,8 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls -r Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/blocks/CIQLB') expect(out).to.eql( - `-rw-r--r-- - QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n` + - `-rw-r--r-- - QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n` + '-rw-r--r-- - QmQ8ag7ysVyCMzJGFjxrUStwWtniQ69c7G9aezbmsKeNYD 10849 CIQLBK52T5EHVHZY5URTG5JS3JCUJDQM2DRB5RVF33DCUUOFJNGVDUI.data\n' + + '-rw-r--r-- - QmaSjzSSRanYzRGPXQY6m5SWfSkkfcnzNkurJEQc4chPJx 10807 CIQLBS5HG4PRCRQ7O4EBXFD5QN6MTI5YBYMCVQJDXPKCOVR6RMLHZFQ.data\n' ) }) @@ -90,12 +90,12 @@ describe('ls', () => runOnAndOff((thing) => { this.timeout(20 * 1000) const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z -v') expect(out).to.eql( - `Mode Mtime Hash Size Name\n` + - `drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n` + - `-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n` + - `drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n` + - `drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n` + - `-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n` + 'Mode Mtime Hash Size Name\n' + + 'drwxr-xr-x - QmamKEPmEH9RUsqRQsfNf5evZQDQPYL9KXg1ADeT7mkHkT - blocks/\n' + + '-rw-r--r-- - QmPkWYfSLCEBLZu7BZt4kigGDMe3cpogMbeVf97gN2xJDN 3928 config\n' + + 'drwxr-xr-x - QmUqyZtPmsRy1U5Mo8kz2BAMmk1hfJ7yW1KAFTMB2odsFv - datastore/\n' + + 'drwxr-xr-x - QmUhUuiTKkkK8J6JZ9zmj8iNHPuNfGYcszgRumzhHBxEEU - init-docs/\n' + + '-rw-r--r-- - QmR56UJmAaZLXLdTT1ALrE9vVqV8soUEekm9BMd4FnuYqV 2 version\n' ) }) @@ -104,14 +104,14 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' ) }) @@ -121,16 +121,16 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls -r /ipfs/Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z/init-docs') expect(out).to.eql( - `-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n` + - `-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n` + - `drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n` + - `-rw-r--r-- - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n` + - `-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n` + - `-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n` + - `-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n` + - `-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n` + - `drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n` + - `-rw-r--r-- - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n` + '-rw-r--r-- - QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V 1677 about\n' + + '-rw-r--r-- - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y 189 contact\n' + + 'drwxr-xr-x - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC - docs/\n' + + '-rw-r--r-- - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT 6 index\n' + + '-rw-r--r-- - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 311 help\n' + + '-rw-r--r-- - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha 1717 quick-start\n' + + '-rw-r--r-- - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB 1091 readme\n' + + '-rw-r--r-- - QmTumTjvcYCAvRRwQ8sDRxh8ezmrcr88YFU7iYNroGGTBZ 1016 security-notes\n' + + 'drwxr-xr-x - QmciSU8hfpAXKjvK5YLUSwApomGSWN5gFbP4EpDAEzu2Te - tour/\n' + + '-rw-r--r-- - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs 796 0.0-intro\n' ) }) @@ -139,11 +139,11 @@ describe('ls', () => runOnAndOff((thing) => { const out = await ipfs('ls Qmaj2NmcyAXT8dFmZRRytE12wpcaHADzbChKToMEjBsj5Z --cid-base=base64') expect(out).to.eql( - `drwxr-xr-x - mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n` + - `-rw-r--r-- - mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n` + - `drwxr-xr-x - mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n` + - `drwxr-xr-x - mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n` + - `-rw-r--r-- - mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n` + 'drwxr-xr-x - mAXASILidvV1YroHLqBvmuXko1Ly1UVenZV1K+MvhsjXhdvZQ - blocks/\n' + + '-rw-r--r-- - mAXASIBT4ZYkQw0IApLoNHBxSjpezyayKZHJyxmFKpt0I3sK5 3928 config\n' + + 'drwxr-xr-x - mAXASIGCpScP8zpa0CqUgyVCR/Cm0Co8pnULGe3seXSsOnJsJ - datastore/\n' + + 'drwxr-xr-x - mAXASIF58POI3+TbHb69iXpD3dRqfXusEj1mHMwPCFenM6HWZ - init-docs/\n' + + '-rw-r--r-- - mAXASICiW5ai+KiU60glImEMMkiHaNSOAivpXspriIhJO8iHI 2 version\n' ) }) })) From 0295250867f759397d34b6bba9e7eda62aaf55f7 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Jan 2020 20:09:30 +0000 Subject: [PATCH 17/18] fix: pin datastore-pubsub version due to ipfs/js-datastore-pubsub#20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d717433e5..792ad11b09 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "class-is": "^1.1.0", "dag-cbor-links": "^1.3.2", "datastore-core": "~0.7.0", - "datastore-pubsub": "^0.2.1", + "datastore-pubsub": "0.2.1", "debug": "^4.1.0", "dlv": "^1.1.3", "err-code": "^2.0.0", From 31e5e822eabe1e988dc7dbb59eda249def063dff Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 10 Jan 2020 07:02:41 +0000 Subject: [PATCH 18/18] chore: restore datastore-pubsub semver --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 792ad11b09..46b4688970 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "class-is": "^1.1.0", "dag-cbor-links": "^1.3.2", "datastore-core": "~0.7.0", - "datastore-pubsub": "0.2.1", + "datastore-pubsub": "^0.2.3", "debug": "^4.1.0", "dlv": "^1.1.3", "err-code": "^2.0.0",