Merge branch 'master' of git://git.kernel.org/pub/scm/gitk/gitk
[gitweb.git] / contrib / emacs / git.el
index b92bbe8728aa9c0e0221ad3bcb549e3dd0b0d6c8..f6102fc344a62982b2ed489e0c077852b8b6ccca 100644 (file)
@@ -530,7 +530,7 @@ and returns the process output as a string."
     (setf (git-fileinfo->needs-refresh info) t)
     (when node   ;preserve the marked flag
       (setf (git-fileinfo->marked info) (git-fileinfo->marked (ewoc-data node))))
-    (if node (ewoc-set-data node info) (ewoc-enter-last status info))))
+    (if node (setf (ewoc-data node) info) (ewoc-enter-last status info))))
 
 (defun git-run-diff-index (status files)
   "Run git-diff-index on FILES and parse the results into STATUS.
@@ -589,6 +589,16 @@ Return the list of files that haven't been handled."
           (when node (push (ewoc-data node) unmerged-files))))
       (git-set-files-state unmerged-files 'unmerged))))
 
+(defun git-get-exclude-files ()
+  "Get the list of exclude files to pass to git-ls-files."
+  (let (files
+        (config (git-config "core.excludesfile")))
+    (when (file-readable-p ".git/info/exclude")
+      (push ".git/info/exclude" files))
+    (when (and config (file-readable-p config))
+      (push config files))
+    files))
+
 (defun git-update-status-files (files &optional default-state)
   "Update the status of FILES from the index."
   (unless git-status (error "Not in git-status buffer."))
@@ -598,11 +608,11 @@ Return the list of files that haven't been handled."
               (git-run-ls-files status files 'added "-c")
             (git-run-diff-index status files))))
     (git-run-ls-unmerged status files)
-    (when (and (or (not files) remaining-files)
-               (file-readable-p ".git/info/exclude"))
-      (setq remaining-files (git-run-ls-files status remaining-files
-                                              'unknown "-o" "--exclude-from=.git/info/exclude"
-                                              (concat "--exclude-per-directory=" git-per-dir-ignore-file))))
+    (when (or (not files) remaining-files)
+      (let ((exclude-files (git-get-exclude-files)))
+        (setq remaining-files (apply #'git-run-ls-files status remaining-files 'unknown "-o"
+                                     (concat "--exclude-per-directory=" git-per-dir-ignore-file)
+                                     (mapcar (lambda (f) (concat "--exclude-from=" f)) exclude-files)))))
     ; mark remaining files with the default state (or remove them if nil)
     (when remaining-files
       (if default-state
@@ -1058,7 +1068,7 @@ Return the list of files that haven't been handled."
   (let ((info (ewoc-data (ewoc-locate git-status))))
     (find-file (git-fileinfo->name info))
     (when (eq 'unmerged (git-fileinfo->state info))
-      (smerge-mode))))
+      (smerge-mode 1))))
 
 (defun git-find-file-other-window ()
   "Visit the current file in its own buffer in another window."