git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alexandre Julliard <julliard@winehq.org>
To: git@vger.kernel.org
Subject: [PATCH 3/3] git.el: Display file types and type changes.
Date: Sun, 06 Jan 2008 12:13:36 +0100	[thread overview]
Message-ID: <87y7b36wbj.fsf@wine.dyndns.org> (raw)

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>
---
 contrib/emacs/git.el |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
index 820df11..5f0d461 100644
--- a/contrib/emacs/git.el
+++ b/contrib/emacs/git.el
@@ -489,8 +489,7 @@ and returns the process output as a string."
   "Set the state of a file info."
   (unless (eq (git-fileinfo->state info) state)
     (setf (git-fileinfo->state info) state
-          (git-fileinfo->old-perm info) 0
-          (git-fileinfo->new-perm info) 0
+          (git-fileinfo->new-perm info) (git-fileinfo->old-perm info)
           (git-fileinfo->rename-state info) nil
           (git-fileinfo->orig-name info) nil
           (git-fileinfo->needs-refresh info) t)))
@@ -524,6 +523,7 @@ and returns the process output as a string."
     (?A 'added)
     (?D 'deleted)
     (?U 'unmerged)
+    (?T 'modified)
     (t nil)))
 
 (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))
     (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)
   "Return a string describing the copy or rename associated with INFO, or an empty string if none."
   (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-permissions-as-string (git-fileinfo->old-perm info) (git-fileinfo->new-perm info))
                   "  " (git-escape-file-name (git-fileinfo->name info))
+                  (git-file-type-as-string info)
                   (git-rename-as-string info))))
 
 (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)
       (goto-char (point-min))
       (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)
         (let ((old-perm (string-to-number (match-string 1) 8))
               (new-perm (string-to-number (match-string 2) 8))
-- 
1.5.4.rc2.53.gb6f8

-- 
Alexandre Julliard
julliard@winehq.org

                 reply	other threads:[~2008-01-06 11:14 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y7b36wbj.fsf@wine.dyndns.org \
    --to=julliard@winehq.org \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).