diff --git a/doc/img/ns-recompile.png b/doc/img/ns-recompile.png index f8391a1..21ad7ef 100644 Binary files a/doc/img/ns-recompile.png and b/doc/img/ns-recompile.png differ diff --git a/src/mount/core.cljc b/src/mount/core.cljc index 5027239..ac56306 100644 --- a/src/mount/core.cljc +++ b/src/mount/core.cljc @@ -51,7 +51,8 @@ (when-let [stop (@running state)] (prn (str "<< stopping.. " state " (namespace was recompiled)")) (stop) - (swap! running dissoc state))) + (swap! running dissoc state) + {:restart? true})) #?(:clj (defn current-state [state] @@ -135,8 +136,8 @@ order (make-state-seq state-name) sym (str state)] (validate lifecycle) - (cleanup-if-dirty state-name) - (let [s-meta (cond-> {:order order + (let [{:keys [restart?]} (cleanup-if-dirty state-name) + s-meta (cond-> {:order order :start `(fn [] ~start) :status #{:stopped}} stop (assoc :stop `(fn [] ~stop)) @@ -144,9 +145,13 @@ resume (assoc :resume `(fn [] ~resume)))] `(do (def ~state (DerefableState. ~state-name)) - ((var mount.core/update-meta!) [~state-name] (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) - :var (var ~state))) - (var ~state)))))) + (let [meta# (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) + :var (var ~state))] + ((var mount.core/update-meta!) [~state-name] meta#) + (when ~restart? + (prn (str ">> starting.. " ~state-name " (namespace was recompiled)")) + ((var mount.core/up) ~state-name meta# (atom #{}))) + (var ~state))))))) #?(:clj (defmacro defstate! [state & {:keys [start! stop!]}] diff --git a/test/core/mount/test/cleanup_dirty_states.cljc b/test/core/mount/test/cleanup_dirty_states.cljc index 88986bc..a0d0188 100644 --- a/test/core/mount/test/cleanup_dirty_states.cljc +++ b/test/core/mount/test/cleanup_dirty_states.cljc @@ -22,6 +22,15 @@ (mount/stop) (is (instance? mount.core.NotStartedState (dval tapp.example/nrepl)))))) +#?(:clj + (deftest restart-on-recompile + (let [_ (mount/start) + before (:server-socket (dval tapp.example/nrepl))] + (require 'tapp.example :reload) + (is (not= before (:server-socket (dval tapp.example/nrepl)))) ;; should have restarted on recompile/reload, hence different reference + (mount/stop) + (is (instance? mount.core.NotStartedState (dval tapp.example/nrepl)))))) + #?(:cljs (deftest cleanup-dirty-states (let [_ (mount/start #'mount.test.helper/helper)]