aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Bernoulli <jonas@bernoul.li>2015-07-10 09:37:42 +0200
committerJonas Bernoulli <jonas@bernoul.li>2015-07-10 09:37:42 +0200
commit4b7d2ad90cdd54cb46d36ec4ecd8690fff01712a (patch)
tree183dfdeed79ad180c24aaded47769dcbc3e37bdb
parent4da008cb9e1e06f1524052a76b4bff36d9b4dace (diff)
parenta8e2edcea0dbd9abef903283c51b65e0192ed345 (diff)
Merge branch 'diff-commands'
-rw-r--r--lisp/magit-diff.el49
1 files changed, 45 insertions, 4 deletions
diff --git a/lisp/magit-diff.el b/lisp/magit-diff.el
index 444b6bc..856d91b 100644
--- a/lisp/magit-diff.el
+++ b/lisp/magit-diff.el
@@ -505,10 +505,13 @@ The following `format'-like specs are supported:
(?c "Detect copies" "-C" read-from-minibuffer)
(?a "Diff algorithm" "--diff-algorithm="
magit-diff-select-algorithm))
- :actions '((?g "Refresh" magit-diff-refresh)
- (?s "Set defaults" magit-diff-set-default-arguments)
- (?w "Save defaults" magit-diff-save-default-arguments)
- (?t "Toggle hunk refinement" magit-diff-toggle-refine-hunk))))
+ :actions '((?g "Refresh" magit-diff-refresh)
+ (?t "Toggle hunk refinement" magit-diff-toggle-refine-hunk)
+ (?s "Set defaults" magit-diff-set-default-arguments)
+ (?r "Switch range type" magit-diff-switch-range-type)
+ (?w "Save defaults" magit-diff-save-default-arguments)
+ (?f "Flip revisions" magit-diff-flip-revs))
+ :max-action-columns 2))
(defadvice magit-diff-refresh-popup (around get-current-arguments activate)
(if (derived-mode-p 'magit-diff-mode)
@@ -727,6 +730,44 @@ for a commit."
(kill-local-variable 'magit-diff-section-arguments)))
(magit-refresh))
+(defconst magit-diff-range-re
+ (concat "\\`\\([^ \t]*[^.]\\)?" ; revA
+ "\\(\\.\\.\\.?\\)" ; range marker
+ "\\([^.][^ \t]*\\)?\\'")) ; revB
+
+(defun magit-diff-switch-range-type (args)
+ "Convert diff range type.
+Change \"revA..revB\" to \"revB...revA\", or vice versa."
+ (interactive (list (magit-diff-refresh-arguments)))
+ (let ((range (car magit-refresh-args)))
+ (if (and (derived-mode-p 'magit-diff-mode)
+ (string-match magit-diff-range-re range))
+ (progn
+ (setcar magit-refresh-args
+ (concat (match-string 1 range)
+ (if (string= (match-string 2 range) "..")
+ "..."
+ "..")
+ (match-string 3 range)))
+ (magit-refresh))
+ (user-error "No range to change"))))
+
+(defun magit-diff-flip-revs (args)
+ "Swap revisions in diff range.
+Change \"revA..revB\" to \"revB..revA\"."
+ (interactive (list (magit-diff-refresh-arguments)))
+ (let ((range (car magit-refresh-args)))
+ (if (and range
+ (derived-mode-p 'magit-diff-mode)
+ (string-match magit-diff-range-re range))
+ (progn
+ (setcar magit-refresh-args
+ (concat (match-string 3 range)
+ (match-string 2 range)
+ (match-string 1 range)))
+ (magit-refresh))
+ (user-error "No range to swap"))))
+
(defun magit-diff-less-context (&optional count)
"Decrease the context for diff hunks by COUNT lines."
(interactive "p")