summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog20
-rw-r--r--lisp/vc-bzr.el2
-rw-r--r--lisp/vc-git.el5
-rw-r--r--lisp/vc-hg.el12
-rw-r--r--lisp/vc-hooks.el6
-rw-r--r--lisp/vc-svn.el13
-rw-r--r--lisp/vc.el28
7 files changed, 63 insertions, 23 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index dec21f2d630..585d64cd2ea 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,23 @@
+2007-12-29 Eric S. Raymond <esr@snark.thyrsus.com>
+
+ * vc-svn.el (vc-svn-parse-status): Recognize 'unregistered,
+ 'added, 'removed.
+
+ * vc.el (header coment): Better description of dir-state.
+ (vc-compatible-state): New function. Checks whether two states
+ can be in the same changeset; used with 'edited it can test whether
+ the next action for a state should be commit.
+ (vc-default-dired-format0info): Display 'added state.
+ (vc-dired-hook): Turn off undo, this is a speed tweak.
+
+ * vc-bzr.el (vc-bzr-dir-state): Recognize 'added.
+
+ * vc-hg.el (vc-bzr-hg-state): Recognize 'added and 'removed.
+ Cope with the possibility that the 'C' status flag might change
+ in 0.9,6.
+
+ * vc-git.el (vc-bzr-dir-state): Recognize 'removed.
+
2007-12-29 Thien-Thi Nguyen <ttn@gnuvola.org>
* files.el (cd-absolute): Fix omission bug:
diff --git a/lisp/vc-bzr.el b/lisp/vc-bzr.el
index 01599c91dff..8a1c56490ac 100644
--- a/lisp/vc-bzr.el
+++ b/lisp/vc-bzr.el
@@ -522,7 +522,7 @@ Optional argument LOCALP is always ignored."
(setq at-start nil)
(cond
((looking-at "^added")
- (setq current-vc-state 'edited)
+ (setq current-vc-state 'added)
(setq current-bzr-state 'added))
((looking-at "^kind changed")
(setq current-vc-state 'edited)
diff --git a/lisp/vc-git.el b/lisp/vc-git.el
index 7895251be0e..1626d5347ee 100644
--- a/lisp/vc-git.el
+++ b/lisp/vc-git.el
@@ -168,19 +168,20 @@
(line-end-position))))
(cond
;; The rest of the possible states in "git ls-files -t" output:
- ;; R removed/deleted
;; K to be killed
;; should not show up in vc-dired, so don't deal with them
;; here.
((eq status-char ?H)
(vc-file-setprop file 'vc-state 'up-to-date))
+ ((eq status-char ?R)
+ (vc-file-setprop file 'vc-state 'removed))
((eq status-char ?M)
(vc-file-setprop file 'vc-state 'edited))
((eq status-char ?C)
(vc-file-setprop file 'vc-state 'edited))
((eq status-char ??)
(vc-file-setprop file 'vc-backend 'none)
- (vc-file-setprop file 'vc-state 'nil)))
+ (vc-file-setprop file 'vc-state nil)))
(forward-line)))))
(defun vc-git-working-revision (file)
diff --git a/lisp/vc-hg.el b/lisp/vc-hg.el
index b3482ddffae..6970ed72ccf 100644
--- a/lisp/vc-hg.el
+++ b/lisp/vc-hg.el
@@ -194,8 +194,8 @@
(buffer-substring-no-properties (+ (point) 2)
(line-end-position))))
(cond
+ ;; State flag for a clean file is now C, might change to =.
;; The rest of the possible states in "hg status" output:
- ;; R = removed
;; ! = deleted, but still tracked
;; should not show up in vc-dired, so don't deal with them
;; here.
@@ -203,14 +203,20 @@
(vc-file-setprop file 'vc-state 'up-to-date))
((eq status-char ?A)
(vc-file-setprop file 'vc-working-revision "0")
- (vc-file-setprop file 'vc-state 'edited))
+ (vc-file-setprop file 'vc-state 'added))
+ ((eq status-char ?R)
+ (vc-file-setprop file 'vc-state 'removed))
((eq status-char ?M)
(vc-file-setprop file 'vc-state 'edited))
((eq status-char ?I)
(vc-file-setprop file 'vc-state 'ignored))
((eq status-char ??)
(vc-file-setprop file 'vc-backend 'none)
- (vc-file-setprop file 'vc-state 'unregistered)))
+ (vc-file-setprop file 'vc-state 'unregistered))
+ ((eq status-char ?!)
+ nil)
+ (t ;; Presently C, might change to = in 0.9.6
+ (vc-file-setprop file 'vc-state 'up-to-date)))
(forward-line)))))
(defun vc-hg-working-revision (file)
diff --git a/lisp/vc-hooks.el b/lisp/vc-hooks.el
index 3d589e117c8..39550da8018 100644
--- a/lisp/vc-hooks.el
+++ b/lisp/vc-hooks.el
@@ -503,14 +503,16 @@ For registered files, the value returned is one of:
Often represented by vc-working-revision = \"0\" in VCSes
with monotonic IDs like Subversion and Mercurial.
- 'ignored The file showed up in a dir-state listing with a flag
+ 'removed Scheduled to be deleted from the repository on next commit.
+
+ 'ignored The file showed up in a dir-state listing with a flag
indicating the version-control system is ignoring it,
Note: This property is not set reliably (some VCSes
don't have useful directory-status commands) so assume
that any file with vc-state nil might be ignorable
without VC knowing it.
- 'unregistered The file showed up in a dir-state listing with a flag
+ 'unregistered The file showed up in a dir-state listing with a flag
indicating that it is not under version control.
Note: This property is not set reliably (some VCSes
don't have useful directory-status commands) so assume
diff --git a/lisp/vc-svn.el b/lisp/vc-svn.el
index ced4c941b55..c1261c5d0a4 100644
--- a/lisp/vc-svn.el
+++ b/lisp/vc-svn.el
@@ -543,15 +543,16 @@ information about FILENAME and return its status."
(let (file status)
(goto-char (point-min))
(while (re-search-forward
- ;; Ignore the files with status in [IX?].
- "^[ ACDGMR!~][ MC][ L][ +][ S]..\\([ *]\\) +\\([-0-9]+\\) +\\([0-9?]+\\) +\\([^ ]+\\) +" nil t)
+ ;; Ignore the files with status X.
+ "^[ ACDGIMR!?~][ MC][ L][ +][ S]..\\([ *]\\) +\\([-0-9]+\\) +\\([0-9?]+\\) +\\([^ ]+\\) +" nil t)
;; If the username contains spaces, the output format is ambiguous,
;; so don't trust the output's filename unless we have to.
(setq file (or filename
(expand-file-name
(buffer-substring (point) (line-end-position)))))
(setq status (char-after (line-beginning-position)))
- (unless (eq status ??)
+ (if (eq status ??)
+ (vc-file-setprop file 'vc-state 'unregistered)
;; `vc-BACKEND-registered' must not set vc-backend,
;; which is instead set in vc-registered.
(unless filename (vc-file-setprop file 'vc-backend 'SVN))
@@ -573,15 +574,15 @@ information about FILENAME and return its status."
;; If the file was actually copied, (match-string 2) is "-".
(vc-file-setprop file 'vc-working-revision "0")
(vc-file-setprop file 'vc-checkout-time 0)
- 'edited)
+ 'added)
((memq status '(?M ?C))
(if (eq (char-after (match-beginning 1)) ?*)
'needs-merge
'edited))
((eq status ?I)
(vc-file-setprop file 'vc-state 'ignored))
- ((eq status ??)
- (vc-file-setprop file 'vc-state 'unregistered))
+ ((eq status ?R)
+ (vc-file-setprop file 'vc-state 'removed))
(t 'edited)))))
(if filename (vc-file-getprop filename 'vc-state))))
diff --git a/lisp/vc.el b/lisp/vc.el
index 5ec872523b5..f25045bc469 100644
--- a/lisp/vc.el
+++ b/lisp/vc.el
@@ -159,12 +159,13 @@
;;
;; - dir-state (dir)
;;
-;; If provided, this function is used to find the version control state
-;; of all files in DIR, and all subdirecties of DIR, in a fast way.
-;; The function should not return anything, but rather store the files'
-;; states into the corresponding `vc-state' properties. (Note: in
-;; older versions this method was not required to recurse into
-;; subdirectories.)
+;; If provided, this function is used to find the version control
+;; state of as many files as possible in DIR, and all subdirecties
+;; of DIR, in a fast way; it is used to avoid expensive indivitual
+;; vc-state calls. The function should not return anything, but
+;; rather store the files' states into the corresponding `vc-state'
+;; properties. (Note: in older versions this method was not
+;; required to recurse into subdirectories.)
;;
;; * working-revision (file)
;;
@@ -1346,6 +1347,12 @@ NOT-URGENT means it is ok to continue if the user says not to save."
(defvar vc-dired-window-configuration)
+(defun vc-compatible-state (p q)
+ "Controls which states can be in the same commit."
+ (or
+ (eq p q)
+ (and (member p '(edited added removed)) (member q '(edited added removed)))))
+
;; Here's the major entry point.
;;;###autoload
@@ -1386,7 +1393,7 @@ merge in the changes into your working copy."
revision)
;; Verify that the fileset is homogenous
(dolist (file (cdr files))
- (if (not (eq (vc-state file) state))
+ (if (not (vc-compatible-state (vc-state file) state))
(error "Fileset is in a mixed-up state"))
(if (not (eq (vc-checkout-model file) model))
(error "Fileset has mixed checkout models")))
@@ -1436,7 +1443,7 @@ merge in the changes into your working copy."
;; do nothing
(message "Fileset is up-to-date"))))
;; Files have local changes
- ((eq state 'edited)
+ ((vc-compatible-state state 'edited)
(let ((ready-for-commit files))
;; If files are edited but read-only, give user a chance to correct
(dolist (file files)
@@ -2349,7 +2356,9 @@ Called by dired after any portion of a vc-dired buffer has been read in."
(if (and (vc-call-backend backend 'responsible-p default-directory)
(vc-find-backend-function backend 'dir-state))
(vc-call-backend backend 'dir-state default-directory)))
- (let (filename (inhibit-read-only t))
+ (let (filename
+ (inhibit-read-only t)
+ (buffer-undo-list t))
(goto-char (point-min))
(while (not (eobp))
(cond
@@ -3076,6 +3085,7 @@ to provide the `find-revision' operation instead."
((eq state 'needs-merge) "(merge)")
((eq state 'needs-patch) "(patch)")
((eq state 'added) "(added)")
+ ((eq state 'removed) "(removed)")
((eq state 'ignored) "(ignored)") ;; dired-hook filters this out
((eq state 'unregistered) "?")
((eq state 'unlocked-changes) "(stale)")