Skip to content

Commit e3e4754

Browse files
committed
Improve eca_shell_command to handle better error outputs.
1 parent e03df73 commit e3e4754

File tree

4 files changed

+80
-19
lines changed

4 files changed

+80
-19
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Improve `eca_shell_command` to handle better error outputs.
6+
57
## 0.21.1
68

79
- Default to gpt-5 instead of o4-mini when openai-api-key found.

src/eca/diff.clj

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,35 @@
2323

2424
(defn diff
2525
([original revised file]
26-
(let [patch (DiffUtils/diff (lines original) (lines revised))
26+
(let [original-lines (lines original)
27+
revised-lines (lines revised)
28+
patch (DiffUtils/diff original-lines revised-lines)
2729
deltas (.getDeltas patch)
28-
added (->> deltas
29-
(filter #(instance? InsertDelta %))
30-
(mapcat (fn [^InsertDelta delta]
31-
(.getLines (.getRevised delta))))
32-
count)
33-
changed (->> deltas
34-
(filter #(instance? ChangeDelta %))
35-
(mapcat (fn [^ChangeDelta delta]
30+
new-file? (= "" original)
31+
added (if new-file?
32+
(count revised-lines)
33+
(->> deltas
34+
(filter #(instance? InsertDelta %))
35+
(mapcat (fn [^InsertDelta delta]
3636
(.getLines (.getRevised delta))))
37-
count)
38-
removed (->> deltas
39-
(filter #(instance? DeleteDelta %))
40-
(mapcat (fn [^DeleteDelta delta]
41-
(.getLines (.getOriginal delta))))
42-
count)]
37+
count))
38+
changed (if new-file?
39+
0
40+
(->> deltas
41+
(filter #(instance? ChangeDelta %))
42+
(mapcat (fn [^ChangeDelta delta]
43+
(.getLines (.getRevised delta))))
44+
count))
45+
removed (if new-file?
46+
0
47+
(->> deltas
48+
(filter #(instance? DeleteDelta %))
49+
(mapcat (fn [^DeleteDelta delta]
50+
(.getLines (.getOriginal delta))))
51+
count))]
4352
{:added (+ added changed)
4453
:removed (+ removed changed)
4554
:diff
46-
(->> (DiffUtils/generateUnifiedDiff file file (lines original) patch 3)
55+
(->> (DiffUtils/generateUnifiedDiff file file original-lines patch 3)
4756
(drop 2) ;; removes file header
4857
unlines)})))

src/eca/features/tools/shell.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@
2727
:uri
2828
shared/uri->filename)
2929
(config/get-property "user.home"))
30-
command-and-opts (concat ["bash -c"] command-args [:dir work-dir])
31-
_ (logger/debug logger-tag "Running command:" command-and-opts)
30+
_ (logger/debug logger-tag "Running command:" command-args)
3231
result (try
33-
(p/shell {:dir work-dir :out :string :err :string} "bash -c" command-args)
32+
(p/shell {:dir work-dir
33+
:out :string
34+
:err :string
35+
:continue true} "bash -c" command-args)
3436
(catch Exception e
3537
{:exit 1 :err (.getMessage e)}))
3638
err (some-> (:err result) string/trim)

test/eca/diff_test.clj

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
(ns eca.diff-test
2+
(:require
3+
[clojure.string :as string]
4+
[clojure.test :refer [deftest is testing]]
5+
[eca.diff :as diff]))
6+
7+
(defn- split-diff-lines [s]
8+
(when s (string/split-lines s)))
9+
10+
(deftest diff-test
11+
(testing "adding new lines"
12+
(let [original (string/join "\n" ["a" "b"])
13+
revised (string/join "\n" ["a" "b" "c" "d"])
14+
{:keys [added removed diff]} (diff/diff original revised "file.txt")
15+
lines (split-diff-lines diff)]
16+
(is (= 2 added) "two lines added")
17+
(is (= 0 removed) "no lines removed")
18+
(is (some #{"+c"} lines) "diff should include +c line")
19+
(is (some #{"+d"} lines) "diff should include +d line")))
20+
21+
(testing "changing an existing line counts as one added and one removed"
22+
(let [original (string/join "\n" ["a" "b" "c"])
23+
revised (string/join "\n" ["a" "B" "c"])
24+
{:keys [added removed diff]} (diff/diff original revised "file.txt")
25+
lines (split-diff-lines diff)]
26+
(is (= 1 added) "one line added due to change")
27+
(is (= 1 removed) "one line removed due to change")
28+
(is (some #{"-b"} lines) "diff should include -b line")
29+
(is (some #{"+B"} lines) "diff should include +B line")))
30+
31+
(testing "removing lines"
32+
(let [original (string/join "\n" ["a" "b" "c"])
33+
revised (string/join "\n" ["a"])
34+
{:keys [added removed diff]} (diff/diff original revised "file.txt")
35+
lines (split-diff-lines diff)]
36+
(is (= 0 added) "no lines added")
37+
(is (= 2 removed) "two lines removed")
38+
(is (some #{"-b"} lines) "diff should include -b line")
39+
(is (some #{"-c"} lines) "diff should include -c line")))
40+
41+
(testing "new file"
42+
(let [revised (string/join "\n" ["a" "b" "c" "d"])
43+
{:keys [added removed diff]} (diff/diff "" revised "file.txt")
44+
lines (split-diff-lines diff)]
45+
(is (= 4 added) "two lines added")
46+
(is (= 0 removed) "no lines removed")
47+
(is (some #{"+c"} lines) "diff should include +c line")
48+
(is (some #{"+d"} lines) "diff should include +d line"))))

0 commit comments

Comments
 (0)