git.el: Display file types and type changes.
Handle the T status from git-diff-index to display type changes between file/symlink/subproject. Also always show the file type for symlink and subprojects to indicate that they are not normal files. Signed-off-by: Alexandre Julliard <julliard@winehq.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
5e3cb7e503
commit
40f162b04b
@ -489,8 +489,7 @@ and returns the process output as a string."
|
|||||||
"Set the state of a file info."
|
"Set the state of a file info."
|
||||||
(unless (eq (git-fileinfo->state info) state)
|
(unless (eq (git-fileinfo->state info) state)
|
||||||
(setf (git-fileinfo->state info) state
|
(setf (git-fileinfo->state info) state
|
||||||
(git-fileinfo->old-perm info) 0
|
(git-fileinfo->new-perm info) (git-fileinfo->old-perm info)
|
||||||
(git-fileinfo->new-perm info) 0
|
|
||||||
(git-fileinfo->rename-state info) nil
|
(git-fileinfo->rename-state info) nil
|
||||||
(git-fileinfo->orig-name info) nil
|
(git-fileinfo->orig-name info) nil
|
||||||
(git-fileinfo->needs-refresh info) t)))
|
(git-fileinfo->needs-refresh info) t)))
|
||||||
@ -524,6 +523,7 @@ and returns the process output as a string."
|
|||||||
(?A 'added)
|
(?A 'added)
|
||||||
(?D 'deleted)
|
(?D 'deleted)
|
||||||
(?U 'unmerged)
|
(?U 'unmerged)
|
||||||
|
(?T 'modified)
|
||||||
(t nil)))
|
(t nil)))
|
||||||
|
|
||||||
(defun git-status-code-as-string (code)
|
(defun git-status-code-as-string (code)
|
||||||
@ -538,6 +538,33 @@ and returns the process output as a string."
|
|||||||
('ignored (propertize "Ignored " 'face 'git-ignored-face))
|
('ignored (propertize "Ignored " 'face 'git-ignored-face))
|
||||||
(t "? ")))
|
(t "? ")))
|
||||||
|
|
||||||
|
(defun git-file-type-as-string (info)
|
||||||
|
"Return a string describing the file type of INFO."
|
||||||
|
(let* ((old-type (lsh (or (git-fileinfo->old-perm info) 0) -9))
|
||||||
|
(new-type (lsh (or (git-fileinfo->new-perm info) 0) -9))
|
||||||
|
(str (case new-type
|
||||||
|
(?\100 ;; file
|
||||||
|
(case old-type
|
||||||
|
(?\100 nil)
|
||||||
|
(?\120 " (type change symlink -> file)")
|
||||||
|
(?\160 " (type change subproject -> file)")))
|
||||||
|
(?\120 ;; symlink
|
||||||
|
(case old-type
|
||||||
|
(?\100 " (type change file -> symlink)")
|
||||||
|
(?\160 " (type change subproject -> symlink)")
|
||||||
|
(t " (symlink)")))
|
||||||
|
(?\160 ;; subproject
|
||||||
|
(case old-type
|
||||||
|
(?\100 " (type change file -> subproject)")
|
||||||
|
(?\120 " (type change symlink -> subproject)")
|
||||||
|
(t " (subproject)")))
|
||||||
|
(?\000 ;; deleted or unknown
|
||||||
|
(case old-type
|
||||||
|
(?\120 " (symlink)")
|
||||||
|
(?\160 " (subproject)")))
|
||||||
|
(t (format " (unknown type %o)" new-type)))))
|
||||||
|
(if str (propertize str 'face 'git-status-face) "")))
|
||||||
|
|
||||||
(defun git-rename-as-string (info)
|
(defun git-rename-as-string (info)
|
||||||
"Return a string describing the copy or rename associated with INFO, or an empty string if none."
|
"Return a string describing the copy or rename associated with INFO, or an empty string if none."
|
||||||
(let ((state (git-fileinfo->rename-state info)))
|
(let ((state (git-fileinfo->rename-state info)))
|
||||||
@ -567,6 +594,7 @@ and returns the process output as a string."
|
|||||||
" " (git-status-code-as-string (git-fileinfo->state info))
|
" " (git-status-code-as-string (git-fileinfo->state info))
|
||||||
" " (git-permissions-as-string (git-fileinfo->old-perm info) (git-fileinfo->new-perm info))
|
" " (git-permissions-as-string (git-fileinfo->old-perm info) (git-fileinfo->new-perm info))
|
||||||
" " (git-escape-file-name (git-fileinfo->name info))
|
" " (git-escape-file-name (git-fileinfo->name info))
|
||||||
|
(git-file-type-as-string info)
|
||||||
(git-rename-as-string info))))
|
(git-rename-as-string info))))
|
||||||
|
|
||||||
(defun git-insert-info-list (status infolist)
|
(defun git-insert-info-list (status infolist)
|
||||||
@ -603,7 +631,7 @@ Return the list of files that haven't been handled."
|
|||||||
(apply #'git-call-process-env t nil "diff-index" "-z" "-M" "HEAD" "--" files)
|
(apply #'git-call-process-env t nil "diff-index" "-z" "-M" "HEAD" "--" files)
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
(while (re-search-forward
|
(while (re-search-forward
|
||||||
":\\([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"
|
":\\([0-7]\\{6\\}\\) \\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\(\\([ADMUT]\\)\0\\([^\0]+\\)\\|\\([CR]\\)[0-9]*\0\\([^\0]+\\)\0\\([^\0]+\\)\\)\0"
|
||||||
nil t 1)
|
nil t 1)
|
||||||
(let ((old-perm (string-to-number (match-string 1) 8))
|
(let ((old-perm (string-to-number (match-string 1) 8))
|
||||||
(new-perm (string-to-number (match-string 2) 8))
|
(new-perm (string-to-number (match-string 2) 8))
|
||||||
|
Reference in New Issue
Block a user