// initVersions collects state relevant to an upgrade decision. The returned // agent and client versions, and the list of currently available tools, will // always be accurate; the chosen version, and the flag indicating development // mode, may remain blank until uploadTools or validate is called. func (c *UpgradeJujuCommand) initVersions(cfg *config.Config, env environs.Environ) (*upgradeVersions, error) { agent, ok := cfg.AgentVersion() if !ok { // Can't happen. In theory. return nil, fmt.Errorf("incomplete environment configuration") } if c.Version == agent { return nil, errUpToDate } client := version.Current.Number available, err := environs.FindAvailableTools(env, client.Major) if err != nil { if !errors.IsNotFoundError(err) { return nil, err } if !c.UploadTools { if c.Version == version.Zero { return nil, errUpToDate } return nil, err } } dev := c.Development || cfg.Development() || agent.IsDev() || client.IsDev() return &upgradeVersions{ dev: dev, agent: agent, client: client, chosen: c.Version, tools: available, }, nil }