/
diff.clj
55 lines (49 loc) · 2.17 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
44
45
46
47
48
49
50
51
52
53
54
55
(ns clojure-lsp.diff
(:require
[clojure-lsp.shared :as shared]
[clojure.string :as string])
(:import
[difflib DiffUtils]))
(set! *warn-on-reflection* true)
(defn- lines
"Splits S on `\n` or `\r\n`."
[s]
(string/split-lines s))
(defn- unlines
"Joins SS strings coll using the system's line separator."
[ss]
(string/join shared/line-separator ss))
(defn unified-diff
([old-uri new-uri original revised project-root-uri]
(unified-diff old-uri new-uri original revised project-root-uri 3))
([old-uri new-uri original revised project-root-uri context]
(let [project-path (shared/uri->filename project-root-uri)]
(unlines (DiffUtils/generateUnifiedDiff
(str "a/" (-> old-uri
shared/uri->filename
(shared/relativize-filepath project-path)))
(str "b/" (-> new-uri
shared/uri->filename
(shared/relativize-filepath project-path)))
(lines original)
(DiffUtils/diff (lines original) (lines revised))
context)))))
(defn rename-diff
[old-uri new-uri project-root-uri]
(let [project-path (shared/uri->filename project-root-uri)]
(->> [(str "rename from " (-> old-uri
shared/uri->filename
(shared/relativize-filepath project-path)))
(str "rename to " (-> new-uri
shared/uri->filename
(shared/relativize-filepath project-path)))]
unlines)))
(defn colorize-diff [diff-text]
(-> diff-text
(string/replace #"(?m)^(rename from .*)$" (shared/colorize "$1" :yellow))
(string/replace #"(?m)^(rename to .*)$" (shared/colorize "$1" :yellow))
(string/replace #"(?m)^(\-\-\-\sa.*)$" (shared/colorize "$1" :yellow))
(string/replace #"(?m)^(\+\+\+\sb.*)$" (shared/colorize "$1" :yellow))
(string/replace #"(?m)^(@@.*@@)$" (shared/colorize "$1" :cyan))
(string/replace #"(?m)^(\+(?!\+\+).*)$" (shared/colorize "$1" :green))
(string/replace #"(?m)^(-(?!--).*)$" (shared/colorize "$1" :red))))