Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / mvdan.cc / gofumpt@v0.0.0-20200802201014-ab5a8192947d / internal / diff / diff.go
1 // Copyright 2019 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
5 // Package diff implements a Diff function that compare two inputs
6 // using the 'diff' tool.
7 package diff
8
9 import (
10         "io/ioutil"
11         "os"
12         "os/exec"
13         "runtime"
14 )
15
16 // Returns diff of two arrays of bytes in diff tool format.
17 func Diff(prefix string, b1, b2 []byte) ([]byte, error) {
18         f1, err := writeTempFile(prefix, b1)
19         if err != nil {
20                 return nil, err
21         }
22         defer os.Remove(f1)
23
24         f2, err := writeTempFile(prefix, b2)
25         if err != nil {
26                 return nil, err
27         }
28         defer os.Remove(f2)
29
30         cmd := "diff"
31         if runtime.GOOS == "plan9" {
32                 cmd = "/bin/ape/diff"
33         }
34
35         data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput()
36         if len(data) > 0 {
37                 // diff exits with a non-zero status when the files don't match.
38                 // Ignore that failure as long as we get output.
39                 err = nil
40         }
41         return data, err
42 }
43
44 func writeTempFile(prefix string, data []byte) (string, error) {
45         file, err := ioutil.TempFile("", prefix)
46         if err != nil {
47                 return "", err
48         }
49         _, err = file.Write(data)
50         if err1 := file.Close(); err == nil {
51                 err = err1
52         }
53         if err != nil {
54                 os.Remove(file.Name())
55                 return "", err
56         }
57         return file.Name(), nil
58 }