{"thread":{"id":"6750","subject":"[PATCH 5/7] git-blame.el: blame unsaved changes","startedAt":"2007-02-09T08:21:32Z","lastAt":"2007-02-09T08:21:32Z","messageCount":1,"participants":["David Kågedal"],"isPatch":true,"patchVersion":1,"patchTotal":7},"messages":[{"id":"34045","messageId":"87mz3npwqb.fsf@morpheus.local","threadId":"6750","inReplyTo":null,"subject":"[PATCH 5/7] git-blame.el: blame unsaved changes","fromName":"David Kågedal","fromEmail":"davidk@lysator.liu.se","sentAt":"2007-02-09T08:21:32Z","receivedAt":"2007-02-09T08:21:32Z","isPatch":true,"sender":{"key":"davidk@lysator.liu.se","avatar":"https://avatars.githubusercontent.com/u/60530?v=4"},"body":"Make git-blame use the current buffer contents for the blame, instead of\nthe saved file.  This makes the blame correct even if there are unsaved\nchanges.\n\nAlso added a git-reblame command.\n\nSigned-off-by: David Kågedal <davidk@lysator.liu.se>\n---\n contrib/emacs/git-blame.el |   65 +++++++++++++++++++++++++++++--------------\n 1 files changed, 44 insertions(+), 21 deletions(-)\n\ndiff --git a/contrib/emacs/git-blame.el b/contrib/emacs/git-blame.el\nindex 7ffc153..f183964 100644\n--- a/contrib/emacs/git-blame.el\n+++ b/contrib/emacs/git-blame.el\n@@ -102,8 +102,17 @@\n \n (defvar git-blame-ancient-color \"dark green\")\n \n-(defvar git-blame-overlays nil)\n-(defvar git-blame-cache nil)\n+(defvar git-blame-proc nil\n+  \"The running git-blame process\")\n+(make-variable-buffer-local 'git-blame-proc)\n+\n+(defvar git-blame-overlays nil\n+  \"The git-blame overlays used in the current buffer.\")\n+(make-variable-buffer-local 'git-blame-overlays)\n+\n+(defvar git-blame-cache nil\n+  \"A cache of git-blame information for the current buffer\")\n+(make-variable-buffer-local 'git-blame-cache)\n \n (defvar git-blame-mode nil)\n (make-variable-buffer-local 'git-blame-mode)\n@@ -118,9 +127,7 @@\n   (if arg\n       (setq git-blame-mode (eq arg 1))\n     (setq git-blame-mode (not git-blame-mode)))\n-  (make-local-variable 'git-blame-overlays)\n   (make-local-variable 'git-blame-colors)\n-  (make-local-variable 'git-blame-cache)\n   (git-blame-cleanup)\n   (if git-blame-mode\n       (progn\n@@ -131,24 +138,37 @@\n         (setq git-blame-cache (make-hash-table :test 'equal))\n         (git-blame-run))))\n \n+;;;###autoload\n+(defun git-reblame ()\n+  \"Recalculate all blame information in the current buffer\"\n+  (unless git-blame-mode\n+    (error \"git-blame is not active\"))\n+  (interactive)\n+  (git-blame-cleanup)\n+  (git-blame-run))\n+\n (defun git-blame-run ()\n-  (let* ((display-buf (current-buffer))\n-         (blame-buf (get-buffer-create\n-                     (concat \" git blame for \" (buffer-name))))\n-         (proc (start-process \"git-blame\" blame-buf\n-                             \"git\" \"blame\" \"--incremental\"\n-                             (file-name-nondirectory buffer-file-name))))\n-    (mapcar 'delete-overlay git-blame-overlays)\n-    (setq git-blame-overlays nil)\n-    (setq git-blame-cache (make-hash-table :test 'equal))\n-    (with-current-buffer blame-buf\n-      (erase-buffer)\n-      (make-local-variable 'git-blame-file)\n-      (make-local-variable 'git-blame-current)\n-      (setq git-blame-file display-buf)\n-      (setq git-blame-current nil))\n-    (set-process-filter proc 'git-blame-filter)\n-    (set-process-sentinel proc 'git-blame-sentinel)))\n+  (if git-blame-proc\n+      ;; Should maybe queue up a new run here\n+      (message \"Already running git blame\")\n+    (let ((display-buf (current-buffer))\n+          (blame-buf (get-buffer-create\n+                      (concat \" git blame for \" (buffer-name)))))\n+      (setq git-blame-proc\n+            (start-process \"git-blame\" blame-buf\n+                           \"git\" \"blame\"\n+                           \"--incremental\" \"--contents\" \"-\"\n+                           (file-name-nondirectory buffer-file-name)))\n+      (with-current-buffer blame-buf\n+        (erase-buffer)\n+        (make-local-variable 'git-blame-file)\n+        (make-local-variable 'git-blame-current)\n+        (setq git-blame-file display-buf)\n+        (setq git-blame-current nil))\n+      (set-process-filter git-blame-proc 'git-blame-filter)\n+      (set-process-sentinel git-blame-proc 'git-blame-sentinel)\n+      (process-send-region git-blame-proc (point-min) (point-max))\n+      (process-send-eof git-blame-proc))))\n \n (defun git-blame-cleanup ()\n   \"Remove all blame properties\"\n@@ -159,6 +179,9 @@\n       (set-buffer-modified-p modified)))\n \n (defun git-blame-sentinel (proc status)\n+  (with-current-buffer (process-buffer proc)\n+    (with-current-buffer git-blame-file\n+      (setq git-blame-proc nil)))\n   ;;(kill-buffer (process-buffer proc))\n   (message \"git blame finished\"))\n \n-- \n1.5.0.rc3.204.g93c76\n\n\n-- \nDavid Kågedal\n"}]}