From 0939bb8805c699f4f1e2f80126931a1a92a95b19 Mon Sep 17 00:00:00 2001
From: Thomas Heller
Date: Thu, 29 Mar 2018 12:37:11 +0200
Subject: [PATCH] protect against *print-length* messing with data files
---
src/main/shadow/build/babel.clj | 3 ++-
src/main/shadow/build/closure.clj | 5 +++--
src/main/shadow/build/targets/browser.clj | 5 +++--
src/main/shadow/cljs/devtools/api.clj | 5 +++--
src/main/shadow/cljs/devtools/server/web/api.clj | 5 +++--
src/main/shadow/cljs/devtools/server/web/common.clj | 5 +++--
src/main/shadow/cljs/devtools/server/worker/ws.clj | 7 ++++---
src/main/shadow/core_ext.clj | 11 +++++++++++
src/main/shadow/undertow.clj | 5 +++--
9 files changed, 35 insertions(+), 16 deletions(-)
create mode 100644 src/main/shadow/core_ext.clj
diff --git a/src/main/shadow/build/babel.clj b/src/main/shadow/build/babel.clj
index 9e95daa4..81a5f949 100644
--- a/src/main/shadow/build/babel.clj
+++ b/src/main/shadow/build/babel.clj
@@ -3,6 +3,7 @@
[clojure.core.async :as async :refer (!!)]
[shadow.build.log :as cljs-log]
[shadow.cljs.util :as util]
+ [shadow.core-ext :as core-ext]
[clojure.tools.logging :as log])
(:import (java.io PushbackReader Writer InputStreamReader BufferedReader IOException)))
@@ -54,7 +55,7 @@
(let [line
(-> req
(dissoc ::reply-to)
- (pr-str)
+ (core-ext/safe-pr-str)
(str "\n"))]
(doto out
(.write line)
diff --git a/src/main/shadow/build/closure.clj b/src/main/shadow/build/closure.clj
index 5f493648..512008eb 100644
--- a/src/main/shadow/build/closure.clj
+++ b/src/main/shadow/build/closure.clj
@@ -15,7 +15,8 @@
[clojure.data.json :as json]
[shadow.build.cache :as cache]
[cljs.compiler :as cljs-comp]
- [clojure.tools.logging :as log])
+ [clojure.tools.logging :as log]
+ [shadow.core-ext :as core-ext])
(:import (java.io StringWriter ByteArrayInputStream FileOutputStream File)
(com.google.javascript.jscomp JSError SourceFile CompilerOptions CustomPassExecutionTime
CommandLineRunner VariableMap SourceMapInput DiagnosticGroups
@@ -689,7 +690,7 @@
(map :name)
(map (fn [def]
(let [export-name
- (-> def name str comp/munge pr-str)]
+ (-> def name str comp/munge core-ext/safe-pr-str)]
(str export-name ":" (comp/munge def)))))
(str/join ",")
(as-module-exports))
diff --git a/src/main/shadow/build/targets/browser.clj b/src/main/shadow/build/targets/browser.clj
index 218db654..589574fc 100644
--- a/src/main/shadow/build/targets/browser.clj
+++ b/src/main/shadow/build/targets/browser.clj
@@ -17,7 +17,8 @@
[shadow.build.output :as output]
[shadow.build.closure :as closure]
[shadow.build.data :as data]
- [shadow.build.log :as log]))
+ [shadow.build.log :as log]
+ [shadow.core-ext :as core-ext]))
(s/def ::entry
(s/or :sym shared/unquoted-simple-symbol?
@@ -342,7 +343,7 @@
(io/make-parents json-file)
(spit json-file (json module-data))
- (spit edn-file (pr-str module-data))
+ (spit edn-file (core-ext/safe-pr-str module-data))
state
))
diff --git a/src/main/shadow/cljs/devtools/api.clj b/src/main/shadow/cljs/devtools/api.clj
index d1e5159c..1af3f9c5 100644
--- a/src/main/shadow/cljs/devtools/api.clj
+++ b/src/main/shadow/cljs/devtools/api.clj
@@ -23,7 +23,8 @@
[shadow.cljs.devtools.server.repl-impl :as repl-impl]
[shadow.cljs.devtools.server.runtime :as runtime]
[shadow.build.output :as output]
- [shadow.build.log :as build-log]))
+ [shadow.build.log :as build-log]
+ [shadow.core-ext :as core-ext]))
;; nREPL support
@@ -454,7 +455,7 @@
(spit
(io/file output-dir "bundle-info.edn")
- (pr-str bundle-info)))
+ (core-ext/safe-pr-str bundle-info)))
:done
))
diff --git a/src/main/shadow/cljs/devtools/server/web/api.clj b/src/main/shadow/cljs/devtools/server/web/api.clj
index a524227b..5d96912a 100644
--- a/src/main/shadow/cljs/devtools/server/web/api.clj
+++ b/src/main/shadow/cljs/devtools/server/web/api.clj
@@ -11,7 +11,8 @@
[shadow.cljs.devtools.api :as api]
[shadow.cljs.util :as util]
[hiccup.page :refer (html5)]
- [clojure.java.io :as io]))
+ [clojure.java.io :as io]
+ [shadow.core-ext :as core-ext]))
(defn index-page [req]
{:status 200
@@ -82,7 +83,7 @@
{:status 200
:headers {"content-type" "application/edn; charset=utf-8"}
- :body (pr-str result)}))
+ :body (core-ext/safe-pr-str result)}))
(defn get-bundle-info [{:keys [config] :as req} build-id]
(try
diff --git a/src/main/shadow/cljs/devtools/server/web/common.clj b/src/main/shadow/cljs/devtools/server/web/common.clj
index a124bc09..f608d62b 100644
--- a/src/main/shadow/cljs/devtools/server/web/common.clj
+++ b/src/main/shadow/cljs/devtools/server/web/common.clj
@@ -2,7 +2,8 @@
(:require [shadow.server.assets :as assets]
[hiccup.page :refer (html5)]
[hiccup.core :refer (html)]
- [clojure.java.io :as io]))
+ [clojure.java.io :as io]
+ [shadow.core-ext :as core-ext]))
(defn not-found
([req]
@@ -20,7 +21,7 @@
(defn edn [req data]
{:status 200
:header {"content-type" "application/edn"}
- :body (pr-str data)})
+ :body (core-ext/safe-pr-str data)})
(defn page-boilerplate
[req ^String content]
diff --git a/src/main/shadow/cljs/devtools/server/worker/ws.clj b/src/main/shadow/cljs/devtools/server/worker/ws.clj
index c58ba5cc..084e074c 100644
--- a/src/main/shadow/cljs/devtools/server/worker/ws.clj
+++ b/src/main/shadow/cljs/devtools/server/worker/ws.clj
@@ -11,7 +11,8 @@
[shadow.http.router :as http]
[shadow.build.data :as data]
[shadow.build.resource :as rc]
- [clojure.tools.logging :as log])
+ [clojure.tools.logging :as log]
+ [shadow.core-ext :as core-ext])
(:import (java.util UUID)))
(defn ws-loop!
@@ -162,7 +163,7 @@
result (worker/repl-compile worker-proc input)]
{:status 200
:headers headers
- :body (pr-str result)})
+ :body (core-ext/safe-pr-str result)})
;; bad requests
{:status 400
@@ -242,7 +243,7 @@
(str prepend js append sm-text)))
})))
(into [])
- (pr-str))})
+ (core-ext/safe-pr-str))})
;; bad requests
{:status 400
diff --git a/src/main/shadow/core_ext.clj b/src/main/shadow/core_ext.clj
new file mode 100644
index 00000000..1fd83dd3
--- /dev/null
+++ b/src/main/shadow/core_ext.clj
@@ -0,0 +1,11 @@
+(ns shadow.core-ext)
+
+(defn safe-pr-str
+ "cider globally sets *print-length* for the nrepl-session which messes with pr-str when used to print cache or other files"
+ [x]
+ (binding [*print-length* nil
+ *print-level* nil
+ *print-namespaced-maps* nil
+ *print-meta* nil]
+ (pr-str x)
+ ))
diff --git a/src/main/shadow/undertow.clj b/src/main/shadow/undertow.clj
index fa373b1f..9e84c2c3 100644
--- a/src/main/shadow/undertow.clj
+++ b/src/main/shadow/undertow.clj
@@ -5,7 +5,8 @@
[clojure.core.async.impl.protocols :as async-prot]
[clojure.tools.logging :as log]
[shadow.undertow.impl :as impl]
- [clojure.edn :as edn])
+ [clojure.edn :as edn]
+ [shadow.core-ext :as core-ext])
(:import (io.undertow Undertow Handlers UndertowOptions)
(io.undertow.websockets WebSocketConnectionCallback)
(io.undertow.server.handlers ResponseCodeHandler BlockingHandler)
@@ -91,7 +92,7 @@
(async/close! ws-in)
;; try to send message, close everything if that fails
(do (try
- (WebSockets/sendTextBlocking (pr-str msg) channel)
+ (WebSockets/sendTextBlocking (core-ext/safe-pr-str msg) channel)
;; just ignore sending to a closed channel
(catch ClosedChannelException e
(async/close! ws-in)