mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-01 08:15:43 +08:00

misc/completion/ipfs-completion.bash: add `ipfs stats` to BASH completion core/commands/mount_unix.go: ensure error is not nil before printing it contribute.md: fix bibliography indexing in example core/commands/swarm.go: change tabs to spaces in USAGE message *: 80-column readability improvements License: MIT Signed-off-by: Thomas Gardner <tmg@fastmail.com>
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
// Package commands implements the IPFS command interface
|
|
//
|
|
// Using github.com/ipfs/go-ipfs/commands to define the command line and HTTP
|
|
// APIs. This is the interface available to folks using IPFS from outside of
|
|
// the Go language.
|
|
package commands
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"sort"
|
|
"strings"
|
|
|
|
cmds "github.com/ipfs/go-ipfs/commands"
|
|
)
|
|
|
|
type Command struct {
|
|
Name string
|
|
Subcommands []Command
|
|
Options []cmds.Option
|
|
ShowOptions bool
|
|
}
|
|
|
|
const (
|
|
flagsOptionName = "flags"
|
|
)
|
|
|
|
// CommandsCmd takes in a root command,
|
|
// and returns a command that lists the subcommands in that root
|
|
func CommandsCmd(root *cmds.Command) *cmds.Command {
|
|
return &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "List all available commands.",
|
|
ShortDescription: `Lists all available commands (and subcommands) and exits.`,
|
|
},
|
|
Options: []cmds.Option{
|
|
cmds.BoolOption(flagsOptionName, "f", "Show command flags"),
|
|
},
|
|
Run: func(req cmds.Request, res cmds.Response) {
|
|
showOptions, _, _ := req.Option(flagsOptionName).Bool()
|
|
rootCmd := cmd2outputCmd("ipfs", root, showOptions)
|
|
res.SetOutput(&rootCmd)
|
|
},
|
|
Marshalers: cmds.MarshalerMap{
|
|
cmds.Text: func(res cmds.Response) (io.Reader, error) {
|
|
v := res.Output().(*Command)
|
|
buf := new(bytes.Buffer)
|
|
for _, s := range cmdPathStrings(v) {
|
|
buf.Write([]byte(s + "\n"))
|
|
}
|
|
return buf, nil
|
|
},
|
|
},
|
|
Type: Command{},
|
|
}
|
|
}
|
|
|
|
func cmd2outputCmd(name string, cmd *cmds.Command, showOptions bool) Command {
|
|
output := Command{
|
|
Name: name,
|
|
Subcommands: make([]Command, len(cmd.Subcommands)),
|
|
Options: cmd.Options,
|
|
ShowOptions: showOptions,
|
|
}
|
|
|
|
i := 0
|
|
for name, sub := range cmd.Subcommands {
|
|
output.Subcommands[i] = cmd2outputCmd(name, sub, showOptions)
|
|
i++
|
|
}
|
|
|
|
return output
|
|
}
|
|
|
|
func cmdPathStrings(cmd *Command) []string {
|
|
var cmds []string
|
|
|
|
var recurse func(prefix string, cmd *Command)
|
|
recurse = func(prefix string, cmd *Command) {
|
|
newPrefix := prefix + cmd.Name
|
|
cmds = append(cmds, newPrefix)
|
|
if prefix != "" && cmd.ShowOptions {
|
|
for _, option := range cmd.Options {
|
|
names := option.Names()
|
|
var cmdOpts []string
|
|
for _, flag := range names {
|
|
if len(flag) == 1 {
|
|
flag = "-" + flag
|
|
} else {
|
|
flag = "--" + flag
|
|
}
|
|
cmdOpts = append(cmdOpts, newPrefix+" "+flag)
|
|
}
|
|
cmds = append(cmds, strings.Join(cmdOpts, " / "))
|
|
}
|
|
}
|
|
for _, sub := range cmd.Subcommands {
|
|
recurse(newPrefix+" ", &sub)
|
|
}
|
|
}
|
|
|
|
recurse("", cmd)
|
|
sort.Sort(sort.StringSlice(cmds))
|
|
return cmds
|
|
}
|