Fix project-needed? to work with projects that may take project arg.

Some arities may, others may not.
This commit is contained in:
Phil Hagelberg 2010-08-21 09:12:04 -07:00
parent fff60515a7
commit 1013f342c7
2 changed files with 18 additions and 15 deletions

View file

@ -130,24 +130,27 @@
(defn arglists [task-name]
(:arglists (meta (resolve-task task-name))))
;; TODO: some arities of some tasks require projects while others don't
(defn project-needed? [task-name]
(every? #{'project} (map first (arglists task-name))))
(defn project-needed? [parameters]
(= 'project (first parameters)))
(defn arg-count [parameters project]
(if (and project (project-needed? parameters))
(dec (count parameters))
(count parameters)))
(defn matching-arity? [task-name project args]
(let [arg-count (if (project-needed? task-name)
(inc (count args))
(count args))]
(some (fn [defined-args]
(if (= '& (last (butlast defined-args)))
(>= arg-count (- (count defined-args) 2))
(= arg-count (count defined-args))))
(arglists task-name))))
(some (fn [parameters]
(and (if (= '& (last (butlast parameters)))
(>= (- (arg-count parameters project) 2) (count args))
(= (arg-count parameters project) (count args)))
parameters))
;; use project.clj if possible
(reverse (sort-by count (arglists task-name)))))
(defn apply-task [task-name project args not-found]
(let [task (resolve-task task-name not-found)]
(if (matching-arity? task-name project args)
(if (project-needed? task-name)
(if-let [parameters (matching-arity? task-name project args)]
(if (project-needed? parameters)
(apply task project args)
(apply task args))
(abort "Wrong number of arguments to" task-name "task."
@ -172,7 +175,7 @@
(defn -main
([& [task-name & args]]
(let [task-name (or (@aliases task-name) task-name "help")
project (if (project-needed? task-name) (read-project))
project (if (.exists (File. "project.clj")) (read-project))
compile-path (:compile-path project)]
(user-init project)
(when compile-path (.mkdirs (File. compile-path)))

View file

@ -49,6 +49,6 @@ from a remote repository. May place shell wrappers in ~/.lein/bin."
(add-metadata artifact (file (pom project))))
(install-shell-wrapper (JarFile. jarfile))
(.install installer jarfile artifact local-repo)))
([_ project-name version]
([project-name version]
(let [[name group] ((juxt name namespace) (symbol project-name))]
(standalone-install name (or group name) version))))