2013-09-28 23:08:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
2014-06-03 15:08:58 +00:00
|
|
|
"github.com/github/git-media/gitmedia"
|
2013-09-28 23:08:21 +00:00
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
BuildOS = flag.String("os", "", "OS to target: darwin, freebsd, linux, windows")
|
|
|
|
BuildArch = flag.String("arch", "", "Arch to target: 386, amd64")
|
|
|
|
BuildAll = flag.Bool("all", false, "Builds all architectures")
|
|
|
|
ShowHelp = flag.Bool("help", false, "Shows help")
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
cmd, err := exec.Command("script/fmt").Output()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(cmd) > 0 {
|
|
|
|
fmt.Println(string(cmd))
|
|
|
|
}
|
|
|
|
|
|
|
|
flag.Parse()
|
|
|
|
if *ShowHelp {
|
2014-05-22 23:08:14 +00:00
|
|
|
fmt.Println("usage: script/bootstrap [-os] [-arch] [-all]")
|
2013-09-28 23:08:21 +00:00
|
|
|
flag.PrintDefaults()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if *BuildAll {
|
|
|
|
for _, buildos := range []string{"darwin", "freebsd", "linux", "windows"} {
|
|
|
|
for _, buildarch := range []string{"386", "amd64"} {
|
|
|
|
build(buildos, buildarch)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
build(*BuildOS, *BuildArch)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func build(buildos, buildarch string) {
|
2013-11-05 23:15:21 +00:00
|
|
|
addenv := len(buildos) > 0 && len(buildarch) > 0
|
|
|
|
name := "git-media-v" + gitmedia.Version
|
|
|
|
dir := "bin"
|
|
|
|
|
|
|
|
if addenv {
|
2013-09-28 23:08:21 +00:00
|
|
|
fmt.Printf("Building for %s/%s\n", buildos, buildarch)
|
2013-11-06 00:41:31 +00:00
|
|
|
dir = filepath.Join(dir, "releases", buildos+"-"+buildarch, name)
|
2013-09-28 23:08:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
filepath.Walk("cmd", func(path string, info os.FileInfo, err error) error {
|
|
|
|
if !strings.HasSuffix(path, ".go") {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-11-05 23:15:21 +00:00
|
|
|
cmd := filepath.Base(path)
|
|
|
|
cmd = cmd[0 : len(cmd)-3]
|
|
|
|
return buildCommand(path, dir, buildos, buildarch)
|
2013-09-28 23:08:21 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
if addenv {
|
2014-05-22 23:29:55 +00:00
|
|
|
err := os.MkdirAll(dir, 0755)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error setting up installer:\n", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
err = setupInstaller(buildos, buildarch, dir)
|
2013-11-05 23:50:21 +00:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error setting up installer:\n", err.Error())
|
|
|
|
}
|
2013-09-28 23:08:21 +00:00
|
|
|
}
|
2013-11-05 23:15:21 +00:00
|
|
|
}
|
2013-09-28 23:08:21 +00:00
|
|
|
|
2013-11-05 23:15:21 +00:00
|
|
|
func buildCommand(path, dir, buildos, buildarch string) error {
|
|
|
|
addenv := len(buildos) > 0 && len(buildarch) > 0
|
|
|
|
name := filepath.Base(path)
|
|
|
|
name = name[0 : len(name)-3]
|
|
|
|
|
|
|
|
bin := filepath.Join(dir, name)
|
2013-11-05 21:42:53 +00:00
|
|
|
|
2013-11-05 23:35:05 +00:00
|
|
|
if buildos == "windows" {
|
|
|
|
bin = bin + ".exe"
|
|
|
|
}
|
|
|
|
|
2013-09-28 23:08:21 +00:00
|
|
|
cmd := exec.Command("go", "build", "-o", bin, path)
|
|
|
|
if addenv {
|
2013-11-05 21:48:39 +00:00
|
|
|
cmd.Env = []string{
|
|
|
|
"GOOS=" + buildos,
|
|
|
|
"GOARCH=" + buildarch,
|
|
|
|
"GOPATH=" + os.Getenv("GOPATH"),
|
2014-05-22 23:32:13 +00:00
|
|
|
"GOROOT=" + os.Getenv("GOROOT"),
|
2013-11-05 21:48:39 +00:00
|
|
|
}
|
2013-09-28 23:08:21 +00:00
|
|
|
}
|
|
|
|
|
2013-11-06 00:20:30 +00:00
|
|
|
output, err := cmd.CombinedOutput()
|
|
|
|
if len(output) > 0 {
|
|
|
|
fmt.Println(string(output))
|
2013-09-28 23:08:21 +00:00
|
|
|
}
|
2013-11-06 00:20:30 +00:00
|
|
|
return err
|
2013-09-28 23:08:21 +00:00
|
|
|
}
|
2013-11-05 23:15:21 +00:00
|
|
|
|
|
|
|
func setupInstaller(buildos, buildarch, dir string) error {
|
|
|
|
if buildos == "windows" {
|
2013-11-05 23:50:21 +00:00
|
|
|
return winInstaller(buildos, buildarch, dir)
|
|
|
|
} else {
|
|
|
|
return unixInstaller(buildos, buildarch, dir)
|
2013-11-05 23:15:21 +00:00
|
|
|
}
|
2013-11-05 23:50:21 +00:00
|
|
|
}
|
2013-11-05 23:15:21 +00:00
|
|
|
|
2013-11-05 23:50:21 +00:00
|
|
|
func unixInstaller(buildos, buildarch, dir string) error {
|
2013-12-06 17:49:34 +00:00
|
|
|
fullInstallPath := filepath.Join(dir, "install.sh")
|
|
|
|
cmd := exec.Command("cp", "script/install.sh.example", fullInstallPath)
|
2013-11-05 23:50:21 +00:00
|
|
|
if err := logAndRun(cmd); err != nil {
|
2013-11-05 23:15:21 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2013-12-06 17:49:34 +00:00
|
|
|
if err := os.Chmod(fullInstallPath, 0755); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2013-11-05 23:50:21 +00:00
|
|
|
name := zipName(buildos, buildarch) + ".tar.gz"
|
2013-11-06 00:40:49 +00:00
|
|
|
cmd = exec.Command("tar", "czf", "../"+name, filepath.Base(dir))
|
2013-11-05 23:15:21 +00:00
|
|
|
cmd.Dir = filepath.Dir(dir)
|
2013-11-05 23:50:21 +00:00
|
|
|
return logAndRun(cmd)
|
|
|
|
}
|
|
|
|
|
|
|
|
func winInstaller(buildos, buildarch, dir string) error {
|
|
|
|
cmd := exec.Command("cp", "script/install.bat.example", filepath.Join(dir, "install.bat"))
|
|
|
|
if err := logAndRun(cmd); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2013-11-06 00:40:49 +00:00
|
|
|
installerPath := filepath.Dir(filepath.Dir(dir))
|
|
|
|
|
2013-11-05 23:50:21 +00:00
|
|
|
name := zipName(buildos, buildarch) + ".zip"
|
2013-11-06 00:40:49 +00:00
|
|
|
full := filepath.Join(installerPath, name)
|
2013-11-06 00:36:32 +00:00
|
|
|
matches, err := filepath.Glob(dir + "/*")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
args := make([]string, len(matches)+2)
|
|
|
|
args[0] = "-j" // junk the zip paths
|
|
|
|
args[1] = full
|
|
|
|
copy(args[2:], matches)
|
|
|
|
|
|
|
|
cmd = exec.Command("zip", args...)
|
2013-11-05 23:50:21 +00:00
|
|
|
return logAndRun(cmd)
|
|
|
|
}
|
|
|
|
|
|
|
|
func logAndRun(cmd *exec.Cmd) error {
|
|
|
|
fmt.Printf(" - %s\n", strings.Join(cmd.Args, " "))
|
|
|
|
if len(cmd.Dir) > 0 {
|
|
|
|
fmt.Printf(" - in %s\n", cmd.Dir)
|
|
|
|
}
|
|
|
|
|
2013-11-06 00:20:30 +00:00
|
|
|
output, err := cmd.CombinedOutput()
|
|
|
|
fmt.Println(string(output))
|
|
|
|
return err
|
2013-11-05 23:15:21 +00:00
|
|
|
}
|
2013-11-05 23:50:21 +00:00
|
|
|
|
|
|
|
func zipName(os, arch string) string {
|
|
|
|
return fmt.Sprintf("git-media-%s-%s-v%s", os, arch, gitmedia.Version)
|
|
|
|
}
|