Skip to content

Commit 7a4680b

Browse files
authored
#4 (#5)
* run with tree-resolved edn * support aliases * do not delete __base and use also .cpcache * README
1 parent c21cbc5 commit 7a4680b

File tree

8 files changed

+336
-127
lines changed

8 files changed

+336
-127
lines changed

.github/workflows/notify-diff.yml

Lines changed: 0 additions & 32 deletions
This file was deleted.

README.md

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,7 @@ But it's good to know that such potential risks can be detected in advance.
3838

3939
## Example
4040

41-
Just make some changes in your `deps.edn` then run:
42-
43-
```sh
44-
clj -Sdeps '{:deps {io.github.namenu/deps-diff {:git/tag "v1.1" :git/sha "c1e0a84"}}}' \
45-
-X namenu.deps-diff/diff \
46-
:base '"HEAD"' \
47-
:target '"deps.edn"' \
48-
:format :cli
49-
```
50-
51-
... or create a `.github/workflows/deps-diff.yml` file as follows.
41+
Just create a `.github/workflows/deps-diff.yml` file as follows.
5242

5343
```yml
5444
name: Notify dependency diff
@@ -62,13 +52,9 @@ jobs:
6252
notify:
6353
runs-on: ubuntu-latest
6454
steps:
65-
- uses: actions/checkout@v4
66-
with:
67-
fetch-depth: 0 # Required to make it possible to compare with PR base branch
68-
6955
- name: Diff dependencies
7056
id: diff
71-
uses: namenu/deps-diff@v1.0
57+
uses: namenu/deps-diff@main
7258
with:
7359
format: markdown
7460
aliases: "[:test]"
@@ -79,8 +65,7 @@ jobs:
7965
message: |
8066
### `deps.edn` dependency changes
8167
82-
${{ steps.diff.
83-
.deps_diff }}
68+
${{ steps.diff.outputs.deps_diff }}
8469
```
8570
8671
This workflow will comment on your PR as shown below.
@@ -90,11 +75,10 @@ This workflow will comment on your PR as shown below.
9075
9176
## Inputs
9277
93-
| Name | Description | Default Value |
94-
|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|
95-
| `base` | The deps.edn before the change being referenced. You can specify a git ref or file path. The default value is the git ref of the base branch of the PR, referencing the `deps.edn` at the repository's root path. You can specify it like `{{git-ref}}:{{path-to-deps.edn}}`. | Git ref of PR's base branch |
96-
| `target` | The deps.edn after the change being referenced. You can specify a git ref or file path. The default value is the deps.edn in the current directory. | `deps.edn` in the current directory |
97-
| `format` | Determines the format of the output. You can specify `edn`, `markdown`, or `cli`. The default value is edn | `edn` |
78+
| Name | Description | Default Value |
79+
|-------------|------------------------------------------------------------------------------------------------------------------------------|----------------------------|
80+
| `base` | The git sha before the change being referenced. The default value is the git ref of the base branch of the PR. | Git ref of PR's base branch |
81+
| `format` | Determines the format of the output. You can specify `edn`, `markdown`, or `cli`. The default value is edn | `edn` |
9882
| `aliases` | Specifies the aliases to be used when forming the basis. It must be expressed as a quoted sequence (e.g., `'[:dev :test]'`). | `nil` |
9983

10084

action.yml

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ inputs:
99
required: true
1010
description: git/sha of base commit
1111
default: ${{ github.event.pull_request.base.sha }}
12-
target:
12+
project:
1313
required: true
1414
description: path of the target deps.edn
15-
default: 'deps.edn'
15+
default: :standard
1616
aliases:
1717
required: false
1818
description: aliases to create basis
@@ -55,17 +55,36 @@ runs:
5555
restore-keys: |
5656
${{ env.cache-name }}-
5757
58+
- name: Checkout base
59+
uses: actions/checkout@v4
60+
with:
61+
ref: ${{ github.event.pull_request.base.sha }}
62+
63+
- name: Resolve base
64+
shell: bash
65+
run: |
66+
clojure -X:deps tree :aliases '${{ inputs.aliases }}' :format :edn > __base.edn
67+
68+
- name: Checkout target
69+
uses: actions/checkout@v4
70+
with:
71+
clean: false
72+
73+
- name: Resolve target
74+
shell: bash
75+
run: |
76+
clojure -X:deps tree :aliases '${{ inputs.aliases }}' :format :edn > __target.edn
77+
5878
- id: diff
5979
shell: bash
6080
run: |
6181
set +e
6282
6383
DEPS_DIFF=$(clojure -Sdeps '{:deps {namenu/deps-diff {:local/root "${{ github.action_path }}"}}}' \
6484
-X namenu.deps-diff/diff \
65-
:base '"${{ inputs.base }}"' \
66-
:target '"${{ inputs.target }}"' \
67-
:format :${{ inputs.format }} \
68-
:aliases '${{ inputs.aliases }}')
85+
:base '"__base.edn"' \
86+
:target '"__target.edn"' \
87+
:format :${{ inputs.format }})
6988
EXIT_CODE=$?
7089
7190
echo "DEPS_DIFF<<EOF" >> $GITHUB_OUTPUT

src/namenu/deps_diff.clj

