diff --git a/project.clj b/project.clj index 9b1a8680fc206ee5cb2225da890cae507457d4e5..e76a22af776fb07990e21577b3d2f46e54c34e7f 100644 --- a/project.clj +++ b/project.clj @@ -112,7 +112,6 @@ [org.eclipse.jetty/jetty-server "9.4.14.v20181114"] ; We require JDK 8 which allows us to run Jetty 9.4, ring-jetty-adapter runs on 1.7 which forces an older version [ring/ring-json "0.4.0"] ; Ring middleware for reading/writing JSON automatically [stencil "0.5.0"] ; Mustache templates for Clojure - [expectations "2.2.0-beta2"] [toucan "1.11.0-SNAPSHOT" :exclusions [org.clojure/java.jdbc honeysql]]] ; Model layer, hydration, and DB utilities :main ^:skip-aot metabase.core diff --git a/src/metabase/plugins/dependencies.clj b/src/metabase/plugins/dependencies.clj index 75203cf9ce47d2d01d879a72584432ae902634c8..7d34cb2fbf78d93d2400607a5dc48697f8c565a9 100644 --- a/src/metabase/plugins/dependencies.clj +++ b/src/metabase/plugins/dependencies.clj @@ -19,23 +19,33 @@ (fn [_ _ dep] (dependency-type dep))) (defmethod dependency-satisfied? :default [_ {{plugin-name :name} :info} dep] - (log/error (u/format-color 'red - (trs "Plugin {0} declares a dependency that Metabase does not understand: {1}" plugin-name dep)) - (trs "Refer to the plugin manifest reference for a complete list of valid plugin dependencies:") - "https://github.com/metabase/metabase/wiki/Metabase-Plugin-Manifest-Reference") + (log/error + (u/format-color 'red + (trs "Plugin {0} declares a dependency that Metabase does not understand: {1}" plugin-name dep)) + (trs "Refer to the plugin manifest reference for a complete list of valid plugin dependencies:") + "https://github.com/metabase/metabase/wiki/Metabase-Plugin-Manifest-Reference") false) -(defonce ^:private ^{:arglists '([plugin-name message]), :doc "Warn that a plugin cannot be initialized because of - required dependencies. Subsequent calls with duplicate warnings are automatically ignored."} - warn-about-required-dependencies - (let [already-warned (atom #{})] - (fn [plugin-name message] - (let [k [plugin-name message]] - (when-not (contains? @already-warned k) - (swap! already-warned conj k) - (log/info (u/format-color 'red - (trs "Metabase cannot initialize plugin {0} due to required dependencies." plugin-name)) - message)))))) +(defonce ^:private already-logged (atom #{})) + +(defn log-once + "Log a message a single time, such as warning that a plugin cannot be initialized because of required dependencies. + Subsequent calls with duplicate messages are automatically ignored." + {:style/indent 1} + ([message] + (log-once nil message)) + + ([plugin-name-or-nil message] + (let [k [plugin-name-or-nil message]] + (when-not (contains? @already-logged k) + (swap! already-logged conj k) + (log/info message))))) + +(defn- warn-about-required-dependencies [plugin-name message] + (log-once plugin-name + (str (u/format-color 'red (trs "Metabase cannot initialize plugin {0} due to required dependencies." plugin-name)) + " " + message))) (defmethod dependency-satisfied? :class [_ {{plugin-name :name} :info} {^String classname :class, message :message, :as dep}] @@ -47,15 +57,15 @@ (defmethod dependency-satisfied? :plugin [initialized-plugin-names {{plugin-name :name} :info, :as info} {dep-plugin-name :plugin}] - (log/info (trs "Plugin ''{0}'' depends on plugin ''{1}''" plugin-name dep-plugin-name)) + (log-once plugin-name (trs "Plugin ''{0}'' depends on plugin ''{1}''" plugin-name dep-plugin-name)) ((set initialized-plugin-names) dep-plugin-name)) (defn- all-dependencies-satisfied?* [initialized-plugin-names {:keys [dependencies], {plugin-name :name} :info, :as info}] (let [dep-satisfied? (fn [dep] (u/prog1 (dependency-satisfied? initialized-plugin-names info dep) - (log/debug - (trs "{0} dependency {1} satisfied? {2}" plugin-name (dissoc dep :message) (boolean <>)))))] + (log-once plugin-name + (trs "{0} dependency {1} satisfied? {2}" plugin-name (dissoc dep :message) (boolean <>)))))] (every? dep-satisfied? dependencies))) (defn all-dependencies-satisfied? @@ -69,8 +79,8 @@ (do (swap! plugins-with-unsatisfied-deps conj info) - (log/debug (u/format-color 'yellow - (trs "Plugins with unsatisfied deps: {0}" (mapv (comp :name :info) @plugins-with-unsatisfied-deps)))) + (log-once (u/format-color 'yellow + (trs "Plugins with unsatisfied deps: {0}" (mapv (comp :name :info) @plugins-with-unsatisfied-deps)))) false)))