{"thread":{"id":"9196","subject":"[PATCH] git.el: Support for incremental status updates.","startedAt":"2007-07-24T10:12:47Z","lastAt":"2007-07-31T19:58:35Z","messageCount":6,"participants":["Alexandre Julliard","Karl Hasselström","David Kågedal"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"48424","messageId":"87sl7ekt40.fsf@wine.dyndns.org","threadId":"9196","inReplyTo":null,"subject":"[PATCH] git.el: Support for incremental status updates.","fromName":"Alexandre Julliard","fromEmail":"julliard@winehq.org","sentAt":"2007-07-24T10:12:47Z","receivedAt":"2007-07-24T10:12:47Z","isPatch":true,"sender":{"key":"julliard@winehq.org","avatar":null},"body":"When we know which files have been modified, we can now run diff-index\nor ls-files with a file list to refresh only the specified files\ninstead of the whole project.\n\nThis also allows proper refreshing of files upon add/delete/resolve,\ninstead of making assumptions about the new file state.\n\nSigned-off-by: Alexandre Julliard <julliard@winehq.org>\n---\n contrib/emacs/git.el |  224 +++++++++++++++++++++++++-------------------------\n 1 files changed, 113 insertions(+), 111 deletions(-)\n\ndiff --git a/contrib/emacs/git.el b/contrib/emacs/git.el\nindex d7f4316..53dd703 100644\n--- a/contrib/emacs/git.el\n+++ b/contrib/emacs/git.el\n@@ -314,8 +314,8 @@ and returns the process output as a string.\"\n     (sort-lines nil (point-min) (point-max))\n     (save-buffer))\n   (when created\n-    (git-run-command nil nil \"update-index\" \"--info-only\" \"--add\" \"--\" (file-relative-name ignore-name)))\n-  (git-add-status-file (if created 'added 'modified) (file-relative-name ignore-name))))\n+    (git-run-command nil nil \"update-index\" \"--add\" \"--\" (file-relative-name ignore-name)))\n+  (git-update-status-files (list (file-relative-name ignore-name)) 'unknown)))\n \n ; propertize definition for XEmacs, stolen from erc-compat\n (eval-when-compile\n@@ -523,23 +523,39 @@ and returns the process output as a string.\"\n                   \"  \" (git-escape-file-name (git-fileinfo->name info))\n                   (git-rename-as-string info))))\n \n-(defun git-parse-status (status)\n-  \"Parse the output of git-diff-index in the current buffer.\"\n-  (goto-char (point-min))\n-  (while (re-search-forward\n-          \":\\\\([0-7]\\\\{6\\\\}\\\\) \\\\([0-7]\\\\{6\\\\}\\\\) [0-9a-f]\\\\{40\\\\} [0-9a-f]\\\\{40\\\\} \\\\(\\\\([ADMU]\\\\)\\0\\\\([^\\0]+\\\\)\\\\|\\\\([CR]\\\\)[0-9]*\\0\\\\([^\\0]+\\\\)\\0\\\\([^\\0]+\\\\)\\\\)\\0\"\n-          nil t 1)\n-    (let ((old-perm (string-to-number (match-string 1) 8))\n-          (new-perm (string-to-number (match-string 2) 8))\n-          (state (or (match-string 4) (match-string 6)))\n-          (name (or (match-string 5) (match-string 7)))\n-          (new-name (match-string 8)))\n-      (if new-name  ; copy or rename\n-          (if (eq ?C (string-to-char state))\n-              (ewoc-enter-last status (git-create-fileinfo 'added new-name old-perm new-perm 'copy name))\n-            (ewoc-enter-last status (git-create-fileinfo 'deleted name 0 0 'rename new-name))\n-            (ewoc-enter-last status (git-create-fileinfo 'added new-name old-perm new-perm 'rename name)))\n-        (ewoc-enter-last status (git-create-fileinfo (git-state-code state) name old-perm new-perm))))))\n+(defun git-insert-fileinfo (status info &optional refresh)\n+  \"Insert INFO in the status buffer, optionally refreshing an existing one.\"\n+  (let ((node (and refresh\n+                   (git-find-status-file status (git-fileinfo->name info)))))\n+    (setf (git-fileinfo->needs-refresh info) t)\n+    (when node   ;preserve the marked flag\n+      (setf (git-fileinfo->marked info) (git-fileinfo->marked (ewoc-data node))))\n+    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))\n+\n+(defun git-run-diff-index (status files)\n+  \"Run git-diff-index on FILES and parse the results into STATUS.\n+Return the list of files that haven't been handled.\"\n+  (let ((refresh files))\n+    (with-temp-buffer\n+      (apply #'git-run-command t nil \"diff-index\" \"-z\" \"-M\" \"HEAD\" \"--\" files)\n+      (goto-char (point-min))\n+      (while (re-search-forward\n+              \":\\\\([0-7]\\\\{6\\\\}\\\\) \\\\([0-7]\\\\{6\\\\}\\\\) [0-9a-f]\\\\{40\\\\} [0-9a-f]\\\\{40\\\\} \\\\(\\\\([ADMU]\\\\)\\0\\\\([^\\0]+\\\\)\\\\|\\\\([CR]\\\\)[0-9]*\\0\\\\([^\\0]+\\\\)\\0\\\\([^\\0]+\\\\)\\\\)\\0\"\n+              nil t 1)\n+        (let ((old-perm (string-to-number (match-string 1) 8))\n+              (new-perm (string-to-number (match-string 2) 8))\n+              (state (or (match-string 4) (match-string 6)))\n+              (name (or (match-string 5) (match-string 7)))\n+              (new-name (match-string 8)))\n+          (if new-name  ; copy or rename\n+              (if (eq ?C (string-to-char state))\n+                  (git-insert-fileinfo status (git-create-fileinfo 'added new-name old-perm new-perm 'copy name) refresh)\n+                (git-insert-fileinfo status (git-create-fileinfo 'deleted name 0 0 'rename new-name) refresh)\n+                (git-insert-fileinfo status (git-create-fileinfo 'added new-name old-perm new-perm 'rename name)) refresh)\n+            (git-insert-fileinfo status (git-create-fileinfo (git-state-code state) name old-perm new-perm) refresh))\n+          (setq files (delete name files))\n+          (when new-name (setq files (delete new-name files)))))))\n+  files)\n \n (defun git-find-status-file (status file)\n   \"Find a given file in the status ewoc and return its node.\"\n@@ -548,32 +564,59 @@ and returns the process output as a string.\"\n       (setq node (ewoc-next status node)))\n     node))\n \n-(defun git-parse-ls-files (status default-state &optional skip-existing)\n-  \"Parse the output of git-ls-files in the current buffer.\"\n-  (goto-char (point-min))\n-  (let (infolist)\n-    (while (re-search-forward \"\\\\([HMRCK?]\\\\) \\\\([^\\0]*\\\\)\\0\" nil t 1)\n-      (let ((state (match-string 1))\n-            (name (match-string 2)))\n-        (unless (and skip-existing (git-find-status-file status name))\n-          (push (git-create-fileinfo (or (git-state-code state) default-state) name) infolist))))\n-    (dolist (info (nreverse infolist))\n-      (ewoc-enter-last status info))))\n-\n-(defun git-parse-ls-unmerged (status)\n-  \"Parse the output of git-ls-files -u in the current buffer.\"\n-  (goto-char (point-min))\n-  (let (files)\n-    (while (re-search-forward \"[0-7]\\\\{6\\\\} [0-9a-f]\\\\{40\\\\} [123]\\t\\\\([^\\0]+\\\\)\\0\" nil t)\n-      (let ((node (git-find-status-file status (match-string 1))))\n-        (when node (push (ewoc-data node) files))))\n-    (git-set-files-state files 'unmerged)))\n-\n-(defun git-add-status-file (state name)\n-  \"Add a new file to the status list (if not existing already) and return its node.\"\n+(defun git-run-ls-files (status files default-state &rest options)\n+  \"Run git-ls-files on FILES and parse the results into STATUS.\n+Return the list of files that haven't been handled.\"\n+  (let ((refresh files))\n+    (with-temp-buffer\n+      (apply #'git-run-command t nil \"ls-files\" \"-z\" \"-t\" (append options (list \"--\") files))\n+      (goto-char (point-min))\n+      (while (re-search-forward \"\\\\([HMRCK?]\\\\) \\\\([^\\0]*\\\\)\\0\" nil t 1)\n+        (let ((state (match-string 1))\n+              (name (match-string 2)))\n+          (git-insert-fileinfo status (git-create-fileinfo (or (git-state-code state) default-state) name) refresh)\n+          (setq files (delete name files))))))\n+  files)\n+\n+(defun git-run-ls-unmerged (status files)\n+  \"Run git-ls-files -u on FILES and parse the results into STATUS.\"\n+  (with-temp-buffer\n+    (apply #'git-run-command t nil \"ls-files\" \"-z\" \"-u\" \"--\" files)\n+    (goto-char (point-min))\n+    (let (unmerged-files)\n+      (while (re-search-forward \"[0-7]\\\\{6\\\\} [0-9a-f]\\\\{40\\\\} [123]\\t\\\\([^\\0]+\\\\)\\0\" nil t)\n+        (let ((node (git-find-status-file status (match-string 1))))\n+          (when node (push (ewoc-data node) unmerged-files))))\n+      (git-set-files-state unmerged-files 'unmerged))))\n+\n+(defun git-update-status-files (files &optional default-state)\n+  \"Update the status of FILES from the index.\"\n   (unless git-status (error \"Not in git-status buffer.\"))\n-  (or (git-find-status-file git-status name)\n-      (ewoc-enter-last git-status (git-create-fileinfo state name))))\n+  (let* ((status git-status)\n+         (remaining-files\n+          (if (git-empty-db-p) ; we need some special handling for an empty db\n+              (git-run-ls-files status files 'added \"-c\")\n+            (git-run-diff-index status files))))\n+    (git-run-ls-unmerged status files)\n+    (when (and (or (not files) remaining-files)\n+               (file-readable-p \".git/info/exclude\"))\n+      (setq remaining-files (git-run-ls-files status remaining-files\n+                                              'unknown \"-o\" \"--exclude-from=.git/info/exclude\"\n+                                              (concat \"--exclude-per-directory=\" git-per-dir-ignore-file))))\n+    ; mark remaining files with the default state (or remove them if nil)\n+    (when remaining-files\n+      (if default-state\n+          (ewoc-map (lambda (info)\n+                      (when (member (git-fileinfo->name info) remaining-files)\n+                        (git-set-files-state (list info) default-state))\n+                      nil)\n+                    status)\n+        (ewoc-filter status\n+                     (lambda (info files)\n+                       (not (member (git-fileinfo->name info) files)))\n+                     remaining-files)))\n+    (git-refresh-files)\n+    (git-refresh-ewoc-hf status)))\n \n (defun git-marked-files ()\n   \"Return a list of all marked files, or if none a list containing just the file at cursor position.\"\n@@ -789,54 +832,34 @@ and returns the process output as a string.\"\n (defun git-add-file ()\n   \"Add marked file(s) to the index cache.\"\n   (interactive)\n-  (let ((files (git-marked-files-state 'unknown)))\n+  (let ((files (git-get-filenames (git-marked-files-state 'unknown))))\n     (unless files\n-      (push (ewoc-data\n-             (git-add-status-file 'added (file-relative-name\n-                                          (read-file-name \"File to add: \" nil nil t))))\n-            files))\n-    (apply #'git-run-command nil nil \"update-index\" \"--info-only\" \"--add\" \"--\" (git-get-filenames files))\n-    (git-set-files-state files 'added)\n-    (git-refresh-files)))\n+      (push (file-relative-name (read-file-name \"File to add: \" nil nil t)) files))\n+    (apply #'git-run-command nil nil \"update-index\" \"--add\" \"--\" files)\n+    (git-update-status-files files 'uptodate)))\n \n (defun git-ignore-file ()\n   \"Add marked file(s) to the ignore list.\"\n   (interactive)\n-  (let ((files (git-marked-files-state 'unknown)))\n+  (let ((files (git-get-filenames (git-marked-files-state 'unknown))))\n     (unless files\n-      (push (ewoc-data\n-             (git-add-status-file 'unknown (file-relative-name\n-                                            (read-file-name \"File to ignore: \" nil nil t))))\n-            files))\n-    (dolist (info files) (git-append-to-ignore (git-fileinfo->name info)))\n-    (git-set-files-state files 'ignored)\n-    (git-refresh-files)))\n+      (push (file-relative-name (read-file-name \"File to ignore: \" nil nil t)) files))\n+    (dolist (f files) (git-append-to-ignore f))\n+    (git-update-status-files files 'ignored)))\n \n (defun git-remove-file ()\n   \"Remove the marked file(s).\"\n   (interactive)\n-  (let ((files (git-marked-files-state 'added 'modified 'unknown 'uptodate)))\n+  (let ((files (git-get-filenames (git-marked-files-state 'added 'modified 'unknown 'uptodate))))\n     (unless files\n-      (push (ewoc-data\n-             (git-add-status-file 'unknown (file-relative-name\n-                                            (read-file-name \"File to remove: \" nil nil t))))\n-            files))\n+      (push (file-relative-name (read-file-name \"File to remove: \" nil nil t)) files))\n     (if (yes-or-no-p\n          (format \"Remove %d file%s? \" (length files) (if (> (length files) 1) \"s\" \"\")))\n         (progn\n-          (dolist (info files)\n-            (let ((name (git-fileinfo->name info)))\n-              (when (file-exists-p name) (delete-file name))))\n-          (apply #'git-run-command nil nil \"update-index\" \"--info-only\" \"--remove\" \"--\" (git-get-filenames files))\n-          ; remove unknown files from the list, set the others to deleted\n-          (ewoc-filter git-status\n-                       (lambda (info files)\n-                         (not (and (memq info files) (eq (git-fileinfo->state info) 'unknown))))\n-                       files)\n-          (git-set-files-state files 'deleted)\n-          (git-refresh-files)\n-          (unless (ewoc-nth git-status 0)  ; refresh header if list is empty\n-            (git-refresh-ewoc-hf git-status)))\n+          (dolist (name files)\n+            (when (file-exists-p name) (delete-file name)))\n+          (apply #'git-run-command nil nil \"update-index\" \"--remove\" \"--\" files)\n+          (git-update-status-files files nil))\n       (message \"Aborting\"))))\n \n (defun git-revert-file ()\n@@ -849,26 +872,23 @@ and returns the process output as a string.\"\n                 (format \"Revert %d file%s? \" (length files) (if (> (length files) 1) \"s\" \"\"))))\n       (dolist (info files)\n         (case (git-fileinfo->state info)\n-          ('added (push info added))\n-          ('deleted (push info modified))\n-          ('unmerged (push info modified))\n-          ('modified (push info modified))))\n+          ('added (push (git-fileinfo->name info) added))\n+          ('deleted (push (git-fileinfo->name info) modified))\n+          ('unmerged (push (git-fileinfo->name info) modified))\n+          ('modified (push (git-fileinfo->name info) modified))))\n       (when added\n-          (apply #'git-run-command nil nil \"update-index\" \"--force-remove\" \"--\" (git-get-filenames added))\n-          (git-set-files-state added 'unknown))\n+        (apply #'git-run-command nil nil \"update-index\" \"--force-remove\" \"--\" added))\n       (when modified\n-          (apply #'git-run-command nil nil \"checkout\" \"HEAD\" (git-get-filenames modified))\n-          (git-set-files-state modified 'uptodate))\n-      (git-refresh-files))))\n+        (apply #'git-run-command nil nil \"checkout\" \"HEAD\" modified))\n+      (git-update-status-files (append added modified) 'uptodate))))\n \n (defun git-resolve-file ()\n   \"Resolve conflicts in marked file(s).\"\n   (interactive)\n-  (let ((files (git-marked-files-state 'unmerged)))\n+  (let ((files (git-get-filenames (git-marked-files-state 'unmerged))))\n     (when files\n-      (apply #'git-run-command nil nil \"update-index\" \"--\" (git-get-filenames files))\n-      (git-set-files-state files 'modified)\n-      (git-refresh-files))))\n+      (apply #'git-run-command nil nil \"update-index\" \"--\" files)\n+      (git-update-status-files files 'uptodate))))\n \n (defun git-remove-handled ()\n   \"Remove handled files from the status list.\"\n@@ -1071,27 +1091,9 @@ and returns the process output as a string.\"\n          (pos (ewoc-locate status))\n          (cur-name (and pos (git-fileinfo->name (ewoc-data pos)))))\n     (unless status (error \"Not in git-status buffer.\"))\n+    (git-run-command nil nil \"update-index\" \"--refresh\")\n     (git-clear-status status)\n-    (git-run-command nil nil \"update-index\" \"--info-only\" \"--refresh\")\n-    (if (git-empty-db-p)\n-        ; we need some special handling for an empty db\n-        (with-temp-buffer\n-          (git-run-command t nil \"ls-files\" \"-z\" \"-t\" \"-c\")\n-          (git-parse-ls-files status 'added))\n-      (with-temp-buffer\n-        (git-run-command t nil \"diff-index\" \"-z\" \"-M\" \"HEAD\")\n-        (git-parse-status status)))\n-      (with-temp-buffer\n-        (git-run-command t nil \"ls-files\" \"-z\" \"-u\")\n-        (git-parse-ls-unmerged status))\n-      (when (file-readable-p \".git/info/exclude\")\n-        (with-temp-buffer\n-          (git-run-command t nil \"ls-files\" \"-z\" \"-t\" \"-o\"\n-                           \"--exclude-from=.git/info/exclude\"\n-                           (concat \"--exclude-per-directory=\" git-per-dir-ignore-file))\n-          (git-parse-ls-files status 'unknown)))\n-    (git-refresh-files)\n-    (git-refresh-ewoc-hf status)\n+    (git-update-status-files nil)\n     ; move point to the current file name if any\n     (let ((node (and cur-name (git-find-status-file status cur-name))))\n       (when node (ewoc-goto-node status node)))))\n-- \n1.5.3.rc2.39.g82303f\n\n-- \nAlexandre Julliard\njulliard@winehq.org\n"},{"id":"49162","messageId":"20070730232226.GA2413@diana.vm.bytemark.co.uk","threadId":"9196","inReplyTo":"87sl7ekt40.fsf@wine.dyndns.org","subject":"Re: [PATCH] git.el: Support for incremental status updates.","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2007-07-30T23:22:26Z","receivedAt":"2007-07-30T23:22:26Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2007-07-24 12:12:47 +0200, Alexandre Julliard wrote:\n\n> +    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))\n\nMy emacs doesn't like this. When i do \"a\" or \"U\" (and quite possibly\nothers that I haven't tried yet) I get\n\n  git-insert-fileinfo: Symbol's function definition is void: ewoc-set-data\n\nThe command appears to have been aborted, but if I press \"g\" to\nrefresh the display, I see that it has in fact been carried out. So\nthere is a workaround, at least.\n\nThis is GNU Emacs 21.4.1 on Ubuntu 7.04.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"49201","messageId":"87k5shudz7.fsf@morpheus.local","threadId":"9196","inReplyTo":"20070730232226.GA2413@diana.vm.bytemark.co.uk","subject":"Re: [PATCH] git.el: Support for incremental status updates.","fromName":"David Kågedal","fromEmail":"davidk@lysator.liu.se","sentAt":"2007-07-31T09:19:56Z","receivedAt":"2007-07-31T09:19:56Z","isPatch":true,"sender":{"key":"davidk@lysator.liu.se","avatar":"https://avatars.githubusercontent.com/u/60530?v=4"},"body":"Karl Hasselström <kha@treskal.com> writes:\n\n> On 2007-07-24 12:12:47 +0200, Alexandre Julliard wrote:\n>\n>> +    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))\n>\n> My emacs doesn't like this. When i do \"a\" or \"U\" (and quite possibly\n> others that I haven't tried yet) I get\n>\n>   git-insert-fileinfo: Symbol's function definition is void: ewoc-set-data\n\nYou probably need to add a (require 'ewoc).  Try loading ewoc and run\nthe command again.\n\n-- \nDavid Kågedal\n"},{"id":"49205","messageId":"20070731111438.GA17903@diana.vm.bytemark.co.uk","threadId":"9196","inReplyTo":"87k5shudz7.fsf@morpheus.local","subject":"Re: [PATCH] git.el: Support for incremental status updates.","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2007-07-31T11:14:38Z","receivedAt":"2007-07-31T11:14:38Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2007-07-31 11:19:56 +0200, David Kågedal wrote:\n\n> Karl Hasselström <kha@treskal.com> writes:\n>\n> > On 2007-07-24 12:12:47 +0200, Alexandre Julliard wrote:\n> >\n> > > +    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))\n> >\n> > My emacs doesn't like this. When i do \"a\" or \"U\" (and quite\n> > possibly others that I haven't tried yet) I get\n> >\n> >   git-insert-fileinfo: Symbol's function definition is void: ewoc-set-data\n>\n> You probably need to add a (require 'ewoc). Try loading ewoc and run\n> the command again.\n\ngit.el already requires ewoc. And it uses a number of ewoc functions\n(and has done so since its creation); this newly introduced call is\nthe only one that fails.\n\nAlso, I've just discovered that with Emacs 22.1, I don't see this\nproblem. So my guess is that ewoc-set-data is newer than Emacs 21.4.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"49239","messageId":"874pjktnoe.fsf@wine.dyndns.org","threadId":"9196","inReplyTo":"20070731111438.GA17903@diana.vm.bytemark.co.uk","subject":"Re: [PATCH] git.el: Support for incremental status updates.","fromName":"Alexandre Julliard","fromEmail":"julliard@winehq.org","sentAt":"2007-07-31T18:48:01Z","receivedAt":"2007-07-31T18:48:01Z","isPatch":true,"sender":{"key":"julliard@winehq.org","avatar":null},"body":"Karl Hasselström <kha@treskal.com> writes:\n\n> git.el already requires ewoc. And it uses a number of ewoc functions\n> (and has done so since its creation); this newly introduced call is\n> the only one that fails.\n>\n> Also, I've just discovered that with Emacs 22.1, I don't see this\n> problem. So my guess is that ewoc-set-data is newer than Emacs 21.4.\n\nYes, it's a new function. Something like this should work:\n\nFrom 8da6b3257fe785484c5683fc97edccf75ac5588d Mon Sep 17 00:00:00 2001\nFrom: Alexandre Julliard <julliard@winehq.org>\nDate: Tue, 31 Jul 2007 20:45:53 +0200\nSubject: [PATCH] git.el: Avoid using ewoc-set-data for compatibility with Emacs 21.\n\nSigned-off-by: Alexandre Julliard <julliard@winehq.org>\n---\n contrib/emacs/git.el |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/contrib/emacs/git.el b/contrib/emacs/git.el\nindex 9bcd7c4..f6102fc 100644\n--- a/contrib/emacs/git.el\n+++ b/contrib/emacs/git.el\n@@ -530,7 +530,7 @@ and returns the process output as a string.\"\n     (setf (git-fileinfo->needs-refresh info) t)\n     (when node   ;preserve the marked flag\n       (setf (git-fileinfo->marked info) (git-fileinfo->marked (ewoc-data node))))\n-    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))\n+    (if node (setf (ewoc-data node) info) (ewoc-enter-last status info))))\n \n (defun git-run-diff-index (status files)\n   \"Run git-diff-index on FILES and parse the results into STATUS.\n-- \n1.5.3.rc3.97.gcb90c\n\n-- \nAlexandre Julliard\njulliard@winehq.org\n"},{"id":"49244","messageId":"20070731195835.GD28331@diana.vm.bytemark.co.uk","threadId":"9196","inReplyTo":"874pjktnoe.fsf@wine.dyndns.org","subject":"Re: [PATCH] git.el: Support for incremental status updates.","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2007-07-31T19:58:35Z","receivedAt":"2007-07-31T19:58:35Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2007-07-31 20:48:01 +0200, Alexandre Julliard wrote:\n\n> Yes, it's a new function. Something like this should work:\n>\n> From: Alexandre Julliard <julliard@winehq.org>\n> Date: Tue, 31 Jul 2007 20:45:53 +0200\n> Subject: [PATCH] git.el: Avoid using ewoc-set-data for compatibility with Emacs 21.\n>\n> Signed-off-by: Alexandre Julliard <julliard@winehq.org>\n\nAcked-by: Karl Hasselström <kha@treskal.com>\n\nI've only tested it on emacs 21, though.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"}]}