Skip to content

Commit 45a188e

Browse files
committed
Tweak how cache digest is generated
1 parent 1695f5c commit 45a188e

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/net/lewisship/cli_tools/cache.cljc

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@
88
[clojure.string :as str]
99
[clj-commons.ansi :refer [perr]]
1010
#?(:bb [babashka.classpath :as cp]))
11-
(:import [java.io File]
12-
[java.security MessageDigest]))
11+
(:import (java.io File)
12+
(java.nio ByteBuffer)
13+
(java.security MessageDigest)))
1314

1415
(defn- get-classpath
1516
[]
16-
#?(
17-
:bb (cp/get-classpath)
17+
#?(:bb (cp/get-classpath)
1818
:clj (System/getProperty "java.class.path")))
1919

2020
(defn- get-split-classpath
2121
[]
2222
(let [sep fs/path-separator
2323
paths (-> (get-classpath)
2424
(str/split (re-pattern sep)))]
25-
2625
(->> paths
2726
sort
2827
(mapv io/file))))
@@ -34,16 +33,19 @@
3433
(let [bytes (.getBytes value "UTF-8")]
3534
(.update digest bytes)))
3635

37-
(defn- update-digest-from-file-contents
36+
(defn- update-digest-from-file
3837
[^MessageDigest digest f]
39-
(let [f' (fs/file f)]
40-
;; Would be better to digest the 8 raw bytes, but this is easier.
41-
(update-digest-from-string digest (Long/toHexString (.lastModified f')))))
38+
(let [f' (fs/file f)
39+
last-modified (.lastModified f')
40+
b (ByteBuffer/allocate 8)]
41+
(.putLong b last-modified)
42+
(.flip b)
43+
(.update digest b)))
4244

4345
(defn- update-digest-recursively
4446
[digest ^File root]
4547
(let [paths (fs/glob root "**")]
46-
(run! #(update-digest-from-file-contents digest %) paths)))
48+
(run! #(update-digest-from-file digest %) paths)))
4749

4850
(defn- update-digest
4951
[digest source]
@@ -52,7 +54,8 @@
5254
;; The assumption is that files are .jar files and the name will change if
5355
;; the contents change.
5456
(update-digest-from-string digest (.getCanonicalPath f))
55-
;; But for a source directory, find all the sources (and digest their contents).
57+
;; But for a source directory, find all the sources (and digest their file time stamps).
58+
;; Adding or removing a file (even if no other files are touched) will change the digest.
5659
(update-digest-recursively digest f))))
5760

5861
(defn- hex-string [^bytes input]

0 commit comments

Comments
 (0)