diff --git a/bin/release b/bin/release index 8f07c2c2..67f92869 100755 --- a/bin/release +++ b/bin/release @@ -1,24 +1,65 @@ #! /bin/bash +set -e +set -o nounset + # Preparation ## Get the new version number from the most recent tag -# Sanity checks +LATEST_TAG=$(git describe --abbrev=0 --match='v*') +VERSION=${LATEST_TAG#v} +echo Attempt to build distributables for version $VERSION +# NB does not check that this tag is on master + +echo +echo == Sanity checks ## Check that the version doesn't already exist by looking at github ## releases +if curl -sSf https://api.github.com/repos/zettio/weave/releases/$LATEST_TAG 2>/dev/null; then + echo Release $LATEST_TAG already exists on GitHub + echo https://github.com/zettio/weave/releases/$LATEST_TAG + exit 1 +fi + +## Clone the repo at the tag and go there +RELEASE_DIR=releases/$LATEST_TAG +mkdir -p releases +git clone -q -b $LATEST_TAG . $RELEASE_DIR +cd $RELEASE_DIR ## Check that the top changelog entry is this version +latest_changelog=$(grep -o "Release v.*" -m1 ./CHANGELOG.md) +if ! [ `echo "$latest_changelog" | grep -o 'v[^ ]*'` == $LATEST_TAG ]; then + echo Latest changelog entry $latest_changelog does not match + echo the latest tag $LATEST_TAG + exit 1 +fi -# Build and test +echo Sanity checks OK for releasing tag $LATEST_TAG -# Clone the repo at the tag, inject the version numbers, build -# distributables (library versions?) +echo +echo == Build and test -# Run tests with the distributables, including version check +## Inject the version numbers and build the distributables +## (library versions?) + +sed -i "/var version = / c\var version = \"$VERSION\"" weaver/main.go +make + +## Run tests with the distributables, including version check +v=$(./weaver/weaver --version) +if ! [ "$v" == "weaver $VERSION" ]; then + echo Version of distributable "$v" does not match tag $LATEST_TAG + exit 1 +fi + +make tests + +echo Build and tests OK # Publish -# Either leave the distributables in a directory for the dev to -# upload, or upload them automatically? +## Either leave the distributables in a directory for the dev to +## upload, or upload them automatically? diff --git a/weaver/main.go b/weaver/main.go index 177f14ba..c28b9bb9 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -18,6 +18,8 @@ import ( "syscall" ) +var version = "(unreleased version)" + func main() { log.SetPrefix(weave.Protocol + " ") @@ -32,17 +34,19 @@ func main() { runtime.GOMAXPROCS(procs) var ( - ifaceName string - routerName string - password string - wait int - debug bool - prof string - peers []string - connLimit int - bufSz int + justVersion bool + ifaceName string + routerName string + password string + wait int + debug bool + prof string + peers []string + connLimit int + bufSz int ) + flag.BoolVar(&justVersion, "version", false, "print version and exit") flag.StringVar(&ifaceName, "iface", "", "name of interface to read from") flag.StringVar(&routerName, "name", "", "name of router (defaults to MAC)") flag.StringVar(&password, "password", "", "network password") @@ -54,6 +58,11 @@ func main() { flag.Parse() peers = flag.Args() + if justVersion { + io.WriteString(os.Stdout, fmt.Sprintf("weaver %s\n", version)) + os.Exit(0) + } + options := make(map[string]string) flag.Visit(func(f *flag.Flag) { value := f.Value.String() @@ -127,6 +136,7 @@ func main() { func handleHttp(router *weave.Router) { http.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, fmt.Sprintln("weaver version", version)) io.WriteString(w, router.Status()) }) http.HandleFunc("/connect", func(w http.ResponseWriter, r *http.Request) {