Last active
December 15, 2015 05:59
-
-
Save dskinner/5213497 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"archive/tar" | |
"compress/bzip2" | |
"flag" | |
"io" | |
"io/ioutil" | |
"log" | |
"net/http" | |
"os" | |
"path/filepath" | |
"regexp" | |
) | |
var ( | |
url = "http://www.sublimetext.com/3dev" | |
pattern = regexp.MustCompile(`Ubuntu 64 bit.*<a href="(.*_x64\.tar\.bz2)"`) | |
flagPath = flag.String("path", "", "path to write out") | |
) | |
func getHref() string { | |
resp, err := http.Get(url) | |
if err != nil { | |
log.Fatalf("http.Get failed: %v\n", err) | |
} | |
b, err := ioutil.ReadAll(resp.Body) | |
if err != nil { | |
log.Fatalf("ioutil.ReadAll failed: %v\n", err) | |
} | |
m := pattern.FindSubmatch(b) | |
if len(m) != 2 { | |
log.Fatalf("Failed to locate href: %s", m) | |
} | |
href := m[1] | |
return string(href) | |
} | |
func download(href string) *http.Response { | |
resp, err := http.Get(href) | |
if err != nil { | |
log.Fatalf("http.Get failed: %v\n", err) | |
} | |
return resp | |
} | |
func expand(r io.Reader, path string) (dir string) { | |
tr := tar.NewReader(bzip2.NewReader(r)) | |
for { | |
hdr, err := tr.Next() | |
if err == io.EOF { | |
break | |
} | |
if err != nil { | |
log.Fatalf("Error reading tar header: %s\n", err) | |
} | |
dst := filepath.Join(path, hdr.Name) | |
if dir == "" { | |
dir = dst | |
} | |
switch hdr.Typeflag { | |
case tar.TypeDir: | |
err := os.MkdirAll(dst, 0766) | |
if err != nil { | |
log.Fatalf("Failed to create folder: %s\n", err) | |
} | |
default: | |
out, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.FileMode(hdr.Mode)) | |
if err != nil { | |
log.Fatalf("Failed to create destination: %s\n", err) | |
} | |
if _, err := io.Copy(out, tr); err != nil { | |
log.Fatalf("Failed to write file to disk: ", err) | |
} | |
} | |
} | |
return | |
} | |
func main() { | |
flag.Parse() | |
if *flagPath == "" { | |
flag.Usage() | |
return | |
} | |
log.Println("retrieving link") | |
href := getHref() | |
log.Println("downloading archive") | |
resp := download(href) | |
log.Println("expanding archive") | |
_ = expand(resp.Body, *flagPath) | |
log.Println("done!") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment