Stefan Reichör | 7 Mar 2003 07:10
Picon

Re: Appending bbdb queries

Please change the Subject header to a concise bug description.
In this report, remember to cover the basics, that is, what you expected to
happen and what in fact did happen.  Please remove these
instructions from your message.

Hi,
I use the latest emacs from CVS under windows.
I use bbdb and I found out, that the bbdb append feature does not
work with my emacs.
I tried the same feature on my debian box with the latest debian
emacs packages. It works on debian.

Here is the recipe for the test (in a bbdb buffer):
I type:
b search-string1 <RET>
+ b search-string2 <RET>

But the second search always clears the first one and I get only the
results of the second search.

On linux (emacs21.2.2) I get the correct result:
records with search-string1 and search-string2 are shown.

I started to debug the bbdb query.
Here is, what I found out:
* In the function bbdb-display-records-1, there is a call to
  with-output-to-temp-buffer.
* Before the call to this function, the variable bbdb-records
  contains the already visible bbdb-entries.
* After the call to with-output-to-temp-buffer, the variable
  bbdb-records is nil
  + On linux this variable has still the same value as before
  + I fixed the problem with the new variable xbbdb-records
* My question is now, is this a bug of with-output-to-temp-buffer?

I sent the things I found out to the emacs developers, here is the
response from RMS:

RMS> You need to report this to the bbdb maintainers.  We don't
RMS> know the code of bbdb.  It could be that this is an Emacs bug,
RMS> but we cannot afford to study the code of bbdb to investigate it.
RMS> 
RMS> If the bbdb maintainers find that the bug seems to be in Emacs,
RMS> they need to provide us with a precise test case that doesn't
RMS> involve using bbdb.  Then we can take it the rest of the way.

My changed function looks like this:

(defun bbdb-display-records-1 (records &optional append layout)
  (setq append (or append (bbdb-append-records-p)))
  (if (or (null records)
          (consp (car records)))
      nil

    ;; add layout and a marker to the local list of records
    (setq layout (or layout bbdb-display-layout))
    (setq records (mapcar (lambda (x)
                            (list x layout (make-marker)))
                          records)))

  (let ((b (current-buffer))
        (temp-buffer-setup-hook nil)
        (temp-buffer-show-hook nil)
        (xbbdb-records (copy-alist bbdb-records))
        (first (car (car records))))
    ;;(message "xbbdb-records: %S" xbbdb-records)
    ;;(message "bbdb-records: %S" bbdb-records)

    ;;05.03.2003, XSteve, with-output-to-temp-buffer seems to
    ;; destroy the binding of bbdb-records on windows emacs, cvs version...
    ;; so use xbbdb-records - this works
    (with-output-to-temp-buffer bbdb-buffer-name
      (set-buffer bbdb-buffer-name)
      ;;(message "xbbdb-records: %S" xbbdb-records)
      ;;(message "bbdb-records: %S" bbdb-records)

      ;; If append is unset, clear the buffer.
      (unless append
        (bbdb-undisplay-records))

      ;; If we're appending these records to the ones already displayed,
      ;; then first remove any duplicates, and then sort them.
      (if append
          (let ((rest records))
            (while rest
              (if (assq (car (car rest)) xbbdb-records)
                  (setq records (delq (car rest) records)))
              (setq rest (cdr rest)))
            (setq records (append xbbdb-records records))
            (setq records
                  (sort records
                        (lambda (x y) (bbdb-record-lessp (car x) (car y)))))))
      (make-local-variable 'mode-line-buffer-identification)
      (make-local-variable 'mode-line-modified)
      (set (make-local-variable 'bbdb-showing-changed-ones) nil)
      (let ((done nil)
            (rest records)
            (changed (bbdb-changed-records)))
        (while (and rest (not done))
          (setq done (memq (car (car rest)) changed)
                rest (cdr rest)))
        (setq bbdb-showing-changed-ones done))
      (bbdb-frob-mode-line (length records))
      (and (not bbdb-gag-messages)
           (not bbdb-silent-running)
           (message "Formatting..."))
      (bbdb-mode)
      ;; this in in the *BBDB* buffer, remember, not the .bbdb buffer.
      (set (make-local-variable 'bbdb-records) nil)
      (setq bbdb-records records)
      (let ((buffer-read-only nil)
            prs)
        (bbdb-debug (setq prs (bbdb-records)))
        (setq truncate-lines t)
        (while records
          (bbdb-debug (if (not (memq (car (car records)) prs))
                          (error "record doubleplus unpresent!")))
          (set-marker (nth 2 (car records)) (point))
          (bbdb-format-record (nth 0 (car records))
                              (nth 1 (car records)))
          (setq records (cdr records))))
      (and (not bbdb-gag-messages)
           (not bbdb-silent-running)
           (message "Formatting...done."))
      )
    (set-buffer bbdb-buffer-name)
    (if (and append first)
        (let ((cons (assq first bbdb-records))
              (window (get-buffer-window (current-buffer))))
          (if window (set-window-start window (nth 2 cons)))))
    (bbdbq)
    ;; this doesn't really belong here, but it's convenient ... and when
    ;; using electric display it would not be called otherwise.
    (save-excursion (run-hooks 'bbdb-list-hook))
    (if bbdb-gui (bbdb-fontify-buffer))
    (set-buffer-modified-p nil)
    (setq buffer-read-only t)
    (set-buffer b)))

Emacs  : GNU Emacs 21.3.50.1 (i386-msvc-nt5.0.2195)
 of 2003-02-19 on HEIDI
Package: BBDB 2.35

current state:
==============
(setq
 emacs-version "21.3.50.1"
 bbdb-version-date "$Date: 2002/12/25 15:06:00 $"
 bbdb-file-format 6
 bbdb-no-duplicates-p nil
 bbdb-address-editing-function 'bbdb-address-edit-default
 bbdb-address-formatting-alist '((bbdb-address-is-continental . bbdb-format-address-continental)
                                 (nil . bbdb-format-address-default))
 bbdb-addresses-label-list '("Home" "Office" "Mobile")
 bbdb-after-change-hook '(bbdb/gnus-score-invalidate-alist)
 bbdb-after-read-db-hook nil
 bbdb-always-add-addresses nil
 bbdb-auto-revert-p nil
 bbdb-canonicalize-net-hook nil
 bbdb-canonicalize-redundant-nets-p t
 bbdb-case-fold-search t
 bbdb-change-hook 'bbdb-timestamp-hook
 bbdb-check-zip-codes-p t
 bbdb-complete-name-allow-cycling t
 bbdb-complete-name-hooks '(ding)
 bbdb-completion-display-record t
 bbdb-completion-type 'primary-or-name
 bbdb-continental-zip-regexp "^\\s *[A-Z][A-Z]?\\s *-\\s *[0-9][0-9][0-9]"
 bbdb-create-hook 'bbdb-creation-date-hook
 bbdb-default-area-code nil
 bbdb-default-country nil
 bbdb-default-domain nil
 bbdb-default-label-list '("Home" "Office" "Mobile" "Other")
 bbdb-define-all-aliases-field 'mail-alias
 bbdb-define-all-aliases-mode 'all
 bbdb-dial-local-prefix nil
 bbdb-dial-local-prefix-alist '(((if (integerp bbdb-default-area-code)
                                  (format "(%03d)" bbdb-default-area-code)
                                  (or bbdb-default-area-code ""))
                                 "")
                                )
 bbdb-dial-long-distance-prefix nil
 bbdb-display-layout 'multi-line
 bbdb-display-layout-alist '((one-line (order phones mail-alias net notes) (name-end . 24)
                              (toggle . t))
                             (multi-line (omit creation-date timestamp) (toggle . t))
                             (pop-up-multi-line) (full-multi-line))
 bbdb-dwim-net-address-allow-redundancy t
 bbdb-electric-p nil
 bbdb-expand-mail-aliases t
 bbdb-extract-address-component-handler 'message
 bbdb-extract-address-component-ignore-regexp
"\\(\\(undisclosed\\|unlisted\\)[^,]*recipients\\)\\|no To-header on input"
 bbdb-extract-address-components-func 'bbdb-rfc822-addresses
 bbdb-file "~/.bbdb"
 bbdb-file-remote nil
 bbdb-file-remote-save-always t
 bbdb-finger-buffer-name "*finger*"
 bbdb-finger-host-field 'finger-host
 bbdb-get-addresses-headers '((authors "From" "Resent-From" "Reply-To")
                              (recipients "Resent-To" "Resent-CC" "To" "CC" "BCC"))
 bbdb-get-only-first-address-p t
 bbdb-gui t
 bbdb-hashtable-size 200003
 bbdb-info-file nil
 bbdb-initialize-hook nil
 bbdb-legal-zip-codes '("^$" "^[ 	\n]*[0-9][0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[ 	\n]*$"
                        "^[ 	\n]*\\([0-9][0-9][0-9][0-9][0-9]\\)[ 	\n]*-?[ 	\n]*\\([0-9][0-9][0-9][0-9]?\\)[ 	\n]*$"
"^[ 	\n]*\\([A-Za-z0-9]+\\)[ 	\n]+\\([A-Za-z0-9]+\\)[ 	\n]*$" "^[ 	\n]*\\([A-Z]+\\)[ 	\n]*-?[
	\n]*\\([0-9]+ ?[A-Z]*\\)[ 	\n]*$" "^[ 	\n]*\\([A-Z]+\\)[ 	\n]*-?[ 	\n]*\\([0-9]+\\)[
	\n]+\\([0-9]+\\)[ 	\n]*$")
 bbdb-list-hook nil
 bbdb-load-hook nil
 bbdb-message-caching-enabled t
 bbdb-message-marker-field 'mark-char
 bbdb-mode-hook nil
 bbdb-modem-device "/dev/modem"
 bbdb-modem-dial nil
 bbdb-new-nets-always-primary nil
 bbdb-north-american-phone-numbers-p nil
 bbdb-notes-default-separator ", "
 bbdb-notes-sort-order '((notes . 0) (www . 1) (ftp . 2) (gopher . 3) (telnet . 4)
                         (mail-alias . 5) (mail-folder . 6) (lpr . 7) (creation-date . 1000)
                         (timestamp . 1001))
 bbdb-notice-auto-save-file nil
 bbdb-notice-hook nil
 bbdb-offer-save t
 bbdb-phones-label-list '("Home" "Office")
 bbdb-pop-up-display-layout 'pop-up-multi-line
 bbdb-pop-up-target-lines 5
 bbdb-print-alist '((omit-area-code . "^(000) ") (phone-on-first-line . "^[ 	]*$") (ps-fonts)
                    (font-size . 6) (quad-hsize . "3.15in") (quad-vsize . "4.5in"))
 bbdb-print-brief-alist '((columns . 1) (separator . 1) (n-phones . 2) (n-addresses . 1)
                          (include-files "bbdb-print-brief" "bbdb-cols"))
 bbdb-print-epilog "\\endaddresses\n\\bye\n"
 bbdb-print-file-name "c:/temp/bbdb.tex"
 bbdb-print-full-alist '((columns . 3) (separator . 2) (include-files "bbdb-print" "bbdb-cols"))
 bbdb-print-net 'primary
 bbdb-print-omit-fields '(omit tex-name aka mail-alias)
 bbdb-print-prolog "%%%% ====== Phone/Address list in -*-TeX-*- Format =====\n%%%%        produced by
