From 778a522915abe95655d6b99d3603c41958ae9271 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Fri, 30 Jul 2010 21:17:07 -0700 Subject: [PATCH] Add interactive task. No more waiting around for JVM boot if that's your thing. --- src/leiningen/core.clj | 25 ++++++++++++++----------- src/leiningen/interactive.clj | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 src/leiningen/interactive.clj diff --git a/src/leiningen/core.clj b/src/leiningen/core.clj index 846a1cf2..9d2e9e54 100644 --- a/src/leiningen/core.clj +++ b/src/leiningen/core.clj @@ -58,23 +58,26 @@ ([] (read-project "project.clj"))) (def aliases (atom {"--help" "help" "-h" "help" "-?" "help" "-v" "version" - "--version" "version" "überjar" "uberjar"})) + "--version" "version" "überjar" "uberjar" + "int" "interactive"})) (def no-project-needed (atom #{"new" "help" "version"})) (defn task-not-found [& _] (abort "That's not a task. Use \"lein help\" to list all tasks.")) -(defn resolve-task [task] - (let [task-ns (symbol (str "leiningen." task)) - task (symbol task)] - (try - (when-not (find-ns task-ns) - (require task-ns)) - (or (ns-resolve task-ns task) - #'task-not-found) - (catch java.io.FileNotFoundException e - #'task-not-found)))) +(defn resolve-task + ([task not-found] + (let [task-ns (symbol (str "leiningen." task)) + task (symbol task)] + (try + (when-not (find-ns task-ns) + (require task-ns)) + (or (ns-resolve task-ns task) + not-found) + (catch java.io.FileNotFoundException e + not-found)))) + ([task] (resolve-task task #'task-not-found))) (defn- hook-namespaces [project] (sort (or (:hooks project) diff --git a/src/leiningen/interactive.clj b/src/leiningen/interactive.clj new file mode 100644 index 00000000..da3929d4 --- /dev/null +++ b/src/leiningen/interactive.clj @@ -0,0 +1,24 @@ +(ns leiningen.interactive + (:require [clojure.string :as string]) + (:use [leiningen.core :only [resolve-task no-project-needed]])) + +(defn not-found [& _] + (println "That's not a task. Use \"lein help\" to list all tasks.")) + +(defn interactive + "Enter an interactive shell for calling tasks without relaunching new JVMs." + [project] + (println "Welcome to Leiningen. Type \"help\" for a list of commands.") + (loop [] + (flush) + (print "lein> ") + (flush) + ;; TODO: integrate with tab-completion in jLine + (let [input (.readLine *in*)] + (when input + (let [[task-name & args] (string/split input #"\s") + task (resolve-task task-name not-found)] + (if (@no-project-needed task-name) + (apply task args) + (apply task project args)) + (recur))))))