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  }