From 0348da597c8211705e5349d3c937d1935d0d33aa Mon Sep 17 00:00:00 2001 From: vemv Date: Tue, 15 Aug 2023 17:21:14 +0200 Subject: [PATCH 1/3] Add a Dockerfile for TRAMP development purposes --- dev/sample-project/Dockerfile | 61 ++++++++++++++++++++++++++++++++++ dev/sample-project/Makefile | 10 ++++++ dev/sample-project/README.md | 17 ++++++++++ dev/sample-project/project.clj | 5 +++ dev/sample-project/src/foo.clj | 3 ++ 5 files changed, 96 insertions(+) create mode 100644 dev/sample-project/Dockerfile create mode 100644 dev/sample-project/Makefile create mode 100644 dev/sample-project/README.md create mode 100644 dev/sample-project/project.clj create mode 100644 dev/sample-project/src/foo.clj diff --git a/dev/sample-project/Dockerfile b/dev/sample-project/Dockerfile new file mode 100644 index 000000000..01890c1c7 --- /dev/null +++ b/dev/sample-project/Dockerfile @@ -0,0 +1,61 @@ +# Use an official Clojure runtime as a parent image +FROM clojure:temurin-17-lein-bullseye + +# Set environment variables to non-interactive (this prevents some prompts) +ENV DEBIAN_FRONTEND=noninteractive + +# Define environment variable for nREPL port +ENV NREPL_PORT=7888 + +RUN apt-get update \ + && apt-get install -y openssh-server locales \ + && mkdir /var/run/sshd + +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +RUN locale-gen en_US.UTF-8 +RUN locale-gen en en_US en_US.UTF-8 +RUN dpkg-reconfigure locales + +# Set root password +RUN echo 'root:cider' | chpasswd + +RUN sed -i 's/^#* *PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config +RUN sed -i 's/^#* *PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config +RUN sed -i 's/^#* *ChallengeResponseAuthentication .*/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config + +# SSH login fix. Otherwise user is kicked off after login +RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd + +# Expose SSH port +EXPOSE 22 + +CMD ["/usr/sbin/sshd", "-D"] + +# Set the working directory in the docker image +WORKDIR /usr/src/app + +# Copy the current directory contents into the directory at /usr/src/app in the image +COPY . /usr/src/app + +# Install any needed packages specified in project.clj +RUN lein deps + +# Forward all relevant env vars for ssh sessions +RUN echo "export JAVA_HOME=${JAVA_HOME}" >> /root/.bashrc +RUN echo "export LEIN_HOME=${LEIN_HOME}" >> /root/.bashrc +RUN echo "export LEIN_JAVA_CMD=${LEIN_JAVA_CMD}" >> /root/.bashrc +RUN echo "export LEIN_JVM_OPTS=${LEIN_JVM_OPTS}" >> /root/.bashrc +RUN echo "export LEIN_ROOT=${LEIN_ROOT}" >> /root/.bashrc +RUN echo "export NREPL_PORT=${NREPL_PORT}" >> /root/.bashrc +RUN echo "export PATH=${PATH}" >> /root/.bashrc + +# Make port 7888 available to the world outside this container (nREPL default port) +#EXPOSE 7888 + +# Run lein repl when the container launches, on port defined by NREPL_PORT +#CMD ["lein", "repl", ":headless", ":host", "0.0.0.0", ":port", "7888"] diff --git a/dev/sample-project/Makefile b/dev/sample-project/Makefile new file mode 100644 index 000000000..d2487db65 --- /dev/null +++ b/dev/sample-project/Makefile @@ -0,0 +1,10 @@ +build: + DOCKER_BUILDKIT=0 docker build --no-cache -t cider-tramp-dev . + +run: build + docker run -p 7888:7888 -p 8022:22 cider-tramp-dev + +ssh: + ssh-keygen -R "[localhost]:8022" + echo "Password is: cider" + ssh root@localhost -p 8022 diff --git a/dev/sample-project/README.md b/dev/sample-project/README.md new file mode 100644 index 000000000..c731ed072 --- /dev/null +++ b/dev/sample-project/README.md @@ -0,0 +1,17 @@ +This project spins up a Clojure project within a Docker image. + +The Docker image exposes a SSH server. + +This way, for development purposes, we can SSH into it with TRAMP and exercise CIDER's TRAMP-related capabilities. + +To get started: + +* In one terminal tab, run `make run` to run the Docker image +* Once it's ready, from another tab, run `make ssh` + * The password is `cider` + * `cd /usr/src/app; lein repl :headless :host 0.0.0.0 :port 7888` + +Now, from emacs you can `cider-connect` to localhost. + +* `M-:`, `(dired "/sshx:root@localhost#8022:/usr/src/app")` +* `M-x cider-connect` (choose `localhost`, `7888`) diff --git a/dev/sample-project/project.clj b/dev/sample-project/project.clj new file mode 100644 index 000000000..a57ba3a93 --- /dev/null +++ b/dev/sample-project/project.clj @@ -0,0 +1,5 @@ +(defproject cider-tramp-dev "0" + :dependencies [[org.clojure/clojure "1.11.1"] + [clj-http "3.12.3"]] + :source-paths ["src"] + :plugins [[cider/cider-nrepl "0.35.0"]]) diff --git a/dev/sample-project/src/foo.clj b/dev/sample-project/src/foo.clj new file mode 100644 index 000000000..e5a730e66 --- /dev/null +++ b/dev/sample-project/src/foo.clj @@ -0,0 +1,3 @@ +(ns foo + (:require + [clj-http.client :as client])) From 9d2aa2ca5d145f4ff80f831895839e5697a1a82e Mon Sep 17 00:00:00 2001 From: vemv Date: Tue, 15 Aug 2023 17:22:16 +0200 Subject: [PATCH 2/3] Make TRAMP functionality work when using non-standard ports --- CHANGELOG.md | 1 + cider-common.el | 8 +++++--- test/cider-common-tests.el | 8 +++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 530f7ca03..efd32c4c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ - Recompute namespace info on each fighweel-main recompilation. - Fix the `xref-find-definitions` CIDER backend to return correct filenames. - Fix the `cider-xref-fn-deps` buttons to direct to the right file. +- Make TRAMP functionality work when using non-standard ports. ### Changes diff --git a/cider-common.el b/cider-common.el index 90a7382a5..4225a5434 100644 --- a/cider-common.el +++ b/cider-common.el @@ -226,8 +226,8 @@ create a valid path." (match-string 1 filename) filename))) -(defun cider-make-tramp-prefix (method user host) - "Constructs a Tramp file prefix from METHOD, USER, HOST. +(defun cider-make-tramp-prefix (method user host &optional port) + "Constructs a Tramp file prefix from METHOD, USER, HOST, PORT. It originated from Tramp's `tramp-make-tramp-file-name'. The original be forced to make full file name with `with-parsed-tramp-file-name', not providing prefix only option." @@ -240,6 +240,8 @@ prefix only option." (if (string-match tramp-ipv6-regexp host) (concat tramp-prefix-ipv6-format host tramp-postfix-ipv6-format) host)) + (when port + (concat "#" port)) tramp-postfix-host-format)) (defun cider-tramp-prefix (&optional buffer) @@ -253,7 +255,7 @@ if BUFFER is local." (when (tramp-tramp-file-p name) (with-parsed-tramp-file-name name v (with-no-warnings - (cider-make-tramp-prefix v-method v-user v-host)))))) + (cider-make-tramp-prefix v-method v-user v-host v-port)))))) (defun cider--client-tramp-filename (name &optional buffer) "Return the tramp filename for path NAME relative to BUFFER. diff --git a/test/cider-common-tests.el b/test/cider-common-tests.el index b918811b7..92df2bbe7 100644 --- a/test/cider-common-tests.el +++ b/test/cider-common-tests.el @@ -68,9 +68,15 @@ (describe "cider-make-tramp-prefix" (it "returns tramp-prefix only" - ;;; The third parameter is a host. It must contains a port number. + ;;; The third parameter is a host. (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9#22") :to-equal "/ssh:cider-devs@192.168.50.9#22:") + (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9") + :to-equal "/ssh:cider-devs@192.168.50.9#22:") + (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9" "12345") + :to-equal "/ssh:cider-devs@192.168.50.9#12345:") + (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9#12345") + :to-equal "/ssh:cider-devs@192.168.50.9#12345:") ;;; These two cases are for using ssh config alias. (expect (cider-make-tramp-prefix "ssh" nil "test.cider.com") :to-equal "/ssh:test.cider.com:") From 8f2221f43b0d4847b71dd446f8ff579489c5044a Mon Sep 17 00:00:00 2001 From: vemv Date: Tue, 15 Aug 2023 17:23:58 +0200 Subject: [PATCH 3/3] Don't lose the CIDER session over TRAMP files Fixes https://github.com/clojure-emacs/cider/issues/3250 --- CHANGELOG.md | 1 + cider-connection.el | 2 ++ test/cider-common-tests.el | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efd32c4c1..7196c4c27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - [#3402](https://github.com/clojure-emacs/cider/issues/3402): fix `cider-format-connection-params` edge case for Emacs 29. - [#3393](https://github.com/clojure-emacs/cider/issues/3393): Recompute namespace info on each shadow-cljs recompilation or evaluation. - Recompute namespace info on each fighweel-main recompilation. +- [#3250](https://github.com/clojure-emacs/cider/issues/3250): don't lose the CIDER session over TRAMP files. - Fix the `xref-find-definitions` CIDER backend to return correct filenames. - Fix the `cider-xref-fn-deps` buttons to direct to the right file. - Make TRAMP functionality work when using non-standard ports. diff --git a/cider-connection.el b/cider-connection.el index 765d915ce..9c0c09350 100644 --- a/cider-connection.el +++ b/cider-connection.el @@ -624,6 +624,8 @@ REPL defaults to the current REPL." (when (string-match-p "#uzip" file) (let ((avfs-path (directory-file-name (expand-file-name (or (getenv "AVFSBASE") "~/.avfs/"))))) (setq file (replace-regexp-in-string avfs-path "" file t t)))) + (when-let ((tp (cider-tramp-prefix (current-buffer)))) + (setq file (string-remove-prefix tp file))) (when (process-live-p proc) (let* ((classpath (or (process-get proc :cached-classpath) (let ((cp (with-current-buffer repl diff --git a/test/cider-common-tests.el b/test/cider-common-tests.el index 92df2bbe7..de2d25e1b 100644 --- a/test/cider-common-tests.el +++ b/test/cider-common-tests.el @@ -72,7 +72,7 @@ (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9#22") :to-equal "/ssh:cider-devs@192.168.50.9#22:") (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9") - :to-equal "/ssh:cider-devs@192.168.50.9#22:") + :to-equal "/ssh:cider-devs@192.168.50.9:") (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9" "12345") :to-equal "/ssh:cider-devs@192.168.50.9#12345:") (expect (cider-make-tramp-prefix "ssh" "cider-devs" "192.168.50.9#12345")