bbdb-print, version 3.0\n\n\\input texnansi\n\n"
 bbdb-print-require t
 bbdb-quiet-about-name-mismatches nil
 bbdb-readonly-p nil
 bbdb-refile-notes-default-merge-function 'bbdb-refile-notes-default-merge-function
 bbdb-refile-notes-generate-alist '((creation-date . bbdb-refile-notes-string-least)
                                    (timestamp . bbdb-refile-notes-string-most))
 bbdb-save-db-timeout nil
 bbdb-send-mail-style 'compose-mail
 bbdb-silent-running nil
 bbdb-snarf-web-prop 'www
 bbdb-sound-files ["/usr/demo/SOUND/sounds/touchtone.0.au"
"/usr/demo/SOUND/sounds/touchtone.1.au" "/usr/demo/SOUND/sounds/touchtone.2.au"
"/usr/demo/SOUND/sounds/touchtone.3.au" "/usr/demo/SOUND/sounds/touchtone.4.au"
"/usr/demo/SOUND/sounds/touchtone.5.au" "/usr/demo/SOUND/sounds/touchtone.6.au"
"/usr/demo/SOUND/sounds/touchtone.7.au" "/usr/demo/SOUND/sounds/touchtone.8.au"
"/usr/demo/SOUND/sounds/touchtone.9.au" "/usr/demo/SOUND/sounds/touchtone.pound.au" "/usr/demo/SOUND/sounds/touchtone.star.au"]
 bbdb-sound-player nil
 bbdb-sound-volume 50
 bbdb-time-display-format "%d %b %Y"
 bbdb-update-records-mode 'annotating
 bbdb-use-alternate-names t
 bbdb-use-pop-up t
 bbdb-user-mail-names nil
 bbdb-write-file-hooks '(bbdb-write-file-hook-fn)
 bbdb/gnus-lines-and-from-length 18
 bbdb/gnus-score-default nil
 bbdb/gnus-score-field 'gnus-score
 bbdb/gnus-split-crosspost-default nil
 bbdb/gnus-split-default-group "mail.misc"
 bbdb/gnus-split-myaddr-regexp "^reichoer$\\|^reichoer <at> \\([-a-z0-9]+\\.\\)*riic.at$"
 bbdb/gnus-split-nomatch-function nil
 bbdb/gnus-split-private-field 'gnus-private
 bbdb/gnus-split-public-field 'gnus-public
 bbdb/gnus-summary-in-bbdb-format-letter "b"
 bbdb/gnus-summary-known-poster-mark "+"
 bbdb/gnus-summary-mark-known-posters t
 bbdb/gnus-summary-prefer-bbdb-data t
 bbdb/gnus-summary-prefer-real-names t
 bbdb/gnus-summary-show-bbdb-names t
 bbdb/gnus-summary-user-format-letter "B"
 bbdb/gnus-update-records-mode 'annotating
 bbdb/mail-auto-create-p t
 bbdb/news-auto-create-p nil
 bbdb/vm-set-auto-folder-alist-field 'vm-folder
 features '(apropos smtpmail holidays diary-lib rx em-smart em-rebind em-xtra em-unix term em-term
            em-script em-prompt em-ls em-pred em-hist em-glob em-dirs em-cmpl esh-opt em-basic
            em-banner em-alias esh-var esh-io esh-ext esh-proc esh-arg esh-cmd esh-mode eshell
            psvn cl-specs flow-fill w3m-form w3m ccl w3m-hist w3m-e21 w3m-fsf w3m-image w3m-proc
            w3m-util edebug sort gnus-cite smiley gnus-bcklg gnus-async gnus-dup gnus-ml
            gnus-topic url-http url-gw url-handlers nnrss mm-url pop3 nnml nnfolder bbdb-gnus
            bbdb-snarf mail-extr spam spam-stat gnus-uu gnus-delay gnus-draft gnus-agent gnus-srvr
            gnus-score score-mode nnvirtual gnus-cache nndraft nnmh gnus-pers gnus-dired gnus-msg
            gnus-art mm-uu nnir nnimap imap gnus-sum gnus-group gnus-undo gnus-demon nnmail
            mail-source nntp nnoo gnus-start gnus-spec gnus-int gnus-range gnus-win log-edit
            tramp-vc vc-rcs vc add-log pcvs pcvs-parse pcvs-info pcvs-defs pcvs-util ewoc mwheel
            thingatpt ede-dired wisent-python wisent-bovine wisent eieio-opt dabbrev find-file
            semantic-c filladapt tempo w3-cus xml-parse doxymacs vhdl-mode mmm-mode mmm-univ
            mmm-class mmm-region mmm-utils semantic-bovine semanticdb-file semantic-edit eldoc
            semantic-el find-func loadhist todoo reftex-vcr reftex-dcr reftex-auc noutline outline
            font-latex xref filecache rfn-eshadow preview prv-emacs desktop latex tex-buf tex
            google xml soap url-cache url-auth url url-proxy url-privacy url-expand url-methods
            url-auto url-history url-cookie url-util url-parse url-vars printing cus-edit
            cus-start cus-load mh-identity mh-comp mh-e gnus gnus-ems mh-utils mm-view
            mh-customize mh-loaddefs rmail ps-print lpr student-list-mode xsteve-pymacs pymacs
            midnight work-log mailalias ecb-layout-defs progr-align grabbox remind-mode diminish
            babel bbdb-autoloads bbdb-query bbdb-print bbdb-com bbdb sendmail message rfc822 mml
            mml-sec mml-smime smime dig mml1991 mml2015 pgg pgg-parse pgg-def mm-decode mm-bodies
            mm-encode mailcap mail-parse rfc2045 rfc2231 rfc2047 gnus-util netrc qp ietf-drums
            time-date parse-time mailabbrev nnheader mm-util mail-prsvr mailheader canlock
            mail-utils timezone webjump browse-url w3-auto xref-hks mkback jka-compr tramp shell
            format-spec mmm-auto mmm-vars mmm-compat tmmofl mouse-embrace window-ring saveplace
            live-mode defaultcontent clipper toc hippie-exp align boxes ffap findr findstr igrep
            tempbuf keep-buffers scroll-in-place minibuffer-complete-cycle icomplete
            browse-kill-ring generic-dl generic-menu misc newcomment emacs-wiki executable
            pcomplete timeclock find-recursive ido bubble-buffer ibuffer ecb ecb-autogen autoload
            ecb-tod ecb-upgrade ecb-face ecb-cycle ecb-eshell ecb-navigate ecb-help ecb-jde
            ecb-layout compile ecb-create-layout ecb-mode-line ecb-compilation ecb-util
            tree-buffer avoid silentcomp ede-speedbar ede vc-cvs ede-source sb-rmail sb-html
            sb-texinfo sb-info info semantic-ia-sb semantic-analyze semantic-cb eieio-speedbar
            eieio-custom semantic-sb speedbar ange-ftp sb-image dframe cedet semantic-load
            semanticdb-el semanticdb-search semanticdb eieio-base eieio senator which-func
            semantic-imenu imenu semantic-ctxt semantic-util-modes semantic-util semantic
            semantic-lex semantic-fw semantic-token assoc working inversion escreen power-macros
            find-library read-library calendar cal-menu pp esh-util esh-module esh-toggle dired-dd
            dired-dd-b3-menu wdired dired-x dired-aux pydoc python-mode comint ring vsim-nav cwarn
            cc-mode cc-cmds cc-styles cc-align cc-engine cc-langs cc-vars cc-menus cc-defs derived
            latex-doc latex-doc-var help-fns help-mode view button cl cl-19 reftex reftex-vars
            tex-font tex-site edmacro screen-lines byte-opt bytecomp byte-compile hideshow msb
            mouse-copy cua-base paren stig-paren reporter emacs-functions dired diff-mode
            easy-mmode advice advice-preload uniquify autorevert ehelp electric recentf wid-edit
            easymenu generic-x skeleton jit-lock font-lock regexp-opt syntax generic gnuserv
            tooltip image tool-bar fontset ediff-hook vc-hooks lisp-float-type dos-w32 disp-table
            ls-lisp lisp-mode page menu-bar timer select scroll-bar mldrag mouse facemenu
            font-core frame ucs-tables georgian utf-8-lang misc-lang vietnamese tibetan thai lao
            korean japanese hebrew greek romanian slovak czech european ethiopic tamil malayalam
            devanagari indian cyrillic chinese case-table help simple faces cus-face
            text-properties overlay md5 base64 format mule env custom widget backquote
            make-network-process)
 )

-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The debugger 
for complex code. Debugging C/C++ programs can leave you feeling lost and 
disoriented. TotalView can help you find your way. Available on major UNIX 
and Linux platforms. Try it free. www.etnus.com
_______________________________________________
bbdb-info <at> lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bbdb-info
BBDB Home Page: http://bbdb.sourceforge.net/


Gmane