RelatedSoftware/Gnus

The following code, when put into your .gnus.el, will bind the key a in such a way that hitting it on an attached Darcs patch will query for a darcs repository to apply this patch to.

(eval-after-load "gnus-art"
  '(define-key gnus-mime-button-map (kbd "a") 'my-gnus-darcs-apply-part))

(defun my-gnus-darcs-apply-part (repo)
  "Apply the MIME part under point to a Darcs repository."
  (interactive "DApply to Darcs repository: ")
  (gnus-article-check-buffer)
  (let ((data (get-text-property (point)
                                 'gnus-data)))
    (when data
      (mm-with-unibyte-buffer
        (mm-insert-part data)
        (my-send-region-to-command (point-min)
                                   (point-max)
                                   "darcs" "apply"
                                   (format "--repodir=%s"
                                           (expand-file-name repo))
                                   "-a")))))

(defun my-send-region-to-command (beg end command &rest args)
  "Call COMMAND with ARGS, and display output in a special buffer."
  (let* ((coding-system-for-write 'binary)
         (buf (with-current-buffer
                  (get-buffer-create "*Shell Command Output*")
                (setq buffer-read-only nil)
                (erase-buffer)
                (current-buffer)))
         (exit-status (apply 'call-process-region
                             beg end
                             command
                             nil buf nil
                             args)))
    (with-current-buffer buf
      (setq mode-line-process
            (cond ((null exit-status)
                   " - Error")
                  ((stringp exit-status)
                   (format " - Signal [%s]" exit-status))
                  ((not (equal 0 exit-status))
                   (format " - Exit [%d]" exit-status)))))
    (if (with-current-buffer buf (> (point-max)
                                    (point-min)))
        ;; There's some output, display it
        (display-message-or-buffer buf)
      ;; No output; error?
      (cond ((null exit-status)
             (message "(Command failed with error)"))
            ((equal 0 exit-status)
             (message "(Command succeeded with no output)"))
            ((stringp exit-status)
             (message "(Command killed by signal %s)"
                      exit-status))
            (t
             (message "(Command failed with code %d and no output)"
                      exit-status output))))))