Skip to content

Instantly share code, notes, and snippets.

@dskinner
Last active December 15, 2015 05:59
Show Gist options
  • Save dskinner/5213497 to your computer and use it in GitHub Desktop.
Save dskinner/5213497 to your computer and use it in GitHub Desktop.
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