dev/update_closure_compiler: new command

Go program that replaces get_closure_compiler from
misc/get_closure.pl

Change-Id: Ic7471c970afbfc65bc14d9ec2401aeb0d1ecd9a1
This commit is contained in:
mpl 2013-06-19 18:12:42 +02:00
parent 2430cf7a20
commit f1c0c37cd7
1 changed files with 139 additions and 0 deletions

View File

@ -0,0 +1,139 @@
/*
Copyright 2013 The Camlistore Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// The updatelibrary command allows to selectively download
// from the closure library git repository (at a chosen revision)
// the resources needed by the Camlistore ui.
package main
import (
"archive/zip"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"regexp"
"camlistore.org/pkg/osutil"
)
const (
compilerDirURL = "http://closure-compiler.googlecode.com/files/"
compilerVersion = "20121212"
)
var rgxVersion = regexp.MustCompile(`.*Version: (.*) \(revision.*`)
func main() {
// check JRE presence
_, err := exec.LookPath("java")
if err != nil {
log.Fatal("Didn't find 'java' in $PATH. The Java Runtime Environment is needed to run the closure compiler.\n")
}
camliRootPath, err := osutil.GoPackagePath("camlistore.org")
if err != nil {
log.Fatal("Package camlistore.org not found in $GOPATH (or $GOPATH not defined).")
}
destDir := filepath.Join(camliRootPath, "tmp", "closure-compiler")
// check if compiler already exists
jarFile := filepath.Join(destDir, "compiler.jar")
_, err = os.Stat(jarFile)
if err == nil {
// if compiler exists, check version
cmd := exec.Command("java", "-jar", jarFile, "--version", "--help", "2>&1")
output, _ := cmd.CombinedOutput()
m := rgxVersion.FindStringSubmatch(string(output))
if m == nil {
log.Fatalf("Could not find compiler version in %q", output)
}
if m[1] == compilerVersion {
log.Printf("compiler already at version %v , nothing to do.", compilerVersion)
os.Exit(0)
}
if err := os.Remove(jarFile); err != nil {
log.Fatalf("Could not remove %v: %v", jarFile, err)
}
} else {
if !os.IsNotExist(err) {
log.Fatalf("Could not stat %v: %v", jarFile, err)
}
}
// otherwise, download compiler
log.Printf("Getting closure compiler version %s.\n", compilerVersion)
if err := os.MkdirAll(destDir, 0755); err != nil {
log.Fatal(err)
}
if err := os.Chdir(destDir); err != nil {
log.Fatal(err)
}
zipFilename := "compiler-" + compilerVersion + ".zip"
compilerURL := compilerDirURL + zipFilename
resp, err := http.Get(compilerURL)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
f, err := os.Create(zipFilename)
if err != nil {
log.Fatal(err)
}
if _, err := io.Copy(f, resp.Body); err != nil {
log.Fatal(err)
}
if err := f.Close(); err != nil {
log.Fatal(err)
}
r, err := zip.OpenReader(zipFilename)
if err != nil {
log.Fatal(err)
}
for x, f := range r.File {
if f.FileHeader.Name != "compiler.jar" {
if x == len(r.File)-1 {
log.Fatal("compiler.jar was not found in the zip archive")
}
continue
}
rc, err := f.Open()
if err != nil {
log.Fatal(err)
}
g, err := os.Create(jarFile)
if err != nil {
log.Fatal(err)
}
defer g.Close()
if _, err = io.Copy(g, rc); err != nil {
log.Fatal(err)
}
rc.Close()
break
}
if err := r.Close(); err != nil {
log.Fatal(err)
}
if err := os.Remove(zipFilename); err != nil {
log.Fatal(err)
}
log.Printf("Success. Installed at %v", jarFile)
}