Repository: incubator-htrace Updated Branches: refs/heads/master 6b36b1aa6 -> a303830fc
HTRACE-35. bundler: support nested js and html files (cmccabe) Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/a303830f Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/a303830f Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/a303830f Branch: refs/heads/master Commit: a303830fc0a97e2a5ef1fb30a3e5cd318b65ef3e Parents: 6b36b1a Author: Colin P. Mccabe <[email protected]> Authored: Tue Dec 30 14:36:00 2014 -0800 Committer: Colin P. Mccabe <[email protected]> Committed: Tue Dec 30 16:10:42 2014 -0800 ---------------------------------------------------------------------- .../go/src/org/apache/htrace/bundler/bundler.go | 63 +++++++++++++------- .../go/src/org/apache/htrace/htraced/rest.go | 6 +- htrace-core/src/web/index.html | 4 +- htrace-core/src/web/nested/nested.html | 24 ++++++++ 4 files changed, 73 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/a303830f/htrace-core/src/go/src/org/apache/htrace/bundler/bundler.go ---------------------------------------------------------------------- diff --git a/htrace-core/src/go/src/org/apache/htrace/bundler/bundler.go b/htrace-core/src/go/src/org/apache/htrace/bundler/bundler.go index 7e6f542..9a71eed 100644 --- a/htrace-core/src/go/src/org/apache/htrace/bundler/bundler.go +++ b/htrace-core/src/go/src/org/apache/htrace/bundler/bundler.go @@ -32,6 +32,7 @@ import ( "io/ioutil" "log" "os" + "path/filepath" "strings" ) @@ -57,6 +58,8 @@ const APACHE_HEADER = `/* const GENERATED_CODE_COMMENT = "// THIS IS GENERATED CODE. DO NOT EDIT." +var SEP string = string(os.PathSeparator) + // Return true if a file contains a given string. func fileContainsString(path, line string) (bool, error) { file, err := os.Open(path) @@ -76,12 +79,17 @@ func fileContainsString(path, line string) (bool, error) { return false, nil } +// Converts a source file path to a destination file path +func sfileToDfile(sfile string) string { + return strings.Replace(sfile, SEP, "__", -1) + ".go" +} + // Delete generated files that are in dfiles but not sfiles. // sfiles and dfiles must be sorted by file name. -func deleteUnusedDst(sfiles []os.FileInfo, dst string, dfiles []os.FileInfo) error { +func deleteUnusedDst(sfiles []string, dst string, dfiles []os.FileInfo) error { s := 0 for d := range dfiles { - fullDst := dst + string(os.PathSeparator) + dfiles[d].Name() + fullDst := dst + SEP + dfiles[d].Name() generated, err := fileContainsString(fullDst, GENERATED_CODE_COMMENT) if err != nil { return err @@ -95,11 +103,12 @@ func deleteUnusedDst(sfiles []os.FileInfo, dst string, dfiles []os.FileInfo) err if s >= len(sfiles) { break } - if sfiles[s].Name()+".go" == dfiles[d].Name() { + tgt := sfileToDfile(sfiles[s]) + if tgt == dfiles[d].Name() { found = true break } - if sfiles[s].Name()+".go" > dfiles[d].Name() { + if tgt > dfiles[d].Name() { break } s++ @@ -115,17 +124,10 @@ func deleteUnusedDst(sfiles []os.FileInfo, dst string, dfiles []os.FileInfo) err return nil } -func stripSuffixes(str string) string { - idx := strings.Index(str, ".") - if idx < 0 { - return str - } - return str[0:idx] -} - -func createBundleFile(pkg, src, sfile, tdir string) error { +func createBundleFile(pkg, src, sfile, dst string) error { // Open destination file and write header. - fullDst := tdir + string(os.PathSeparator) + sfile + ".go" + tgt := sfileToDfile(sfile) + fullDst := dst + SEP + tgt out, err := os.Create(fullDst) if err != nil { return err @@ -143,13 +145,13 @@ func createBundleFile(pkg, src, sfile, tdir string) error { if err != nil { return err } - _, err = out.WriteString(fmt.Sprintf("var _ = addResource(\"/%s\", `\n", stripSuffixes(sfile))) + _, err = out.WriteString(fmt.Sprintf("var _ = addResource(\"%s\", `\n", tgt[:len(tgt)-3])) if err != nil { return err } // Open source file and create scanner. - fullSrc := src + string(os.PathSeparator) + sfile + fullSrc := src + SEP + sfile in, err := os.Open(fullSrc) if err != nil { return err @@ -186,9 +188,28 @@ func main() { if *dst == "" { log.Fatal("You must supply a dst directory for output.") } - sfiles, err := ioutil.ReadDir(*src) + sfiles := make([]string, 0, 32) + absSrc, err := filepath.Abs(filepath.Clean(*src)) + if err != nil { + log.Fatalf("Error getting absolute path for %s: %s\n", *src, err.Error()) + } + err = filepath.Walk(absSrc, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + var suffix string + suffix, err = filepath.Rel(absSrc, path) + if err != nil { + return err + } + sfiles = append(sfiles, suffix) + return nil + }) if err != nil { - log.Fatal("Error listing files in src directory %s: %s\n", *src, err.Error()) + log.Fatal("Error listing files in src directory %s: %s\n", absSrc, err.Error()) } var dfiles []os.FileInfo dfiles, err = ioutil.ReadDir(*dst) @@ -197,11 +218,11 @@ func main() { } deleteUnusedDst(sfiles, *dst, dfiles) for s := range sfiles { - err = createBundleFile(*pkg, *src, sfiles[s].Name(), *dst) + err = createBundleFile(*pkg, absSrc, sfiles[s], *dst) if err != nil { - log.Fatal("Error creating bundle file for %s in %s: %s\n", + log.Fatalf("Error creating bundle file for %s in %s: %s\n", sfiles[s], *dst, err.Error()) } - log.Printf("Bundled %s\n", *dst+string(os.PathSeparator)+sfiles[s].Name()) + log.Printf("Bundled %s as %s\n", absSrc, absSrc + SEP + sfileToDfile(sfiles[s])) } } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/a303830f/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go ---------------------------------------------------------------------- diff --git a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go index 5b97313..b704bd2 100644 --- a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go +++ b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go @@ -27,6 +27,7 @@ import ( "org/apache/htrace/conf" "org/apache/htrace/resource" "strconv" + "strings" ) type serverInfoHandler struct { @@ -130,8 +131,11 @@ type defaultServeHandler struct { } func (hand *defaultServeHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - rsc := resource.Catalog[req.URL.Path] + ident := strings.TrimLeft(req.URL.Path, "/") + ident = strings.Replace(ident, "/", "__", -1) + rsc := resource.Catalog[ident] if rsc == "" { + log.Printf("failed to find entry for %s\n", ident) w.WriteHeader(http.StatusNotFound) return } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/a303830f/htrace-core/src/web/index.html ---------------------------------------------------------------------- diff --git a/htrace-core/src/web/index.html b/htrace-core/src/web/index.html index 1cab08b..cc73492 100644 --- a/htrace-core/src/web/index.html +++ b/htrace-core/src/web/index.html @@ -1,3 +1,5 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -14,8 +16,6 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <head><title>HTRACE</title></head> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/a303830f/htrace-core/src/web/nested/nested.html ---------------------------------------------------------------------- diff --git a/htrace-core/src/web/nested/nested.html b/htrace-core/src/web/nested/nested.html new file mode 100644 index 0000000..18fa410 --- /dev/null +++ b/htrace-core/src/web/nested/nested.html @@ -0,0 +1,24 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<html xmlns="http://www.w3.org/1999/xhtml"> +<body> +<head><title>HTRACE</title></head> +Nested world.<p/> +</body> +</html>
