update magit
[emacs.git] / .emacs.d / elisp / magit / magit-wip.el
index 6367b3d..5c19840 100644 (file)
   "Commit message for git-wip commits.
 
 The following `format'-like specs are supported:
-%f the full name of the file being saved
-#g the root of the git repository
-%r the name of the file being saved,
-   relative to the repository root."
+%f the full name of the file being saved, and
+%r the name of the file being saved, relative to the repository root
+%g the root of the git repository."
   :group 'magit
   :type 'string)
 
@@ -97,10 +96,9 @@ The following `format'-like specs are supported:
   "Message shown in the echo area after creating a git-wip commit.
 
 The following `format'-like specs are supported:
-%f the full name of the file being saved
-#g the root of the git repository
-%r the name of the file being saved,
-   relative to the repository root."
+%f the full name of the file being saved, and
+%r the name of the file being saved, relative to the repository root.
+%g the root of the git repository."
   :group 'magit
   :type '(choice (const :tag "No message" nil) string))
 
@@ -110,13 +108,13 @@ The following `format'-like specs are supported:
 (define-minor-mode magit-wip-save-mode
   "Magit support for committing to a work-in-progress ref.
 
-When this minor mode is turned on and a file is saved inside a
-writable git repository then it is also committed to a special
-work-in-progress ref."
+When this minor mode is turned on and a file is saved inside a writable
+git repository then it is also committed to a special work-in-progress
+ref."
   :lighter magit-wip-save-mode-lighter
   (if magit-wip-save-mode
-      (add-hook  'after-save-hook 'magit-wip-save t t)
-    (remove-hook 'after-save-hook 'magit-wip-save t)))
+      (add-hook  'after-save-hook 'magit-wip-save-safe t t)
+    (remove-hook 'after-save-hook 'magit-wip-save-safe t)))
 
 ;;;###autoload
 (define-globalized-minor-mode global-magit-wip-save-mode
@@ -131,23 +129,23 @@ work-in-progress ref."
         (magit-wip-save-mode 1)
       (message "Git command 'git wip' cannot be found"))))
 
+(defun magit-wip-save-safe ()
+  (condition-case err
+      (magit-wip-save)
+    (error
+     (message "Magit WIP got an error: %S" err))))
+
 (defun magit-wip-save ()
-  (let* ((filename (expand-file-name (file-truename (buffer-file-name))))
-         (filedir  (file-name-directory filename))
-         (toplevel (magit-get-top-dir filedir))
-         (blobname (file-relative-name filename toplevel))
-         (spec `((?f . ,filename)
-                 (?r . ,blobname)
-                 (?g . ,toplevel))))
-    (when (and toplevel (file-writable-p toplevel)
-               (not (member blobname
-                            (let ((default-directory filedir))
-                              (magit-git-lines
-                               "ls-files" "--other" "--ignored"
-                               "--exclude-standard" "--full-name")))))
-      (magit-run-git-async "wip" "save"
-                           (format-spec magit-wip-commit-message spec)
-                           "--editor" "--" filename)
+  (let* ((top-dir (magit-get-top-dir default-directory))
+         (name (file-truename (buffer-file-name)))
+         (spec `((?r . ,(file-relative-name name top-dir))
+                 (?f . ,(buffer-file-name))
+                 (?g . ,top-dir))))
+    (when (and top-dir (file-writable-p top-dir))
+      (save-excursion ; kludge see https://github.com/magit/magit/issues/441
+        (magit-run-git "wip" "save"
+                       (format-spec magit-wip-commit-message spec)
+                       "--editor" "--" name))
       (when magit-wip-echo-area-message
         (message (format-spec magit-wip-echo-area-message spec))))))