[PATCH] Makefile: Do not call ldconfig when DESTDIR is defined

2010-10-22 Thread Michal Sojka
If make install is called with non-empty DESTDIR, calling ldconfig has
usually no sense. Without this patch dpkg-buildpackage fails with

  make[1]: ldconfig: Command not found

Signed-off-by: Michal Sojka sojk...@fel.cvut.cz
---
This patch first appeared in id:87ljaf6p51@steelpick.2x.cz

 lib/Makefile.local |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/Makefile.local b/lib/Makefile.local
index a60ef98..2d36db1 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -36,9 +36,11 @@ SONAME = $(LINKER_NAME).$(LIBNOTMUCH_VERSION_MAJOR)
 LIBNAME = $(SONAME).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE)
 LIBRARY_LINK_FLAG = -shared -Wl,-soname=$(SONAME)
 ifeq ($(LIBDIR_IN_LDCONFIG),1)
+ifeq ($(DESTDIR),)
 LIBRARY_INSTALL_POST_COMMAND=ldconfig
 endif
 endif
+endif
 
 dir := lib
 extra_cflags += -I$(dir) -fPIC
-- 
tg: (f117d80..) t/fix-ldconfig-for-deb (depends on: master)
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 0/2] Notmuch cat v2

2010-10-22 Thread Michal Sojka
Hi all,

this is my second attempt to implement notmuch cat subcommand (the
first version was posted in
id:1271747793-17507-1-git-send-email-sojk...@fel.cvut.cz). This
subcommand outputs the given message to stdout.

In this version the arguments are classical notmuch search terms and
not a filename as in the previous version. Emacs interface then uses
message-id to retrieve the message.

Some people suggested that cat could be implemented as a special
format of show subcommand. That would be possible, but it seems that
show command always constructs threads form the messages which means
that is executes several database queries. I consider this as
unnecessary overhead and for that reason cat is a separate subcommand.

Michal Sojka (2):
  Add 'cat' subcommand
  emacs: Access raw messages via cat subcommand

 emacs/notmuch-show.el |   14 +---
 notmuch-client.h  |3 ++
 notmuch-show.c|   83 +
 notmuch.1 |4 ++
 notmuch.c |4 ++
 test/cat  |   38 ++
 test/notmuch-test |2 +-
 7 files changed, 142 insertions(+), 6 deletions(-)
 create mode 100755 test/cat

-- 
1.7.2.3

___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 2/2] emacs: Access raw messages via cat subcommand

2010-10-22 Thread Michal Sojka
This patch modifies the following commands to access the messages via
cat subcommand:
- view/save attachments ('v', 'w'),
- view a raw message ('V') and
- pipe a message to a command ('|').

With this patch, it is straightforward to use notmuch emacs interface
with a remote database accessed over SSH. To do this, it is sufficient
to redefine notmuch-command variable to contain the name of a script
containing:

ssh u...@host notmuch $@

