updates.go 2.23 KB
Newer Older
1 2 3 4 5 6 7 8
package updates

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
9
	"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver"
10
	u "github.com/jbenet/go-ipfs/util"
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
)

const (
	Version                   = "0.1.0" // actual current application's version literal
	EndpointURLLatestReleases = "https://api.github.com/repos/jbenet/go-ipfs/tags"
	VersionErrorShort         = `Warning: You are running version %s of go-ipfs. The latest version is %s.`
	VersionErrorLong          = `
  Warning: You are running version %s of go-ipfs. The latest version is %s.
  Since this is alpha software, it is strongly recommended you update.

  You can update go-ipfs by running

      ipfs version update

  You can silence this message by running

      ipfs config update.check ignore

  `
)

32 33
var log = u.Logger("updates")

34 35 36 37 38 39
var currentVersion *semver.Version

func init() {
	var err error
	currentVersion, err = semver.NewVersion(Version)
	if err != nil {
Henry's avatar
Henry committed
40
		log.Error("The const Version literal in version.go needs to be in semver format: %s \n", Version)
41 42 43 44 45 46 47 48
		os.Exit(1)
	}
}

func CheckForUpdates() error {
	resp, err := http.Get(EndpointURLLatestReleases)
	if err != nil {
		// can't reach the endpoint, coud be firewall, or no internet connection or something else
49
		log.Error("update check: error connecting to API endpoint for newer versions: %v", err)
50 51 52 53 54 55 56 57
		return nil
	}
	var body interface{}
	_ = json.NewDecoder(resp.Body).Decode(&body)
	releases, ok := body.([]interface{})
	if !ok {
		// the response body does not seem to meet specified Github API format
		// https://developer.github.com/v3/repos/#list-tags
58
		log.Error("update check: API endpoint for newer versions does not seem to be in Github API specified format")
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
		return nil
	}
	for _, r := range releases {
		release, ok := r.(map[string]interface{})
		if !ok {
			continue
		}
		tagName, ok := release["name"].(string)
		if !ok {
			continue
		}
		if len(tagName) > 0 && tagName[0] == 'v' {
			// both 'v0.1.0' and '0.1.0' semver tagname conventions can be encountered
			tagName = tagName[1:]
		}
		releaseVersion, err := semver.NewVersion(tagName)
		if err != nil {
			continue
		}
		if currentVersion.LessThan(*releaseVersion) {
			return fmt.Errorf(VersionErrorLong, Version, tagName)
		}
	}
	return nil
}