From 2c10158ce92f102280d4d87406ebeea3e05bf915 Mon Sep 17 00:00:00 2001 From: flu0r1ne Date: Thu, 29 Jul 2021 13:09:23 -0500 Subject: Added README, Licence, and fixed issue with modules --- cmd/diff.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 4 deletions(-) (limited to 'cmd/diff.go') diff --git a/cmd/diff.go b/cmd/diff.go index 46327b3..8d6a85f 100644 --- a/cmd/diff.go +++ b/cmd/diff.go @@ -1,8 +1,13 @@ package cmd import ( + "golang.flu0r1ne.net/zsu/snap" + "os/exec" + "os" + "io" + "log" "fmt" - "golang.flu0r1ne.net/zfdiff/snap" + "errors" ) func Diff(params []string) { @@ -15,9 +20,57 @@ func Diff(params []string) { die.Fatal("Too many arguments provided") } - from, to := snap.ParseDiff(params[0]) + reference := params[0] - reference := params[1] + from, to := snap.ToRelative("@-"), snap.ToRelative("@") + if len(params) > 1 { + from, to = snap.ParseDiff(params[1]) + } + + oracle := snap.GetOracle(reference) + + fromPath := oracle.PathTo(from) + toPath := oracle.PathTo(to) + + _, noColor := os.LookupEnv("NO_COLOR") + + colorOpt := "--color=always" + if noColor { + colorOpt = "--color=never" + } + + diff := exec.Command("diff", colorOpt, fromPath, toPath) + diff.Env = os.Environ() + + stderr, err := diff.StderrPipe() + if err != nil { + log.Fatal(err); + } - fmt.Println(from, to, reference); + stdout, err := diff.StdoutPipe() + if err != nil { + log.Fatal(err); + } + + if err := diff.Start(); err != nil { + log.Fatal(err) + } + + outtext, _ := io.ReadAll(stdout) + errtext, _ := io.ReadAll(stderr) + + fmt.Fprintf(os.Stderr, "%s", errtext) + fmt.Fprintf(os.Stdout, "%s", outtext) + + if err := diff.Wait(); err != nil { + var exiterr *exec.ExitError + + // GNU Diff exits 1 if the files differ + if errors.As(err, &exiterr) && exiterr.ExitCode() == 1 { + os.Exit(exiterr.ExitCode()) + } + + die.Fatalf("Error encountered while executing diff.") + os.Exit(2) + } } -- cgit v1.2.3