Parcourir la source

Use runtime info to determine ARM version for upgrade (fixes #1051)

Jakob Borg il y a 11 ans
Parent
commit
0fde4b3b2e

+ 3 - 15
build.go

@@ -72,17 +72,8 @@ func main() {
 	flag.Parse()
 	flag.Parse()
 
 
 	switch goarch {
 	switch goarch {
-	case "386", "amd64", "armv5", "armv6", "armv7":
+	case "386", "amd64", "arm", "armv5", "armv6", "armv7":
 		break
 		break
-	case "arm":
-		switch os.Getenv("GOARM") {
-		case "5", "6", "7":
-			goarch += "v" + os.Getenv("GOARM")
-			break
-		default:
-			log.Println("Invalid goarch \"arm\". Use one of \"armv5\", \"armv6\", \"armv7\".")
-			log.Fatalln("Note that producing a correct \"armv5\" binary requires a rebuilt stdlib.")
-		}
 	default:
 	default:
 		log.Printf("Unknown goarch %q; proceed with caution!", goarch)
 		log.Printf("Unknown goarch %q; proceed with caution!", goarch)
 	}
 	}
@@ -161,7 +152,7 @@ func checkRequiredGoVersion() {
 		// This is a standard go build. Verify that it's new enough.
 		// This is a standard go build. Verify that it's new enough.
 		f, err := strconv.ParseFloat(vs, 64)
 		f, err := strconv.ParseFloat(vs, 64)
 		if err != nil {
 		if err != nil {
-			log.Printf("*** Could parse Go version out of %q.\n*** This isn't known to work, proceed on your own risk.", vs)
+			log.Printf("*** Couldn't parse Go version out of %q.\n*** This isn't known to work, proceed on your own risk.", vs)
 			return
 			return
 		}
 		}
 		if f < minGoVersion {
 		if f < minGoVersion {
@@ -269,7 +260,7 @@ func listFiles(dir string) []string {
 
 
 func setBuildEnv() {
 func setBuildEnv() {
 	os.Setenv("GOOS", goos)
 	os.Setenv("GOOS", goos)
-	if strings.HasPrefix(goarch, "arm") {
+	if strings.HasPrefix(goarch, "armv") {
 		os.Setenv("GOARCH", "arm")
 		os.Setenv("GOARCH", "arm")
 		os.Setenv("GOARM", goarch[4:])
 		os.Setenv("GOARM", goarch[4:])
 	} else {
 	} else {
@@ -334,9 +325,6 @@ func ldflags() string {
 	b.WriteString(fmt.Sprintf(" -X main.BuildUser %s", buildUser()))
 	b.WriteString(fmt.Sprintf(" -X main.BuildUser %s", buildUser()))
 	b.WriteString(fmt.Sprintf(" -X main.BuildHost %s", buildHost()))
 	b.WriteString(fmt.Sprintf(" -X main.BuildHost %s", buildHost()))
 	b.WriteString(fmt.Sprintf(" -X main.BuildEnv %s", buildEnvironment()))
 	b.WriteString(fmt.Sprintf(" -X main.BuildEnv %s", buildEnvironment()))
-	if strings.HasPrefix(goarch, "arm") {
-		b.WriteString(fmt.Sprintf(" -X main.GoArchExtra %s", goarch[3:]))
-	}
 	return b.String()
 	return b.String()
 }
 }
 
 

+ 1 - 1
cmd/syncthing/gui.go

@@ -598,7 +598,7 @@ func restPostUpgrade(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	if upgrade.CompareVersions(rel.Tag, Version) == 1 {
 	if upgrade.CompareVersions(rel.Tag, Version) == 1 {
-		err = upgrade.UpgradeTo(rel, GoArchExtra)
+		err = upgrade.UpgradeTo(rel)
 		if err != nil {
 		if err != nil {
 			l.Warnln("upgrading:", err)
 			l.Warnln("upgrading:", err)
 			http.Error(w, err.Error(), 500)
 			http.Error(w, err.Error(), 500)

+ 2 - 3
cmd/syncthing/main.go

@@ -62,7 +62,6 @@ var (
 	IsRelease   bool
 	IsRelease   bool
 	IsBeta      bool
 	IsBeta      bool
 	LongVersion string
 	LongVersion string
-	GoArchExtra string // "", "v5", "v6", "v7"
 )
 )
 
 
 const (
 const (
@@ -329,7 +328,7 @@ func main() {
 				l.Fatalln("Cannot upgrade, database seems to be locked. Is another copy of Syncthing already running?")
 				l.Fatalln("Cannot upgrade, database seems to be locked. Is another copy of Syncthing already running?")
 			}
 			}
 
 
-			err = upgrade.UpgradeTo(rel, GoArchExtra)
+			err = upgrade.UpgradeTo(rel)
 			if err != nil {
 			if err != nil {
 				l.Fatalln("Upgrade:", err) // exits 1
 				l.Fatalln("Upgrade:", err) // exits 1
 			}
 			}
@@ -1246,7 +1245,7 @@ func autoUpgrade() {
 		}
 		}
 
 
 		l.Infof("Automatic upgrade (current %q < latest %q)", Version, rel.Tag)
 		l.Infof("Automatic upgrade (current %q < latest %q)", Version, rel.Tag)
-		err = upgrade.UpgradeTo(rel, GoArchExtra)
+		err = upgrade.UpgradeTo(rel)
 		if err != nil {
 		if err != nil {
 			l.Warnln("Automatic upgrade:", err)
 			l.Warnln("Automatic upgrade:", err)
 			continue
 			continue

+ 25 - 0
internal/upgrade/releasename_darwin.go

@@ -0,0 +1,25 @@
+// Copyright (C) 2014 The Syncthing Authors.
+//
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package upgrade
+
+import (
+	"fmt"
+	"runtime"
+)
+
+func releaseName(tag string) string {
+	return fmt.Sprintf("syncthing-macosx-%s-%s.", runtime.GOARCH, tag)
+}

+ 38 - 0
internal/upgrade/releasename_linux_arm.go

@@ -0,0 +1,38 @@
+// Copyright (C) 2014 The Syncthing Authors.
+//
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package upgrade
+
+import (
+	"fmt"
+	"strings"
+	"syscall"
+)
+
+func releaseName(tag string) string {
+	return fmt.Sprintf("syncthing-linux-armv%s-%s.", goARM(), tag)
+}
+
+// Get the current ARM architecture version for upgrade purposes. If we can't
+// figure it out from the uname, default to ARMv6 (same as Go distribution).
+func goARM() string {
+	var name syscall.Utsname
+	syscall.Uname(&name)
+	machine := string(name.Machine[:5])
+	if strings.HasPrefix(machine, "armv") {
+		return machine[4:]
+	}
+	return "6"
+}

+ 27 - 0
internal/upgrade/releasename_other.go

@@ -0,0 +1,27 @@
+// Copyright (C) 2014 The Syncthing Authors.
+//
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>.
+
+// +build !arm,!darwin
+
+package upgrade
+
+import (
+	"fmt"
+	"runtime"
+)
+
+func releaseName(tag string) string {
+	return fmt.Sprintf("syncthing-%s-%s-%s.", runtime.GOOS, runtime.GOARCH, tag)
+}

+ 2 - 2
internal/upgrade/upgrade_common.go

@@ -48,7 +48,7 @@ func init() {
 }
 }
 
 
 // A wrapper around actual implementations
 // A wrapper around actual implementations
-func UpgradeTo(rel Release, archExtra string) error {
+func UpgradeTo(rel Release) error {
 	select {
 	select {
 	case <-upgradeUnlocked:
 	case <-upgradeUnlocked:
 		path, err := osext.Executable()
 		path, err := osext.Executable()
@@ -56,7 +56,7 @@ func UpgradeTo(rel Release, archExtra string) error {
 			upgradeUnlocked <- true
 			upgradeUnlocked <- true
 			return err
 			return err
 		}
 		}
-		err = upgradeTo(path, rel, archExtra)
+		err = upgradeTo(path, rel)
 		// If we've failed to upgrade, unlock so that another attempt could be made
 		// If we've failed to upgrade, unlock so that another attempt could be made
 		if err != nil {
 		if err != nil {
 			upgradeUnlocked <- true
 			upgradeUnlocked <- true

+ 2 - 9
internal/upgrade/upgrade_supported.go

@@ -28,19 +28,12 @@ import (
 	"os"
 	"os"
 	"path"
 	"path"
 	"path/filepath"
 	"path/filepath"
-	"runtime"
 	"strings"
 	"strings"
 )
 )
 
 
 // Upgrade to the given release, saving the previous binary with a ".old" extension.
 // Upgrade to the given release, saving the previous binary with a ".old" extension.
-func upgradeTo(path string, rel Release, archExtra string) error {
-	osName := runtime.GOOS
-	if osName == "darwin" {
-		// We call the darwin release bundles macosx because that makes more
-		// sense for people downloading them
-		osName = "macosx"
-	}
-	expectedRelease := fmt.Sprintf("syncthing-%s-%s%s-%s.", osName, runtime.GOARCH, archExtra, rel.Tag)
+func upgradeTo(path string, rel Release) error {
+	expectedRelease := releaseName(rel.Tag)
 	if debug {
 	if debug {
 		l.Debugf("expected release asset %q", expectedRelease)
 		l.Debugf("expected release asset %q", expectedRelease)
 	}
 	}

+ 1 - 1
internal/upgrade/upgrade_unsupp.go

@@ -17,7 +17,7 @@
 
 
 package upgrade
 package upgrade
 
 
-func upgradeTo(path string, rel Release, extra string) error {
+func upgradeTo(path string, rel Release) error {
 	return ErrUpgradeUnsupported
 	return ErrUpgradeUnsupported
 }
 }
 
 

+ 2 - 3
internal/upgrade/upgrade_windows.go

@@ -28,13 +28,12 @@ import (
 	"os"
 	"os"
 	"path"
 	"path"
 	"path/filepath"
 	"path/filepath"
-	"runtime"
 	"strings"
 	"strings"
 )
 )
 
 
 // Upgrade to the given release, saving the previous binary with a ".old" extension.
 // Upgrade to the given release, saving the previous binary with a ".old" extension.
-func upgradeTo(path string, rel Release, archExtra string) error {
-	expectedRelease := fmt.Sprintf("syncthing-%s-%s%s-%s.", runtime.GOOS, runtime.GOARCH, archExtra, rel.Tag)
+func upgradeTo(path string, rel Release) error {
+	expectedRelease := releaseName(rel.Tag)
 	if debug {
 	if debug {
 		l.Debugf("expected release asset %q", expectedRelease)
 		l.Debugf("expected release asset %q", expectedRelease)
 	}
 	}