diff options
author | Dmitry Gutov <dgutov@yandex.ru> | 2017-05-01 19:46:24 +0300 |
---|---|---|
committer | Dmitry Gutov <dgutov@yandex.ru> | 2017-05-01 19:54:34 +0300 |
commit | 8e94fb1dd952ed73ea03b1cd6d30eee4d6549e1a (patch) | |
tree | dee14f4a592cd944cf0e4fe199c885a8693071b0 /lisp/vc | |
parent | c889b0998434776fbabc2a7fee0b29232ff98424 (diff) | |
download | emacs-8e94fb1dd952ed73ea03b1cd6d30eee4d6549e1a.tar.gz emacs-8e94fb1dd952ed73ea03b1cd6d30eee4d6549e1a.tar.bz2 emacs-8e94fb1dd952ed73ea03b1cd6d30eee4d6549e1a.zip |
vc-git-state: Return `ignored' as appropriate with newer Git
* lisp/vc/vc-git.el
(vc-git--program-version): New variable.
(vc-git--program-version): New function.
(vc-git-state): Use it to choose whether to add '--ignored' (bug#19343).
Diffstat (limited to 'lisp/vc')
-rw-r--r-- | lisp/vc/vc-git.el | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 0e1c08c51ff..f70bbddbe7b 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -231,6 +231,19 @@ Should be consistent with the Git config value i18n.logOutputEncoding." (?U 'edited) ;; FIXME (?T 'edited))) ;; FIXME +(defvar vc-git--program-version nil) + +(defun vc-git--program-version () + (or vc-git--program-version + (let ((version-string + (vc-git--run-command-string nil "version"))) + (setq vc-git--program-version + (if (and version-string + (string-match "git version \\([0-9.]+\\)$" + version-string)) + (match-string 1 version-string) + "0"))))) + (defun vc-git--git-status-to-vc-state (code-list) "Convert CODE-LIST to a VC status. @@ -268,25 +281,20 @@ in the order given by 'git status'." (defun vc-git-state (file) "Git-specific version of `vc-state'." - ;; FIXME: Still can't detect `ignored', see below, and returns - ;; `up-to-date' instead. Which is rarely a problem because - ;; `vc-backend' returns nil for ignored files. - ;; - ;; It also can't set `needs-update' or `needs-merge'. The rough + ;; It can't set `needs-update' or `needs-merge'. The rough ;; equivalent would be that upstream branch for current branch is in ;; fast-forward state i.e. current branch is direct ancestor of ;; corresponding upstream branch, and the file was modified ;; upstream. We'd need to check against the upstream tracking ;; branch for that (an extra process call or two). - (let ((status - (vc-git--run-command-string file "status" "--porcelain" "-z" - ;; Just to be explicit, it's the - ;; default anyway. - "--untracked-files" - ;; Requires Git 1.7.6.3 or so, - ;; so does not work in CentOS 6 - ;; "--ignored" - "--"))) + (let* ((args + `("status" "--porcelain" "-z" + ;; Just to be explicit, it's the default anyway. + "--untracked-files" + ,@(when (version<= "1.7.6.3" (vc-git--program-version)) + '("--ignored")) + "--")) + (status (apply #'vc-git--run-command-string file args))) ;; Alternatively, the `ignored' state could be detected with 'git ;; ls-files -i -o --exclude-standard', but that's an extra process ;; call, and the `ignored' state is rarely needed. |