stgit.el: Bugfix moving symlinks to/from index
[stgit] / contrib / stgit.el
index 8c69d51..c4ed958 100644 (file)
@@ -164,6 +164,17 @@ Returns nil if there was no output."
   "Returns non-nil if the index contains no changes from HEAD."
   (zerop (stgit-run-git-silent "diff-index" "--cached" "--quiet" "HEAD")))
 
+(defvar stgit-index-node nil)
+(defvar stgit-worktree-node nil)
+
+(defun stgit-refresh-index ()
+  (when stgit-index-node
+    (ewoc-invalidate (car stgit-index-node) (cdr stgit-index-node))))
+
+(defun stgit-refresh-worktree ()
+  (when stgit-worktree-node
+    (ewoc-invalidate (car stgit-worktree-node) (cdr stgit-worktree-node))))
+
 (defun stgit-run-series (ewoc)
   (let ((first-line t))
     (with-temp-buffer
@@ -192,19 +203,20 @@ Returns nil if there was no output."
                                 :empty (string= (match-string 1) "0"))))
             (setq first-line nil)
             (forward-line 1)))))
-    (when stgit-show-worktree
-      (ewoc-enter-last ewoc
-                       (make-stgit-patch
-                        :status 'index
-                        :name :index
-                        :desc nil
-                        :empty nil))
-      (ewoc-enter-last ewoc
-                       (make-stgit-patch
-                        :status 'work
-                        :name :work
-                        :desc nil
-                        :empty nil)))))
+    (if stgit-show-worktree
+        (setq stgit-index-node (cons ewoc (ewoc-enter-last ewoc
+                                                           (make-stgit-patch
+                                                            :status 'index
+                                                            :name :index
+                                                            :desc nil
+                                                            :empty nil)))
+              stgit-worktree-node (cons ewoc (ewoc-enter-last ewoc
+                                                              (make-stgit-patch
+                                                               :status 'work
+                                                               :name :work
+                                                               :desc nil
+                                                               :empty nil))))
+      (setq stgit-worktree-node nil))))
 
 
 (defun stgit-reload ()
@@ -423,11 +435,8 @@ Cf. `stgit-file-type-change-string'."
                                'file-data file))))
 
 (defun stgit-insert-patch-files (patch)
-  "Expand (show modification of) the patch with name PATCHSYM (a
-symbol) after the line at point.
-`stgit-expand-find-copies-harder' controls how hard to try to
-find copied files."
-  (insert "\n")
+  "Expand (show modification of) the patch PATCH after the line
+at point."
   (let* ((patchsym (stgit-patch-name patch))
          (end (progn (insert "#") (prog1 (point-marker) (forward-char -1))))
          (args (list "-z" (if stgit-expand-find-copies-harder
@@ -643,8 +652,7 @@ Commands:
         (buffer (and gitdir (stgit-find-buffer gitdir))))
     (when buffer
       (with-current-buffer buffer
-        ;; FIXME: just invalidate ewoc node
-       (stgit-reload)))))
+        (stgit-refresh-worktree)))))
 
 (defun stgit-add-mark (patchsym)
   "Mark the patch PATCHSYM."
@@ -868,13 +876,14 @@ If PATCHSYM is a keyword, returns PATCHSYM unmodified."
       (goto-char (point-min))
       (diff-mode))))
 
-(defun stgit-move-change-to-index (file status)
+(defun stgit-move-change-to-index (file)
   "Copies the workspace state of FILE to index, using git add or git rm"
-  (let ((op (if (file-exists-p file) "add" "rm")))
+  (let ((op (if (or (file-exists-p file) (file-symlink-p file))
+                '("add") '("rm" "-q"))))
     (stgit-capture-output "*git output*"
-      (stgit-run-git op "--" file))))
+      (apply 'stgit-run-git (append op '("--") (list file))))))
 
-(defun stgit-remove-change-from-index (file status)
+(defun stgit-remove-change-from-index (file)
   "Unstages the change in FILE from the index"
   (stgit-capture-output "*git output*"
     (stgit-run-git "reset" "-q" "--" file)))
@@ -887,15 +896,13 @@ If PATCHSYM is a keyword, returns PATCHSYM unmodified."
       (error "No file on the current line"))
     (let ((patch-name (stgit-patch-name-at-point)))
       (cond ((eq patch-name :work)
-             (stgit-move-change-to-index (stgit-file-file patched-file)
-                                         (stgit-file-status patched-file)))
+             (stgit-move-change-to-index (stgit-file-file patched-file)))
             ((eq patch-name :index)
-             (stgit-remove-change-from-index (stgit-file-file patched-file)
-                                             (stgit-file-status patched-file)))
+             (stgit-remove-change-from-index (stgit-file-file patched-file)))
             (t
              (error "Can only move files in the working tree to index")))))
-  ;; FIXME: invalidate ewoc
-  (stgit-reload))
+  (stgit-refresh-worktree)
+  (stgit-refresh-index))
 
 (defun stgit-edit ()
   "Edit the patch on the current line."