(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)
(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)))))
(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)))))
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
(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))