aboutsummaryrefslogtreecommitdiff
path: root/cmd/diff.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/diff.go')
-rw-r--r--cmd/diff.go61
1 files changed, 57 insertions, 4 deletions
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)
+ }
}