Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ all: check-diff

.PHONY: check-diff

check-diff: main.go open_unix.go open_windows.go
go build $(LDFLAGS) -o check-diff .
check-diff: *.go
go build $(LDFLAGS) -o check-diff

linux: main.go open_unix.go
GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o check-diff open_unix.go main.go
linux: *.go
GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o check-diff

check:
go test -v ./...

lint:
golangci-lint run ./...
81 changes: 81 additions & 0 deletions diff.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package main

import (
"bufio"
"fmt"
"io"
"strings"

"github.com/cubicdaiya/gonp"
)
Comment thread
kazeburo marked this conversation as resolved.

func getLines(filename string) ([]string, error) {
file, err := openRD(filename)
if err != nil {
return nil, err
}
defer file.Close()

scanner := bufio.NewScanner(file)
scanner.Buffer(make([]byte, 64*1024), 10*1024*1024)
lines := make([]string, 0)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return nil, err
}
return lines, nil
}

func diff(prev, current string) (string, error) {
prevLines, err := getLines(prev)
if err != nil {
return "", err
}
newLines, err := getLines(current)
if err != nil {
return "", err
}

d := gonp.New(prevLines, newLines)
d.Compose()

return d.SprintUniHunks(d.UnifiedHunks()), nil
}

func buildNoDifferenceMsg(filename string) (string, error) {
file, err := openRD(filename)
if err != nil {
return "", err
}
defer file.Close()

fileinfo, err := file.Stat()
if err != nil {
return "", err
}
b := make([]byte, 128)
count, err := file.Read(b)
if err != nil && err != io.EOF {
return "", err
}
Comment thread
kazeburo marked this conversation as resolved.
o := string(strings.TrimRight(string(b[0:count]), "\r\n"))
if fileinfo.Size() > 128 {
return fmt.Sprintf("no difference: ```%s...```", o), nil
}
return fmt.Sprintf("no difference: ```%s```", o), nil
}

func buildDiffMsg(diff string) string {
o := diff
if len(diff) > 512 {
o = diff[0:512]
}
o = strings.TrimRight(o, "\r\n")

if len(diff) > 512 {
return fmt.Sprintf("found difference: ```%s...```", o)
}
return fmt.Sprintf("found difference: ```%s```", o)
}
88 changes: 88 additions & 0 deletions diff_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package main

import (
"strings"
"testing"
)

func TestDiff(t *testing.T) {
file1, cleanup1 := createTempFile(t, "Hello, World!\n")
defer cleanup1()

file2, cleanup2 := createTempFile(t, "Hello, Go!\n")
defer cleanup2()

diffResult, err := diff(file1.Name(), file2.Name())
if err != nil {
t.Fatalf("diff failed: %v", err)
}
if diffResult == "" {
t.Errorf("Expected a diff result, got empty string")
}
if !strings.Contains(diffResult, "Hello, World!") || !strings.Contains(diffResult, "Hello, Go!") {
t.Errorf("Diff result does not contain expected content: %q", diffResult)
}
}

func TestBuildNoDifferenceMsg(t *testing.T) {
shortMsg := "This is a test message."
file, cleanup := createTempFile(t, shortMsg+"\n")
defer cleanup()
expected := "no difference: ```" + shortMsg + "```"
result, err := buildNoDifferenceMsg(file.Name())
if err != nil {
t.Fatalf("buildNoDifferenceMsg failed: %v", err)
}
if result != expected {
t.Errorf("Expected %q, got %q", expected, result)
}
}

func TestBuildNoDifferenceMsgLargeResult(t *testing.T) {
largeMsg := strings.Repeat("A", 600)
file, cleanup := createTempFile(t, largeMsg+"\n")
defer cleanup()

expected := "no difference: ```" + largeMsg[:128] + "...```"
result, err := buildNoDifferenceMsg(file.Name())
if err != nil {
t.Fatalf("buildNoDifferenceMsg failed: %v", err)
}
if result != expected {
t.Errorf("Expected %q, got %q", expected, result)
}
}

func TestBuildDiffMsg(t *testing.T) {
diff := "This is a test diff message.\nThis is the second line of the diff.\n"
expected := "found difference: ```This is a test diff message.\nThis is the second line of the diff.```"
result := buildDiffMsg(diff)
if result != expected {
t.Errorf("Expected %q, got %q", expected, result)
}
}

