diff options
author | Mikhail Fesenko <proggga@gmail.com> | 2019-10-28 21:51:00 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-10-28 23:59:10 +0000 |
commit | fd1e60f6e3bd42075e335a90ad36719ffed0eb1a (patch) | |
tree | 1f7534f05f914e138735e895b396d5e7de63c353 /src/cmd/internal/diff/diff.go | |
parent | 449b6abbacc464443a7faf166bf4db3df3e0f8da (diff) | |
download | go-git-fd1e60f6e3bd42075e335a90ad36719ffed0eb1a.tar.gz |
cmd/fix, cmd/go, cmd/gofmt: refactor common code into new internal diff package
Change-Id: Idac8473d1752059bf2f617fd7a781000ee2c3af4
GitHub-Last-Rev: 02a3aa1a3241d3ed4422518f1c954cd54bbe858e
GitHub-Pull-Request: golang/go#35141
Reviewed-on: https://go-review.googlesource.com/c/go/+/203218
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/cmd/internal/diff/diff.go')
-rw-r--r-- | src/cmd/internal/diff/diff.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/cmd/internal/diff/diff.go b/src/cmd/internal/diff/diff.go new file mode 100644 index 0000000000..e9d2c23780 --- /dev/null +++ b/src/cmd/internal/diff/diff.go @@ -0,0 +1,58 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package diff implements a Diff function that compare two inputs +// using the 'diff' tool. +package diff + +import ( + "io/ioutil" + "os" + "os/exec" + "runtime" +) + +// Returns diff of two arrays of bytes in diff tool format. +func Diff(prefix string, b1, b2 []byte) ([]byte, error) { + f1, err := writeTempFile(prefix, b1) + if err != nil { + return nil, err + } + defer os.Remove(f1) + + f2, err := writeTempFile(prefix, b2) + if err != nil { + return nil, err + } + defer os.Remove(f2) + + cmd := "diff" + if runtime.GOOS == "plan9" { + cmd = "/bin/ape/diff" + } + + data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput() + if len(data) > 0 { + // diff exits with a non-zero status when the files don't match. + // Ignore that failure as long as we get output. + err = nil + } + return data, err +} + +func writeTempFile(prefix string, data []byte) (string, error) { + file, err := ioutil.TempFile("", prefix) + if err != nil { + return "", err + } + _, err = file.Write(data) + if err1 := file.Close(); err == nil { + err = err1 + } + if err != nil { + os.Remove(file.Name()) + return "", err + } + return file.Name(), nil +} |