|
11 | 11 | file-modification timestamps"}
|
12 | 12 | clojure.tools.namespace.dir
|
13 | 13 | (:require [clojure.tools.namespace.file :as file]
|
| 14 | + [clojure.tools.namespace.find :as find] |
14 | 15 | [clojure.tools.namespace.track :as track]
|
15 | 16 | [clojure.java.classpath :refer [classpath-directories]]
|
16 | 17 | [clojure.java.io :as io]
|
17 | 18 | [clojure.set :as set]
|
18 | 19 | [clojure.string :as string])
|
19 | 20 | (:import (java.io File) (java.util.regex Pattern)))
|
20 | 21 |
|
21 |
| -(defn- find-files [dirs] |
| 22 | +(defn- find-files [dirs platform] |
22 | 23 | (->> dirs
|
23 | 24 | (map io/file)
|
24 | 25 | (filter #(.exists ^File %))
|
25 |
| - (mapcat file-seq) |
26 |
| - (filter file/clojure-file?) |
27 |
| - (map #(.getCanonicalFile ^File %)))) |
| 26 | + (mapcat #(find/find-sources-in-dir % platform)))) |
28 | 27 |
|
29 | 28 | (defn- modified-files [tracker files]
|
30 | 29 | (filter #(< (::time tracker 0) (.lastModified ^File %)) files))
|
31 | 30 |
|
32 | 31 | (defn- deleted-files [tracker files]
|
33 | 32 | (set/difference (::files tracker #{}) (set files)))
|
34 | 33 |
|
35 |
| -(defn- update-files [tracker deleted modified] |
| 34 | +(defn- update-files [tracker deleted modified {:keys [read-opts]}] |
36 | 35 | (let [now (System/currentTimeMillis)]
|
37 | 36 | (-> tracker
|
38 | 37 | (update-in [::files] #(if % (apply disj % deleted) #{}))
|
39 | 38 | (file/remove-files deleted)
|
40 | 39 | (update-in [::files] into modified)
|
41 |
| - (file/add-files modified) |
| 40 | + (file/add-files modified read-opts) |
42 | 41 | (assoc ::time now))))
|
43 | 42 |
|
44 |
| -(defn scan |
45 |
| - "Scans directories for files which have changed since the last time |
46 |
| - 'scan' was run; update the dependency tracker with |
| 43 | +(defn scan-files |
| 44 | + "Scans files to find those which have changed since the last time |
| 45 | + 'scan-files' was run; updates the dependency tracker with |
47 | 46 | new/changed/deleted files.
|
48 | 47 |
|
| 48 | + files is the collection of files to scan. |
| 49 | +
|
| 50 | + Optional third argument is map of options: |
| 51 | +
|
| 52 | + :platform Either clj (default) or cljs, both defined in |
| 53 | + clojure.tools.namespace.find, controls reader options for |
| 54 | + parsing files. |
| 55 | +
|
| 56 | + :add-all? If true, assumes all extant files are modified regardless |
| 57 | + of filesystem timestamps." |
| 58 | + {:added "0.3.0"} |
| 59 | + ([tracker files] (scan-files tracker files nil)) |
| 60 | + ([tracker files {:keys [platform add-all?]}] |
| 61 | + (let [deleted (seq (deleted-files tracker files)) |
| 62 | + modified (if add-all? |
| 63 | + files |
| 64 | + (seq (modified-files tracker files)))] |
| 65 | + (if (or deleted modified) |
| 66 | + (update-files tracker deleted modified platform) |
| 67 | + tracker)))) |
| 68 | + |
| 69 | +(defn scan-dirs |
| 70 | + "Scans directories for files which have changed since the last time |
| 71 | + 'scan-dirs' or 'scan-files' was run; updates the dependency tracker |
| 72 | + with new/changed/deleted files. |
| 73 | +
|
| 74 | + dirs is the collection of directories to scan, defaults to all |
| 75 | + directories on Clojure's classpath. |
| 76 | +
|
| 77 | + Optional third argument is map of options: |
| 78 | +
|
| 79 | + :platform Either clj (default) or cljs, both defined in |
| 80 | + clojure.tools.namespace.find, controls file extensions |
| 81 | + and reader options. |
| 82 | +
|
| 83 | + :add-all? If true, assumes all extant files are modified regardless |
| 84 | + of filesystem timestamps." |
| 85 | + {:added "0.3.0"} |
| 86 | + ([tracker] (scan-dirs tracker nil nil)) |
| 87 | + ([tracker dirs] (scan-dirs tracker dirs nil)) |
| 88 | + ([tracker dirs {:keys [platform add-all?] :as options}] |
| 89 | + (let [ds (or (seq dirs) (classpath-directories))] |
| 90 | + (scan-files tracker (find-files ds platform) options)))) |
| 91 | + |
| 92 | +(defn scan |
| 93 | + "DEPRECATED: replaced by scan-dirs. |
| 94 | +
|
| 95 | + Scans directories for Clojure (.clj, .cljc) source files which have |
| 96 | + changed since the last time 'scan' was run; update the dependency |
| 97 | + tracker with new/changed/deleted files. |
| 98 | +
|
49 | 99 | If no dirs given, defaults to all directories on the classpath."
|
| 100 | + {:added "0.2.0" |
| 101 | + :deprecated "0.3.0"} |
50 | 102 | [tracker & dirs]
|
51 |
| - (let [ds (or (seq dirs) (classpath-directories)) |
52 |
| - files (find-files ds) |
53 |
| - deleted (seq (deleted-files tracker files)) |
54 |
| - modified (seq (modified-files tracker files))] |
55 |
| - (if (or deleted modified) |
56 |
| - (update-files tracker deleted modified) |
57 |
| - tracker))) |
| 103 | + (scan-dirs tracker dirs {:platform find/clj})) |
58 | 104 |
|
59 | 105 | (defn scan-all
|
60 |
| - "Scans directories for all Clojure source files and updates the |
| 106 | + "DEPRECATED: replaced by scan-dirs. |
| 107 | +
|
| 108 | + Scans directories for all Clojure source files and updates the |
61 | 109 | dependency tracker to reload files. If no dirs given, defaults to
|
62 | 110 | all directories on the classpath."
|
| 111 | + {:added "0.2.0" |
| 112 | + :deprecated "0.3.0"} |
63 | 113 | [tracker & dirs]
|
64 |
| - (let [ds (or (seq dirs) (classpath-directories)) |
65 |
| - files (find-files ds) |
66 |
| - deleted (seq (deleted-files tracker files))] |
67 |
| - (update-files tracker deleted files))) |
| 114 | + (scan-dirs tracker dirs {:platform find/clj :add-all? true})) |
0 commit comments