forked from weavejester/cljfmt
-
Notifications
You must be signed in to change notification settings - Fork 2
/
diff.clj
43 lines (36 loc) · 1.26 KB
/
diff.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(ns cljfmt.diff
(:import [difflib DiffUtils Delta$TYPE]
[java.io File]
[java.util.regex Pattern])
(:require [clojure.java.io :as io]
[clojure.string :as str]))
(defn- lines [s]
(str/split s #"\n"))
(defn- unlines [ss]
(str/join "\n" ss))
(defn to-absolute-path [filename]
(->> (str/split filename (re-pattern (Pattern/quote File/separator)))
(apply io/file)
.getCanonicalPath))
(defn unified-diff
([filename original revised]
(unified-diff filename original revised 3))
([filename original revised context]
(unlines (DiffUtils/generateUnifiedDiff
(->> filename to-absolute-path (str "a"))
(->> filename to-absolute-path (str "b"))
(lines original)
(DiffUtils/diff (lines original) (lines revised))
context))))
(def ^:private ansi-colors
{:reset "[0m"
:red "[031m"
:green "[032m"
:cyan "[036m"})
(defn- colorize [s color]
(str \u001b (ansi-colors color) s \u001b (ansi-colors :reset)))
(defn colorize-diff [diff-text]
(-> diff-text
(str/replace #"(?m)^(@@.*@@)$" (colorize "$1" :cyan))
(str/replace #"(?m)^(\+(?!\+\+).*)$" (colorize "$1" :green))
(str/replace #"(?m)^(-(?!--).*)$" (colorize "$1" :red))))