Pass arguments to f in change task through the reader.

This means that you can use non-strings as args in the change task,
but it requires double-quoting when you do want strings.
This commit is contained in:
Phil Hagelberg 2014-05-27 11:45:05 -07:00
parent dd7447544b
commit b1a07d03ec
4 changed files with 18 additions and 14 deletions

View file

@ -231,7 +231,7 @@ You can use the `lein-pprint` plugin to see the default value of `:release-tasks
```
$ lein pprint :release-tasks
[["vcs" "assert-committed"]
["change" "version" "leiningen.release/bump-version" "release"]
["change" "version" "leiningen.release/bump-version" "\"release\""]
["vcs" "commit"]
["vcs" "tag"]
["deploy"]
@ -247,7 +247,7 @@ want to automatically bump the version in `project.clj`:
```clojure
:release-tasks [["vcs" "assert-committed"]
["change" "version"
"leiningen.release/bump-version" "release"]
"leiningen.release/bump-version" "\"release\""]
["vcs" "commit"]
["vcs" "tag"]
["deploy"]]

View file

@ -189,7 +189,7 @@
;; If these change, be sure to update release docstring and DEPLOY.md
:release-tasks ^:top-displace [["vcs" "assert-committed"]
["change" "version"
"leiningen.release/bump-version" "release"]
"leiningen.release/bump-version" "\"release\""]
["vcs" "commit"]
["vcs" "tag"]
["deploy"]

View file

@ -32,8 +32,7 @@
(= "set" f) (constantly (first args))
(string? f) (or (utils/require-resolve (symbol f))
(fail-argument! (str "Unable to resolve " f)))
:else (fail-argument!
(str "Expected " f " to implement or reference an IFn")))]
:else (fail-argument! (str f " is not a function.")))]
#(apply f % args)))
;;; Maven convention helpers
@ -147,12 +146,15 @@
;;; Public API
(defn change-string
"Programmatic functional access to project.clj-rewriting.
See the `change` task function which handles reading and writing from disk as
well as turning string args into Clojure data; this function handles the rest."
[project-str key-or-path f & args]
(let [f (collapse-fn f args)
path (normalize-path key-or-path)
proj (parse-project project-str)]
(sj/str-pt
;; TODO: support 'magic' keys within nested scope also
(condp = path
[:version] (update-version proj f)
[:name] (update-name proj f)
@ -173,16 +175,18 @@ as its first argument and the remaining task aruments as the rest.
This will append \"-SNAPSHOT\" to the current version:
$ lein change version str \"-SNAPSHOT\"
$ lein change version str '\"-SNAPSHOT\"'
When called programmatically, you may pass a coll of keywords for the
first arg or an actual function for the second.
Note that this task reads the project.clj file from disk rather than
honoring the project map, so profile merging or `update-in` invocations
will not effect it."
All the arguments to f are passed through the reader, so double quoting is
necessory to use strings. Note that this task reads the project.clj file
from disk rather than honoring the project map, so profile merging or
`update-in` invocations will not effect it."
[project key-or-path f & args]
;; cannot work with project map, want to preserve formatting, comments, etc
(let [project-file (io/file (:root project) "project.clj")
source (slurp project-file)]
source (slurp project-file)
args (map read-string args)]
(spit project-file (apply change-string source key-or-path f args))))

View file

@ -32,7 +32,7 @@
a map of the version incremented in the level argument. Add qualifier unless
releasing non-snapshot."
[{:keys [major minor patch qualifier]} level]
(case level
(case (keyword (name level))
:major {:major (inc major) :minor 0 :patch 0 :qualifier "SNAPSHOT"}
:minor {:major major :minor (inc minor) :patch 0 :qualifier "SNAPSHOT"}
:patch {:major major :minor minor :patch (inc patch) :qualifier "SNAPSHOT"}
@ -57,7 +57,7 @@ The default list of release tasks is as follows:
:release-tasks [[\"vcs\" \"assert-committed\"]
[\"change\" \"version\"
\"leiningen.release/bump-version\" \"release\"]
\"leiningen.release/bump-version\" \"\\\"release\\\"\"]
[\"vcs\" \"commit\"]
[\"vcs\" \"tag\"]
[\"deploy\"]
@ -83,7 +83,7 @@ is a task name and the rest are arguments to that task.
The release task takes a single argument which should be one of :major,
:minor, or :patch to indicate which semantic versioning level to bump. If none
is given, it defaults to :patch."
([project] (release *level*))
([project] (release project (str *level*)))
([project level]
(binding [*level* (read-string level)]
(doseq [task (:release-tasks project)]