11package commands
22
33import (
4- "archive/zip"
5- "fmt"
6- updater "github.com/inconshreveable/go-update"
7- "github.com/jingweno/gh/github"
84 "github.com/jingweno/gh/utils"
9- "io"
10- "io/ioutil"
11- "net/http"
125 "os"
13- "path/filepath"
14- "runtime"
15- "strings"
166)
177
188var cmdUpdate = & Command {
@@ -27,128 +17,8 @@ Examples:
2717}
2818
2919func update (cmd * Command , args * Args ) {
30- err := doUpdate ()
20+ updater := NewUpdater ()
21+ err := updater .Update ()
3122 utils .Check (err )
3223 os .Exit (0 )
3324}
34-
35- func doUpdate () (err error ) {
36- client := github .NewClient (github .GitHubHost )
37- releases , err := client .Releases (github .NewProject ("jingweno" , "gh" , github .GitHubHost ))
38- if err != nil {
39- err = fmt .Errorf ("Error fetching releases: %s" , err )
40- return
41- }
42-
43- latestRelease := releases [0 ]
44- tagName := latestRelease .TagName
45- version := strings .TrimPrefix (tagName , "v" )
46- if version == Version {
47- err = fmt .Errorf ("You're already on the latest version: %s" , Version )
48- return
49- }
50-
51- fmt .Printf ("Updating gh to release %s...\n " , version )
52- downloadURL := fmt .Sprintf ("https://github.com/jingweno/gh/releases/download/%s/gh_%s-snapshot_%s_%s.zip" , tagName , version , runtime .GOOS , runtime .GOARCH )
53- path , err := downloadFile (downloadURL )
54- if err != nil {
55- err = fmt .Errorf ("Can't download update from %s to %s" , downloadURL , path )
56- return
57- }
58-
59- exec , err := unzipExecutable (path )
60- if err != nil {
61- err = fmt .Errorf ("Can't unzip gh executable: %s" , err )
62- return
63- }
64-
65- err , _ = updater .FromFile (exec )
66- if err == nil {
67- fmt .Println ("Done!" )
68- }
69-
70- return
71- }
72-
73- func unzipExecutable (path string ) (exec string , err error ) {
74- rc , err := zip .OpenReader (path )
75- if err != nil {
76- err = fmt .Errorf ("Can't open zip file %s: %s" , path , err )
77- return
78- }
79- defer rc .Close ()
80-
81- for _ , file := range rc .File {
82- if ! strings .HasPrefix (file .Name , "gh" ) {
83- continue
84- }
85-
86- dir := filepath .Dir (path )
87- exec , err = unzipFile (file , dir )
88- break
89- }
90-
91- if exec == "" && err == nil {
92- err = fmt .Errorf ("No gh executable is found in %s" , path )
93- }
94-
95- return
96- }
97-
98- func unzipFile (file * zip.File , to string ) (exec string , err error ) {
99- frc , err := file .Open ()
100- if err != nil {
101- err = fmt .Errorf ("Can't open zip entry %s when reading: %s" , file .Name , err )
102- return
103- }
104- defer frc .Close ()
105-
106- dest := filepath .Join (to , filepath .Base (file .Name ))
107- f , err := os .Create (dest )
108- if err != nil {
109- return
110- }
111- defer f .Close ()
112-
113- copied , err := io .Copy (f , frc )
114- if err != nil {
115- return
116- }
117-
118- if uint32 (copied ) != file .UncompressedSize {
119- err = fmt .Errorf ("Zip entry %s is corrupted" , file .Name )
120- return
121- }
122-
123- exec = f .Name ()
124-
125- return
126- }
127-
128- func downloadFile (url string ) (path string , err error ) {
129- dir , err := ioutil .TempDir ("" , "gh-update" )
130- if err != nil {
131- return
132- }
133-
134- file , err := os .Create (filepath .Join (dir , filepath .Base (url )))
135- if err != nil {
136- return
137- }
138- defer file .Close ()
139-
140- resp , err := http .Get (url )
141- if err != nil {
142- return
143- }
144- defer resp .Body .Close ()
145-
146- _ , err = io .Copy (file , resp .Body )
147- if err != nil {
148- return
149- }
150-
151- path = file .Name ()
152-
153- return
154- }
0 commit comments