Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add version deps command [modversion] #6115

Merged
merged 3 commits into from Apr 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions core/commands/commands_test.go
Expand Up @@ -38,6 +38,7 @@ func TestROCommands(t *testing.T) {
"/refs",
"/resolve",
"/version",
"/version/deps",
}

cmdSet := make(map[string]struct{})
Expand Down Expand Up @@ -211,6 +212,7 @@ func TestCommands(t *testing.T) {
"/urlstore",
"/urlstore/add",
"/version",
"/version/deps",
"/cid",
"/cid/format",
"/cid/base32",
Expand Down
60 changes: 59 additions & 1 deletion core/commands/version.go
@@ -1,14 +1,16 @@
package commands

import (
"errors"
"fmt"
"io"
"runtime"
"runtime/debug"

version "github.com/ipfs/go-ipfs"
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"

"github.com/ipfs/go-ipfs-cmdkit"
cmdkit "github.com/ipfs/go-ipfs-cmdkit"
cmds "github.com/ipfs/go-ipfs-cmds"
)

Expand All @@ -32,6 +34,9 @@ var VersionCmd = &cmds.Command{
Tagline: "Show ipfs version information.",
ShortDescription: "Returns the current version of ipfs and exits.",
},
Subcommands: map[string]*cmds.Command{
"deps": depsVersionCommand,
},

Options: []cmdkit.Option{
cmdkit.BoolOption(versionNumberOptionName, "n", "Only show the version number."),
Expand Down Expand Up @@ -83,3 +88,56 @@ var VersionCmd = &cmds.Command{
},
Type: VersionOutput{},
}

type Dependency struct {
Path string
Version string
ReplacedBy string
Sum string
}

const pkgVersionFmt = "%s@%s"

var depsVersionCommand = &cmds.Command{
Helptext: cmdkit.HelpText{
Tagline: "Shows information about dependencies used for build",
ShortDescription: `
Print out all dependencies and their versions.`,
},
Type: Dependency{},

Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
info, ok := debug.ReadBuildInfo()
if !ok {
return errors.New("no embedded dependency information")
}
toDependency := func(mod *debug.Module) (dep Dependency) {
dep.Path = mod.Path
dep.Version = mod.Version
dep.Sum = mod.Sum
if repl := mod.Replace; repl != nil {
dep.ReplacedBy = fmt.Sprintf(pkgVersionFmt, repl.Path, repl.Version)
}
return
}
if err := res.Emit(toDependency(&info.Main)); err != nil {
return err
}
for _, dep := range info.Deps {
if err := res.Emit(toDependency(dep)); err != nil {
return err
}
}
return nil
},
Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, dep Dependency) error {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason, if I change Dependency to *Dependency here I get no output, no error and the encoder is not being run (tested with panic).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fmt.Fprintf(w, pkgVersionFmt, dep.Path, dep.Version)
if dep.ReplacedBy != "" {
fmt.Fprintf(w, " => %s", dep.ReplacedBy)
}
fmt.Fprintf(w, "\n")
return nil
}),
},
}
13 changes: 12 additions & 1 deletion test/sharness/t0010-basic-commands.sh
Expand Up @@ -41,6 +41,16 @@ test_expect_success "ipfs version --all has all required fields" '
grep "Golang version" version_all.txt
'

test_expect_success "ipfs version deps succeeds" '
ipfs version deps >deps.txt
'

test_expect_success "ipfs version deps output looks good" '
head -1 deps.txt | grep "go-ipfs@(devel)" &&
[[ $(tail -n +2 deps.txt | egrep -v -c "^[^ @]+@v[^ @]+( => [^ @]+@v[^ @]+)?$") -eq 0 ]] ||
test_fsh cat deps.txt
'

test_expect_success "'ipfs commands' succeeds" '
ipfs commands >commands.txt
'
Expand Down Expand Up @@ -83,6 +93,7 @@ test_expect_success "All commands accept --help" '

test_expect_failure "All ipfs root commands are mentioned in base helptext" '
echo 0 > fail
ipfs --help > help.txt
cut -d" " -f 2 commands.txt | grep -v ipfs | sort -u | \
while read cmd
do
Expand Down Expand Up @@ -113,7 +124,7 @@ test_expect_success "All ipfs commands fail when passed a bad flag" '
echo 0 > fail
while read -r cmd
do
test_must_fail $cmd --badflag >/dev/null ||
test_must_fail $cmd --badflag >/dev/null 2>&1 ||
{ echo "$cmd exit with code 0 when passed --badflag"; echo 1 > fail; }
done <commands.txt

Expand Down
10 changes: 10 additions & 0 deletions test/sharness/t0060-daemon.sh
Expand Up @@ -71,6 +71,16 @@ test_expect_success "ipfs version output looks good" '
test_fsh cat version.txt
'

test_expect_success "ipfs version deps succeeds" '
ipfs version deps >deps.txt
'

test_expect_success "ipfs version deps output looks good" '
head -1 deps.txt | grep "go-ipfs@(devel)" &&
[[ $(tail -n +2 deps.txt | egrep -v -c "^[^ @]+@v[^ @]+( => [^ @]+@v[^ @]+)?$") -eq 0 ]] ||
test_fsh cat deps.txt
'

test_expect_success "ipfs help succeeds" '
ipfs help >help.txt
'
Expand Down