If the ssh client has enabled connection sharing (ControlMaster option
in OpenSSH), the emacs interface is almost as responsive as when
notmuch is invoked locally.
---
 emacs/notmuch-show.el |   14 +-
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 98d25ef..5d207b9 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -85,10 +85,10 @@ any given message.
 (defmacro with-current-notmuch-show-message (rest body)
   Evaluate body with current buffer set to the text of current message
   `(save-excursion
- (let ((filename (notmuch-show-get-filename)))
-   (let ((buf (generate-new-buffer (concat *notmuch-msg- filename *
+ (let ((id (notmuch-show-get-message-id)))
+   (let ((buf (generate-new-buffer (concat *notmuch-msg- id *
  (with-current-buffer buf
-   (insert-file-contents filename nil nil nil t)
+   (call-process notmuch-command nil t nil cat id)
,@body)
 (kill-buffer buf)
 
@@ -918,7 +918,11 @@ any effects from previous calls to
 (defun notmuch-show-view-raw-message ()
   View the file holding the current message.
   (interactive)
-  (view-file (notmuch-show-get-filename)))
+  (let ((id (notmuch-show-get-message-id)))
+(let ((buf (get-buffer-create (concat *notmuch-raw- id *
+  (switch-to-buffer buf)
+  (save-excursion
+   (call-process notmuch-command nil t nil cat id)
 
 (defun notmuch-show-pipe-message (entire-thread command)
   Pipe the contents of the current message (or thread) to the given command.
@@ -939,7 +943,7 @@ than only the current message.
   (mapconcat 'identity 
(notmuch-show-get-message-ids-for-open-messages)  OR ))
   |  command))
   (setq shell-command
-   (concat command(shell-quote-argument 
(notmuch-show-get-filename)
+   (concat notmuch cat  (shell-quote-argument 
(notmuch-show-get-message-id))  |  command)))
 (start-process-shell-command notmuch-pipe-command *notmuch-pipe* 
shell-command)))
 
 (defun notmuch-show-add-tag (rest toadd)
-- 
1.7.2.3

___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 1/2] Add 'cat' subcommand

2010-10-22 Thread Michal Sojka
This command outputs a raw message matched by search term to the
standard output. It allows MUAs to access the messages for piping,
attachment manipulation, etc. by running notmuch cat rather then
directly access the file. This will simplify the MUAs when they need
to operate on a remote database.
---
 notmuch-client.h  |3 ++
 notmuch-show.c|   83 +
 notmuch.1 |4 ++
 notmuch.c |4 ++
 test/cat  |   38 
 test/notmuch-test |2 +-
 6 files changed, 133 insertions(+), 1 deletions(-)
 create mode 100755 test/cat

diff --git a/notmuch-client.h b/notmuch-client.h
index 20be43b..82526f8 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -111,6 +111,9 @@ int
 notmuch_search_tags_command (void *ctx, int argc, char *argv[]);
 
 int
+notmuch_cat_command (void *ctx, int argc, char *argv[]);
+
+int
 notmuch_part_command (void *ctx, int argc, char *argv[]);
 
 const char *
diff --git a/notmuch-show.c b/notmuch-show.c
index ea465de..285f38f 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -632,6 +632,89 @@ notmuch_show_command (void *ctx, unused (int argc), unused 
(char *argv[]))
 }
 
 int
+notmuch_cat_command (void *ctx, unused (int argc), unused (char *argv[]))
+{
+notmuch_config_t *config;
+notmuch_database_t *notmuch;
+notmuch_query_t *query;
+notmuch_messages_t *messages;
+notmuch_message_t *message;
+char *query_string;
+int i;
+const char *filename;
+FILE *file;
+size_t size;
+char buf[4096];
+
+for (i = 0; i  argc  argv[i][0] == '-'; i++) {
+   fprintf (stderr, Unrecognized option: %s\n, argv[i]);
+   return 1;
+}
+
+config = notmuch_config_open (ctx, NULL, NULL);
+if (config == NULL)
+   return 1;
+
+query_string = query_string_from_args (ctx, argc, argv);
+if (query_string == NULL) {
+   fprintf (stderr, Out of memory\n);
+   return 1;
+}
+
+if (*query_string == '\0') {
+   fprintf (stderr, Error: notmuch cat requires at least one search 
term.\n);
+   return 1;
+}
+
+notmuch = notmuch_database_open (notmuch_config_get_database_path (config),
+NOTMUCH_DATABASE_MODE_READ_ONLY);
+if (notmuch == NULL)
+   return 1;
+
+query = notmuch_query_create (notmuch, query_string);
+if (query == NULL) {
+   fprintf (stderr, Error: Out of memory\n);
+   return 1;
+}
+
+if (notmuch_query_count_messages (query) != 1) {
+   fprintf (stderr, Error: search term did not match precisely one 
message.\n);
+   return 1;
+}
+
+messages = notmuch_query_search_messages (query);
+message = notmuch_messages_get (messages);
+
+if (message == NULL) {
+   fprintf (stderr, Error: Cannot find matching message.\n);
+   return 1;
+}
+
+filename = notmuch_message_get_filename (message);
+if (filename == NULL) {
+   fprintf (stderr, Error: Cannot message filename.\n);
+   return 1;
+}
+
+file = fopen (filename, r);
+if (file == NULL) {
+   fprintf (stderr, Error: Cannot open file %s: %s\n, filename, strerror 
(errno));
+   return 1;
+}
+
+while (!feof (file)) {
+   size = fread (buf, 1, sizeof (buf), file);
+   fwrite (buf, size, 1, stdout);
+}
+
+fclose (file);
+notmuch_query_destroy (query);
+notmuch_database_close (notmuch);
+
+return 0;
+}
+
+int
 notmuch_part_command (void *ctx, unused (int argc), unused (char *argv[]))
 {
notmuch_config_t *config;
diff --git a/notmuch.1 b/notmuch.1
index 3ec9c55..2ec4048 100644
--- a/notmuch.1
+++ b/notmuch.1
@@ -255,6 +255,10 @@ See the
 section below for details of the supported syntax for search-terms.
 .RE
 .TP
+.BR cat   search-term...
+
+Output raw content of a single message matched by the search term.
+.TP
 .BR count  search-term...
 
 Count messages matching the search terms.
diff --git a/notmuch.c b/notmuch.c
index f6b8c13..e36486c 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -310,6 +310,10 @@ command_t commands[] = {
   \tcontain tags only from messages that match the search-term(s).\n
   \n
   \tIn both cases the list will be alphabetically sorted. },
+{ cat, notmuch_cat_command,
+  search-terms,
+  Output raw content of a single message matched by the search term.,
+   },
 { part, notmuch_part_command,
   --part=num search-terms,
   Output a single MIME part of a message.,
diff --git a/test/cat b/test/cat
new file mode 100755
index 000..c6cefea
--- /dev/null
+++ b/test/cat
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+test_description='notmuch cat'
+. ./test-lib.sh
+
+test_begin_subtest Generate some messages
+generate_message
+generate_message
+output=$(NOTMUCH_NEW)
+test_expect_equal $output Added 2 new messages to the database.
+
+test_begin_subtest Without arguments
+output=$(notmuch cat 21)
+test_expect_equal $output Error: notmuch cat 

Re: bug report: xapian error for message id with '..'

2010-10-22 Thread Carl Worth
On Wed, 28 Apr 2010 18:41:18 -0400, Jameson Rollins 
jroll...@finestructure.net wrote:
 So I think this means that the problem probably lies mostly in the emacs
 UI not properly quoting the id string.  What originally got me on this
 problem is that I was not able to manipulate the tag of this email from
 within emacs.

Hi Jameson,

Thanks for reporting that problem. (And thanks for mentioning that the
problem occurred when trying to manipulate tags---I was having trouble
finding the operation that wouldn't work with the problematic ID.)

I've just added a test case to our test suite to cover this. Then I also
added a fix to the emacs code to properly quote message IDs to resolve
the problem.

There might still be other quoting problems here or there in the emacs
interface, so let me know if you find anything else. But at least a
large class of problems is fixed here.

 I also note here that notmuch is not returning an error, even though a
 Xapian exception occurred and the search failed.  This is another
 important issue.  I'm not sure if I should bring it up in a separate
 message or not.  This goes back to the bug tracking issue.

A separate message would be preferred for me. I'm basically using tagged
messages to indicate open bugs, so I'm now stuck with being unable to
untag this thread until both of these issues are fixed. And that's not
ideal.

-Carl

PS. What's also obviously not ideal is that there's no external
visibility of my open bug queue. I'd definitely like to be able to
easily advertise things like No, I haven't forgotten about that bug you
reported in April---I just haven't fixed it yet. Anyone want to write a
nice notmuch search --format=html for me?

-- 
carl.d.wo...@intel.com


pgpHlNVPbOY8t.pgp
Description: PGP signature
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


Re: bug report: xapian error for message id with '..'

2010-10-22 Thread Carl Worth
On Fri, 22 Oct 2010 17:48:29 -0700, Carl Worth cwo...@cworth.org wrote:
 On Wed, 28 Apr 2010 18:41:18 -0400, Jameson Rollins 
 jroll...@finestructure.net wrote:
 
  I also note here that notmuch is not returning an error, even though a
  Xapian exception occurred and the search failed.  This is another
  important issue.  I'm not sure if I should bring it up in a separate
  message or not.  This goes back to the bug tracking issue.
 
 A separate message would be preferred for me. I'm basically using tagged
 messages to indicate open bugs, so I'm now stuck with being unable to
 untag this thread until both of these issues are fixed. And that's not
 ideal.

I just resolved that problem by fixing the underlying bug.

Thanks for the report.

-Carl

-- 
carl.d.wo...@intel.com


pgplVxyLi8RyD.pgp
Description: PGP signature
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 0/4] Maildir synchronization v2

2010-10-22 Thread Michal Sojka
On Mon, 18 Oct 2010, Mike Kelly wrote:
> Michal Sojka  wrote:
> > they are ready to be merged. They can be pulled by:
> > 
> > git pull git://rtime.felk.cvut.cz/notmuch maildir-sync-v2
> 
> I've tested these patches on Linux, and they seem to work as expected.
> However, I'd like to suggest/request that the level-4 syncing of a
> filename should happen in notmuch_(message|thread)_(add|remove)_tag(),
> not in notmuch-tag.cc. Otherwise, anyone using libnotmuch directly
> (e.g. alternative clients, things using python bindings, etc) will not
> benefit from this.

Hi, I'd agree but these pathes don't touch notmuch-tag.c in a
significant way. What's done there is to read the value from config and
to call a function (from libnotmuch) to setup an internal variable
accordingly. Other users of libnotmuch have probably different means of
configuration than notmuch itself and should call this function in a
similar way.

-Michal


[PATCH 2/4] Maildir synchronization

2010-10-22 Thread Michal Sojka
On Wed, 13 Oct 2010, Sebastian Spaeth wrote:
> > +/* ASCII ordered table of Maildir flags and associated tags */
> > +struct maildir_flag_tag flag2tag[] = {
> > +{ 'D', "draft",   false},
> > +{ 'F', "flagged", false},
> > +{ 'P', "passed",  false},
> > +{ 'R', "replied", false},
> > +{ 'S', "unread",  true },
> > +{ 'T', "delete",  false},
> > +};
> 
> [...]
> 
> with one caveat: you use the tag "delete" to mark the state "trashed". I
> think people have slowly settled on the convention "deleted" which is
> also more consistent with a state, such as unread, replied, etc...

Hi,

I changed "delete" to "deleted" and the updated patch series is
reachable by:

git pull git://rtime.felk.cvut.cz/notmuch maildir-sync-v3

-Michal


[PATCH] emacs: Do not color non-matching authors by tag

2010-10-22 Thread Michal Sojka
Customizing notmuch-search-line-faces to color lines in search result
according to tags has the effect that the color overrides other faces
set for the line. This is usually what the user wants with the
exception that it also colors non-matching authors and it is then not
possible to visually distinguish between matching and non-matching
authors.

This patch changes the way how are the faces specified in
notmuch-search-line-faces applied to the search results. In
particular, instead of adding an overlay for the whole line, the
existing faces of the line are replaced with what is given in
notmuch-search-line-faces. The only exception is that
notmuch-search-non-matching-authors face is never replaced.

Signed-off-by: Michal Sojka 

---
 emacs/notmuch.el |   20 +---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 42619b2..d0fb834 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -593,17 +593,31 @@ matching will be applied."
   :type '(alist :key-type (string) :value-type (list))
   :group 'notmuch)

+(defun notmuch-search-set-line-face (start end face)
+  "Change face propery to value FACE expect for non-matching authors."
+  (save-excursion
+(save-restriction
+  (narrow-to-region start end)
+  (goto-char (point-min))
+  (let ((fstart (point))
+   fend)
+   (while (< fstart (point-max))
+ (setq fend (or (next-single-property-change fstart 'face)
+(point-max)))
+ (when (not (eq (get-text-property fstart 'face) 
'notmuch-search-non-matching-authors))
+   (put-text-property fstart fend 'face face))
+ (setq fstart fend))
+
 (defun notmuch-search-color-line (start end line-tag-list)
   "Colorize lines in notmuch-show based on tags"
   (if notmuch-search-line-faces
-  (let ((overlay (make-overlay start end))
-   (tags-faces (copy-alist notmuch-search-line-faces)))
+  (let ((tags-faces (copy-alist notmuch-search-line-faces)))
(while tags-faces
  (let* ((tag-face (car tags-faces))
 (tag (car tag-face))
 (face (cdr tag-face)))
(cond ((member tag line-tag-list)
-  (overlay-put overlay 'face face)
+  (notmuch-search-set-line-face start end face)
   (setq tags-faces nil))
  (t
   (setq tags-faces (cdr tags-faces)
-- 
tg: (f117d80..) t/do-not-colorize-non-matching-authors-by-tag (depends on: 
master)


[PATCH] Makefile: Do not call ldconfig when DESTDIR is defined

2010-10-22 Thread Michal Sojka
If make install is called with non-empty DESTDIR, calling ldconfig has
usually no sense. Without this patch dpkg-buildpackage fails with

  make[1]: ldconfig: Command not found

Signed-off-by: Michal Sojka 
---
This patch first appeared in id:87ljaf6p51.fsf at steelpick.2x.cz

 lib/Makefile.local |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/Makefile.local b/lib/Makefile.local
index a60ef98..2d36db1 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -36,9 +36,11 @@ SONAME = $(LINKER_NAME).$(LIBNOTMUCH_VERSION_MAJOR)
 LIBNAME = $(SONAME).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE)
 LIBRARY_LINK_FLAG = -shared -Wl,-soname=$(SONAME)
 ifeq ($(LIBDIR_IN_LDCONFIG),1)
+ifeq ($(DESTDIR),)
 LIBRARY_INSTALL_POST_COMMAND=ldconfig
 endif
 endif
+endif

 dir := lib
 extra_cflags += -I$(dir) -fPIC
-- 
tg: (f117d80..) t/fix-ldconfig-for-deb (depends on: master)


[PATCH 0/2] Notmuch cat v2

2010-10-22 Thread Michal Sojka
Hi all,

this is my second attempt to implement notmuch cat subcommand (the
first version was posted in
id:1271747793-17507-1-git-send-email-sojkam1 at fel.cvut.cz). This
subcommand outputs the given message to stdout.

In this version the arguments are classical notmuch search terms and
not a filename as in the previous version. Emacs interface then uses
message-id to retrieve the message.

Some people suggested that cat could be implemented as a special
format of show subcommand. That would be possible, but it seems that
show command always constructs threads form the messages which means
that is executes several database queries. I consider this as
unnecessary overhead and for that reason cat is a separate subcommand.

Michal Sojka (2):
  Add 'cat' subcommand
  emacs: Access raw messages via cat subcommand

 emacs/notmuch-show.el |   14 +---
 notmuch-client.h  |3 ++
 notmuch-show.c|   83 +
 notmuch.1 |4 ++
 notmuch.c |4 ++
 test/cat  |   38 ++
 test/notmuch-test |2 +-
 7 files changed, 142 insertions(+), 6 deletions(-)
 create mode 100755 test/cat

-- 
1.7.2.3



[PATCH 2/2] emacs: Access raw messages via cat subcommand

2010-10-22 Thread Michal Sojka
This patch modifies the following commands to access the messages via
cat subcommand:
- view/save attachments ('v', 'w'),
- view a raw message ('V') and
- pipe a message to a command ('|').

With this patch, it is straightforward to use notmuch emacs interface
with a remote database accessed over SSH. To do this, it is sufficient
to redefine notmuch-command variable to contain the name of a script
containing:

ssh user at host notmuch "$@"

If the ssh client has enabled connection sharing (ControlMaster option
in OpenSSH), the emacs interface is almost as responsive as when
notmuch is invoked locally.
---
 emacs/notmuch-show.el |   14 +-
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 98d25ef..5d207b9 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -85,10 +85,10 @@ any given message."
 (defmacro with-current-notmuch-show-message ( body)
   "Evaluate body with current buffer set to the text of current message"
   `(save-excursion
- (let ((filename (notmuch-show-get-filename)))
-   (let ((buf (generate-new-buffer (concat "*notmuch-msg-" filename "*"
+ (let ((id (notmuch-show-get-message-id)))
+   (let ((buf (generate-new-buffer (concat "*notmuch-msg-" id "*"
  (with-current-buffer buf
-   (insert-file-contents filename nil nil nil t)
+   (call-process notmuch-command nil t nil "cat" id)
, at body)
 (kill-buffer buf)

@@ -918,7 +918,11 @@ any effects from previous calls to
 (defun notmuch-show-view-raw-message ()
   "View the file holding the current message."
   (interactive)
-  (view-file (notmuch-show-get-filename)))
+  (let ((id (notmuch-show-get-message-id)))
+(let ((buf (get-buffer-create (concat "*notmuch-raw-" id "*"
+  (switch-to-buffer buf)
+  (save-excursion
+   (call-process notmuch-command nil t nil "cat" id)

 (defun notmuch-show-pipe-message (entire-thread command)
   "Pipe the contents of the current message (or thread) to the given command.
@@ -939,7 +943,7 @@ than only the current message."
   (mapconcat 'identity 
(notmuch-show-get-message-ids-for-open-messages) " OR "))
  " | " command))
   (setq shell-command
-   (concat command " < " (shell-quote-argument 
(notmuch-show-get-filename)
+   (concat "notmuch cat " (shell-quote-argument 
(notmuch-show-get-message-id)) " | " command)))
 (start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" 
shell-command)))

 (defun notmuch-show-add-tag ( toadd)
-- 
1.7.2.3



[PATCH 1/2] Add 'cat' subcommand

2010-10-22 Thread Michal Sojka
This command outputs a raw message matched by search term to the
standard output. It allows MUAs to access the messages for piping,
attachment manipulation, etc. by running notmuch cat rather then
directly access the file. This will simplify the MUAs when they need
to operate on a remote database.
---
 notmuch-client.h  |3 ++
 notmuch-show.c|   83 +
 notmuch.1 |4 ++
 notmuch.c |4 ++
 test/cat  |   38 
 test/notmuch-test |2 +-
 6 files changed, 133 insertions(+), 1 deletions(-)
 create mode 100755 test/cat

diff --git a/notmuch-client.h b/notmuch-client.h
index 20be43b..82526f8 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -111,6 +111,9 @@ int
 notmuch_search_tags_command (void *ctx, int argc, char *argv[]);

 int
+notmuch_cat_command (void *ctx, int argc, char *argv[]);
+
+int
 notmuch_part_command (void *ctx, int argc, char *argv[]);

 const char *
diff --git a/notmuch-show.c b/notmuch-show.c
index ea465de..285f38f 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -632,6 +632,89 @@ notmuch_show_command (void *ctx, unused (int argc), unused 
(char *argv[]))
 }

 int
+notmuch_cat_command (void *ctx, unused (int argc), unused (char *argv[]))
+{
+notmuch_config_t *config;
+notmuch_database_t *notmuch;
+notmuch_query_t *query;
+notmuch_messages_t *messages;
+notmuch_message_t *message;
+char *query_string;
+int i;
+const char *filename;
+FILE *file;
+size_t size;
+char buf[4096];
+
+for (i = 0; i < argc && argv[i][0] == '-'; i++) {
+   fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+   return 1;
+}
+
+config = notmuch_config_open (ctx, NULL, NULL);
+if (config == NULL)
+   return 1;
+
+query_string = query_string_from_args (ctx, argc, argv);
+if (query_string == NULL) {
+   fprintf (stderr, "Out of memory\n");
+   return 1;
+}
+
+if (*query_string == '\0') {
+   fprintf (stderr, "Error: notmuch cat requires at least one search 
term.\n");
+   return 1;
+}
+
+notmuch = notmuch_database_open (notmuch_config_get_database_path (config),
+NOTMUCH_DATABASE_MODE_READ_ONLY);
+if (notmuch == NULL)
+   return 1;
+
+query = notmuch_query_create (notmuch, query_string);
+if (query == NULL) {
+   fprintf (stderr, "Error: Out of memory\n");
+   return 1;
+}
+
+if (notmuch_query_count_messages (query) != 1) {
+   fprintf (stderr, "Error: search term did not match precisely one 
message.\n");
+   return 1;
+}
+
+messages = notmuch_query_search_messages (query);
+message = notmuch_messages_get (messages);
+
+if (message == NULL) {
+   fprintf (stderr, "Error: Cannot find matching message.\n");
+   return 1;
+}
+
+filename = notmuch_message_get_filename (message);
+if (filename == NULL) {
+   fprintf (stderr, "Error: Cannot message filename.\n");
+   return 1;
+}
+
+file = fopen (filename, "r");
+if (file == NULL) {
+   fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror 
(errno));
+   return 1;
+}
+
+while (!feof (file)) {
+   size = fread (buf, 1, sizeof (buf), file);
+   fwrite (buf, size, 1, stdout);
+}
+
+fclose (file);
+notmuch_query_destroy (query);
+notmuch_database_close (notmuch);
+
+return 0;
+}
+
+int
 notmuch_part_command (void *ctx, unused (int argc), unused (char *argv[]))
 {
notmuch_config_t *config;
diff --git a/notmuch.1 b/notmuch.1
index 3ec9c55..2ec4048 100644
--- a/notmuch.1
+++ b/notmuch.1
@@ -255,6 +255,10 @@ See the
 section below for details of the supported syntax for .
 .RE
 .TP
+.BR cat  " ..."
+
+Output raw content of a single message matched by the search term.
+.TP
 .BR count " ..."

 Count messages matching the search terms.
diff --git a/notmuch.c b/notmuch.c
index f6b8c13..e36486c 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -310,6 +310,10 @@ command_t commands[] = {
   "\tcontain tags only from messages that match the search-term(s).\n"
   "\n"
   "\tIn both cases the list will be alphabetically sorted." },
+{ "cat", notmuch_cat_command,
+  "",
+  "Output raw content of a single message matched by the search term.",
+  "" },
 { "part", notmuch_part_command,
   "--part= ",
   "Output a single MIME part of a message.",
diff --git a/test/cat b/test/cat
new file mode 100755
index 000..c6cefea
--- /dev/null
+++ b/test/cat
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+test_description='notmuch cat'
+. ./test-lib.sh
+
+test_begin_subtest "Generate some messages"
+generate_message
+generate_message
+output=$(NOTMUCH_NEW)
+test_expect_equal "$output" "Added 2 new messages to the database."
+
+test_begin_subtest "Without arguments"
+output=$(notmuch cat 2>&1)
+test_expect_equal "$output" "Error: notmuch cat requires 

Automated testing of emacs interface

2010-10-22 Thread Carl Worth
For some time, I've been hesitant to implement big changes in the emacs
interface since we didn't have any automated testing for this stuff.

I had tried once or twice to implemented automated emacs-notmuch
testing, but I also ran into strange errors when I tried to do "emacs
--batch --funcall notmuch-hello". I just found that problem, (emacs
--batch was strangely operating in a window only 10 columns wide and
bugs in notmuch-hello caused it to fail in a window so narrow). And I've
fixed both of these things now.

So the test suite now has a nice "emacs" script which can be used for
easy testing of the emacs interface. I've only committed a simple test
of notmuch-hello so far, but it will be easy to expand from here, (and
I'll appreciate any help in doing so).

Also, as anyone adds functionality to the emacs code in notmuch, please
also extend the test suite to cover that functionality.

Thanks,

-Carl

-- 
carl.d.worth at intel.com
-- next part --
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<http://notmuchmail.org/pipermail/notmuch/attachments/20101022/ee82a037/attachment.pgp>


bug report: xapian error for message id with '..'

2010-10-22 Thread Carl Worth
On Wed, 28 Apr 2010 18:41:18 -0400, Jameson Rollins  wrote:
> So I think this means that the problem probably lies mostly in the emacs
> UI not properly quoting the id string.  What originally got me on this
> problem is that I was not able to manipulate the tag of this email from
> within emacs.

Hi Jameson,

Thanks for reporting that problem. (And thanks for mentioning that the
problem occurred when trying to manipulate tags---I was having trouble
finding the operation that wouldn't work with the problematic ID.)

I've just added a test case to our test suite to cover this. Then I also
added a fix to the emacs code to properly quote message IDs to resolve
the problem.

There might still be other quoting problems here or there in the emacs
interface, so let me know if you find anything else. But at least a
large class of problems is fixed here.

> I also note here that notmuch is not returning an error, even though a
> Xapian exception occurred and the search failed.  This is another
> important issue.  I'm not sure if I should bring it up in a separate
> message or not.  This goes back to the bug tracking issue.

A separate message would be preferred for me. I'm basically using tagged
messages to indicate open bugs, so I'm now stuck with being unable to
untag this thread until both of these issues are fixed. And that's not
ideal.

-Carl

PS. What's also obviously not ideal is that there's no external
visibility of my "open bug queue". I'd definitely like to be able to
easily advertise things like "No, I haven't forgotten about that bug you
reported in April---I just haven't fixed it yet." Anyone want to write a
nice "notmuch search --format=html" for me?

-- 
carl.d.worth at intel.com
-- next part --
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<http://notmuchmail.org/pipermail/notmuch/attachments/20101022/d5ba6218/attachment.pgp>