comparison lisp/vc.el @ 95946:3a39d3ac157c

(vc-deduce-fileset): Check if the buffer has a file. (vc-register): Call the backend function only once, instead of once for each file. (vc-next-action): Update call to vc-register. (vc-dir-register): Remove function. (vc-dir): Bind vc-register instead of vc-dir-register.
author Dan Nicolaescu <dann@ics.uci.edu>
date Sun, 15 Jun 2008 02:52:44 +0000
parents 7561b5637b81
children 054335cbee3d
comparison
equal deleted inserted replaced
95945:ffee379e1fac 95946:3a39d3ac157c
1040 (with-current-buffer vc-parent-buffer 1040 (with-current-buffer vc-parent-buffer
1041 (eq major-mode 'vc-dir-mode)))) 1041 (eq major-mode 'vc-dir-mode))))
1042 (progn 1042 (progn
1043 (set-buffer vc-parent-buffer) 1043 (set-buffer vc-parent-buffer)
1044 (vc-deduce-fileset))) 1044 (vc-deduce-fileset)))
1045 ((not buffer-file-name)
1046 (error "Buffer %s is not associated with a file" (buffer-name)))
1045 ((and allow-unregistered (not (vc-registered buffer-file-name))) 1047 ((and allow-unregistered (not (vc-registered buffer-file-name)))
1046 (list (vc-responsible-backend 1048 (list (vc-responsible-backend
1047 (file-name-directory (buffer-file-name))) 1049 (file-name-directory (buffer-file-name)))
1048 (list buffer-file-name) (list buffer-file-name))) 1050 (list buffer-file-name) (list buffer-file-name)))
1049 (t (error "No fileset is available here."))))) 1051 (t (error "No fileset is available here.")))))
1142 ((eq state 'missing) 1144 ((eq state 'missing)
1143 (error "Fileset files are missing, so cannot be operated on.")) 1145 (error "Fileset files are missing, so cannot be operated on."))
1144 ((eq state 'ignored) 1146 ((eq state 'ignored)
1145 (error "Fileset files are ignored by the version-control system.")) 1147 (error "Fileset files are ignored by the version-control system."))
1146 ((or (null state) (eq state 'unregistered)) 1148 ((or (null state) (eq state 'unregistered))
1147 (mapc (lambda (arg) (vc-register nil arg)) files)) 1149 (vc-register nil vc-fileset))
1148 ;; Files are up-to-date, or need a merge and user specified a revision 1150 ;; Files are up-to-date, or need a merge and user specified a revision
1149 ((or (eq state 'up-to-date) (and verbose (eq state 'needs-update))) 1151 ((or (eq state 'up-to-date) (and verbose (eq state 'needs-update)))
1150 (cond 1152 (cond
1151 (verbose 1153 (verbose
1152 ;; go to a different revision 1154 ;; go to a different revision
1292 (mapcar (lambda (b) (list (downcase (symbol-name b)))) vc-handled-backends) 1294 (mapcar (lambda (b) (list (downcase (symbol-name b)))) vc-handled-backends)
1293 nil t))))) 1295 nil t)))))
1294 (vc-call-backend backend 'create-repo)) 1296 (vc-call-backend backend 'create-repo))
1295 1297
1296 ;;;###autoload 1298 ;;;###autoload
1297 (defun vc-register (&optional set-revision fname comment) 1299 (defun vc-register (&optional set-revision vc-fileset comment)
1298 "Register into a version control system. 1300 "Register into a version control system.
1299 If FNAME is given register that file, otherwise register the current file. 1301 If VC-FILESET is given, register the files in that fileset.
1302 Otherwise register the current file.
1300 With prefix argument SET-REVISION, allow user to specify initial revision 1303 With prefix argument SET-REVISION, allow user to specify initial revision
1301 level. If COMMENT is present, use that as an initial comment. 1304 level. If COMMENT is present, use that as an initial comment.
1302 1305
1303 The version control system to use is found by cycling through the list 1306 The version control system to use is found by cycling through the list
1304 `vc-handled-backends'. The first backend in that list which declares 1307 `vc-handled-backends'. The first backend in that list which declares
1305 itself responsible for the file (usually because other files in that 1308 itself responsible for the file (usually because other files in that
1306 directory are already registered under that backend) will be used to 1309 directory are already registered under that backend) will be used to
1307 register the file. If no backend declares itself responsible, the 1310 register the file. If no backend declares itself responsible, the
1308 first backend that could register the file is used." 1311 first backend that could register the file is used."
1309 (interactive "P") 1312 (interactive "P")
1310 (when (and (null fname) (null buffer-file-name)) (error "No visited file")) 1313 (let* ((fileset-arg (or vc-fileset (vc-deduce-fileset nil t)))
1311 1314 (backend (car fileset-arg))
1312 (let ((bname (if fname (get-file-buffer fname) (current-buffer)))) 1315 (files (nth 1 fileset-arg))
1313 (unless fname (setq fname buffer-file-name)) 1316 (fileset-only-files (nth 2 fileset-arg)))
1314 (when (vc-backend fname) 1317 (dolist (fname fileset-only-files)
1315 (if (vc-registered fname) 1318 (let ((bname (get-file-buffer fname)))
1316 (error "This file is already registered") 1319 (unless fname (setq fname buffer-file-name))
1317 (unless (y-or-n-p "Previous master file has vanished. Make a new one? ") 1320 (when (vc-backend fname)
1318 (error "Aborted")))) 1321 (if (vc-registered fname)
1319 ;; Watch out for new buffers of size 0: the corresponding file 1322 (error "This file is already registered")
1320 ;; does not exist yet, even though buffer-modified-p is nil. 1323 (unless (y-or-n-p "Previous master file has vanished. Make a new one? ")
1321 (when bname 1324 (error "Aborted"))))
1322 (with-current-buffer bname 1325 ;; Watch out for new buffers of size 0: the corresponding file
1323 (when (and (not (buffer-modified-p)) 1326 ;; does not exist yet, even though buffer-modified-p is nil.
1324 (zerop (buffer-size)) 1327 (when bname
1325 (not (file-exists-p buffer-file-name))) 1328 (with-current-buffer bname
1326 (set-buffer-modified-p t)) 1329 (when (and (not (buffer-modified-p))
1327 (vc-buffer-sync))) 1330 (zerop (buffer-size))
1328 (vc-start-logentry (list fname) 1331 (not (file-exists-p buffer-file-name)))
1329 (if set-revision 1332 (set-buffer-modified-p t))
1330 (read-string (format "Initial revision level for %s: " 1333 (vc-buffer-sync)))))
1331 fname)) 1334 (lexical-let ((backend backend)
1332 (vc-call-backend (vc-responsible-backend fname) 1335 (files fileset-only-files))
1333 'init-revision)) 1336 (vc-start-logentry
1334 (or comment (not vc-initial-comment)) 1337 files
1335 nil 1338 (if set-revision
1336 "Enter initial comment." 1339 (read-string (format "Initial revision level for %s: "
1337 "*VC-log*" 1340 files))
1338 (lambda (files rev comment) 1341 (vc-call-backend backend 'init-revision))
1339 (dolist (file files) 1342 (or comment (not vc-initial-comment))
1340 (message "Registering %s... " file) 1343 nil
1341 (let ((backend (vc-responsible-backend file t))) 1344 "Enter initial comment."
1342 (vc-file-clearprops file) 1345 "*VC-log*"
1343 (vc-call-backend backend 'register (list file) rev comment) 1346 (lambda (files rev comment)
1344 (vc-file-setprop file 'vc-backend backend) 1347 (message "Registering %s... " files)
1345 (unless vc-make-backup-files 1348 (dolist (file files)
1346 (make-local-variable 'backup-inhibited) 1349 (vc-file-clearprops file))
1347 (setq backup-inhibited t))) 1350 (vc-call-backend backend 'register files rev comment)
1348 (message "Registering %s... done" file)))))) 1351 (dolist (file files)
1352 (vc-file-setprop file 'vc-backend backend)
1353 (unless vc-make-backup-files
1354 ;; FIXME: Is this code right? What is it supposed to do?
1355 (make-local-variable 'backup-inhibited)
1356 (setq backup-inhibited t)))
1357 (message "Registering %s... done" files))))))
1349 1358
1350 (defun vc-register-with (backend) 1359 (defun vc-register-with (backend)
1351 "Register the current file with a specified back end." 1360 "Register the current file with a specified back end."
1352 (interactive "SBackend: ") 1361 (interactive "SBackend: ")
1353 (when (not (member backend vc-handled-backends)) 1362 (when (not (member backend vc-handled-backends))
1998 (interactive) 2007 (interactive)
1999 (ewoc-filter 2008 (ewoc-filter
2000 vc-ewoc 2009 vc-ewoc
2001 (lambda (crt) (not (eq (vc-dir-fileinfo->state crt) 'up-to-date))))) 2010 (lambda (crt) (not (eq (vc-dir-fileinfo->state crt) 'up-to-date)))))
2002 2011
2003 (defun vc-dir-register ()
2004 "Register the marked files, or the current file if no marks."
2005 (interactive)
2006 ;; FIXME: Just pass the fileset to vc-register.
2007 (mapc (lambda (arg) (vc-register nil arg))
2008 (or (vc-dir-marked-files) (list (vc-dir-current-file)))))
2009
2010 (defun vc-default-status-fileinfo-extra (backend file) 2012 (defun vc-default-status-fileinfo-extra (backend file)
2011 "Default absence of extra information returned for a file." 2013 "Default absence of extra information returned for a file."
2012 nil) 2014 nil)
2013 2015
2014 ;; FIXME: Replace these with a more efficient dispatch 2016 ;; FIXME: Replace these with a more efficient dispatch
2050 (vc-dir-mode (vc-make-backend-object dir)) 2052 (vc-dir-mode (vc-make-backend-object dir))
2051 ;; FIXME: Make a derived-mode instead. 2053 ;; FIXME: Make a derived-mode instead.
2052 ;; Add VC-specific keybindings 2054 ;; Add VC-specific keybindings
2053 (let ((map (current-local-map))) 2055 (let ((map (current-local-map)))
2054 (define-key map "v" 'vc-next-action) ;; C-x v v 2056 (define-key map "v" 'vc-next-action) ;; C-x v v
2055 (define-key map "=" 'vc-diff) ;; C-x v = 2057 (define-key map "=" 'vc-diff) ;; C-x v =
2056 (define-key map "i" 'vc-dir-register) ;; C-x v i 2058 (define-key map "i" 'vc-register) ;; C-x v i
2057 (define-key map "+" 'vc-update) ;; C-x v + 2059 (define-key map "+" 'vc-update) ;; C-x v +
2058 (define-key map "l" 'vc-print-log) ;; C-x v l 2060 (define-key map "l" 'vc-print-log) ;; C-x v l
2059 ;; More confusing than helpful, probably 2061 ;; More confusing than helpful, probably
2060 ;(define-key map "R" 'vc-revert) ;; u is taken by dispatcher unmark. 2062 ;(define-key map "R" 'vc-revert) ;; u is taken by dispatcher unmark.
2061 ;(define-key map "A" 'vc-annotate) ;; g is taken by dispatcher refresh 2063 ;(define-key map "A" 'vc-annotate) ;; g is taken by dispatcher refresh
2062 (define-key map "x" 'vc-dir-hide-up-to-date)) 2064 (define-key map "x" 'vc-dir-hide-up-to-date))
2063 ) 2065 )