Skip to content

Instantly share code, notes, and snippets.

@mmcloughlin
Last active September 9, 2018 11:48
Show Gist options
  • Select an option

  • Save mmcloughlin/68dead71de28bc9efe7ebf64673ea989 to your computer and use it in GitHub Desktop.

Select an option

Save mmcloughlin/68dead71de28bc9efe7ebf64673ea989 to your computer and use it in GitHub Desktop.
package main
import (
"flag"
"go/build"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
yaml "gopkg.in/yaml.v2"
)
const travis = ".travis.yml"
var (
repo = flag.String("repo", "", "repository to clone")
num = flag.Int("num", 3, "number of most recent versions")
dry = flag.Bool("dry", false, "dry run")
verbose = flag.Bool("v", false, "verbose")
)
func cmd(name string, arg ...string) {
c := exec.Command(name, arg...)
if *verbose {
c.Stdout = os.Stdout
c.Stderr = os.Stderr
}
if err := c.Run(); err != nil {
log.Fatal(err)
}
}
func versions(n int) []string {
v := []string{"1.x"}
tags := build.Default.ReleaseTags
for _, tag := range tags[len(tags)-n:] {
if !strings.HasPrefix(tag, "go1.") {
log.Fatalf("unexpected relase tag format '%s'", tag)
}
v = append(v, tag[2:]+".x")
}
return v
}
func main() {
flag.Parse()
// Process flags.
if *repo == "" {
log.Fatal("must provide repository to clone")
}
v := versions(*num)
log.Print("updating to versions list ", v)
// Temporary directory.
dir, err := ioutil.TempDir("", "travisup")
if err != nil {
log.Fatal(err)
}
defer os.RemoveAll(dir)
// Clone.
log.Printf("clone %s", *repo)
cmd("git", "clone", *repo, dir)
// Replace versions.
travispath := filepath.Join(dir, travis)
b, err := ioutil.ReadFile(travispath)
if err != nil {
log.Fatal(err)
}
cfg := yaml.MapSlice{}
if err := yaml.Unmarshal(b, &cfg); err != nil {
log.Fatal(err)
}
for i := range cfg {
if cfg[i].Key.(string) == "go" {
cfg[i].Value = v
}
}
b, err = yaml.Marshal(cfg)
if err != nil {
log.Fatal(err)
}
err = ioutil.WriteFile(travispath, b, 0)
if err != nil {
log.Fatal(err)
}
if *verbose {
cmd("git", "-C", dir, "diff")
}
// Commit.
cmd("git", "-C", dir, "add", travis)
cmd("git", "-C", dir, "commit", "-m", "update go versions in travis")
// Push.
if *dry {
log.Print("dry run skipping push")
return
}
cmd("git", "-C", dir, "push")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment