X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/f9533abf9cc6124174d4f401de63153ab7d2bccf..b4f12bc1acd2892a76e07bbf6ad34b2da1c455b5:/contrib/stgit.el?ds=inline diff --git a/contrib/stgit.el b/contrib/stgit.el index 906a75f..b72ba98 100644 --- a/contrib/stgit.el +++ b/contrib/stgit.el @@ -2016,6 +2016,8 @@ which stage to diff against in the case of unmerged files." (list unmerged-stage)) (t (list (concat patch-id "^") patch-id))) + (and (eq (stgit-file->status patched-file) 'copy) + '("--diff-filter=C")) '("--") (if (stgit-file->copy-or-rename patched-file) (list (stgit-file->cr-from patched-file) @@ -2031,7 +2033,8 @@ which stage to diff against in the case of unmerged files." (if (eq patch-id :index) '("--cached") (list unmerged-stage)))) - (let ((args (append '("show" "-O" "--patch-with-stat" "-O" "-M") + (let ((args (append '("show" "-O" "--patch-with-stat") + `("-O" ,(stgit-find-copies-harder-diff-arg)) (and space-arg (list "-O" space-arg)) '("--") (list (stgit-patch-name-at-point))))) @@ -2094,10 +2097,12 @@ greater than four (e.g., \\[universal-argument] \ (error "Can only show diff range for applied patches")) (stgit-capture-output (format "*StGit diff %s..%s*" first-patch second-patch) - (apply 'stgit-run-git (append '("diff" "--patch-with-stat") - (and whitespace-arg (list whitespace-arg)) - (list (format "%s^" (stgit-id first-patch)) - (stgit-id second-patch)))) + (apply 'stgit-run-git + "diff" "--patch-with-stat" + (stgit-find-copies-harder-diff-arg) + (append (and whitespace-arg (list whitespace-arg)) + (list (format "%s^" (stgit-id first-patch)) + (stgit-id second-patch)))) (with-current-buffer standard-output (goto-char (point-min)) (diff-mode))))) @@ -2326,16 +2331,13 @@ their position in the patch series, bottommost first. PATCHSYMS must not contain duplicate entries, unless ALLOW-DUPLICATES is not nil." - (let (sorted-patchsyms - (series (with-output-to-string - (with-current-buffer standard-output - (stgit-run-silent "series" "--noprefix")))) - start) - (while (string-match "^\\(.+\\)" series start) - (let ((patchsym (intern (match-string 1 series)))) - (when (memq patchsym patchsyms) - (setq sorted-patchsyms (cons patchsym sorted-patchsyms)))) - (setq start (match-end 0))) + (let (sorted-patchsyms) + (ewoc-map #'(lambda (patch) + (let ((name (stgit-patch->name patch))) + (when (memq name patchsyms) + (setq sorted-patchsyms (cons name sorted-patchsyms)))) + nil) + stgit-ewoc) (setq sorted-patchsyms (nreverse sorted-patchsyms)) (unless allow-duplicates @@ -2451,24 +2453,29 @@ deepest patch had before the squash." (unless at-pmark (goto-char old-point))))) -(defun stgit-execute () +(defun stgit-execute (&optional git-mode) "Prompt for an stg command to execute in a shell. The names of any marked patches or the patch at point are inserted in the command to be executed. +With a prefix argument, or if GIT-MODE is non-nil, insert SHA1 +sums of the marked patches instead, and prompt for a git command. + If the command ends in an ampersand, run it asynchronously. When the command has finished, reload the stgit buffer." - (interactive) + (interactive "P") (stgit-assert-mode) - (let* ((patches (stgit-patches-marked-or-at-point nil 'allow-committed)) + (let* ((patches (stgit-sort-patches + (stgit-patches-marked-or-at-point nil 'allow-committed))) (patch-names (mapcar 'symbol-name patches)) (hyphens (find-if (lambda (s) (string-match "^-" s)) patch-names)) (defaultcmd (if patches - (concat "stg " + (concat (if git-mode "git" "stg") " " (and hyphens "-- ") - (mapconcat 'identity patch-names " ")) + (mapconcat (if git-mode 'stgit-id 'identity) + patch-names " ")) "stg ")) (cmd (read-from-minibuffer "Shell command: " (cons defaultcmd 5) nil nil 'shell-command-history))