-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
deps.clj
76 lines (69 loc) · 3.15 KB
/
deps.clj
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
(ns leiningen.deps
"Install jars for all dependencies in lib."
(:require [lancet])
(:use [leiningen.core :only [repositories-for]]
[leiningen.util.maven :only [make-dependency]]
[clojure.contrib.io :only [file delete-file-recursively]])
(:import [org.apache.maven.artifact.ant
Authentication DependenciesTask RemoteRepository]
[org.apache.maven.settings Server]
[org.apache.tools.ant.util FlatFileNameMapper]))
(defn make-repository [[id settings]]
(let [repo (RemoteRepository.)]
(.setId repo id)
(if (string? settings)
(.setUrl repo settings)
(let [{:keys [url username password]} settings]
(.setUrl repo url)
(.addAuthentication repo (Authentication. (doto (Server.)
(.setUsername username)
(.setPassword password))))))
repo))
;; Add symlinking to Lancet's toolbox.
(lancet/define-ant-task symlink symlink)
(defmulti copy-dependencies (fn [k destination flatten? fileset] k))
(defmethod copy-dependencies :default [k destination flatten? fileset]
(lancet/copy {:todir destination :flatten (if flatten? "on" "off")}
fileset))
(defmethod copy-dependencies :symlink [k destination flatten? fileset]
(let [files (.getIncludedFiles
(.getDirectoryScanner fileset lancet/ant-project))
dir (.getDir fileset)]
;; In principle, this should work... but it doesn't.
;; Instead we link each file in turn.
#_(symlink {:action "record" :linkfilename destination}
fileset)
(doseq [f files]
(symlink {:link destination
:resource (.getCanonicalPath (file dir f))}))))
(defn make-deps-task [project deps-set]
(let [deps-task (DependenciesTask.)]
(.setBasedir lancet/ant-project (:root project))
(.setFilesetId deps-task "dependency.fileset")
(.setProject deps-task lancet/ant-project)
(.setPathId deps-task (:name project))
(doseq [r (map make-repository (repositories-for project))]
(.addConfiguredRemoteRepository deps-task r))
(doseq [dep (project deps-set)]
(.addDependency deps-task (make-dependency dep)))
deps-task))
(defn deps
"Download and install all :dependencies listed in project.clj.
With an argument it will skip development dependencies."
([project skip-dev deps-set]
(when-not (:disable-implicit-clean project)
(delete-file-recursively (:library-path project) true))
(let [deps-task (make-deps-task project deps-set)
_ (.execute deps-task)
fileset (.getReference lancet/ant-project
(.getFilesetId deps-task))]
(.mkdirs (file (:library-path project)))
(copy-dependencies (:jar-behavior project)
(:library-path project)
true fileset)
(when (and (not skip-dev) (seq (:dev-dependencies project)))
(deps (assoc project :library-path (str (:root project) "/lib/dev"))
true :dev-dependencies))
fileset))
([project skip-dev] (deps project skip-dev :dependencies))
([project] (deps project false)))