// Parser creates and populates a fresh parser. // Since commands have local state a fresh parser is required to isolate tests // from each other. func Parser() *flags.Parser { optionsData.Version = func() { printVersions() panic(&exitStatus{0}) } parser := flags.NewParser(&optionsData, flags.HelpFlag|flags.PassDoubleDash|flags.PassAfterNonOption) parser.ShortDescription = i18n.G("Tool to interact with snaps") parser.LongDescription = i18n.G(` Install, configure, refresh and remove snap packages. Snaps are 'universal' packages that work across many different Linux systems, enabling secure distribution of the latest apps and utilities for cloud, servers, desktops and the internet of things. This is the CLI for snapd, a background service that takes care of snaps on the system. Start with 'snap list' to see installed snaps. `) parser.FindOptionByLongName("version").Description = i18n.G("Print the version and exit") // Add all regular commands for _, c := range commands { obj := c.builder() if x, ok := obj.(parserSetter); ok { x.setParser(parser) } cmd, err := parser.AddCommand(c.name, c.shortHelp, strings.TrimSpace(c.longHelp), obj) if err != nil { logger.Panicf("cannot add command %q: %v", c.name, err) } cmd.Hidden = c.hidden opts := cmd.Options() if c.optDescs != nil && len(opts) != len(c.optDescs) { logger.Panicf("wrong number of option descriptions for %s: expected %d, got %d", c.name, len(opts), len(c.optDescs)) } for _, opt := range opts { name := opt.LongName if name == "" { name = string(opt.ShortName) } desc, ok := c.optDescs[name] if !(c.optDescs == nil || ok) { logger.Panicf("%s missing description for %s", c.name, name) } lintDesc(c.name, name, desc, opt.Description) if desc != "" { opt.Description = desc } } args := cmd.Args() if c.argDescs != nil && len(args) != len(c.argDescs) { logger.Panicf("wrong number of argument descriptions for %s: expected %d, got %d", c.name, len(args), len(c.argDescs)) } for i, arg := range args { name, desc := arg.Name, "" if c.argDescs != nil { name = c.argDescs[i].name desc = c.argDescs[i].desc } lintArg(c.name, name, desc, arg.Description) arg.Name = name arg.Description = desc } } return parser }
// Parser creates and populates a fresh parser. // Since commands have local state a fresh parser is required to isolate tests // from each other. func Parser() *flags.Parser { optionsData.Version = func() { printVersions() panic(&exitStatus{0}) } parser := flags.NewParser(&optionsData, flags.HelpFlag|flags.PassDoubleDash|flags.PassAfterNonOption) parser.ShortDescription = i18n.G("Tool to interact with snaps") parser.LongDescription = i18n.G(` The snap tool interacts with the snapd daemon to control the snappy software platform. `) parser.FindOptionByLongName("version").Description = i18n.G("Print the version and exit") // Add all regular commands for _, c := range commands { obj := c.builder() if x, ok := obj.(parserSetter); ok { x.setParser(parser) } cmd, err := parser.AddCommand(c.name, c.shortHelp, strings.TrimSpace(c.longHelp), obj) if err != nil { logger.Panicf("cannot add command %q: %v", c.name, err) } cmd.Hidden = c.hidden opts := cmd.Options() if c.optDescs != nil && len(opts) != len(c.optDescs) { logger.Panicf("wrong number of option descriptions for %s: expected %d, got %d", c.name, len(opts), len(c.optDescs)) } for _, opt := range opts { name := opt.LongName if name == "" { name = string(opt.ShortName) } desc, ok := c.optDescs[name] if !(c.optDescs == nil || ok) { logger.Panicf("%s missing description for %s", c.name, name) } lintDesc(c.name, name, desc, opt.Description) if desc != "" { opt.Description = desc } } args := cmd.Args() if c.argDescs != nil && len(args) != len(c.argDescs) { logger.Panicf("wrong number of argument descriptions for %s: expected %d, got %d", c.name, len(args), len(c.argDescs)) } for i, arg := range args { name, desc := arg.Name, "" if c.argDescs != nil { name = c.argDescs[i].name desc = c.argDescs[i].desc } lintArg(c.name, name, desc, arg.Description) arg.Name = name arg.Description = desc } } // Add the experimental command experimentalCommand, err := parser.AddCommand("experimental", shortExperimentalHelp, longExperimentalHelp, &cmdExperimental{}) experimentalCommand.Hidden = true if err != nil { logger.Panicf("cannot add command %q: %v", "experimental", err) } // Add all the sub-commands of the experimental command for _, c := range experimentalCommands { cmd, err := experimentalCommand.AddCommand(c.name, c.shortHelp, strings.TrimSpace(c.longHelp), c.builder()) if err != nil { logger.Panicf("cannot add experimental command %q: %v", c.name, err) } cmd.Hidden = c.hidden } return parser }