branch: elpa/magit
commit 56197d8a40615f523a77dd260005f0a009a344c6
Author: Jonas Bernoulli <[email protected]>
Commit: Jonas Bernoulli <[email protected]>
magit-dired.el: New library
---
default.mk | 1 +
lisp/Makefile | 1 +
lisp/magit-diff.el | 2 +-
lisp/magit-dired.el | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++
lisp/magit-extras.el | 58 -------------------------------
lisp/magit.el | 1 +
6 files changed, 102 insertions(+), 59 deletions(-)
diff --git a/default.mk b/default.mk
index fa21db8611d..f23c2fbaf76 100644
--- a/default.mk
+++ b/default.mk
@@ -101,6 +101,7 @@ ELS += magit-ediff.el
ELS += magit-gitignore.el
ELS += magit-bundle.el
ELS += magit-extras.el
+ELS += magit-dired.el
ELS += git-rebase.el
ELS += magit-bookmark.el
ELCS = $(ELS:.el=.elc)
diff --git a/lisp/Makefile b/lisp/Makefile
index dcd3b193c94..313b89834c6 100644
--- a/lisp/Makefile
+++ b/lisp/Makefile
@@ -56,6 +56,7 @@ magit-gitignore.elc: magit.elc
magit-sparse-checkout.elc: magit.elc
magit-bundle.elc: magit.elc
magit-extras.elc: magit.elc magit-merge.elc
+magit-dired.elc: magit.elc
git-rebase.elc: magit.elc
magit-bookmark.elc: magit.elc
diff --git a/lisp/magit-diff.el b/lisp/magit-diff.el
index a5444d23c51..3f4f6055cb3 100644
--- a/lisp/magit-diff.el
+++ b/lisp/magit-diff.el
@@ -73,7 +73,7 @@
(declare-function magit-commit-add-log "magit-commit" ())
(declare-function magit-diff-trace-definition "magit-log" ())
(declare-function magit-patch-save "magit-patch" (files &optional arg))
-(declare-function magit-do-async-shell-command "magit-extras" (file))
+(declare-function magit-do-async-shell-command "magit-dired" (file))
(declare-function magit-add-change-log-entry "magit-extras"
(&optional whoami file-name other-window))
(declare-function magit-add-change-log-entry-other-window "magit-extras"
diff --git a/lisp/magit-dired.el b/lisp/magit-dired.el
new file mode 100644
index 00000000000..084ccd58a0e
--- /dev/null
+++ b/lisp/magit-dired.el
@@ -0,0 +1,98 @@
+;;; magit-dired.el --- Dired support for Magit -*- lexical-binding:t -*-
+
+;; Copyright (C) 2008-2025 The Magit Project Contributors
+
+;; Author: Jonas Bernoulli <[email protected]>
+;; Maintainer: Jonas Bernoulli <[email protected]>
+
+;; SPDX-License-Identifier: GPL-3.0-or-later
+
+;; Magit is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Magit is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+;; License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Magit. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Dired support for Magit.
+
+;;; Code:
+
+(require 'magit)
+
+;; For `magit-do-async-shell-command'.
+(declare-function dired-read-shell-command "dired-aux" (prompt arg files))
+
+;;; Open Dired from Magit
+
+;;;###autoload
+(defun magit-dired-jump (&optional other-window)
+ "Visit file at point using Dired.
+With a prefix argument, visit in another window. If there
+is no file at point, then instead visit `default-directory'."
+ (interactive "P")
+ (dired-jump other-window
+ (and-let* ((file (magit-file-at-point)))
+ (expand-file-name (if (file-directory-p file)
+ (file-name-as-directory file)
+ file)))))
+
+;;; Commands for Dired Buffers
+
+;;;###autoload
+(defun magit-dired-log (&optional follow)
+ "Show log for all marked files, or the current file."
+ (interactive "P")
+ (if-let ((topdir (magit-toplevel default-directory)))
+ (let ((args (car (magit-log-arguments)))
+ (files (dired-get-marked-files nil nil #'magit-file-tracked-p)))
+ (unless files
+ (user-error "No marked file is being tracked by Git"))
+ (when (and follow
+ (not (member "--follow" args))
+ (not (cdr files)))
+ (push "--follow" args))
+ (magit-log-setup-buffer
+ (list (or (magit-get-current-branch) "HEAD"))
+ args
+ (let ((default-directory topdir))
+ (mapcar #'file-relative-name files))
+ magit-log-buffer-file-locked))
+ (magit--not-inside-repository-error)))
+
+;;;###autoload
+(defun magit-dired-am-apply-patches (repo &optional arg)
+ "In Dired, apply the marked (or next ARG) files as patches.
+If inside a repository, then apply in that. Otherwise prompt
+for a repository."
+ (interactive (list (or (magit-toplevel)
+ (magit-read-repository t))
+ current-prefix-arg))
+ (let ((files (dired-get-marked-files nil arg nil nil t)))
+ (magit-status-setup-buffer repo)
+ (magit-am-apply-patches files)))
+
+;;; Miscellaneous Commands
+
+;;;###autoload
+(defun magit-do-async-shell-command (file)
+ "Open FILE with `dired-do-async-shell-command'.
+Interactively, open the file at point."
+ (interactive (list (or (magit-file-at-point)
+ (magit-read-file "Act on file"))))
+ (require 'dired-aux)
+ (dired-do-async-shell-command
+ (dired-read-shell-command "& on %s: " current-prefix-arg (list file))
+ nil (list file)))
+
+;;; _
+(provide 'magit-dired)
+;;; magit-dired.el ends here
diff --git a/lisp/magit-extras.el b/lisp/magit-extras.el
index 63264584dc3..7e346a689a1 100644
--- a/lisp/magit-extras.el
+++ b/lisp/magit-extras.el
@@ -28,8 +28,6 @@
(require 'magit)
-;; For `magit-do-async-shell-command'.
-(declare-function dired-read-shell-command "dired-aux" (prompt arg files))
;; For `magit-project-status'.
(declare-function vc-git-command "vc-git"
(buffer okstatus file-or-list &rest flags))
@@ -217,62 +215,6 @@ to nil before loading Magit to prevent \"m\" from being
bound.")
(keymap-set project-prefix-map "m" #'magit-project-status)
(add-to-list 'project-switch-commands '(magit-project-status "Magit") t)))
-;;;###autoload
-(defun magit-dired-jump (&optional other-window)
- "Visit file at point using Dired.
-With a prefix argument, visit in another window. If there
-is no file at point, then instead visit `default-directory'."
- (interactive "P")
- (dired-jump other-window
- (and-let* ((file (magit-file-at-point)))
- (expand-file-name (if (file-directory-p file)
- (file-name-as-directory file)
- file)))))
-
-;;;###autoload
-(defun magit-dired-log (&optional follow)
- "Show log for all marked files, or the current file."
- (interactive "P")
- (if-let ((topdir (magit-toplevel default-directory)))
- (let ((args (car (magit-log-arguments)))
- (files (dired-get-marked-files nil nil #'magit-file-tracked-p)))
- (unless files
- (user-error "No marked file is being tracked by Git"))
- (when (and follow
- (not (member "--follow" args))
- (not (cdr files)))
- (push "--follow" args))
- (magit-log-setup-buffer
- (list (or (magit-get-current-branch) "HEAD"))
- args
- (let ((default-directory topdir))
- (mapcar #'file-relative-name files))
- magit-log-buffer-file-locked))
- (magit--not-inside-repository-error)))
-
-;;;###autoload
-(defun magit-dired-am-apply-patches (repo &optional arg)
- "In Dired, apply the marked (or next ARG) files as patches.
-If inside a repository, then apply in that. Otherwise prompt
-for a repository."
- (interactive (list (or (magit-toplevel)
- (magit-read-repository t))
- current-prefix-arg))
- (let ((files (dired-get-marked-files nil arg nil nil t)))
- (magit-status-setup-buffer repo)
- (magit-am-apply-patches files)))
-
-;;;###autoload
-(defun magit-do-async-shell-command (file)
- "Open FILE with `dired-do-async-shell-command'.
-Interactively, open the file at point."
- (interactive (list (or (magit-file-at-point)
- (magit-read-file "Act on file"))))
- (require 'dired-aux)
- (dired-do-async-shell-command
- (dired-read-shell-command "& on %s: " current-prefix-arg (list file))
- nil (list file)))
-
;;; Shift Selection
(defun magit--turn-on-shift-select-mode-p ()
diff --git a/lisp/magit.el b/lisp/magit.el
index b240b9436ac..d26faf60abb 100644
--- a/lisp/magit.el
+++ b/lisp/magit.el
@@ -782,6 +782,7 @@ For X11 something like ~/.xinitrc should work.\n"
(require 'magit-gitignore)
(require 'magit-sparse-checkout)
(require 'magit-extras)
+ (require 'magit-dired)
(require 'git-rebase)
(require 'magit-bookmark)))