{"thread":{"id":"10068","subject":"[PATCH 1/4] git.el: Preserve file marks when doing a full refresh.","startedAt":"2007-09-29T09:58:08Z","lastAt":"2007-09-29T09:58:08Z","messageCount":1,"participants":["Alexandre Julliard"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"54322","messageId":"87bqblpzdb.fsf@wine.dyndns.org","threadId":"10068","inReplyTo":null,"subject":"[PATCH 1/4] git.el: Preserve file marks when doing a full refresh.","fromName":"Alexandre Julliard","fromEmail":"julliard@winehq.org","sentAt":"2007-09-29T09:58:08Z","receivedAt":"2007-09-29T09:58:08Z","isPatch":true,"sender":{"key":"julliard@winehq.org","avatar":null},"body":"Signed-off-by: Alexandre Julliard <julliard@winehq.org>\n---\n contrib/emacs/git.el |   40 ++++++++++++++++++++++++++++------------\n 1 files changed, 28 insertions(+), 12 deletions(-)\n\ndiff --git a/contrib/emacs/git.el b/contrib/emacs/git.el\nindex 2d77fd4..7b4a0d3 100644\n--- a/contrib/emacs/git.el\n+++ b/contrib/emacs/git.el\n@@ -494,24 +494,31 @@ and returns the process output as a string.\"\n       (setf (git-fileinfo->orig-name info) nil)\n       (setf (git-fileinfo->needs-refresh info) t))))\n \n-(defun git-set-filenames-state (status files state)\n-  \"Set the state of a list of named files.\"\n+(defun git-status-filenames-map (status func files &rest args)\n+  \"Apply FUNC to the status files names in the FILES list.\"\n   (when files\n     (setq files (sort files #'string-lessp))\n     (let ((file (pop files))\n           (node (ewoc-nth status 0)))\n       (while (and file node)\n         (let ((info (ewoc-data node)))\n-          (cond ((string-lessp (git-fileinfo->name info) file)\n-                 (setq node (ewoc-next status node)))\n-                ((string-equal (git-fileinfo->name info) file)\n-                 (unless (eq (git-fileinfo->state info) state)\n-                   (setf (git-fileinfo->state info) state)\n-                   (setf (git-fileinfo->rename-state info) nil)\n-                   (setf (git-fileinfo->orig-name info) nil)\n-                   (setf (git-fileinfo->needs-refresh info) t))\n-                 (setq file (pop files)))\n-                (t (setq file (pop files)))))))\n+          (if (string-lessp (git-fileinfo->name info) file)\n+              (setq node (ewoc-next status node))\n+            (if (string-equal (git-fileinfo->name info) file)\n+                (apply func info args))\n+            (setq file (pop files))))))))\n+\n+(defun git-set-filenames-state (status files state)\n+  \"Set the state of a list of named files.\"\n+  (when files\n+    (git-status-filenames-map status\n+                              (lambda (info state)\n+                                (unless (eq (git-fileinfo->state info) state)\n+                                  (setf (git-fileinfo->state info) state)\n+                                  (setf (git-fileinfo->rename-state info) nil)\n+                                  (setf (git-fileinfo->orig-name info) nil)\n+                                  (setf (git-fileinfo->needs-refresh info) t)))\n+                              files state)\n     (unless state  ;; delete files whose state has been set to nil\n       (ewoc-filter status (lambda (info) (git-fileinfo->state info))))))\n \n@@ -1197,11 +1204,20 @@ Return the list of files that haven't been handled.\"\n   (interactive)\n   (let* ((status git-status)\n          (pos (ewoc-locate status))\n+         (marked-files (git-get-filenames (ewoc-collect status (lambda (info) (git-fileinfo->marked info)))))\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-update-status-files nil)\n+    ; restore file marks\n+    (when marked-files\n+      (git-status-filenames-map status\n+                                (lambda (info)\n+                                        (setf (git-fileinfo->marked info) t)\n+                                        (setf (git-fileinfo->needs-refresh info) t))\n+                                marked-files)\n+      (git-refresh-files))\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.2.121.gf7223\n\n-- \nAlexandre Julliard\njulliard@winehq.org\n"}]}