// fileList parses deps.js from the closure repo, as well as the similar // dependencies generated for the UI js files, and compiles the list of // js files from the closure lib required for the UI. func fileList() ([]string, error) { camliRootPath, err := osutil.GoPackagePath("camlistore.org") if err != nil { log.Fatal("Package camlistore.org not found in $GOPATH (or $GOPATH not defined).") } uiDir := filepath.Join(camliRootPath, "server", "camlistored", "ui") closureDepsFile := filepath.Join(closureGitDir, "closure", "goog", "deps.js") f, err := os.Open(closureDepsFile) if err != nil { return nil, err } defer f.Close() allClosureDeps, err := closure.DeepParseDeps(f) if err != nil { return nil, err } uiDeps, err := closure.GenDeps(http.Dir(uiDir)) if err != nil { return nil, err } _, requ, err := closure.ParseDeps(bytes.NewReader(uiDeps)) if err != nil { return nil, err } nameDone := make(map[string]bool) jsfilesDone := make(map[string]bool) for _, deps := range requ { for _, dep := range deps { if _, ok := nameDone[dep]; ok { continue } jsfiles := allClosureDeps[dep] for _, filename := range jsfiles { if _, ok := jsfilesDone[filename]; ok { continue } jsfilesDone[filename] = true } nameDone[dep] = true } } jsfiles := []string{ "AUTHORS", "LICENSE", "README", filepath.Join("closure", "goog", "base.js"), filepath.Join("closure", "goog", "css", "common.css"), filepath.Join("closure", "goog", "css", "toolbar.css"), filepath.Join("closure", "goog", "deps.js"), } prefix := filepath.Join("closure", "goog") for k, _ := range jsfilesDone { jsfiles = append(jsfiles, filepath.Join(prefix, k)) } sort.Strings(jsfiles) return jsfiles, nil }
func main() { flag.Parse() args := flag.Args() if len(args) != 1 { usage() } b, err := closure.GenDeps(http.Dir(args[0])) if err != nil { log.Fatal(err) } io.Copy(os.Stdout, bytes.NewReader(b)) }
// serveDepsJS serves an auto-generated Closure deps.js file. func serveDepsJS(rw http.ResponseWriter, req *http.Request, dir string) { // TODO: closure.GenDeps should work from a VFS interface // (http.FileSystem or lighter) so we can eliminate the // Makefile genjsdeps hack and just always generate our own. b, err := closure.GenDeps(dir) if err != nil { log.Print(err) http.Error(rw, "Server error", 500) return } rw.Header().Set("Content-Type", "text/javascript; charset=utf-8") rw.Write([]byte("// auto-generated from camlistored\n")) rw.Write(b) }
// serveDepsJS serves an auto-generated Closure deps.js file. func serveDepsJS(rw http.ResponseWriter, req *http.Request, dir string) { var root http.FileSystem if dir == "" { root = uistatic.Files } else { root = http.Dir(dir) } b, err := closure.GenDeps(root) if err != nil { log.Print(err) http.Error(rw, "Server error", 500) return } rw.Header().Set("Content-Type", "text/javascript; charset=utf-8") rw.Write([]byte("// auto-generated from camlistored\n")) rw.Write(b) }
// serveDepsJS serves an auto-generated Closure deps.js file. func serveDepsJS(rw http.ResponseWriter, req *http.Request) { envVar := uiFiles.OverrideEnv if envVar == "" { log.Printf("No uiFiles.OverrideEnv set; can't generate deps.js") http.NotFound(rw, req) return } dir := os.Getenv(envVar) if dir == "" { log.Printf("The %q environment variable is not set; can't generate deps.js", envVar) http.NotFound(rw, req) return } b, err := closure.GenDeps(dir) if err != nil { log.Print(err) http.Error(rw, "Server error", 500) return } rw.Header().Set("Content-Type", "text/javascript; charset=utf-8") rw.Write(b) }