emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fixes to vc-bzr.el for the new VC code


From: Riccardo Murri
Subject: Fixes to vc-bzr.el for the new VC code
Date: Fri, 04 Jan 2008 02:25:48 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux)

Hello,

here's a patch against vc-bzr.el (diff taken against CVS-1.23 HEAD),
containing some misc fixes.  Only slightly tested on 23.0.50.1 built
on Debian from CVS sources.

Short summary of changes:

  - completed transition to new VC; `vc-bzr-state' uses the new
    'removed, 'ignored and 'unregistered states.
  - new customization option `vc-bzr-log-switches' (analogous to
    `vc-bzr-diff-switches'); 
  - bugfix in `vc-bzr-unregister': must not delete unregistered file; 
  - vc-bzr-command overrides only LC_MESSAGES, not the whole
    locale setting;


Detailed changelog:

* Copyright and version headers update.  Remove some outdated comments
  through the whole file.
* (vc-bzr-program-args): Removed because unused.
* (vc-bzr-log-switches): New customization option.
* (vc-bzr-command): Use LC_MESSAGES=C instead of LC_ALL=C. No longer
  use `vc-bzr-program-args'.
* (vc-bzr-revision-granularity): New function.
* (vc-bzr-status): Update regex to match latest Bzr output. Use new
  'removed, 'ignored and 'unregistered states. 
* (vc-bzr-init-revision): New function.
* (vc-bzr-unregister): Must not delete file.
* (vc-bzr-find-revision): New function.
* (vc-bzr-checkout): Argument `rev' is explicit revision only if it's
  a non-empty string, otherwise take head revision.
* (vc-bzr-print-log): Pass `vc-bzr-log-switches' to "bzr log".
* (vc-bzr-diff): Simpler build of the revision spec string.
* (vc-annotate-convert-time, vc-bzr-annotate-difference): Removed:
  compatibility hacks for Emacs21, not needed in Emacs 22.
* (vc-bzr-dir-state): Added code comments. Removed redundant statement.
* (vc-bzr-dired-state-info): Only provide custom strings for
  overloaded VC state 'edited; otherwise fallback to
  `vc-default-dired-state-info'.

-- 
Riccardo Murri, via Galeazzo Alessi 61, 00176 Roma


--- /home/rmurri/src/emacs23/lisp/vc-bzr.el     2007-12-30 22:25:49.000000000 
+0100
+++ vc-bzr.el   2008-01-04 00:25:18.000000000 +0100
@@ -1,11 +1,11 @@
 ;;; vc-bzr.el --- VC backend for the bzr revision control system
 
-;; Copyright (C) 2006, 2007  Free Software Foundation, Inc.
+;; Copyright (C) 2006--2008  Free Software Foundation, Inc.
 
 ;; Author: Dave Love <address@hidden>, Riccardo Murri <address@hidden>
 ;; Keywords: tools
 ;; Created: Sept 2006
-;; Version: 2007-09-05
+;; Version: 2008-01-03 (Bzr revno 22)
 ;; URL: http://launchpad.net/vc-bzr
 
 ;; This file is free software; you can redistribute it and/or modify
@@ -26,13 +26,11 @@
 
 ;;; Commentary:
 
-;; See <URL:http://bazaar-vcs.org/> concerning bzr.
-
-;; Load this library to register bzr support in VC.  It covers basic VC 
-;; functionality, but was only lightly exercised with a few Emacs/bzr
-;; version combinations, namely those current on the authors' PCs.
-;; See various Fixmes below.
+;; See <URL:http://bazaar-vcs.org/> concerning bzr.  See
+;; <URL:http://launchpad.net/vc-bzr> for alternate development
+;; branches of `vc-bzr'.
 
+;; Load this library to register bzr support in VC.  
 
 ;; Known bugs
 ;; ==========
@@ -67,12 +65,6 @@
   :group 'vc-bzr
   :type 'string)
 
-;; Fixme: there's probably no call for this.
-(defcustom vc-bzr-program-args nil
-  "List of global arguments to pass to `vc-bzr-program'."
-  :group 'vc-bzr
-  :type '(repeat string))
-
 (defcustom vc-bzr-diff-switches nil
   "String/list of strings specifying extra switches for bzr diff under VC."
   :type '(choice (const :tag "None" nil)
@@ -80,21 +72,29 @@
                  (repeat :tag "Argument List" :value ("") string))
   :group 'vc-bzr)
 