Lines changed: 24 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,21 @@
33
[clojure.edn :as edn]
44
[clojure.set :as set]
55
[clojure.spec.alpha :as s]
6-
[clojure.string :as str]
7-
[clojure.tools.deps :as deps]
8-
[clojure.tools.deps.util.maven :as mvn]
96
[namenu.deps-diff.output :as output]
107
[namenu.deps-diff.spec :as spec]))
118

12-
;; from tools.gitlibs
13-
(defn- run-git
14-
[& args]
15-
(let [command-args (cons "git" (map str args))]
16-
(let [proc-builder (ProcessBuilder. ^java.util.List command-args)
17-
proc (.start proc-builder)
18-
exit (.waitFor proc)
19-
out (slurp (.getInputStream proc))
20-
err (slurp (.getErrorStream proc))]
21-
{:args command-args, :exit exit, :out out, :err err})))
22-
23-
(defn- read-edn
24-
[path]
25-
(cond
26-
;; file
27-
(.exists (clojure.java.io/file path))
28-
(edn/read-string (slurp (str path)))
29-
30-
;; git
31-
:else
32-
(let [path (if (str/ends-with? path "deps.edn")
33-
path
34-
(str path ":" "deps.edn"))
35-
sh (run-git "show" path)]
36-
(when-not (zero? (:exit sh))
37-
(throw (ex-info (str "Couldn't fetch deps.edn from git ref " path)
38-
{:output (:err sh)})))
39-
(edn/read-string (:out sh)))))
40-
41-
(defn- resolve-deps [deps aliases]
42-
(-> (deps/create-basis {:project (merge {:mvn/repos mvn/standard-repos} deps)
43-
:aliases aliases})
44-
:libs
45-
(update-vals #(s/conform ::spec/coord %))))
9+
(defn- parse-resolved-tree [file]
10+
(let [deps-tree (edn/read-string (slurp (str file)))]
11+
(letfn [(walk [m]
12+
(mapcat (fn [[k v]]
13+
(into [[k (dissoc v :children)]]
14+
(walk (:children v))))
15+
m))]
16+
(->> (walk (:children deps-tree))
17+
(keep (fn [[k v]]
18+
(if (:include v)
19+
[k (s/conform ::spec/coord (:coord v))])))
20+
(into {})))))
4621

4722
(defmulti print-result! (fn [_ opts] (keyword (:format opts))))
4823

@@ -59,11 +34,8 @@
5934
(output/cli data))
6035

6136
(defn diff*
62-
[{:keys [base target aliases]}]
63-
(let [deps-from (resolve-deps (read-edn base) aliases)
64-
deps-to (resolve-deps (read-edn target) aliases)
65-
66-
key-set (comp set keys)
37+
[deps-from deps-to]
38+
(let [key-set (comp set keys)
6739

6840
[removed-deps added-deps common-deps] (data/diff (key-set deps-from) (key-set deps-to))]
6941
;; don't need to sort here
@@ -75,18 +47,19 @@
7547
(defn diff
7648
"
7749
opts
78-
:base - git sha
79-
:target - file path
80-
:aliases - seq of aliases to be used creating basis
50+
:base - tree shaped edn of base deps.edn
51+
:target - tree shaped edn of target deps.edn
8152
:format - #{:edn, :markdown, :cli}
8253
"
83-
[{:keys [base target aliases format] :as opts}]
54+
[{:keys [base target format] :as opts}]
8455
(assert (s/valid? ::spec/ref base))
8556
(assert (s/valid? ::spec/ref target))
86-
(assert (s/valid? ::spec/aliases aliases))
8757
(assert (s/valid? ::spec/format format))
8858

89-
(let [d (diff* opts)
59+
(let [deps-from (parse-resolved-tree base)
60+
deps-to (parse-resolved-tree target)
61+
62+
d (diff* deps-from deps-to)
9063
exit-code (if (output/equal? d) 0 1)]
9164
(print-result! d opts)
9265
(System/exit exit-code)))
@@ -95,22 +68,9 @@
9568
;; git show e0f4689c07bc652492bf03eba7edac20ab2bee0f:test/resources/base.edn > base.edn
9669
;; clojure -X namenu.deps-diff/diff base.edn deps.edn
9770

98-
(diff* {:base "HEAD" :target "deps.edn" :format :cli})
99-
(diff* {:base "test-resources/base/deps.edn"
100-
:target "test-resources/target/deps.edn"
101-
:aliases [:poly]})
102-
103-
(diff* {:base "b2a1ca302959b720e703618a912a4b140389ee55" :target "deps.edn"
104-
:format :cli})
105-
106-
(read-edn "HEAD:deps.edn")
107-
108-
(resolve-deps (read-edn "HEAD:deps.edn") [])
109-
(resolve-deps {:deps {'green-labs/gosura {:git/url "https://github.com/green-labs/gosura"
110-
:git/sha "f1d586669f37a3ca99e14739f9abfb1a02128274"}}
111-
:mvn/repos mvn/standard-repos
112-
}
113-
[])
71+
(diff*
72+
(parse-resolved-tree "test-resources/__base.edn")
73+
(parse-resolved-tree "test-resources/__target.edn"))
11474

11575
(make-ver
11676
(s/conform ::spec/coord

0 commit comments

Comments
 (0)