    k keep bool str "keep intermediate .clj files"
    m module MODULE str "module dirpath"
    v verbose bool "Print trace messages."]
+  ;; boolean hasUppercase = !password.equals(password.toLowerCase());
   (let [tmp-dir (boot/tmp-dir!)
         prev-pre (atom nil)
-        dir (if dir dir web-inf-dir)]
+        dir (if dir dir web-inf-dir)
+        version (str/replace (-> (boot/get-env) :gae :module :version) "." "-")]
+    (if (not= version  (.toLowerCase version))
+      (throw (Exception. (str "Upper-case not allowed in GAE version string: " version))))
     (boot/with-pre-wrap fileset
       (let [webapp-edn-files (->> (boot/fileset-diff @prev-pre fileset)
                                   boot/input-files

          ;; _ (println "ARGS: " args)
          ;; jargs (into-array String (conj jargs "build/exploded-app"))

          target-dir (if service (str (-> (boot/get-env) :gae :module :app-dir)
                                      "/target/"
                                      (-> (boot/get-env) :gae :module :name))
                         "target")

  (if verbose (println "TASK: boot-gae/deploy"))
  (validate-tools-api-jar)
  (println "PARAMS: " *opts*)
  (let [mod      (-> (boot/get-env) :gae :module :name)
        app-dir  (-> (boot/get-env) :gae :app :dir)
        ;; dir      (if service (str "target/" mod) "target")
        opts (merge {:sdk-root (:sdk-root config-map)
                     ;; :use-java7 true
                     :build-dir (if build-dir build-dir (gae-app-dir))} ;; (:build-dir config-map)}
                    *opts*)
        _ (println "OPTS: " opts)
        params (into [] (for [[k v] (remove (comp nil? second)
