11package cmd
22
33import (
4- "archive/tar"
5- "archive/zip"
64 "bytes"
7- "compress/gzip"
85 "fmt"
9- "io"
10- "io/ioutil"
116 "log"
127 "net/http"
13- "os"
148 "runtime"
159 "strings"
1610 "time"
@@ -30,10 +24,10 @@ var (
3024
3125// Upgrade command allows the user to upgrade to the latest CLI version
3226func Upgrade (ctx * cli.Context ) {
33- client := http.Client {Timeout : 5 * time .Second }
34- rel , err := checkLatestRelease (client )
27+ client := http.Client {Timeout : 10 * time .Second }
28+ rel , err := fetchLatestRelease (client )
3529 if err != nil {
36- log .Fatal (err )
30+ log .Fatal ("unable to check latest release version: " + err . Error () )
3731 }
3832
3933 // TODO: This checks strings against string
@@ -94,116 +88,3 @@ func Upgrade(ctx *cli.Context) {
9488
9589 fmt .Println ("Successfully upgraded!" )
9690}
97-
98- var (
99- osMap = map [string ]string {
100- "darwin" : "mac" ,
101- "linux" : "linux" ,
102- "windows" : "windows" ,
103- }
104-
105- archMap = map [string ]string {
106- "amd64" : "64bit" ,
107- "386" : "32bit" ,
108- "arm" : "arm" ,
109- }
110- )
111-
112- const installFlag = os .O_RDWR | os .O_CREATE | os .O_TRUNC
113-
114- func installTgz (source * bytes.Reader , dest string ) error {
115- gr , err := gzip .NewReader (source )
116- if err != nil {
117- return err
118- }
119- defer gr .Close ()
120-
121- tr := tar .NewReader (gr )
122- for {
123- hdr , err := tr .Next ()
124- if err == io .EOF {
125- break
126- }
127- if err != nil {
128- return err
129- }
130-
131- fileCopy , err := os .OpenFile (dest , installFlag , hdr .FileInfo ().Mode ())
132- if err != nil {
133- return err
134- }
135- defer fileCopy .Close ()
136-
137- if _ , err = io .Copy (fileCopy , tr ); err != nil {
138- return err
139- }
140- }
141-
142- return nil
143- }
144-
145- func installZip (source * bytes.Reader , dest string ) error {
146- zr , err := zip .NewReader (source , int64 (source .Len ()))
147- if err != nil {
148- return err
149- }
150-
151- for _ , f := range zr .File {
152- fileCopy , err := os .OpenFile (dest , installFlag , f .Mode ())
153- if err != nil {
154- return err
155- }
156- defer fileCopy .Close ()
157-
158- rc , err := f .Open ()
159- if err != nil {
160- return err
161- }
162- defer rc .Close ()
163-
164- _ , err = io .Copy (fileCopy , rc )
165- if err != nil {
166- return err
167- }
168- }
169-
170- return nil
171- }
172-
173- type asset struct {
174- ID int `json:"id"`
175- Name string `json:"name"`
176- ContentType string `json:"content_type"`
177- }
178-
179- func (a * asset ) Download () (* bytes.Reader , error ) {
180- downloadURL := fmt .Sprintf ("https://api.github.com/repos/exercism/cli/releases/assets/%d" , a .ID )
181- req , err := http .NewRequest ("GET" , downloadURL , nil )
182- if err != nil {
183- return nil , err
184- }
185- // https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
186- req .Header .Set ("Accept" , "application/octet-stream" )
187- res , err := http .DefaultClient .Do (req )
188- if err != nil {
189- return nil , err
190- }
191- defer res .Body .Close ()
192-
193- bs , err := ioutil .ReadAll (res .Body )
194- if err != nil {
195- return nil , err
196- }
197-
198- return bytes .NewReader (bs ), nil
199- }
200-
201- type release struct {
202- Location string `json:"html_url"`
203- TagName string `json:"tag_name"`
204- Assets []asset `json:"assets"`
205- }
206-
207- func (r * release ) Version () string {
208- return strings .TrimPrefix (r .TagName , "v" )
209- }
0 commit comments