Skip to content

Commit 04488c0

Browse files
author
Katrina Owen
authored
Merge pull request #385 from exercism/better-upgrade
Use go-update and semver for a better upgrade experience
2 parents 87518e5 + de5f502 commit 04488c0

40 files changed

Lines changed: 3045 additions & 139 deletions

Godeps/Godeps.json

Lines changed: 74 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/debug.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,15 @@ func Debug(ctx *cli.Context) error {
3131
fmt.Printf("\n**** Debug Information ****\n")
3232
fmt.Printf("Exercism CLI Version: %s\n", ctx.App.Version)
3333

34-
rel, err := fetchLatestRelease(*client)
34+
u, err := NewUpgrader(client)
3535
if err != nil {
3636
log.Println("unable to fetch latest release: " + err.Error())
3737
} else {
38-
if rel.Version() != ctx.App.Version {
38+
rel := u.release
39+
needed, err := u.IsUpgradeNeeded(ctx.App.Version)
40+
if err != nil {
41+
log.Printf("unable to check semver: %s\n", err)
42+
} else if needed {
3943
defer fmt.Printf("\nA newer version of the CLI (%s) can be downloaded here: %s\n", rel.TagName, rel.Location)
4044
}
4145
fmt.Printf("Exercism CLI Latest Release: %s\n", rel.Version())

cmd/release_utils.go

Lines changed: 0 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,13 @@
11
package cmd
22

33
import (
4-
"archive/tar"
5-
"archive/zip"
64
"bytes"
7-
"compress/gzip"
8-
"encoding/json"
95
"fmt"
10-
"io"
116
"io/ioutil"
127
"net/http"
13-
"os"
148
"strings"
159
)
1610

17-
var (
18-
osMap = map[string]string{
19-
"darwin": "mac",
20-
"linux": "linux",
21-
"windows": "windows",
22-
}
23-
24-
archMap = map[string]string{
25-
"amd64": "64bit",
26-
"386": "32bit",
27-
"arm": "arm",
28-
}
29-
)
30-
3111
type asset struct {
3212
ID int `json:"id"`
3313
Name string `json:"name"`
@@ -65,90 +45,3 @@ type release struct {
6545
func (r *release) Version() string {
6646
return strings.TrimPrefix(r.TagName, "v")
6747
}
68-
69-
const installFlag = os.O_RDWR | os.O_CREATE | os.O_TRUNC
70-
71-
func installTgz(source *bytes.Reader, dest string) error {
72-
gr, err := gzip.NewReader(source)
73-
if err != nil {
74-
return err
75-
}
76-
defer gr.Close()
77-
78-
tr := tar.NewReader(gr)
79-
for {
80-
hdr, err := tr.Next()
81-
if err == io.EOF {
82-
break
83-
}
84-
if err != nil {
85-
return err
86-
}
87-
88-
// Move the old version to a backup path that we can recover from
89-
// in case the upgrade fails
90-
destBackup := dest + ".bak"
91-
if _, err := os.Stat(dest); err == nil {
92-
os.Rename(dest, destBackup)
93-
}
94-
95-
fileCopy, err := os.OpenFile(dest, installFlag, hdr.FileInfo().Mode())
96-
if err != nil {
97-
os.Rename(destBackup, dest)
98-
return err
99-
}
100-
defer fileCopy.Close()
101-
102-
if _, err = io.Copy(fileCopy, tr); err != nil {
103-
os.Rename(destBackup, dest)
104-
return err
105-
} else {
106-
os.Remove(destBackup)
107-
}
108-
}
109-
110-
return nil
111-
}
112-
113-
func installZip(source *bytes.Reader, dest string) error {
114-
zr, err := zip.NewReader(source, int64(source.Len()))
115-
if err != nil {
116-
return err
117-
}
118-
119-
for _, f := range zr.File {
120-
fileCopy, err := os.OpenFile(dest, installFlag, f.Mode())
121-
if err != nil {
122-
return err
123-
}
124-
defer fileCopy.Close()
125-
126-
rc, err := f.Open()
127-
if err != nil {
128-
return err
129-
}
130-
defer rc.Close()
131-
132-
_, err = io.Copy(fileCopy, rc)
133-
if err != nil {
134-
return err
135-
}
136-
}
137-
138-
return nil
139-
}
140-
141-
func fetchLatestRelease(client http.Client) (*release, error) {
142-
resp, err := client.Get("https://api.github.com/repos/exercism/cli/releases/latest")
143-
if err != nil {
144-
return nil, err
145-
}
146-
defer resp.Body.Close()
147-
148-
var rel release
149-
if err := json.NewDecoder(resp.Body).Decode(&rel); err != nil {
150-
return nil, err
151-
}
152-
153-
return &rel, nil
154-
}

0 commit comments

Comments
 (0)