func TestBuildDiffMsgLargeResult(t *testing.T) {
diff := strings.Repeat("A", 600)
expected := "found difference: ```" + diff[:512] + "...```"
result := buildDiffMsg(diff)
if result != expected {
t.Errorf("Expected %q, got %q", expected, result)
}
}

func TestDiffNoDifference(t *testing.T) {
file1, cleanup1 := createTempFile(t, "Hello, World!\n")
defer cleanup1()

file2, cleanup2 := createTempFile(t, "Hello, World!\n")
defer cleanup2()

diffResult, err := diff(file1.Name(), file2.Name())
if err != nil {
t.Fatalf("diff failed: %v", err)
}
if diffResult != "" {
t.Errorf("Expected no diff result, got: %q", diffResult)
}
}
101 changes: 19 additions & 82 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package main

import (
"bufio"
"bytes"
"crypto/sha256"
"fmt"
Expand All @@ -12,7 +11,6 @@ import (
"runtime"
"strings"

"github.com/cubicdaiya/gonp"
"github.com/jessevdk/go-flags"
"github.com/mackerelio/checkers"
"github.com/mackerelio/golib/pluginutil"
Expand All @@ -21,6 +19,13 @@ import (
var version string
var commit string

const (
OK = iota
WARNING
CRITICAL
UNKNOWN
)

type Opt struct {
Args []string
Command string
Expand All @@ -40,7 +45,7 @@ func (opt *Opt) cmd(file *os.File) error {
}
err := cmd.Wait()
if err != nil {
return fmt.Errorf("%s - %s", err, stderr.String())
return fmt.Errorf("%w - %s", err, stderr.String())
}
return nil
}
Expand Down Expand Up @@ -69,7 +74,7 @@ func (opt *Opt) run() *checkers.Checker {
err = opt.cmd(newFile)
if err != nil {
newFile.Close()
os.Remove(newFile.Name())
_ = os.Remove(newFile.Name())
return checkers.Critical(err.Error())
}

Expand Down Expand Up @@ -114,77 +119,6 @@ func (opt *Opt) run() *checkers.Checker {
return checkers.Critical(diffMsg)
}

func buildNoDifferenceMsg(filename string) (string, error) {
file, err := openRD(filename)
if err != nil {
return "", err
}
defer file.Close()

fileinfo, err := file.Stat()
if err != nil {
return "", err
}
b := make([]byte, 128)
count, err := file.Read(b)
if err != nil {
return "", err
}
o := string(strings.TrimRight(string(b[0:count]), "\r\n"))
if fileinfo.Size() > 128 {
return fmt.Sprintf("no difference: ```%s...```", o), nil
}
return fmt.Sprintf("no difference: ```%s```", o), nil
}

func buildDiffMsg(diff string) string {
o := diff
if len(diff) > 512 {
o = diff[0:512]
}
o = strings.TrimRight(o, "\r\n")

if len(diff) > 512 {
return fmt.Sprintf("found difference: ```%s...```", o)
}
return fmt.Sprintf("found difference: ```%s```", o)
}

func getLines(filename string) ([]string, error) {
file, err := openRD(filename)
if err != nil {
return nil, err
}
defer file.Close()

scanner := bufio.NewScanner(file)
scanner.Buffer(make([]byte, 64*1024), 10*1024*1024)
lines := make([]string, 0)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return nil, err
}
return lines, nil
}

func diff(prev, new string) (string, error) {
prevLines, err := getLines(prev)
if err != nil {
return "", err
}
newLines, err := getLines(new)
if err != nil {
return "", err
}

diff := gonp.New(prevLines, newLines)
diff.Compose()

return diff.SprintUniHunks(diff.UnifiedHunks()), nil
}

func fileExists(filename string) bool {
_, err := os.Stat(filename)
return err == nil
Expand All @@ -207,16 +141,19 @@ func main() {
runtime.GOARCH,
runtime.Version(),
commit)
os.Exit(0)
}
if err != nil {
os.Exit(OK)
} else if flags.WroteHelp(err) {
fmt.Fprintf(os.Stdout, "%v\n", err)
os.Exit(OK)
} else if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
if len(args) == 0 {
os.Exit(UNKNOWN)
} else if len(args) == 0 {
fmt.Fprintf(os.Stderr, "command is required\n")
psr.WriteHelp(os.Stderr)
os.Exit(1)
os.Exit(UNKNOWN)
}
Comment thread
kazeburo marked this conversation as resolved.

opt.Args = []string{}
opt.Command = args[0]
if len(args) > 1 {
Expand Down
Loading
Loading