From 196e0956fb273acbbe4d110297b2ec053ba29d09 Mon Sep 17 00:00:00 2001
From: "Steven G. Johnson" <stevenj@alum.mit.edu>
Date: Mon, 14 Oct 2024 10:16:18 -0400
Subject: [PATCH] fix pkg mode in 1.11

---
 src/execute_request.jl | 11 +++++++++--
 src/init.jl            | 25 +++++++++++++++----------
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/execute_request.jl b/src/execute_request.jl
index d6a00476..e5471227 100644
--- a/src/execute_request.jl
+++ b/src/execute_request.jl
@@ -3,7 +3,15 @@
 # returning results.
 
 import Base.Libc: flush_cstdio
+
 import Pkg
+if VERSION < v"1.11"
+    do_pkg_cmd(cmd::AbstractString) =
+        Pkg.REPLMode.do_cmd(minirepl[], cmd; do_rethrow=true)
+else # Pkg.jl#3777
+    do_pkg_cmd(cmd::AbstractString) =
+        Pkg.REPLMode.do_cmds(cmd, stdout)
+end
 
 # global variable so that display can be done in the correct Msg context
 execute_msg = Msg(["julia"], Dict("username"=>"jlkernel", "session"=>uuid4()), Dict())
@@ -47,8 +55,7 @@ function execute_request(socket, msg)
 
     # "] ..." cells are interpreted as pkg shell commands
     if occursin(r"^\].*$", code)
-        code = "IJulia.Pkg.REPLMode.do_cmd(IJulia.minirepl[], \"" *
-            escape_string(code[2:end]) * "\"; do_rethrow=true)"
+        code = "IJulia.do_pkg_cmd(\"" * escape_string(code[2:end]) * "\")"
     end
 
     # a cell beginning with "? ..." is interpreted as a help request
diff --git a/src/init.jl b/src/init.jl
index f34efcd6..231a33d7 100644
--- a/src/init.jl
+++ b/src/init.jl
@@ -30,16 +30,19 @@ const read_stdout = Ref{Base.PipeEndpoint}()
 const read_stderr = Ref{Base.PipeEndpoint}()
 const socket_locks = Dict{Socket,ReentrantLock}()
 
-# similar to Pkg.REPLMode.MiniREPL, a minimal REPL-like emulator
-# for use with Pkg.do_cmd.  We have to roll our own to
-# make sure it uses the redirected stdout, and because
-# we don't have terminal support.
-import REPL
-struct MiniREPL <: REPL.AbstractREPL
-    display::TextDisplay
+# needed for executing pkg commands on earlier Julia versions
+@static if VERSION < v"1.11"
+    # similar to Pkg.REPLMode.MiniREPL, a minimal REPL-like emulator
+    # for use with Pkg.do_cmd.  We have to roll our own to
+    # make sure it uses the redirected stdout, and because
+    # we don't have terminal support.
+    import REPL
+    struct MiniREPL <: REPL.AbstractREPL
+        display::TextDisplay
+    end
+    REPL.REPLDisplay(repl::MiniREPL) = repl.display
+    const minirepl = Ref{MiniREPL}()
 end
-REPL.REPLDisplay(repl::MiniREPL) = repl.display
-const minirepl = Ref{MiniREPL}()
 
 function init(args)
     inited && error("IJulia is already running")
@@ -108,7 +111,9 @@ function init(args)
         redirect_stderr(IJuliaStdio(stderr,"stderr"))
     end
     redirect_stdin(IJuliaStdio(stdin,"stdin"))
-    minirepl[] = MiniREPL(TextDisplay(stdout))
+    @static if VERSION < v"1.11"
+        minirepl[] = MiniREPL(TextDisplay(stdout))
+    end
 
     logger = ConsoleLogger(Base.stderr)
     Base.CoreLogging.global_logger(logger)