-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeps.clj
More file actions
99 lines (82 loc) · 3.17 KB
/
deps.clj
File metadata and controls
99 lines (82 loc) · 3.17 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
(ns deps
(:require [clojure.string :as string])
(:gen-class))
(def usage-string (.ToString #"
USAGE to list the dependencies of a program:
deps.exe scpview.exe
- OR to show the places where these files would be found -
@echo off
for /F %f in ('deps.exe scpview.exe') DO ECHO ======================= %f ======================= &&where %f
@echo on
"))
(defn- stderr! [& args]
(binding [*out* *err*]
(apply println args)))
(defn- title! [& args]
(System.Console/set_Title
(apply print-str args)))
(def currently-reading-files (atom #{}))
(defn update-currently-reading-title! []
(title! "Reading dependences from " @currently-reading-files))
(defn read-dependencies-from-file [f-name]
(let [file-name (.ToLower f-name)
_ (swap! currently-reading-files #(conj % file-name))
_ (update-currently-reading-title!)
deps
(->> (System.IO.File/ReadAllText file-name)
(re-seq #"(?i)[%a-z0-9._-]{1,100}\.dll")
(remove #(>= (.IndexOf % \%) 0)) ; remove C-language printf-style names
(mapv #(.ToLower %)))
_ (swap! currently-reading-files #(disj % file-name))
_ (update-currently-reading-title!)]
deps))
(defn dependencies-from-folder [directory-name file-name]
(let [dir (System.IO.DirectoryInfo. directory-name)
file-names (->> [file-name "*.dll"]
(mapcat #(.GetFiles dir %))
(map #(.ToLower (.get_Name %))))]
(->> file-names
(pmap
(fn[f][f (->> (read-dependencies-from-file f)
(remove #(= f %)))]))
(apply concat)
(apply hash-map))))
;(clojure.pprint/pprint (dependencies-from-folder "."))
(defn deps-recursive [directory-name file-name]
(let [file-deps (dependencies-from-folder directory-name file-name)
deps (tree-seq
#(let [f (last %)]
(and (->> f file-deps boolean)
(-> % frequencies (get f) (= 1))))
(fn[n]
(mapv #(conj n %) (file-deps (last n))))
[file-name])] ; root node
deps))
(defn deps-recursive2 [directory-name file-name]
(let [file-deps (dependencies-from-folder directory-name file-name)
deps (tree-seq
#(->> % file-deps boolean)
file-deps
file-name)] ; root node
deps))
(defn -main[& args]
(if (or (empty? args) (some #{"/?" "-?" "--help"} args))
(stderr! usage-string)
(let [root-file-name (string/lower-case (first args))
_ (stderr! "Running dependencies in current directory"
(System.Environment/get_CurrentDirectory)
"for" root-file-name)
deps (map last (deps-recursive "." root-file-name))]
(title! "Reading dependences from " root-file-name)
(loop [[d & r] deps
printed #{}]
(if d
(do
(title! "Found" (count printed) "Evaluating" d)
(when-not (printed d)
(stderr! "Found" d))
(recur r (conj printed d)))
(->> printed
sort
(map println)
doall))))))