func addRemote(cmd *c.Command, args []string) { remote := &dev.Remote{Priority: 50} switch len(args) { case 1: remote.Urlbase = args[0] case 2: pri, err := strconv.Atoi(args[1]) if err == nil { remote.Priority = pri remote.Urlbase = args[0] } else { remote.Name, remote.Urlbase = args[0], args[1] } case 3: remote.Name, remote.Urlbase = args[0], args[1] pri, err := strconv.Atoi(args[2]) if err == nil { remote.Priority = pri } else { log.Fatalf("Last argument must be a number, but you passed %v\n", args[2]) } default: log.Fatalf("Adding a remote takes at least 1 and most 3 parameters!") } dev.ValidateRemote(remote) dev.MustFindCrowbar() if dev.Remotes[remote.Name] != nil { log.Fatalf("%s is already a Crowbar remote.", remote.Name) } dev.AddRemote(remote) os.Exit(0) }
func listRemotes(cmd *c.Command, args []string) { dev.MustFindCrowbar() for _, remote := range dev.SortedRemotes() { fmt.Printf("%s: urlbase=%s, priority=%d\n", remote.Name, remote.Urlbase, remote.Priority) } os.Exit(0) }
func crossReleaseChanges(cmd *c.Command, args []string) { dev.MustFindCrowbar() if len(args) != 2 { log.Fatalf("%s takes exactly 2 release names!") } releases := new([2]dev.Release) // Translate command line parameters. // releases[0] will be the release with changes, and // releases[1] will be the base release. for i, name := range args { switch name { case "current": releases[i] = dev.CurrentRelease() case "parent": if i == 0 { log.Fatalf("parent can only be the second arg to %s\n", cmd.Name()) } releases[1] = releases[0].Parent() if releases[1] == nil { log.Fatalf("%s does not have a parent release.\n", releases[0].Name()) } default: releases[i] = dev.GetRelease(name) } } dev.CrossReleaseChanges(releases[0], releases[1]) }
func fetch(cmd *c.Command, args []string) { dev.MustFindCrowbar() ok, _ := dev.Fetch(nil) if !ok { os.Exit(1) } log.Printf("All updates fetched.\n") }
func sanityCheckBuild(cmd *c.Command, args []string) { dev.MustFindCrowbar() paths := make([]string, 0, 0) for _, bc := range dev.BarclampsInBuild(dev.CurrentBuild()) { paths = append(paths, filepath.Join(bc.Repo.Path(), "crowbar.yml")) } buildutils.SanityCheckMetadata(paths) }
func showRelease(cmd *c.Command, args []string) { dev.MustFindCrowbar() if len(args) == 0 { dev.ShowRelease(dev.CurrentRelease()) } else { for _, rel := range args { dev.ShowRelease(dev.GetRelease(rel)) } } }
func splitRelease(cmd *c.Command, args []string) { if len(args) != 1 { log.Fatalf("split-release only accepts one argument!") } dev.MustFindCrowbar() current := dev.CurrentRelease() if _, err := dev.SplitRelease(current, args[0]); err != nil { log.Println(err) log.Fatalf("Could not split new release %s from %s", args[0], current.Name()) } }
func zapRemote(cmd *c.Command, args []string) { if len(args) != 1 { log.Fatalf("remote rm only accepts one argument!\n") } dev.MustFindCrowbar() remote, found := dev.Remotes[args[0]] if !found { log.Fatalf("%s is not a remote!\n", args[0]) } dev.ZapRemote(remote) }
func setRemoteURLBase(cmd *c.Command, args []string) { dev.MustFindCrowbar() if len(args) != 2 { log.Fatal("Need exactly 2 arguments") } remote, found := dev.Remotes[args[0]] if !found { log.Fatalf("%s is not a remote!\n", args[0]) } dev.SetRemoteURLBase(remote, args[1]) }
func remoteChanges(cmd *c.Command, args []string) { dev.MustFindCrowbar() switch len(args) { case 0: dev.RemoteChanges(dev.CurrentRelease()) case 1: dev.RemoteChanges(dev.GetRelease(args[0])) default: log.Fatalf("%s takes 0 or 1 release name!\n", cmd.Name()) } }
func releases(cmd *c.Command, args []string) { dev.MustFindCrowbar() res := make([]string, 0, 20) for release := range dev.Releases() { res = append(res, release) } sort.Strings(res) for _, release := range res { fmt.Println(release) } }
func showRemote(cmd *c.Command, args []string) { dev.MustFindCrowbar() if len(args) != 1 { log.Fatal("Need exactly 1 argument.") } remote, found := dev.Remotes[args[0]] if !found { log.Fatalf("%s is not a remote!\n", args[0]) } fmt.Printf("Remote %s:\n\tUrlbase: %s\n\tPriority: %d\n", remote.Name, remote.Urlbase, remote.Priority) os.Exit(0) }
func renameRemote(cmd *c.Command, args []string) { if len(args) != 2 { log.Fatalf("remote rename takes exactly 2 arguments.\n") } dev.MustFindCrowbar() remote, found := dev.Remotes[args[0]] if !found { log.Fatalf("%s is not a Crowbar remote.", args[0]) } if _, found = dev.Remotes[args[1]]; found { log.Fatalf("%s is already a remote, cannot rename %s to it\n", args[1], args[0]) } dev.RenameRemote(remote, args[1]) }
func updateTracking(cmd *c.Command, args []string) { dev.MustFindCrowbar() ok, res := dev.UpdateTrackingBranches() if ok { os.Exit(0) } log.Printf("Failed to update tracking branches in: ") for _, result := range res { if !result.OK { log.Printf("\t%s\n", result.Name) } } os.Exit(1) }
func switchBuild(cmd *c.Command, args []string) { dev.MustFindCrowbar() if ok, _ := dev.IsClean(); !ok { log.Fatalln("Crowbar is not clean, cannot switch builds.") } rels := dev.Releases() current := dev.CurrentBuild() var target dev.Build found := false switch len(args) { case 0: target, found = current, true case 1: // Were we passed a known release? rel, foundRel := rels[args[0]] if foundRel { for _, build := range []string{current.Name(), "master"} { target, found = rel.Builds()[build] if found { break } } } else { target, found = dev.Builds()[args[0]] } default: log.Fatalf("switch takes 0 or 1 argument.") } if !found { log.Fatalf("%s is not anything we can switch to!") } ok, tokens := dev.Switch(target) for _, tok := range tokens { if tok.Results != nil { log.Printf("%s: %v\n", tok.Name, tok.Results) } } if ok { log.Printf("Switched to %s\n", target.FullName()) os.Exit(0) } log.Printf("Failed to switch to %s!\n", target.FullName()) ok, _ = dev.Switch(current) os.Exit(1) }
func isClean(cmd *c.Command, args []string) { dev.MustFindCrowbar() ok, items := dev.IsClean() if ok { log.Println("All Crowbar repositories are clean.") os.Exit(0) } for _, item := range items { if !item.OK { log.Printf("%s is not clean:\n", item.Name) for _, line := range item.Results.(git.StatLines) { log.Printf("\t%s\n", line.Print()) } } } os.Exit(1) return }
func sync(cmd *c.Command, args []string) { dev.MustFindCrowbar() ok, _ := dev.IsClean() if !ok { log.Printf("Cannot rebase local changes, Crowbar is not clean.\n") isClean(cmd, args) } ok, res := dev.Rebase() if ok { log.Println("All local changes rebased against upstream.") os.Exit(0) } for _, tok := range res { log.Printf("%v: %v %v\n", tok.Name, tok.OK, tok.Results) } log.Println("Errors rebasing local changes. All changes unwound.") os.Exit(1) }
func removeRelease(cmd *c.Command, args []string) { if len(args) != 1 { log.Fatalf("remove-release only accepts one argument!") } dev.MustFindCrowbar() releaseName := args[0] releases := dev.Releases() release, found := releases[releaseName] if !found { log.Fatalf("%s is not a release!\n", releaseName) } if releaseName == "development" { log.Fatal("Cannot delete the development release.") } if err := dev.RemoveRelease(release); err != nil { log.Fatal(err) } log.Printf("Release %s deleted.\n", releaseName) }
func builds(cmd *c.Command, args []string) { dev.MustFindCrowbar() res := make([]string, 0, 20) if len(args) == 0 { for build := range dev.CurrentRelease().Builds() { res = append(res, dev.CurrentRelease().Name()+"/"+build) } } else { for _, release := range args { for build := range dev.GetRelease(release).Builds() { res = append(res, release+"/"+build) } } } sort.Strings(res) for _, build := range res { fmt.Println(build) } }
func barclampsInBuild(cmd *c.Command, args []string) { dev.MustFindCrowbar() res := make([]string, 0, 20) var build dev.Build var found bool if len(args) == 0 { build = dev.CurrentBuild() } else if len(args) == 1 { builds := dev.Builds() build, found = builds[args[0]] if !found { log.Fatalln("No such build %s", args[0]) } } for name := range dev.BarclampsInBuild(build) { res = append(res, name) } sort.Strings(res) for _, name := range res { fmt.Println(name) } }
func zapBuild(cmd *c.Command, args []string) { if len(args) != 1 { log.Fatalf("remove-build only accepts one argument!\n") } buildName := args[0] dev.MustFindCrowbar() if !strings.Contains(buildName, "/") { // We were passed what appears to be a raw build name. // Turn it into a real build by prepending the release name. buildName = dev.CurrentRelease().Name() + "/" + buildName } builds := dev.Builds() build, found := builds[buildName] if !found { log.Fatalf("%s is not a build, cannot delete it!", buildName) } if strings.HasSuffix(buildName, "/master") { log.Fatalf("Cannot delete the master build in a release!") } if err := build.Zap(); err != nil { log.Fatal(err) } log.Printf("Build %s deleted.\n", buildName) }
func showBuild(cmd *c.Command, args []string) { dev.MustFindCrowbar() fmt.Println(dev.CurrentBuild().FullName()) }
func currentRelease(cmd *c.Command, args []string) { dev.MustFindCrowbar() fmt.Println(dev.CurrentRelease().Name()) }
func cloneBarclamps(cmd *c.Command, args []string) { dev.MustFindCrowbar() dev.CloneBarclamps() }
func syncRemotes(cmd *c.Command, args []string) { dev.MustFindCrowbar() dev.SyncRemotes() }
func showCrowbar(cmd *c.Command, args []string) { dev.MustFindCrowbar() log.Printf("Crowbar is located at: %s\n", dev.Repo.Path()) }