+(defun mh-unshar-msg (dir)
+ "Unpack the shar file contained in the current message into directory DIR."
+ (interactive (list (read-file-name "Unshar message in directory: "
+ mh-unshar-default-directory
+ mh-unshar-default-directory nil)))
+ (mh-display-msg (mh-get-msg-num t) mh-current-folder) ;update show buffer
+ (mh-unshar-buffer dir))
+
+(defun mh-unshar-buffer (dir)
+ ;; Unpack the shar file contained in the current buffer into directory DIR.
+ (goto-char (point-min))
+ (if (or (re-search-forward "^#![ \t]*/bin/sh" nil t)
+ (and (re-search-forward "^[^a-z0-9\"]*cut here\b" nil t)
+ (forward-line 1))
+ (re-search-forward "^#" nil t)
+ (re-search-forward "^: " nil t))
+ (let ((default-directory (expand-file-name dir))
+ (start (progn (beginning-of-line) (point)))
+ (log-buffer (get-buffer-create "*Unshar Output*")))
+ (save-excursion
+ (set-buffer log-buffer)
+ (setq default-directory (expand-file-name dir))
+ (erase-buffer)
+ (if (file-directory-p default-directory)
+ (insert "cd " dir "\n")
+ (insert "mkdir " dir "\n")
+ (call-process "mkdir" nil log-buffer t default-directory)))
+ (set-window-start (display-buffer log-buffer) 0) ;so can watch progress
+ (call-process-region start (point-max) "sh" nil log-buffer t))
+ (error "Cannot find start of shar.")))
+
+