+(defcustom vc-bzr-log-switches nil
+  "String/list of strings specifying extra switches for `bzr log' under VC."
+  :type '(choice (const :tag "None" nil)
+                 (string :tag "Argument String")
+                 (repeat :tag "Argument List" :value ("") string))
+  :group 'vc-bzr)
+
 ;; since v0.9, bzr supports removing the progress indicators
 ;; by setting environment variable BZR_PROGRESS_BAR to "none".
 (defun vc-bzr-command (bzr-command buffer okstatus file-or-list &rest args)
   "Wrapper round `vc-do-command' using `vc-bzr-program' as COMMAND.
-Invoke the bzr command adding `BZR_PROGRESS_BAR=none' to the environment."
+Invoke the bzr command adding `BZR_PROGRESS_BAR=none' and
+`LC_MESSAGES=C' to the environment."
   (let ((process-environment
          (list* "BZR_PROGRESS_BAR=none" ; Suppress progress output (bzr >=0.9)
-                "LC_ALL=C"              ; Force English output
+                "LC_MESSAGES=C"         ; Force English output
                 process-environment)))
     (apply 'vc-do-command buffer okstatus vc-bzr-program
-           file-or-list bzr-command (append vc-bzr-program-args args))))
+           file-or-list bzr-command args)))
 
 
 ;;;###autoload
-(defconst vc-bzr-admin-dirname ".bzr"    ; FIXME: "_bzr" on w32?
+(defconst vc-bzr-admin-dirname ".bzr"
   "Name of the directory containing Bzr repository status files.")
 ;;;###autoload
 (defconst vc-bzr-admin-checkout-format-file
@@ -122,6 +122,10 @@
        file 'bzr-root
        (vc-find-root file vc-bzr-admin-checkout-format-file))))
 
+(defun vc-bzr-revision-granularity ()
+  "Always return 'repository: Bzr has repository-wide revision numbers."  
+  'repository)
+
 (defun vc-bzr-registered (file)
   "Return non-nil if FILE is registered with bzr.
 
@@ -167,8 +171,6 @@
     (when rootdir 
          (file-relative-name filename* rootdir))))
 
-;; FIXME:  Also get this in a non-registered sub-directory.
-;; It already works for me. -- Riccardo
 (defun vc-bzr-status (file)
   "Return FILE status according to Bzr.
 Return value is a cons (STATUS . WARNING), where WARNING is a
@@ -197,16 +199,16 @@
                  ;; bzr prints paths relative to the repository root.
                  (concat "^\\(" vc-bzr-state-words "\\):[ \t\n]+"
                          (regexp-quote (vc-bzr-file-name-relative file))
-                         (if (file-directory-p file) "/?" "")
+                         ;; Bzr appends a '/' to directory names and
+                         ;; '*' to executable files
+                         (if (file-directory-p file) "/?" "\\*?")
                          "[ \t\n]*$")
                  nil t)
             (lexical-let ((statusword (match-string 1)))
               ;; Erase the status text that matched.
               (delete-region (match-beginning 0) (match-end 0))
               (setq status
-                    (and (equal ret 0) ; Seems redundant.  --Stef
-                         (intern (replace-regexp-in-string " " ""
-                                                         statusword))))))
+                    (intern (replace-regexp-in-string " " "" statusword)))))
           (when status
             (goto-char (point-min))
             (skip-chars-forward " \n\t") ;Throw away spaces.
@@ -226,19 +228,22 @@
       (if (cdr result)
           (message "Warnings in `bzr' output: %s" (cdr result)))
       (cdr (assq (car result)
-                 '((added . edited)
+                 '((added . added)
                    (kindchanged . edited)
                    (renamed . edited)
                    (modified . edited)
-                   (removed . edited)
-                   (ignored . nil)
-                   (unknown . nil)
+                   (removed . removed)
+                   (ignored . ignored)
+                   (unknown . unregistered)
                    (unchanged . up-to-date)))))))
 
 (defun vc-bzr-workfile-unchanged-p (file)
   (eq 'unchanged (car (vc-bzr-status file))))
 
 (defun vc-bzr-working-revision (file)
+  ;; XXX: does not return "0" for a file added but not yet committed,
+  ;; as required by vc.el, but we cannot do that without calling `bzr
+  ;; status' --Riccardo
   (lexical-let*
       ((rootdir (vc-bzr-root file))
        (branch-format-file (expand-file-name vc-bzr-admin-branch-format-file
@@ -280,6 +285,10 @@
   "Create a new Bzr repository."
   (vc-bzr-command "init" nil 0 nil))
 
+(defun vc-bzr-init-revision (&optional file)
+  "Always return nil, as Bzr cannot register explicit versions."
+  nil)
+
 (defun vc-bzr-register (files &optional rev comment)
   "Register FILE under bzr.
 Signal an error unless REV is nil.
@@ -308,7 +317,7 @@
 
 (defun vc-bzr-unregister (file)
   "Unregister FILE from bzr."
-  (vc-bzr-command "remove" nil 0 file))
+  (vc-bzr-command "remove" nil 0 file "--keep"))
 
 (defun vc-bzr-checkin (files rev comment)
   "Check FILE in to bzr with log message COMMENT.
@@ -316,6 +325,13 @@
   (if rev (error "Can't check in a specific revision with bzr"))
   (vc-bzr-command "commit" nil 0 files "-m" comment))
 
+(defun vc-bzr-find-revision (file rev buffer)
+  "Fetch revision REV of file FILE and put it into BUFFER."
+    (with-current-buffer buffer
+      (if (and rev (stringp rev) (not (string= rev "")))
+          (vc-bzr-command "cat" t 0 file "-r" rev)
+        (vc-bzr-command "cat" t 0 file))))
+
 (defun vc-bzr-checkout (file &optional editable rev destfile)
   "Checkout revision REV of FILE from bzr to DESTFILE.
 EDITABLE is ignored."
@@ -324,7 +340,7 @@
   (let ((coding-system-for-read 'binary)
         (coding-system-for-write 'binary))
     (with-temp-file destfile
-      (if rev
+      (if (and rev (stringp rev) (not (string= rev "")))
           (vc-bzr-command "cat" t 0 file "-r" rev)
         (vc-bzr-command "cat" t 0 file)))))
 
@@ -357,9 +373,13 @@
 
 (defun vc-bzr-print-log (files &optional buffer) ; get buffer arg in Emacs 22
   "Get bzr change log for FILES into specified BUFFER."
-  ;; Fixme: This might need the locale fixing up if things like `revno'
-  ;; got localized, but certainly it shouldn't use LC_ALL=C.
-  (vc-bzr-command "log" buffer 0 files)
+  ;; FIXME: `vc-bzr-command' runs `bzr log' with `LC_MESSAGES=C', so
+  ;; the log display may not what the user wants - but I see no other
+  ;; way of getting the above regexps working.
+  (apply 'vc-bzr-command "log" buffer 0 files 
+        (if (stringp vc-bzr-log-switches)
+            (list vc-bzr-log-switches)
+          vc-bzr-log-switches))
   ;; FIXME: Until Emacs-23, VC was missing a hook to sort out the mode for
   ;; the buffer, or at least set the regexps right.
   (unless (fboundp 'vc-default-log-view-mode)
@@ -377,24 +397,14 @@
 
 (defun vc-bzr-diff (files &optional rev1 rev2 buffer)
   "VC bzr backend for diff."
-  (let ((working (vc-working-revision (if (consp files) (car files) files))))
-    (if (and (equal rev1 working) (not rev2))
-        (setq rev1 nil))
-    (if (and (not rev1) rev2)
-        (setq rev1 working))
-    ;; bzr diff produces condition code 1 for some reason.
+  ;; `bzr diff' exits with code 1 if diff is non-empty
     (apply #'vc-bzr-command "diff" (or buffer "*vc-diff*") 1 files
-           "--diff-options" (mapconcat 'identity (vc-diff-switches-list bzr)
+        "--diff-options" (mapconcat 'identity 
+                                    (vc-diff-switches-list bzr)
                                        " ")
-           (when rev1
-             (if rev2
-                 (list "-r" (format "%s..%s" rev1 rev2))
-               (list "-r" rev1))))))
-
-
-
-;; FIXME: vc-{next,previous}-revision need fixing in vc.el to deal with
-;; straight integer revisions.
+        (list "-r" (format "%s..%s" 
+                           (or rev1 "revno:-1") 
+                           (or rev2 "")))))
 
 (defun vc-bzr-delete-file (file)
   "Delete FILE and delete it in the bzr repository."
@@ -437,14 +447,6 @@
         (replace-match "")
         (insert tag " |")))))
 
-;; Definition from Emacs 22
-(unless (fboundp 'vc-annotate-convert-time)
-  (defun vc-annotate-convert-time (time)
-    "Convert a time value to a floating-point number of days.
-The argument TIME is a list as returned by `current-time' or
-`encode-time', only the first two elements of that list are considered."
-    (/ (+ (* (float (car time)) (lsh 1 16)) (cadr time)) 24 3600)))
-
 (defun vc-bzr-annotate-time ()
   (when (re-search-forward "^ *[0-9]+ |" nil t)
     (let ((prop (get-text-property (line-beginning-position) 'help-echo)))
@@ -464,12 +466,6 @@
     (if (looking-at " *\\([0-9]+\\) | ")
         (match-string-no-properties 1))))
 
-;; Not needed for Emacs 22
-(defun vc-bzr-annotate-difference (point)
-  (let ((next-time (vc-bzr-annotate-time)))
-    (if next-time
-        (- (vc-annotate-convert-time (current-time)) next-time))))
-
 (defun vc-bzr-command-discarding-stderr (command &rest args)
   "Execute shell command COMMAND (with ARGS); return its output and exitcode.
 Return value is a cons (EXITCODE . OUTPUT), where EXITCODE is
@@ -496,9 +492,9 @@
     ;; `bzr ls --versioned' lists all versioned files;
     ;; assume they are up-to-date, unless we are given
     ;; evidence of the contrary.
-    (setq at-start t)
     (with-temp-buffer
       (buffer-disable-undo)            ;; Because these buffers can get huge
+      ;; Gather list of all files registered with Bzr
       (vc-bzr-command "ls" t 0 nil "--versioned")
       (goto-char (point-min))
       (while (or at-start
@@ -508,9 +504,13 @@
                      (buffer-substring-no-properties 
                       (line-beginning-position) (line-end-position))
                      bzr-root-directory)))
+          ;; files are up-to-date unless they appear in the `bzr
+          ;; status' output below
           (vc-file-setprop file 'vc-state 'up-to-date)
           ;; XXX: is this correct? what happens if one 
           ;; mixes different SCMs in the same dir?
+          ;; Anyway, we're looking at the output of `bzr ls --versioned',
+          ;; so we know these files are registered with Bzr.
           (vc-file-setprop file 'vc-backend 'Bzr))))
     ;; `bzr status' reports on added/modified/renamed and unknown/ignored files
     (setq at-start t)
@@ -565,11 +565,10 @@
 (defun vc-bzr-dired-state-info (file)
   "Bzr-specific version of `vc-dired-state-info'."
   (if (eq 'edited (vc-state file))
-      (let ((bzr-state (vc-file-getprop file 'vc-bzr-state)))
-        (if bzr-state
-            (concat "(" (symbol-name bzr-state) ")")
-          ;; else fall back to default vc representation
-          (vc-default-dired-state-info 'Bzr file)))))
+       (concat "(" (symbol-name (or (vc-file-getprop file 'vc-bzr-state) 
+                                    'edited)) ")")
+    ;; else fall back to default vc.el representation
+    (vc-default-dired-state-info 'Bzr file)))
 
 (eval-after-load "vc"
   '(add-to-list 'vc-directory-exclusion-list vc-bzr-admin-dirname t))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]