]> code.delx.au - gnu-emacs-elpa/commitdiff
Ignore up-to-date vc state when the buffer is being reverted
authorDmitry Gutov <dgutov@yandex.ru>
Sun, 3 Feb 2013 22:16:44 +0000 (02:16 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Sun, 3 Feb 2013 22:16:44 +0000 (02:16 +0400)
diff-hl.el

index 93bf299ded2316d9ecc05cfae8af06f32a323448..5b1ecdac7d77e9bdd7f111f4b9671fdce4875833 100644 (file)
   (let* ((file buffer-file-name)\r
          (backend (vc-backend file)))\r
     (when backend\r
-      (cl-case (vc-state file backend)\r
-        (edited\r
-         (let* ((buf-name " *diff-hl* ")\r
-                res)\r
-           (diff-hl-with-diff-switches\r
-            (vc-call-backend backend 'diff (list file) nil nil buf-name))\r
-           (with-current-buffer buf-name\r
-             (goto-char (point-min))\r
-             (unless (eobp)\r
-               (diff-beginning-of-hunk t)\r
-               (while (looking-at diff-hunk-header-re-unified)\r
-                 (let ((line (string-to-number (match-string 3)))\r
-                       (len (let ((m (match-string 4)))\r
-                              (if m (string-to-number m) 1)))\r
-                       (beg (point)))\r
-                   (diff-end-of-hunk)\r
-                   (let* ((inserts (diff-count-matches "^\\+" beg (point)))\r
-                          (deletes (diff-count-matches "^-" beg (point)))\r
-                          (type (cond ((zerop deletes) 'insert)\r
-                                      ((zerop inserts) 'delete)\r
-                                      (t 'change))))\r
-                     (when (eq type 'delete)\r
-                       (setq len 1)\r
-                       (cl-incf line))\r
-                     (push (list line len type) res))))))\r
-           (nreverse res)))\r
-        (added\r
-         `((1 ,(line-number-at-pos (point-max)) insert)))\r
-        (removed\r
-         `((1 ,(line-number-at-pos (point-max)) delete)))))))\r
+      (let ((state (vc-state file backend)))\r
+        (cond\r
+         ((or (eq state 'edited)\r
+              (and (eq state 'up-to-date)\r
+                   ;; VC state is stale in after-revert-hook.\r
+                   revert-buffer-in-progress-p))\r
+          (let* ((buf-name " *diff-hl* ")\r
+                 res)\r
+            (diff-hl-with-diff-switches\r
+             (vc-call-backend backend 'diff (list file) nil nil buf-name))\r
+            (with-current-buffer buf-name\r
+              (goto-char (point-min))\r
+              (unless (eobp)\r
+                (diff-beginning-of-hunk t)\r
+                (while (looking-at diff-hunk-header-re-unified)\r
+                  (let ((line (string-to-number (match-string 3)))\r
+                        (len (let ((m (match-string 4)))\r
+                               (if m (string-to-number m) 1)))\r
+                        (beg (point)))\r
+                    (diff-end-of-hunk)\r
+                    (let* ((inserts (diff-count-matches "^\\+" beg (point)))\r
+                           (deletes (diff-count-matches "^-" beg (point)))\r
+                           (type (cond ((zerop deletes) 'insert)\r
+                                       ((zerop inserts) 'delete)\r
+                                       (t 'change))))\r
+                      (when (eq type 'delete)\r
+                        (setq len 1)\r
+                        (cl-incf line))\r
+                      (push (list line len type) res))))))\r
+            (nreverse res)))\r
+         ((eq state 'added)\r
+          `((1 ,(line-number-at-pos (point-max)) insert)))\r
+         ((eq state 'removed)\r
+          `((1 ,(line-number-at-pos (point-max)) delete))))))))\r
 \r
 (defun diff-hl-update ()\r
   (let ((changes (diff-hl-changes))\r