diff --git a/core/commands/add.go b/core/commands/add.go index a178f31e294..1660c125619 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -37,6 +37,7 @@ const ( progressOptionName = "progress" trickleOptionName = "trickle" wrapOptionName = "wrap-with-directory" + stdinPathName = "stdin-name" hiddenOptionName = "hidden" onlyHashOptionName = "only-hash" chunkerOptionName = "chunker" @@ -116,6 +117,7 @@ You can now check what blocks have been created by: cmdkit.BoolOption(trickleOptionName, "t", "Use trickle-dag format for dag generation."), cmdkit.BoolOption(onlyHashOptionName, "n", "Only chunk and hash - do not write to disk."), cmdkit.BoolOption(wrapOptionName, "w", "Wrap files with a directory object."), + cmdkit.StringOption(stdinPathName, "Assign a name if the file source is stdin."), cmdkit.BoolOption(hiddenOptionName, "H", "Include files that are hidden. Only takes effect on recursive add."), cmdkit.StringOption(chunkerOptionName, "s", "Chunking algorithm, size-[bytes] or rabin-[min]-[avg]-[max]").WithDefault("size-262144"), cmdkit.BoolOption(pinOptionName, "Pin this object when adding.").WithDefault(true), @@ -181,6 +183,7 @@ You can now check what blocks have been created by: hashFunStr, _ := req.Options[hashOptionName].(string) inline, _ := req.Options[inlineOptionName].(bool) inlineLimit, _ := req.Options[inlineLimitOptionName].(int) + pathName, _ := req.Options[stdinPathName].(string) // The arguments are subject to the following constraints. // @@ -287,6 +290,7 @@ You can now check what blocks have been created by: fileAdder.Silent = silent fileAdder.RawLeaves = rawblks fileAdder.NoCopy = nocopy + fileAdder.Name = pathName fileAdder.CidBuilder = prefix if inline { diff --git a/core/coreunix/add.go b/core/coreunix/add.go index ced043b9e1f..04d79ac65b3 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -83,6 +83,7 @@ type Adder struct { RawLeaves bool Silent bool Wrap bool + Name string NoCopy bool Chunker string root ipld.Node @@ -470,8 +471,16 @@ func (adder *Adder) addFile(file files.File) error { return err } + addFileName := file.FileName() + addFileInfo, ok := file.(files.FileInfo) + if ok { + if addFileInfo.AbsPath() == os.Stdin.Name() && adder.Name != "" { + addFileName = adder.Name + adder.Name = "" + } + } // patch it into the root - return adder.addNode(dagnode, file.FileName()) + return adder.addNode(dagnode, addFileName) } func (adder *Adder) addDir(dir files.File) error { diff --git a/test/sharness/t0040-add-and-cat.sh b/test/sharness/t0040-add-and-cat.sh index bd60140f58f..0977c32890e 100755 --- a/test/sharness/t0040-add-and-cat.sh +++ b/test/sharness/t0040-add-and-cat.sh @@ -184,6 +184,27 @@ test_add_cat_file() { test_expect_success "make sure it looks good" ' test_cmp zero-length-file zero-length-file_out ' + + test_expect_success "ipfs add --stdin-name" ' + NAMEHASH="QmdFyxZXsFiP4csgfM5uPu99AvFiKH62CSPDw5TP92nr7w" && + echo "IPFS" | ipfs add --stdin-name file.txt > actual && + echo "added $NAMEHASH file.txt" > expected && + test_cmp expected actual + ' + + test_expect_success "ipfs add --stdin-name -w" ' + NAMEHASH="QmdFyxZXsFiP4csgfM5uPu99AvFiKH62CSPDw5TP92nr7w" && + echo "IPFS" | ipfs add -w --stdin-name file.txt | head -n1> actual && + echo "added $NAMEHASH file.txt" > expected && + test_cmp expected actual + ' + + test_expect_success "ipfs cat with stdin-name" ' + NAMEHASH=$(echo "IPFS" | ipfs add -w --stdin-name file.txt -Q) && + ipfs cat /ipfs/$NAMEHASH/file.txt > expected && + echo "IPFS" > actual && + test_cmp expected actual + ' } test_add_cat_5MB() {