Browse Source

Merge branch 'for-junio' of git://source.winehq.org/~julliard/git/git

* 'for-junio' of git://source.winehq.org/~julliard/git/git:
  Add a README in the contrib/emacs directory.
  git.el: Improve the confirmation message on remove and revert.
  git.el: Make sure that file lists are sorted as they are created.
maint
Junio C Hamano 16 years ago
parent
commit
2d602e9179
  1. 39
      contrib/emacs/README
  2. 37
      contrib/emacs/git.el

39
contrib/emacs/README

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
This directory contains various modules for Emacs support.

To make the modules available to Emacs, you should add this directory
to your load-path, and then require the modules you want. This can be
done by adding to your .emacs something like this:

(add-to-list 'load-path ".../git/contrib/emacs")
(require 'git)
(require 'git-blame)


The following modules are available:

* git.el:

Status manager that displays the state of all the files of the
project, and provides easy access to the most frequently used git
commands. The user interface is as far as possible compatible with
the pcl-cvs mode. It can be started with `M-x git-status'.

* git-blame.el:

Emacs implementation of incremental git-blame. When you turn it on
while viewing a file, the editor buffer will be updated by setting
the background of individual lines to a color that reflects which
commit it comes from. And when you move around the buffer, a
one-line summary will be shown in the echo area.

* vc-git.el:

This file used to contain the VC-mode backend for git, but it is no
longer distributed with git. It is now maintained as part of Emacs
and included in standard Emacs distributions starting from version
22.2.

If you have an earlier Emacs version, upgrading to Emacs 22 is
recommended, since the VC mode in older Emacs is not generic enough
to be able to support git in a reasonable manner, and no attempt has
been made to backport vc-git.el.

37
contrib/emacs/git.el

@ -530,9 +530,9 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)." @@ -530,9 +530,9 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)."
(git-fileinfo->needs-refresh info) t)))

(defun git-status-filenames-map (status func files &rest args)
"Apply FUNC to the status files names in the FILES list."
"Apply FUNC to the status files names in the FILES list.
The list must be sorted."
(when files
(setq files (sort files #'string-lessp))
(let ((file (pop files))
(node (ewoc-nth status 0)))
(while (and file node)
@ -545,7 +545,7 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)." @@ -545,7 +545,7 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)."
(setq file (pop files))))))))

(defun git-set-filenames-state (status files state)
"Set the state of a list of named files."
"Set the state of a list of named files. The list must be sorted"
(when files
(git-status-filenames-map status #'git-set-fileinfo-state files state)
(unless state ;; delete files whose state has been set to nil
@ -750,6 +750,7 @@ Return the list of files that haven't been handled." @@ -750,6 +750,7 @@ Return the list of files that haven't been handled."
(let (unmerged-files)
(while (re-search-forward "[0-7]\\{6\\} [0-9a-f]\\{40\\} [123]\t\\([^\0]+\\)\0" nil t)
(push (match-string 1) unmerged-files))
(setq unmerged-files (nreverse unmerged-files)) ;; assume it is sorted already
(git-set-filenames-state status unmerged-files 'unmerged))))

(defun git-get-exclude-files ()
@ -770,17 +771,18 @@ Return the list of files that haven't been handled." @@ -770,17 +771,18 @@ Return the list of files that haven't been handled."
(append options (mapcar (lambda (f) (concat "--exclude-from=" f)) exclude-files)))))

(defun git-update-status-files (&optional files mark-files)
"Update the status of FILES from the index."
"Update the status of FILES from the index.
The FILES list must be sorted."
(unless git-status (error "Not in git-status buffer."))
;; set the needs-update flag on existing files
(if (setq files (sort files #'string-lessp))
(if files
(git-status-filenames-map
git-status (lambda (info) (setf (git-fileinfo->needs-update info) t)) files)
(ewoc-map (lambda (info) (setf (git-fileinfo->needs-update info) t) nil) git-status)
(git-call-process nil "update-index" "--refresh")
(when git-show-uptodate
(git-run-ls-files-cached git-status nil 'uptodate)))
(let* ((remaining-files
(let ((remaining-files
(if (git-empty-db-p) ; we need some special handling for an empty db
(git-run-ls-files-cached git-status files 'added)
(git-run-diff-index git-status files))))
@ -825,13 +827,13 @@ Return the list of files that haven't been handled." @@ -825,13 +827,13 @@ Return the list of files that haven't been handled."
(list (ewoc-data (ewoc-locate git-status)))))

(defun git-marked-files-state (&rest states)
"Return marked files that are in the specified states."
"Return a sorted list of marked files that are in the specified states."
(let ((files (git-marked-files))
result)
(dolist (info files)
(when (memq (git-fileinfo->state info) states)
(push info result)))
result))
(nreverse result)))

(defun git-refresh-files ()
"Refresh all files that need it and clear the needs-refresh flag."
@ -1066,7 +1068,9 @@ Return the list of files that haven't been handled." @@ -1066,7 +1068,9 @@ Return the list of files that haven't been handled."
(unless files
(push (file-relative-name (read-file-name "File to remove: " nil nil t)) files))
(if (yes-or-no-p
(format "Remove %d file%s? " (length files) (if (> (length files) 1) "s" "")))
(if (cdr files)
(format "Remove %d files? " (length files))
(format "Remove %s? " (car files))))
(progn
(dolist (name files)
(ignore-errors
@ -1085,7 +1089,9 @@ Return the list of files that haven't been handled." @@ -1085,7 +1089,9 @@ Return the list of files that haven't been handled."
added modified)
(when (and files
(yes-or-no-p
(format "Revert %d file%s? " (length files) (if (> (length files) 1) "s" ""))))
(if (cdr files)
(format "Revert %d files? " (length files))
(format "Revert %s? " (git-fileinfo->name (car files))))))
(dolist (info files)
(case (git-fileinfo->state info)
('added (push (git-fileinfo->name info) added))
@ -1101,13 +1107,14 @@ Return the list of files that haven't been handled." @@ -1101,13 +1107,14 @@ Return the list of files that haven't been handled."
(or (not added)
(apply 'git-call-process-display-error "update-index" "--force-remove" "--" added))
(or (not modified)
(apply 'git-call-process-display-error "checkout" "HEAD" modified)))))
(git-update-status-files (append added modified))
(apply 'git-call-process-display-error "checkout" "HEAD" modified))))
(names (git-get-filenames files)))
(git-update-status-files names)
(when ok
(dolist (file modified)
(let ((buffer (get-file-buffer file)))
(when buffer (with-current-buffer buffer (revert-buffer t t t)))))
(git-success-message "Reverted" (git-get-filenames files)))))))
(git-success-message "Reverted" names))))))

(defun git-resolve-file ()
"Resolve conflicts in marked file(s)."
@ -1365,14 +1372,14 @@ Return the list of files that haven't been handled." @@ -1365,14 +1372,14 @@ Return the list of files that haven't been handled."
(mapconcat #'identity msg "\n"))))

(defun git-get-commit-files (commit)
"Retrieve the list of files modified by COMMIT."
"Retrieve a sorted list of files modified by COMMIT."
(let (files)
(with-temp-buffer
(git-call-process t "diff-tree" "-m" "-r" "-z" "--name-only" "--no-commit-id" "--root" commit)
(goto-char (point-min))
(while (re-search-forward "\\([^\0]*\\)\0" nil t 1)
(push (match-string 1) files)))
files))
(sort files #'string-lessp)))

(defun git-read-commit-name (prompt &optional default)
"Ask for a commit name, with completion for local branch, remote branch and tag."

Loading…
Cancel
Save