]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/winbatch.go
all: treat all files as binary, but check in .bat with CRLF
[gostls13.git] / test / winbatch.go
index 30e0e3c982e389c56fcfbba114110b2e179c1c1d..c3b48d385cecc8bd1dd4ddfa5e1a8b1377750283 100644 (file)
@@ -4,8 +4,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Check that batch files are maintained as CRLF files (consistent behaviour
-// on all operating systems). See https://github.com/golang/go/issues/37791
+// Check that batch files are maintained as CRLF files (consistent
+// behavior on all operating systems). See golang.org/issue/37791.
 
 package main
 
@@ -13,18 +13,56 @@ import (
        "bytes"
        "fmt"
        "io/ioutil"
+       "log"
        "os"
        "path/filepath"
        "runtime"
+       "strings"
 )
 
 func main() {
-       batches, _ := filepath.Glob(runtime.GOROOT() + "/src/*.bat")
-       for _, bat := range batches {
-               body, _ := ioutil.ReadFile(bat)
-               if !bytes.Contains(body, []byte("\r\n")) {
-                       fmt.Printf("Windows batch file %s does not contain CRLF line termination.\nTry running git checkout src/*.bat to fix this.\n", bat)
-                       os.Exit(1)
+       // Ensure that the GOROOT/src/all.bat file exists and has strict CRLF line endings.
+       enforceBatchStrictCRLF(filepath.Join(runtime.GOROOT(), "src", "all.bat"))
+
+       // Walk the entire Go repository source tree (without GOROOT/pkg),
+       // skipping directories that start with "." and named "testdata",
+       // and ensure all .bat files found have exact CRLF line endings.
+       err := filepath.Walk(runtime.GOROOT(), func(path string, fi os.FileInfo, err error) error {
+               if err != nil {
+                       return err
+               }
+               if fi.IsDir() && (strings.HasPrefix(fi.Name(), ".") || fi.Name() == "testdata") {
+                       return filepath.SkipDir
+               }
+               if path == filepath.Join(runtime.GOROOT(), "pkg") {
+                       // GOROOT/pkg is known to contain generated artifacts, not source code.
+                       // Skip it to avoid false positives. (Also see golang.org/issue/37929.)
+                       return filepath.SkipDir
+               }
+               if filepath.Ext(fi.Name()) == ".bat" {
+                       enforceBatchStrictCRLF(path)
+               }
+               return nil
+       })
+       if err != nil {
+               log.Fatalln(err)
+       }
+}
+
+func enforceBatchStrictCRLF(path string) {
+       b, err := ioutil.ReadFile(path)
+       if err != nil {
+               log.Fatalln(err)
+       }
+       cr, lf := bytes.Count(b, []byte{13}), bytes.Count(b, []byte{10})
+       crlf := bytes.Count(b, []byte{13, 10})
+       if cr != crlf || lf != crlf {
+               if rel, err := filepath.Rel(runtime.GOROOT(), path); err == nil {
+                       // Make the test failure more readable by showing a path relative to GOROOT.
+                       path = rel
                }
+               fmt.Printf("Windows batch file %s does not use strict CRLF line termination.\n", path)
+               fmt.Printf("Please convert it to CRLF before checking it in due to golang.org/issue/37791.\n")
+               os.Exit(1)
        }
 }