- #402: Add
^:concatmetadata support for config merging. - #415: Gracefully handle missing middleware via the
^:optionalmetadata.
- #408: Refactor
stdinmiddleware. - #409: Refactor handler construction and middleware application.
- #412: Deprecated: automatic inclusion of middleware references by
:requires/:expectsinto the resulting handler. This behavior still works but will produce an error in the future. It is thus recommended to include all necessary middleware into the list passed tonrepl.server/default-handler. - #416: Load nrepl.ack conditionally.
- #410: Middleware: deduplicate middleware when constructing a handler.
- #421: Fix EDN transport with Unix domain sockets.
- #422: Fix
load-filesending nil message for empty/comment-only files. - Fix
err-exitthrowing a string instead of an Exception.
- #403: Fix off by 1 error in CallbackBufferedOutputStream.
- #398: Fix crashes when printing strings with multicodepoint characters.
- #393: Add
forward-system-outputop for forwarding System/out and System/err output to the client. - #383: Introduce
safe-handlehelper to simplify dealing with errors in middleware responses. - #386: Add support for
XDG_CONFIG_HOME.
- #391: (Breaking) Remove
nrepl.helpers/load-file-command. - #391: Make
load-filework completely throughinterruptible-evalmiddleware. - #385: Preserve filename in functions compiled during regular eval.
- #395: Raise minimal junixsocket version to 2.4.0 (only on pre-JDK17 if you need binding nREPL to UNIX sockets).
- #215: Don't send
:donetwice if namespace can't be resolved duringeval. - #387: Correctly resolve namespaced keywords in tty transport.
- #370: Accept
:client-nameand:client-versionincloneop. - #374: Add support for dynamic var defaults.
- #378: (Breaking) Raise minimal supported Clojure version to 1.8.
- #375: Refactor and simplify
load-filemiddleware.
- #377: Resolve dynamic variables in middleware from a user session instead of server context.
- #335: Remove support for sideloading and
wrap-sideloadermiddleware. - #339: Introduce custom REPL implementation instead of
clojure.main/repl. - #341: Make
sessionmiddleware handle all dynamic bindings. - #342: Make the stack of the
evalhandler shorter. (this makes stacktraces easier to understand) - #345: Use customized executors for all asynchronous tasks.
- #347: Refactor
printmiddleware to have tidier stack and use Java classes instead of proxies.
- #271: Fix not being able to define dynamic variables from terminal REPL.
- #348: Fail with helpful error if incorrect bencode is written through the transport.
- #356: The built-in client now prints all output.
- #318: Introduce custom JVMTI agent to restore
Thread.stop()(needed by theinterruptop) on JDK20+.- #326: Add explicit opt-out for
libnreplagent.
- #326: Add explicit opt-out for
- #323: Rewrite
nrepl.bencodeimplementation to be more performant and use Clojure 1.7 features.
- #327: Prevent classloader chain from growing after each eval.
- #299: Fix
ClassCastExceptionon re-connect to Unix socket.
- #307: Fix issue where TLS accept loop could sometimes exit prematurely. This caused tests to hang sometimes.
- #311: Make
--interactiveoption work when starting a server on a filesystem socket with--socket PATH.
- #304: Improve
completionsop by switching internally tocompliment-lite. The change is mostly transparent, but should result in more accurate completion results.
- #266: Add TLS support.
- #291: Fix issue with completion middleware not returning values for local class files, or
.jarfiles on Windows.
- #217: Add nREPL client support for unix domain sockets.
- #279: Allow reader conditionals for tty transport.
- #281: Make unix domain socket integration compatible with junixsocket versions >= 2.5.0.
- #217: Add keyword completion support.
- #226: Add doc and arglists to completion responses.
- #238: Expand completion and lookup error message when ns not found.
- #204: Add server support
for UNIX domain (filesystem) sockets via
-s/--socket PATHon the command line or(start-server ... :socket PATH)whenever the JDK is version 16 or newer or junixsocket is available as a dependency. - #243: Keep the sideloader state in the session so it persists across middleware changes. Sanitize the input in
base64-decode.
- #227: Fix completion for static class members.
- #231: Fix sanitize error when file is
java.net.URL. - #208: Fix namespace resolution in the cmdline REPL.
- #248: Create fewer new classloaders.
- #258: Make compatible with graalvm native image.
- #213: Fix sideloader race condition.
- #211: Fix a couple of lookup op errors.
- #206: Fix classloader-related breakage with
cider-nrepland Java 8.
- Bundle a couple of print functions compatible with the print middleware (see
nrepl.util.print). - #174: Provide a built-in
completionsop. - #143: Added a middleware that allows dynamic loading/unloading of middleware while the server is running.
- #180: Provide a built-in
lookupop.
- #125: The built-in client supports
greeting-fn. - #126: The built-in client exits with an error message when the tty transport is selected. It used to fail silently. This was never supported.
- #113: Fix an issue with hotloading using Pomegranate in Leiningen.
- #17: It was possible for the bencode transport to write partial messages if a middleware tries to write something unencodable. This could cause the client or server to hang.
- #60: Implemented EDN transport.
- #140: Added initial version of spec for message responses. These are used during Clojure 1.10 tests.
- #97: Added a sideloader, a network classloader that allows dependencies to be added even when the source/class files are not available on the server JVM's classpath (e.g. supplied by the client).
- #152: Kill session threads when closing sessions.
- #132: Avoid malformed bencode messages during interrupts, mainly affecting streamed printing.
- #137: Expanded Bencode writer to work with maps that have keywords or symbols as keys. This allowed a simplification of the Bencode transport itself.
- #158: Interrupt now runs in three stages: calls
interrupton the thread, waits 100ms for the thread to respond and return messages, then waits 5000ms for the thread to terminate itself. A hard.stopis only called if it fails to do so. - #178: Allow
:read-condoption when evaluating code. - #167: Allow suppressing ack message when using
nrepl.cmdline.
- #117: Replace
nrepl.middleware.pr-valueswithnrepl.middleware.print.- New dynamic vars in
nrepl.middleware.printfor configuring the print middleware at the REPL. - The new middleware provides behaviour that is backwards-compatible with the
old one. Existing middleware descriptors whose
:requiresset contains#'pr-valuesshould instead use#'wrap-print.
- New dynamic vars in
- #128: New middleware,
nrepl.middleware.caught, provides a hook called when eval, read, or print throws an exception or error. Defaults toclojure.main/repl-caught. Configurable by the dynamic varnrepl.middleware.caught/*caught-fn*.
- [CLI] Make sure ack port parameter is converted to integer for command line nREPL initialization.
- [CLI] When starting the REPL, make sure the transport option is used correctly.
- [CLI] Make sure calling
send-ackatcmdlinens works with the correct transport. - #8: Clean up context classloader after eval.
- #16: Use a single session thread per evaluation.
- #107: Stop reading and evaluating code on first read error.
- #108: Refactor cmdline functions into a public, reusable API.
- Restore the
nrepl.bencodenamespace.
- Make sure we never send a nil transport to via
send-ack.
- [CLI] #90: Doesn't display properly URLs if using a 3rd-party transport.
- #89: Remove
tools.loggingdependency.
- #12: Support custom printing
function in
pr-values, enabling pretty-printed REPL results. - #66: Add support for a global and local configuration file.
- [CLI] #63: Make it possible to specify the transport via the command-line client (
--transport/-t).
- #10: Bind
*1,*2,*3and*ein cloned session. - #33: Add ability to change value of
*print-namespace-maps*. - #68: Avoid illegal access warning on JDK 9+ caused by
nrepl.middleware.interruptible-eval/set-line!. - [CLI] #77: Exit cleanly after pressing
ctrl-din an interactive REPL. - #13: Catch
ThreadDeathexception thrown by interrupt.
- #56: Bind the server by default to
127.0.0.1instead of to::(this turned out to be a security risk). - #76: Move version-related logic to a dedicated namespace (
nrepl.version). - Deprecate
nrepl.core/version. - Deprecate
nrepl.core/version-string. - [CLI] #81: Handle interrupt in interactive session.
- [CLI] The built-in the CLI generates an
.nrepl-portfile on server startup. - [CLI] #39: Add a
--connectcommand-line option allowing you to connect. with the built-in client to an already running nREPL server. - [CLI] Add shorthand names for most command-line options.
- [CLI] Add a
-v/--versioncommand-line option.
- #32: Extract the bencode logic in a separate library.
- #38: Remove extra newline in REPL output.
- [CLI] Added
--helpcommand-line option. - [CLI] Added
--bindcommand-line option. - [CLI] Added
--handlerand--middlewarecommand-line options. Extremely useful when starting nREPL usingcljandtools.deps, as this allows you to inject middleware trivially without the need for something likeleinorboot.
- [CLI] Add missing newline after colorized values displayed in the REPL.
- [CLI] Display connection info when starting the built-in cmd client. This makes it possible
for clients like CIDER to parse it and auto-connect to the server. Pretty handy if you're
using
cljto start your server.
- #16: Don't change the thread used for form evaluation over time. See #36 for a discussion of the fix. (partial fix)
- The result of
nrepl.server/start-serverno longer contains the legacy key:ssfrom the days of nREPL 0.0.x. If someone was using it they should switch to:server-socketinstead. - #28: Echo back missing ns during eval (previously you'd only get an error that a ns is missing, but no mention of the name of that namespace).
- #35: Add constant DCL across evaluations (which means you can now easily hot-load dependencies).
- #34: Treat
nilport as 0 (which assigns a random port).
- #11: Don't read the version string
from a resource file (
version.txt).
- #4: (Breaking) Change the project's
namespaces.
clojure.tools.nreplis nownrepl.core, the rest of the namespaces were renamed following the patternclojure.tools.nrepl.*->nrepl.*.
- #15 Fix for
clojure.tools.nrepl.middleware.sessionfor:unknown-sessionerror andclojure.tools.nrepl.middleware.interruptible-evalfor:no-codeerror, the correct response of:status :doneis now being returned. - #26: Recompile the Java classes for Java 8.
- #1: Materially identical
to
[org.clojure/tools.nrepl "0.2.13"], but released undernrepl/nreplcoordinates as part of the migration out of clojure-contrib https://github.com/nrepl/nrepl clojure.tools/loggingis now a normal dependency (it used to be an optional dependency).
- #20: If
start-serveris not provided with a:bindhostname, nREPL will default to binding to the ipv6::(as before), but will now always fall back tolocalhost. Previously, the ipv4 hostname was only used if::could not be resolved; this change ensures that thelocalhostfallback is used in networking environments where::is resolved successfully, but cannot be bound.
0.2.13:
start-servernow binds to::by default, and falls back tolocalhost, avoiding confusion when working in environments that have both IPv4 and IPv6 networking available. (NREPL-83)
0.2.11:
clojure.tools.nrepl.middleware.interruptible-evalnow accepts optionalfile,line, andcolumnvalues in order to fix location metadata to defined vars and functions, for more useful stack traces, navigation, etc.- REPL evaluations now support use of reader conditionals (loading
.cljcfiles containing reader conditionals has always worked transparently)
0.2.10:
clojure.tools.nrepl.middleware.pr-valueswill not print the contents of:valueresponse messages if the message contains a:printed-valueslot.default-executorandqueue-evalinclojure.tools.nrepl.middleware.interruptible-evalare now public.
0.2.9:
clojure.tools.nrepl.middleware.interruptible-evalnow defines a default thread executor used for all evaluations (unless a different executor is provided to the configuration ofclojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval). This should aid in the development ofinterrupt-capable alternative evaluation middlewares/handlers.
0.2.8:
- The default bind address used by
clojure.tools.nrepl.server/start-serveris nowlocalhost, not0.0.0.0. As always, the bind address can be set explicitly via a:bindkeyword argument to that function. This is considered a security bugfix, though technically it may cause breakage if anyone was implicitly relying upon nREPL's socket server to listen on all network interfaces. - The
ServerSocketcreated as part ofclojure.tools.nrepl.server/start-serveris now configured withSO_REUSEADDRenabled; this should prevent spurious "address already in use" when quickly bouncing apps that open an nREPL server on a fixed port, etc. (NREPL-67) - Middlewares may now contribute to the response of the
"describe"operation via an optional:describe-fnfunction provided via their descriptors. (NREPL-64) - The
:nscomponent of the response to"load-file"operations is now elided, as it was (usually) incorrect (as a result of reusinginterruptible-evalfor handlingload-fileoperations) (NREPL-68)
0.2.7:
- The topological sort ("linearization") applied to middleware provided to start a new nREPL server has been reworked to address certain edge case bugs (NREPL-53)
interruptible-evalno longer incorrectly clobbers a session's*ns*binding when it processes anevalmessage containing anns"argument"- Eliminated miscellaneous reflection warnings
0.2.5:
- Clients can now signal EOF on
*in*with an empty:stdinvalue (NREPL-65) - Clojure
:version-stringis now included in response to adescribeoperation (NREPL-63) - Improve representation of
java.versioninformation in response to adescribeoperation (NREPL-62)
0.2.4:
- Fixed the source of a reliable per-connection thread leak (NREPL-40)
- Fix printing of lazy sequences so that
*out*bindings are properly preserved (NREPL-45) - Enhance
clojure.tools.nrepl.middleware.interruptible-eval/evaluateso that a customevalfunction can be provided on a per-message basis (NREPL-50) - Fix pretty-printing of reference returned by
clojure.tools.nrepl.server/start-server(NREPL-51) - nREPL now works with JDK 1.8 (NREPL-56)
- The value of the
java.versionsystem property is now included in the response to adescribeoperation (NREPL-57) - Common session bindings (e.g.
*e,*1, etc) are now set in time for nREPL middleware to access them in the case of an exception being thrown (NREPL-58)
0.2.3:
- Now using a queue to maintain
*in*, to avoid intermittent failures due to prior use ofPipedReader/Writer. (NREPL-39) - When loading a file, always bind
*print-level*and*print-length*when generating theclojure.lang.Compiler/loadexpression (NREPL-41)
0.2.2:
- Added
clojure.tools.nrepl/code*forpr-str'ing expressions (presumably for later evaluation) - session IDs are now properly combined into a set by
clojure.tools.nrepl/combine-responses - fixes printing of server instances under Clojure 1.3.0+ (nREPL-37)
0.2.1:
- fixes incorrect translation between
Writer.write()andStringBuilder.append()APIs (NREPL-38)
0.2.0:
Top-to-bottom redesign
0.0.6:
Never released; initial prototype of "rich content" support that (in part) helped motivate a re-examination of the underlying protocol and design.
0.0.5:
- added Clojure 1.3.0 (ALPHA) compatibility
0.0.4:
- fixed (hacked) obtaining
clojure.testoutput whenclojure.testis initially loaded within an nREPL session - eliminated 1-minute default timeout on expression evaluation
- all standard REPL var bindings are now properly established and maintained within a session