// Create creates/initializes a new Glide repository. // // This will fail if a glide.yaml already exists. // // By default, this will scan the present source code directory for dependencies. // // If skipImport is set to true, this will not attempt to import from an existing // GPM, Godep, or GB project if one should exist. However, it will still attempt // to read the local source to determine required packages. func Create(base string, skipImport, nonInteractive bool) { glidefile := gpath.GlideFile // Guard against overwrites. guardYAML(glidefile) // Guess deps conf := guessDeps(base, skipImport) // Write YAML msg.Info("Writing configuration file (%s)", glidefile) if err := conf.WriteFile(glidefile); err != nil { msg.Die("Could not save %s: %s", glidefile, err) } var res bool if !nonInteractive { msg.Info("Would you like Glide to help you find ways to improve your glide.yaml configuration?") msg.Info("If you want to revisit this step you can use the config-wizard command at any time.") msg.Info("Yes (Y) or No (N)?") res = msg.PromptUntilYorN() if res { ConfigWizard(base) } } if !res { msg.Info("You can now edit the glide.yaml file. Consider:") msg.Info("--> Using versions and ranges. See https://glide.sh/docs/versions/") msg.Info("--> Adding additional metadata. See https://glide.sh/docs/glide.yaml/") msg.Info("--> Running the config-wizard command to improve the versions in your configuration") } }
func wizardAskLatest(latest string, d *cfg.Dependency) bool { msg.Info("The package %s appears to have Semantic Version releases (http://semver.org). ", d.Name) msg.Info("The latest release is %s. You are currently not using a release. Would you like", latest) msg.Info("to use this release? Yes (Y) or No (N)") return msg.PromptUntilYorN() }
func wizardAskCurrent(cur string, d *cfg.Dependency) bool { msg.Info("The package %s is currently set to use the version %s.", d.Name, d.Reference) msg.Info("There is an equivalent semantic version (http://semver.org) release of %s. Would", cur) msg.Info("you like to use that instead? Yes (Y) or No (N)") return msg.PromptUntilYorN() }
func wizardRemember() bool { msg.Info("Would you like to remember the previous decision and apply it to future") msg.Info("dependencies? Yes (Y) or No (N)") return msg.PromptUntilYorN() }
// ConfigWizard reads configuration from a glide.yaml file and attempts to suggest // improvements. The wizard is interactive. func ConfigWizard(base string) { _, err := gpath.Glide() glidefile := gpath.GlideFile if err != nil { msg.Info("Unable to find a glide.yaml file. Would you like to create one now? Yes (Y) or No (N)") bres := msg.PromptUntilYorN() if bres { // Guess deps conf := guessDeps(base, false) // Write YAML if err := conf.WriteFile(glidefile); err != nil { msg.Die("Could not save %s: %s", glidefile, err) } } else { msg.Err("Unable to find configuration file. Please create configuration information to continue.") } } conf := EnsureConfig() err = cache.Setup() if err != nil { msg.Die("Problem setting up cache: %s", err) } msg.Info("Looking for dependencies to make suggestions on") msg.Info("--> Scanning for dependencies not using version ranges") msg.Info("--> Scanning for dependencies using commit ids") var deps []*cfg.Dependency for _, dep := range conf.Imports { if wizardLookInto(dep) { deps = append(deps, dep) } } for _, dep := range conf.DevImports { if wizardLookInto(dep) { deps = append(deps, dep) } } msg.Info("Gathering information on each dependency") msg.Info("--> This may take a moment. Especially on a codebase with many dependencies") msg.Info("--> Gathering release information for dependencies") msg.Info("--> Looking for dependency imports where versions are commit ids") for _, dep := range deps { wizardFindVersions(dep) } var changes int for _, dep := range deps { var remote string if dep.Repository != "" { remote = dep.Repository } else { remote = "https://" + dep.Name } // First check, ask if the tag should be used instead of the commit id for it. cur := cache.MemCurrent(remote) if cur != "" && cur != dep.Reference { wizardSugOnce() var dres bool asked, use, val := wizardOnce("current") if !use { dres = wizardAskCurrent(cur, dep) } if !asked { as := wizardRemember() wizardSetOnce("current", as, dres) } if asked && use { dres = val.(bool) } if dres { msg.Info("Updating %s to use the tag %s instead of commit id %s", dep.Name, cur, dep.Reference) dep.Reference = cur changes++ } } // Second check, if no version is being used and there's a semver release ask about latest. memlatest := cache.MemLatest(remote) if dep.Reference == "" && memlatest != "" { wizardSugOnce() var dres bool asked, use, val := wizardOnce("latest") if !use { dres = wizardAskLatest(memlatest, dep) } if !asked { as := wizardRemember() wizardSetOnce("latest", as, dres) } if asked && use { dres = val.(bool) } if dres { msg.Info("Updating %s to use the release %s instead of no release", dep.Name, memlatest) dep.Reference = memlatest changes++ } } // Third check, if the version is semver offer to use a range instead. sv, err := semver.NewVersion(dep.Reference) if err == nil { wizardSugOnce() var res string asked, use, val := wizardOnce("range") if !use { res = wizardAskRange(sv, dep) } if !asked { as := wizardRemember() wizardSetOnce("range", as, res) } if asked && use { res = val.(string) } if res == "m" { r := "^" + sv.String() msg.Info("Updating %s to use the range %s instead of commit id %s", dep.Name, r, dep.Reference) dep.Reference = r changes++ } else if res == "p" { r := "~" + sv.String() msg.Info("Updating %s to use the range %s instead of commit id %s", dep.Name, r, dep.Reference) dep.Reference = r changes++ } } } if changes > 0 { msg.Info("Configuration changes have been made. Would you like to write these") msg.Info("changes to your configuration file? Yes (Y) or No (N)") dres := msg.PromptUntilYorN() if dres { msg.Info("Writing updates to configuration file (%s)", glidefile) if err := conf.WriteFile(glidefile); err != nil { msg.Die("Could not save %s: %s", glidefile, err) } msg.Info("You can now edit the glide.yaml file.:") msg.Info("--> For more information on versions and ranges see https://glide.sh/docs/versions/") msg.Info("--> For details on additional metadata see https://glide.sh/docs/glide.yaml/") } else { msg.Warn("Change not written to configuration file") } } else { msg.Info("No proposed changes found. Have a nice day.") } }