Fix Appveyor Windows build and GitInfo path issue on Windows
authorDavid Kassa <david.kassa@gmail.com>
Sun, 1 Jan 2017 22:16:58 +0000 (16:16 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 1 Jan 2017 22:16:58 +0000 (23:16 +0100)
appveyor.yml [new file with mode: 0644]
helpers/content.go
helpers/general.go
helpers/pygments.go
hugolib/gitinfo.go
hugolib/shortcode_test.go

diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644 (file)
index 0000000..1a11026
--- /dev/null
@@ -0,0 +1,29 @@
+image: WMF 5
+clone_folder: c:\GOPATH\src\github.com\spf13\hugo
+init:
+- cmd: >-
+    set PATH=%PATH%;C:\MinGW\bin;C:\GOPATH\bin
+
+    copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe
+environment:
+  GOPATH: c:\GOPATH
+install:
+- cmd: >-
+    gem install asciidoctor
+
+    pip install docutils
+build_script:
+- cmd: make govendor
+test_script:
+- cmd: >-
+    make check
+
+    REM Test 64-bit alignment on 32-bit builds
+
+    set "GOARCH=386" & make test & set GOARCH=
+
+    go build -race
+
+    hugo -s docs/
+
+    hugo --renderToMemory -s docs/
index eb8987b33253fc563c8cb8a266f82b2c0919a42a..9b245972e2c12dc55af619b4d0b195b103f9f8c4 100644 (file)
@@ -571,7 +571,7 @@ func getAsciidocContent(ctx *RenderingContext) []byte {
                jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
        }
 
-       return out.Bytes()
+       return normalizeExternalHelperLineFeeds(out.Bytes())
 }
 
 // HasRst returns whether rst2html is installed on this computer.
@@ -590,12 +590,24 @@ func getRstExecPath() string {
        return path
 }
 
+func getPythonExecPath() string {
+       path, err := exec.LookPath("python")
+       if err != nil {
+               path, err = exec.LookPath("python.exe")
+               if err != nil {
+                       return ""
+               }
+       }
+       return path
+}
+
 // getRstContent calls the Python script rst2html as an external helper
 // to convert reStructuredText content to HTML.
 func getRstContent(ctx *RenderingContext) []byte {
        content := ctx.Content
        cleanContent := bytes.Replace(content, SummaryDivider, []byte(""), 1)
 
+       python := getPythonExecPath()
        path := getRstExecPath()
 
        if path == "" {
@@ -606,7 +618,7 @@ func getRstContent(ctx *RenderingContext) []byte {
        }
 
        jww.INFO.Println("Rendering", ctx.DocumentName, "with", path, "...")
-       cmd := exec.Command(path, "--leave-comments")
+       cmd := exec.Command(python, path, "--leave-comments")
        cmd.Stdin = bytes.NewReader(cleanContent)
        var out, cmderr bytes.Buffer
        cmd.Stdout = &out
@@ -624,11 +636,21 @@ func getRstContent(ctx *RenderingContext) []byte {
                jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
        }
 
-       result := out.Bytes()
+       result := normalizeExternalHelperLineFeeds(out.Bytes())
 
        // TODO(bep) check if rst2html has a body only option.
        bodyStart := bytes.Index(result, []byte("<body>\n"))
+       if bodyStart < 0 {
+               bodyStart = -7 //compensate for length
+       }
+
        bodyEnd := bytes.Index(result, []byte("\n</body>"))
+       if bodyEnd < 0 || bodyEnd >= len(result) {
+               bodyEnd = len(result) - 1
+               if bodyEnd < 0 {
+                       bodyEnd = 0
+               }
+       }
 
        return result[bodyStart+7 : bodyEnd]
 }
index 1ea08eb25ed18711afe6721044c941806967c9a5..740c05f5c992344c9426a81b529badbad14040b6 100644 (file)
@@ -38,6 +38,11 @@ import (
 // FilePathSeparator as defined by os.Separator.
 const FilePathSeparator = string(filepath.Separator)
 
+// Strips carriage returns from third-party / external processes (useful for Windows)
+func normalizeExternalHelperLineFeeds(content []byte) []byte {
+       return bytes.Replace(content, []byte("\r"), []byte(""), -1)
+}
+
 // FindAvailablePort returns an available and valid TCP port.
 func FindAvailablePort() (*net.TCPAddr, error) {
        l, err := net.Listen("tcp", ":0")
index 7903678b6a8fb27a811db2ece82478df4efb740b..5e9812d72e929d8cb448af9912e4e36597340ee4 100644 (file)
@@ -112,7 +112,7 @@ func Highlight(code, lang, optsStr string) string {
                return code
        }
 
-       str := out.String()
+       str := string(normalizeExternalHelperLineFeeds([]byte(out.String())))
 
        // inject code tag into Pygments output
        if lang != "" && strings.Contains(str, "<pre>") {
index b2119048e8600abbb91e5eef17de5ebeead3baab..2893db06f2181bebe4d524808f343900dcffb734 100644 (file)
@@ -57,7 +57,7 @@ func (h *HugoSites) assembleGitInfo() {
                        continue
                }
                // Git normalizes file paths on this form:
-               filename := path.Join(contentRoot, contentDir, filepath.ToSlash(p.Path()))
+               filename := path.Join(filepath.ToSlash(contentRoot), contentDir, filepath.ToSlash(p.Path()))
                g, ok := gitMap[filename]
                if !ok {
                        jww.ERROR.Printf("Failed to find GitInfo for %q", filename)
index ec3acfb72d9c9bd0cc97238583b54fa3060b60b6..536c06541b09143addbfd7ffff54d712c6a1b51e 100644 (file)
@@ -324,7 +324,7 @@ void do();
        }
 
        if !matched {
-               t.Error("Hightlight mismatch, got\n", output)
+               t.Errorf("Hightlight mismatch, got (escaped to see invisible chars)\n%+q", output)
        }
 }