generated from PEZ/rn-rf-shadow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtoolchain-report
executable file
·117 lines (102 loc) · 3.27 KB
/
toolchain-report
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/Usr/bin/env joker
;; Usage: toolchain-report
;;
;; This tool queries a set of defined packages in your "toolchain" and
;; reports the versions of those packages in a map. There are no
;; command line flags or options for this script.
(ns main
(:require [joker.os :as os]))
;; The "toolchain" is defined as a vector of maps that define how to
;; query for version. We expect every tool has some command line flag
;; that writes the version info to stdout or stderr, but each tool
;; might format that output in some unique way. Therefore we specify a
;; regular expression pattern that will be used to extract the version
;; from the output.
;;
;; Easiest to show an example:
;;
;; {
;; :key :yarn ; each tool has a unique key
;; :cmd ["yarn" "-v"] ; executing this prints the version
;; :pattern #"(.*)\n" ; this regexp extracts the version #
;; :output :out ; :out = stdout, :err = stderr
;; }
;;
;; The default is to grab everything from stdout up to the first
;; newline '\n', so our example can be shortened:
;;
;; {:key :yarn :cmd ["yarn" "-v"]}
;;
(def toolchain
[
;; operating system
{:key :os-name
:cmd ["clojure" "-e" "(System/getProperty \"os.name\")"]
:pattern #"\"(.*)\""}
{:key :os-version
:cmd ["clojure" "-e" "(System/getProperty \"os.version\")"]
:pattern #"\"(.*)\""}
{:key :todays-date
:cmd ["clojure" "-e" "(.toString (java.time.LocalDate/now))"]}
;; clojure/clojurescript tools
{:key :clojure
:cmd ["clj" "-Stree"]
:pattern #"org.clojure/clojure\s+(.*)\n"}
{:key :clojurescript
:cmd ["clj" "-Stree"]
:pattern #"org.clojure/clojurescript\s+(.*)\n"}
{:key :shadow-cljs-jar
:cmd ["shadow-cljs" "info"]
:pattern #"jar:\s+(.*)\n"}
{:key :shadow-cljs-cli
:cmd ["shadow-cljs" "info"]
:pattern #"cli:\s+(.*)\n"}
;; react native toolchain
{:key :expo-cli :cmd ["expo-cli" "-V"]}
;; javascript tools
{:key :node :cmd ["node" "-v"]}
{:key :yarn :cmd ["yarn" "-v"]}
;; libraries / packages
{:key :expo-js
:cmd ["yarn" "list"]
:pattern #"\s+expo@(.*)\n"}
{:key :react
:cmd ["yarn" "list"]
:pattern #"\s+react@(.*)\n"}
{:key :react-native
:cmd ["yarn" "list"]
:pattern #"\s+react-native@(.*)\n"}
{:key :reagent
:cmd ["clj" "-Stree"]
:pattern #"reagent/reagent\s+(.*)\n"}
{:key :re-frame
:cmd ["clj" "-Stree"]
:pattern #"re-frame/re-frame\s+(.*)\n"}
;; java jdk
{:key :jdk-vendor
:cmd ["java" "-version"]
:output :err
:pattern #"(.*)\s+version"}
{:key :jdk-version
:cmd ["java" "-version"]
:output :err
:pattern #"version\s+\"(.*)\"\n"}
])
(def sh-memoized (memoize #(apply os/sh %)))
(defn check [{:keys [key cmd output pattern]
:or {output :out pattern #"(.*)\n"}}]
(let [result (try (sh-memoized cmd)
(catch Error e {:success nil}))]
(if (:success result)
{key (-> (re-find pattern (output result))
(get 1))}
{key nil})))
(defn print-sorted-keys [m]
;; hack because joker doesn't provide sorted-map
(println "{")
(doseq [k (sort (keys m))]
(printf " %s \"%s\"\n" k (k m)))
(println "}"))
;; run all queries and print the result
(print-sorted-keys (->> (map check toolchain)
(apply merge)))