github.com/xzntrc/go-enry/v2@v2.0.0-20230215091818-766cc1d65498/internal/code-generator/generator/generator_test_util.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 // https://cs.opensource.google/go/x/perf/+/e8d778a6:LICENSE 5 6 package generator 7 8 import ( 9 "bytes" 10 "fmt" 11 "os" 12 "os/exec" 13 ) 14 15 // text_diff returns a human-readable description of the differences between s1 and s2. 16 // It essentially is https://cs.opensource.google/go/x/perf/+/e8d778a6:internal/diff/diff.go 17 // Used only in code generator tests, as a debugging aid. 18 // It is not part of any release artifact and is not distibuted with enry. 19 func text_diff(b1, b2 []byte) (string, error) { 20 if bytes.Equal(b1, b2) { 21 return "", nil 22 } 23 24 cmd := "diff" 25 if _, err := exec.LookPath(cmd); err != nil { 26 return "", fmt.Errorf("diff command unavailable\nold: %q\nnew: %q", b1, b2) 27 } 28 29 f1, err := writeTempFile("", "gen_test", b1) 30 if err != nil { 31 return "", err 32 } 33 defer os.Remove(f1) 34 35 f2, err := writeTempFile("", "gen_test", b2) 36 if err != nil { 37 return "", err 38 } 39 defer os.Remove(f2) 40 41 data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput() 42 if len(data) > 0 { // diff exits with a non-zero status when the files don't match 43 err = nil 44 } 45 if err != nil { 46 return "", err 47 } 48 return string(data), nil 49 } 50 51 func writeTempFile(dir, prefix string, data []byte) (string, error) { 52 file, err := os.CreateTemp(dir, prefix) 53 if err != nil { 54 return "", err 55 } 56 57 _, err = file.Write(data) 58 if err1 := file.Close(); err == nil { 59 err = err1 60 } 61 if err != nil { 62 os.Remove(file.Name()) 63 return "", err 64 } 65 return file.Name(), nil 66 }