From b0459e4867cd151f426eebf22bafe08c7eb608bf Mon Sep 17 00:00:00 2001 From: Marcelo Cantos Date: Tue, 13 Mar 2018 11:46:57 +1100 Subject: [PATCH] Add AppVeyor Windows builds and releases (#206) * Make some filenames Windows-friendly * Update references to renamed files * Fix escaped filenames to run on non-Windows platforms --- main_test.go | 57 +++++++++++++++++-- "testdata/\".golden" => testdata/%22.golden | 0 "testdata/\".jsonnet" => testdata/%22.jsonnet | 0 testdata/{'.golden => %27.golden} | 0 testdata/{'.jsonnet => %27.jsonnet} | 0 testdata/.gitignore | 4 ++ 6 files changed, 56 insertions(+), 5 deletions(-) rename "testdata/\".golden" => testdata/%22.golden (100%) rename "testdata/\".jsonnet" => testdata/%22.jsonnet (100%) rename testdata/{'.golden => %27.golden} (100%) rename testdata/{'.jsonnet => %27.jsonnet} (100%) create mode 100644 testdata/.gitignore diff --git a/main_test.go b/main_test.go index d5f3a53..f9e2494 100644 --- a/main_test.go +++ b/main_test.go @@ -21,9 +21,14 @@ import ( "encoding/json" "errors" "flag" + "fmt" "io/ioutil" + "os" "os/exec" "path/filepath" + "regexp" + "runtime" + "strconv" "strings" "testing" @@ -217,21 +222,63 @@ func runTest(t *testing.T, test *mainTest) { } } +func expandEscapedFilenames(t *testing.T) error { + // Escaped filenames exist because their unescaped forms are invalid on + // Windows. We have no choice but to skip these in testing. + if runtime.GOOS == "windows" { + return nil + } + + match, err := filepath.Glob("testdata/*%*") + if err != nil { + return err + } + + filenameEscapeRE := regexp.MustCompile(`%[0-9A-Fa-f]{2}`) + + for _, input := range match { + file := filenameEscapeRE.ReplaceAllStringFunc(input, func(s string) string { + code, err := strconv.ParseUint(s[1:], 16, 8) + if err != nil { + panic(err) + } + return string([]byte{byte(code)}) + }) + if file != input { + if err := os.Link(input, file); err != nil { + if !os.IsExist(err) { + return fmt.Errorf("linking %s -> %s: %v", file, input, err) + } + } + t.Logf("Linked %s -> %s", input, file) + } + } + + return nil +} + func TestMain(t *testing.T) { flag.Parse() + + if err := expandEscapedFilenames(t); err != nil { + t.Fatal(err) + } + var mainTests []mainTest match, err := filepath.Glob("testdata/*.jsonnet") if err != nil { t.Fatal(err) } + jsonnetExtRE := regexp.MustCompile(`\.jsonnet$`) + for _, input := range match { - golden := input - name := input - if strings.HasSuffix(input, ".jsonnet") { - name = input[:len(input)-len(".jsonnet")] - golden = name + ".golden" + // Skip escaped filenames. + if strings.ContainsRune(input, '%') { + continue } + name := jsonnetExtRE.ReplaceAllString(input, "") + golden := jsonnetExtRE.ReplaceAllString(input, ".golden") var meta testMetadata if val, exists := metadataForTests[name]; exists { meta = val diff --git "a/testdata/\".golden" b/testdata/%22.golden similarity index 100% rename from "testdata/\".golden" rename to testdata/%22.golden diff --git "a/testdata/\".jsonnet" b/testdata/%22.jsonnet similarity index 100% rename from "testdata/\".jsonnet" rename to testdata/%22.jsonnet diff --git a/testdata/'.golden b/testdata/%27.golden similarity index 100% rename from testdata/'.golden rename to testdata/%27.golden diff --git a/testdata/'.jsonnet b/testdata/%27.jsonnet similarity index 100% rename from testdata/'.jsonnet rename to testdata/%27.jsonnet diff --git a/testdata/.gitignore b/testdata/.gitignore new file mode 100644 index 0000000..d3f4196 --- /dev/null +++ b/testdata/.gitignore @@ -0,0 +1,4 @@ +".golden +".jsonnet +'.golden +'.jsonnet