|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "errors" |
| 5 | + "fmt" |
| 6 | + |
| 7 | + "github.com/blang/semver" |
| 8 | + logging "github.com/op/go-logging" |
| 9 | + "github.com/rhysd/go-github-selfupdate/selfupdate" |
| 10 | + "github.com/urfave/cli" |
| 11 | +) |
| 12 | + |
| 13 | +const updateEndpoint = "fossas/fossa-cli" |
| 14 | + |
| 15 | +var updateLogger = logging.MustGetLogger("update") |
| 16 | + |
| 17 | +func getSemver(v string) string { |
| 18 | + if v[0] != 'v' { |
| 19 | + return "" |
| 20 | + } |
| 21 | + return v[1:] |
| 22 | +} |
| 23 | + |
| 24 | +func checkUpdate() (bool, error) { |
| 25 | + latest, found, err := selfupdate.DetectLatest(updateEndpoint) |
| 26 | + if err != nil { |
| 27 | + return false, fmt.Errorf("could not check for updates: %s", err.Error()) |
| 28 | + } |
| 29 | + |
| 30 | + parsedVersion := getSemver(version) |
| 31 | + updateLogger.Debugf("checking version for updates (%s -> %s)", version, parsedVersion) |
| 32 | + v, err := semver.Parse(parsedVersion) |
| 33 | + if err != nil { |
| 34 | + return false, errors.New("invalid version (are you using a development binary?)") |
| 35 | + } |
| 36 | + if !found || latest.Version.Equals(v) { |
| 37 | + return false, nil |
| 38 | + } |
| 39 | + return true, nil |
| 40 | +} |
| 41 | + |
| 42 | +func doSelfUpdate() error { |
| 43 | + parsedVersion := getSemver(version) |
| 44 | + v, err := semver.Parse(parsedVersion) |
| 45 | + if err != nil { |
| 46 | + return errors.New("invalid version (are you using a development binary?)") |
| 47 | + } |
| 48 | + latest, err := selfupdate.UpdateSelf(v, updateEndpoint) |
| 49 | + if err != nil { |
| 50 | + return fmt.Errorf("could not update: %s", err.Error()) |
| 51 | + } |
| 52 | + if latest.Version.Equals(v) { |
| 53 | + return errors.New("no update required") |
| 54 | + } |
| 55 | + updateLogger.Debugf("updating binary versions (%s -> %s)", version, latest.Version) |
| 56 | + return nil |
| 57 | +} |
| 58 | + |
| 59 | +func updateCmd(c *cli.Context) { |
| 60 | + ok, err := checkUpdate() |
| 61 | + if err != nil { |
| 62 | + updateLogger.Fatalf("Unable to update: %s", err.Error()) |
| 63 | + } |
| 64 | + if !ok { |
| 65 | + updateLogger.Fatalf("No updates available") |
| 66 | + } |
| 67 | + |
| 68 | + if err := doSelfUpdate(); err != nil { |
| 69 | + updateLogger.Fatalf("Update failed: %s", err.Error()) |
| 70 | + } |
| 71 | + |
| 72 | + updateLogger.Info("fossa has been updated; run `fossa -v` to view the current version") |
| 73 | +} |
0 commit comments