// SeriesToUpload returns the supplied series with duplicates removed if // non-empty; otherwise it returns a default list of series we should // probably upload, based on cfg. func SeriesToUpload(cfg *config.Config, series []string) []string { unique := set.NewStrings(series...) if unique.IsEmpty() { unique.Add(version.Current.Series) for _, toolsSeries := range toolsLtsSeries { unique.Add(toolsSeries) } if series, ok := cfg.DefaultSeries(); ok { unique.Add(series) } } return unique.Values() }
// resolveCharmURL returns a resolved charm URL, given a charm location string. // If the series is not resolved, the environment default-series is used, or if // not set, the series is resolved with the state server. func resolveCharmURL(url string, client *api.Client, conf *config.Config) (*charm.URL, error) { ref, series, err := charm.ParseReference(url) if err != nil { return nil, err } // If series is not set, use configured default series if series == "" { if defaultSeries, ok := conf.DefaultSeries(); ok { series = defaultSeries } } // Otherwise, look up the best supported series for this charm if series == "" { if ref.Schema == "local" { possibleUrl := &charm.URL{Reference: ref, Series: "precise"} logger.Errorf(`The series is not specified in the environment (default-series) or with the charm. Did you mean: %s`, possibleUrl.String()) return nil, fmt.Errorf("cannot resolve series for charm: %q", ref) } return client.ResolveCharm(ref) } return &charm.URL{Reference: ref, Series: series}, nil }