diff --git a/core/commands/add.go b/core/commands/add.go index 619fa4318296..3690138e812a 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -2,6 +2,7 @@ package commands import ( "fmt" + "io" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/cheggaaa/pb" "github.com/ipfs/go-ipfs/core/coreunix" @@ -49,7 +50,7 @@ remains to be implemented. cmds.BoolOption(trickleOptionName, "t", "Use trickle-dag format for dag generation"), cmds.BoolOption(onlyHashOptionName, "n", "Only chunk and hash - do not write to disk"), cmds.BoolOption(wrapOptionName, "w", "Wrap files with a directory object"), - cmds.BoolOption(hiddenOptionName, "H", "Include files that are hidden"), + cmds.BoolOption(hiddenOptionName, "H", "Include files that are hidden. Only takes effect on recursive add."), cmds.StringOption(chunkerOptionName, "s", "chunking algorithm to use"), cmds.BoolOption(pinOptionName, "Pin this object when adding. Default true"), }, @@ -147,8 +148,20 @@ remains to be implemented. fileAdder.Silent = silent addAllAndPin := func(f files.File) error { - if err := fileAdder.AddFile(f); err != nil { - return err + // Iterate over each top-level file and add individually. Otherwise the + // single files.File f is treated as a directory, affecting hidden file + // semantics. + for { + file, err := f.NextFile() + if err == io.EOF { + // Finished the list of files. + break + } else if err != nil { + return err + } + if err := fileAdder.AddFile(file); err != nil { + return err + } } if hash { diff --git a/core/coreunix/add.go b/core/coreunix/add.go index c898109af551..d0619b6e6808 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -359,11 +359,7 @@ func (adder *Adder) addFile(file files.File) error { return err } - switch { - case files.IsHidden(file) && !adder.Hidden: - log.Infof("%s is hidden, skipping", file.FileName()) - return &hiddenFileError{file.FileName()} - case file.IsDirectory(): + if file.IsDirectory() { return adder.addDir(file) } @@ -417,11 +413,13 @@ func (adder *Adder) addDir(dir files.File) error { break } - err = adder.addFile(file) - if _, ok := err.(*hiddenFileError); ok { - // hidden file error, skip file + // Skip hidden files when adding recursively, unless Hidden is enabled. + if files.IsHidden(file) && !adder.Hidden { + log.Infof("%s is hidden, skipping", file.FileName()) continue - } else if err != nil { + } + err = adder.addFile(file) + if err != nil { return err } } diff --git a/test/sharness/t0042-add-skip.sh b/test/sharness/t0042-add-skip.sh index d5f7997984fc..05ccf469603d 100755 --- a/test/sharness/t0042-add-skip.sh +++ b/test/sharness/t0042-add-skip.sh @@ -48,6 +48,17 @@ test_add_skip() { test_cmp expected actual ' + test_expect_success "'ipfs add' includes hidden files at the top-level even without --hidden" ' + mkdir -p mountdir/dotfiles && + echo "set nocompatible" > mountdir/dotfiles/.vimrc + cat >expected <<-\EOF && + added QmT4uMRDCN7EMpFeqwvKkboszbqeW1kWVGrBxBuCGqZcQc .vimrc + EOF + ipfs add mountdir/dotfiles/.vimrc >actual + cat actual + test_cmp expected actual + ' + } # should work offline