David Bremner [Thu, 13 Mar 2014 03:21:15 +0000 (00:21 -0300)]
doc: build man pages into hierarchy, fix help test.
It turns out there was a reason the old man pages were stored in a man
compatible hierarchy, namely so that we could run man on them before
installing.
Hardcode doc build location into test suite. This isn't ideal, but
let's unbreak the test suite for now.
David Bremner [Thu, 13 Mar 2014 03:21:14 +0000 (00:21 -0300)]
doc: build man pages at build time; introduce HAVE_SPHINX, HAVE_RST2MAN
This helps avoid build artifacts (namely, nroff and gzipped-nroff man
pages) owned by root.
The variables allow choosing which generator to use for the man page.
These will be hooked to configure in a following commit.
Austin Clements [Tue, 11 Mar 2014 20:42:00 +0000 (16:42 -0400)]
util: Fix two corner-cases in boolean term quoting function
Previously, make_boolean_term did not quote empty boolean terms or
boolean terms that started with '('. These cases are incompatible
with Xapian: empty terms cannot be omitted, and boolean terms that
start with '(' trigger an alternate term quoting syntax.
Fix this by quoting empty terms and terms that contain '('.
David Bremner [Fri, 7 Mar 2014 12:03:23 +0000 (08:03 -0400)]
perf-test: use command line arguments for directories
It seems that between version 1.26 and 1.27 of gnu tar, directories to
be extracted read with --files-from are no longer recursively extacted.
This patch puts them on the command line instead.
Jani Nikula [Sat, 8 Feb 2014 21:14:25 +0000 (23:14 +0200)]
man: try to clarify the folder: and path: vs. --output=files confusion
Jani Nikula [Sun, 9 Mar 2014 21:03:06 +0000 (23:03 +0200)]
man: update man pages for folder: and path: search terms
Text from review by Austin Clements <amdragon@MIT.EDU>.
David Bremner [Sat, 1 Mar 2014 20:12:44 +0000 (16:12 -0400)]
test: add machinery to download and verify databases
Note that it is intentional that the checksum file is not
downloaded. The intent is to check those into git.
David Bremner [Sat, 1 Mar 2014 23:22:59 +0000 (19:22 -0400)]
test: commit database checksum, ignore actual databases
The checksum file is used by the test infrastructure to verify the downloaded
test database is the one we had in mind. Note that this test is
rather strict, and the the checksum file needs to be recommitted when
the database is regenerated.
add a pattern .gitignore to ignore the actual databases
Jani Nikula [Sat, 8 Feb 2014 13:36:54 +0000 (15:36 +0200)]
devel: add script to generate test databases
Add script to generate notmuch test databases using specified versions
of notmuch. This is useful for generating material for database
upgrade tests.
This reuses the test infrastructure to have a sandbox environment for
notmuch new etc.
Jani Nikula [Tue, 11 Mar 2014 05:42:49 +0000 (07:42 +0200)]
test: add database upgrade test from format version 1 to 2
Test the upgrade from probabilistic to boolean folder: terms, and
addition of path: terms.
The test depends on the pre-built test corpus and database tarball and
checksum file being in place. If it's not, the test is skipped. The
mechanism to fetch the test database will be added later.
At the time of writing, a working test database and checksum file is
available at
http://notmuchmail.org/releases/test-databases/
It has been noted that some non-GNU environments make lack
sha256sum. We leave this portability issue for a followup patch.
Jani Nikula [Sat, 22 Feb 2014 20:59:18 +0000 (22:59 +0200)]
test: add tests for the new boolean folder: and path: prefixes
Additional tests for the boolean folder: and path: prefixes using the
full corpus.
Jani Nikula [Sat, 8 Feb 2014 19:20:42 +0000 (21:20 +0200)]
lib: make folder: prefix literal
In xapian terms, convert folder: prefix from probabilistic to boolean
prefix, matching the paths, relative from the maildir root, of the
message files, ignoring the maildir new and cur leaf directories.
folder:foo matches all message files in foo, foo/new, and foo/cur.
folder:foo/new does *not* match message files in foo/new.
folder:"" matches all message files in the top level maildir and its
new and cur subdirectories.
This change constitutes a database change: bump the database version
and add database upgrade support for folder: terms. The upgrade also
adds path: terms.
Finally, fix the folder search test for literal folder: search, as
some of the folder: matching capabilities are lost in the
probabilistic to boolean prefix change.
Jani Nikula [Mon, 6 Jan 2014 21:48:24 +0000 (23:48 +0200)]
test: make insert test use the path: prefix
This is a more strict test for the insert test.
Jani Nikula [Sat, 8 Feb 2014 18:50:44 +0000 (20:50 +0200)]
lib: add support for path: prefix searches
The path: prefix is a literal boolean prefix matching the paths,
relative from the maildir root, of the message files.
path:foo matches all message files in foo (but not in foo/new or
foo/cur).
path:foo/new matches all message files in foo/new.
path:"" matches all message files in the top level maildir.
path:foo/** matches all message files in foo and recursively in all
subdirectories of foo.
path:** matches all message files recursively, i.e. all messages.
Jani Nikula [Sat, 8 Feb 2014 17:48:16 +0000 (19:48 +0200)]
lib: refactor folder term update after filename removal
Abstract some blocks of code for reuse. No functional changes.
Jani Nikula [Sun, 9 Mar 2014 12:25:37 +0000 (14:25 +0200)]
test: rearrange the test corpus into subfolders, fix tests
We will need this for improved folder search tests, but having some
folders should exercise our code paths better anyway.
Modify the relevant test accordingly to make it pass.
This reorganization triggers a bug in the test suite, namely that it
expects the output of --output=files to be in a certain order. So we
add the fix for that into the same commit.
This mainly involves sorting, although the case --duplicate=$n
requires more subtlety.
Jani Nikula [Sun, 9 Mar 2014 13:19:09 +0000 (15:19 +0200)]
test: add notmuch_search_files_sanitize and use it
We do this in a lot of places, so make it a helper in the test-lib.
David Bremner [Tue, 11 Mar 2014 16:52:19 +0000 (13:52 -0300)]
test: add utility function to sort a json list
So far we only need this one place, but it's a bit messy to inline
David Bremner [Mon, 10 Mar 2014 00:59:27 +0000 (21:59 -0300)]
doc: remove preformatted nroff pages
From now on, we should edit the rst source.
David Bremner [Wed, 5 Mar 2014 03:09:38 +0000 (23:09 -0400)]
doc: automatically read version from file
This avoids having to recreate the update-man-versions rule
David Bremner [Wed, 5 Mar 2014 13:34:10 +0000 (09:34 -0400)]
doc: install sphinx version of man pages
The python script mkdocdeps.py is used to import the list of man pages
from the sphinx configuration to make.
This will delete the (release only) target update-man-versions. This
will be replaced in a followup commit.
David Bremner [Tue, 28 Jan 2014 16:12:38 +0000 (12:12 -0400)]
doc: add target rst2man to build man pages using rst2man
Many people have docutils installed, but not sphinx. Allow these
people to build the man pages.
David Bremner [Tue, 28 Jan 2014 16:12:37 +0000 (12:12 -0400)]
doc: convert sphinx based docs
This is the output from sphinx-quickstart, massaged a bit, along with
our existing man pages converted to rst.
A skeleton notmuch-emacs manual is also included. It is not suitable
for end user use yet.
Jani Nikula [Mon, 3 Feb 2014 19:51:43 +0000 (21:51 +0200)]
util: make sanitize string available in string util for reuse
No functional changes.
Jani Nikula [Mon, 3 Feb 2014 19:51:42 +0000 (21:51 +0200)]
cli: refactor reply from guessing
The guess_from_received_header() function had grown quite big. Chop it
up into smaller functions.
No functional changes.
Jani Nikula [Mon, 3 Feb 2014 19:51:41 +0000 (21:51 +0200)]
cli: sanitize tabs and newlines to spaces in notmuch search
Sanitize tabs and newlines to spaces rather than question marks in
--output=summary --format=text output.
This will also hide any difference in unfolding a header that has been
folded with a tab. Our own header parser replaces tabs with spaces,
while gmime would retain the tab.
Tomi Ollila [Mon, 10 Feb 2014 21:15:00 +0000 (23:15 +0200)]
support for generating decreasing dates in bash 4.0 and 4.1
The printf builtin "%(fmt)T" specifier (which allows time values
to use strftime-like formatting) is introduced in bash 4.2.
Trying to execute this in pre-4.2 bash will fail -- and if this
happens execute the fallback piece of perl code to do the same thing.
Tomi Ollila [Tue, 4 Mar 2014 20:38:21 +0000 (22:38 +0200)]
test: NOTMUCH_SKIP_TESTS accepts test names with or without Tddd- prefix
The test names assigned to NOTMUCH_SKIP_TESTS variable can now be given
with or without the Tddd- prefix for tester convenience:
The test name without Tddd -prefix stays constant even when test filenames
are renumbered.
The test name with Tddd -prefix is printed out when tests run.
David Bremner [Sat, 8 Mar 2014 14:00:39 +0000 (10:00 -0400)]
test: don't use $(dir) in recipes.
According the semantics of make, the expansion of $(dir) in recipes
uses dynamic scope, i.e. the value at the time the recipe is run. This
means if test/Makefile.local is not the last sub-makefile included,
all heck breaks loose.
David Bremner [Thu, 6 Mar 2014 12:52:02 +0000 (08:52 -0400)]
debian: add dependency on bash-completion
At some point we decided to only install bash completion for notmuch
if the bash-completion file was present. Add the corresponding debian
build dependency.
Austin Clements [Tue, 4 Mar 2014 06:40:08 +0000 (01:40 -0500)]
test: Print the number of the test along with its name
Previously, we stripped the "Tnnn-" part from the test name when
printing its description at the beginning of each test. However, this
makes it difficult to find the source script for a test (e.g., when a
test fails). Put this prefix back.
Jani Nikula [Tue, 4 Mar 2014 16:51:54 +0000 (18:51 +0200)]
cli: add missing \n in error message
The error messages returned by illegal_tag() don't contain newlines.
Jani Nikula [Sun, 23 Feb 2014 16:55:23 +0000 (18:55 +0200)]
test: add tests for invalid new.tags
Similar tests for both notmuch new and insert.
Jani Nikula [Sun, 23 Feb 2014 16:55:22 +0000 (18:55 +0200)]
cli: make sure notmuch new and insert don't add invalid tags
Check new.tags configuration values before doing anything, and bail
out on invalid values.
Jani Nikula [Sun, 23 Feb 2014 16:55:21 +0000 (18:55 +0200)]
cli: export function for illegal tag checking
This lets us check for forbidden tags consistently across the cli. No
functional changes.
Jani Nikula [Sat, 1 Mar 2014 13:17:50 +0000 (15:17 +0200)]
emacs: use the originating buffer's working directory for pipe
Currently notmuch-show-pipe-message runs the command in the working
directory of the *notmuch-pipe* buffer if it exists, and the current
buffer's working directory (which is inherited to the new
*notmuch-pipe* buffer) otherwise. This is all very surprising to the
user, and it's difficult to know or change where the command will be
run.
Always use the current show buffer's working directory for piping. The
user can check that with M-x pwd and change it with M-x cd. This is
consistent with notmuch-show-pipe-part.
Austin Clements [Thu, 27 Feb 2014 18:10:54 +0000 (13:10 -0500)]
emacs: Simplify and fix `notmuch-mua-prompt-for-sender'
`notmuch-mua-prompt-for-sender' is over-engineered and often wrong.
It attempts to detect when all identities have the same name and
specialize the prompt to just the email address part. However, to do
this it uses `mail-extract-address-components', which is meant for
displaying email addresses, not general-purpose parsing, and hence
performs many canonicalizations that can interfere with this use. For
example, configuring notmuch-identities to ("Austin
<austin@example.com>"), will cause `notmuch-mua-prompt-for-sender' to
lose the name part entirely and return " <austin@example.com>".
This patch rewrites `notmuch-mua-prompt-for-sender' to simply prompt
for a full identity when notmuch-identities is configured, or to
prompt for a sender address when it isn't.
The original code also did several strange things, like using `eval'
and specifying that this function was interactive. As a side-effect,
this patch fixes these problems. And it adds a docstring.
David Bremner [Mon, 3 Mar 2014 12:48:33 +0000 (08:48 -0400)]
NEWS: note closing of id:87ty19pi85.fsf@zancas.localnet
Also close the original debian bug.
David Bremner [Mon, 3 Mar 2014 12:36:37 +0000 (08:36 -0400)]
debian: note closing of debian bug 739556
This one doesn't seem NEWS-worthy.
David Bremner [Mon, 3 Mar 2014 12:25:04 +0000 (08:25 -0400)]
NEWS: note closing of bug id:87wqhcxb5j.fsf@maritornes.cs.unb.ca
This is also/originally Debian bug 737496, so close that too.
David Bremner [Mon, 3 Mar 2014 12:10:51 +0000 (08:10 -0400)]
Merge tag 'debian/0.17-5'
uploaded to unstable
David Bremner [Sun, 2 Mar 2014 11:36:34 +0000 (07:36 -0400)]
debian: fix typo in postinst (Debian bug 740325), clean up empty directory
Try to remove the directory /0755 ; if that fails assume it has
something in it to preserve.
Austin Clements [Tue, 25 Feb 2014 19:18:59 +0000 (14:18 -0500)]
test: Simplify CLEAN list construction
Construct as much of the CLEAN list from TEST_BINARIES as possible,
rather than duplicating this information by hand.
Jani Nikula [Mon, 24 Feb 2014 21:36:58 +0000 (23:36 +0200)]
cli: command line option parser cleanup
Reduce the indentation for clarity. No functional changes.
David Bremner [Sat, 8 Feb 2014 14:25:17 +0000 (10:25 -0400)]
emacs: remove newlines from input to notmuch count --batch
Since a newline starts a new query in batch mode, this causes
mysterious crashes in the emacs interface if saved searches contain
newlines. See the discussion at
id:87wqhcxb5j.fsf@maritornes.cs.unb.ca
In general newlines seem to be just whitespace to the xapian query
parser, so this should be mainly harmless.
David Bremner [Sat, 15 Feb 2014 03:24:58 +0000 (23:24 -0400)]
man: escape backslash in notmuch-tag example
The example was originally intended to have a literal backslash in it, but
'\ ' is interpreted by nroff as a non-breaking space.
It doesn't make much difference to the example, but the non-breaking
space triggers a bug in doclifter.
Austin Clements [Thu, 20 Feb 2014 19:16:36 +0000 (14:16 -0500)]
emacs: Fix `notmuch-user-other-email' when no other emails are configured
Thanks to the previous patch, this no longer crashes in this
situation, but now would return (""). Fix it to return () when no
emails are configured.
Austin Clements [Thu, 20 Feb 2014 19:16:35 +0000 (14:16 -0500)]
emacs: Fix exception when fetching empty or unconfigured settings
When "notmuch config" is called with the name of an empty or
unconfigured setting, it prints nothing (not even a new line).
Previously, `notmuch-config-get' assumed it would always print a
newline. As a result, when `notmuch-config-get' was called with the
name of an empty of unconfigured setting, it would attempt to
(substring "" 0 -1) to strip the newline, which would fail with a
(args-out-of-range "" 0 -1) exception.
Fix this by only stripping the newline if there actually is one.
Austin Clements [Thu, 20 Feb 2014 19:16:34 +0000 (14:16 -0500)]
emacs: Build forwarded message buffer more directly
Previously, we used `message-forward' to build forwarded messages, but
this function is simply too high-level to be a good fit for some of
what we do.
First, since `message-forward' builds a full forward message buffer
given the message to forward, we have to duplicate much of the logic
in `notmuch-mua-mail' to patch the notmuch-y things into the built
buffer.
Second, `message-forward' constructs the From header from
user-full-name and user-mail-address. As a result, if we prompt the
user for an identity, we have to parse it into name and address
components, just to have it put back together by `message-forward'.
This process is not entirely loss-less because
`mail-extract-address-components' does a lot of canonicalization
(since it's intended for displaying addresses, not for parsing them).
To fix these problems, don't use `message-forward' at all.
`message-forward' itself is basically just a call to `message-mail'
and `message-forward-make-body'. Do this ourselves, but call
`notmuch-mua-mail' instead of `message-mail' so we can directly build
a notmuch-y message and control the From header.
This also fixes a bug that was a direct consequence of our use of
`mail-extract-address-components': if the user chose an identity that
had no name part (or the name part matched the mailbox), we would bind
user-full-name to nil, which would cause an exception in the bowels of
message-mode because user-full-name is expected to always be a string
(even if it's just "").
David Bremner [Sat, 22 Feb 2014 01:22:46 +0000 (21:22 -0400)]
man: fix typo in notmuch.1
Fix for Debian bug 739556
Gaute Hope [Thu, 30 Jan 2014 19:11:51 +0000 (20:11 +0100)]
ruby bindings message: docstring typo
Tomi Ollila [Tue, 18 Feb 2014 18:34:52 +0000 (20:34 +0200)]
nmbug-status: replace __values__() with values() in OrderedDict stub
Python dict() object does not have __values__() function which
OrderedDict().values() (the stub provided in nmbug-status) could call
to provide ordered list of values. By renaming this thinko to
values() will make our stub work as expected -- dict items listed out
in order those were added to the dictionary.
Austin Clements [Thu, 20 Feb 2014 04:24:24 +0000 (23:24 -0500)]
emacs: Avoid rebuilding .eldeps even when there's nothing to do
Previously, we updated .eldeps only if the file contents actually
needed to change. This was done to avoid unnecessary make restarts
(if the .eldeps rule changes the mtime of .eldeps, make has to restart
to collect the new dependencies). However, this meant that, after a
modification to any .el file that did not change dependencies, .eldeps
would always be out of date, so every make invocation would run the
.eldeps rule, which is both expensive because it starts up Emacs and
noisy. This was true even when there was nothing to do. E.g.,
$ make clean && make
...
$ touch emacs/notmuch-lib.el && make
...
$ make
Use "make V=1" to see the verbose compile lines.
EMACS emacs/.eldeps
make: Nothing to be done for `all'.
$ make
Use "make V=1" to see the verbose compile lines.
EMACS emacs/.eldeps
make: Nothing to be done for `all'.
Fix this by replacing .eldeps with two files with identical content.
One tracks the mtime of the dependency information and triggers the
Emacs call to rebuild dependencies only when it may be necessary. The
other tracks the content only; this rule over-triggers in the same way
the old rule did, but this rule is cheap and quiet.
David Bremner [Sat, 22 Feb 2014 01:05:05 +0000 (21:05 -0400)]
Merge tag 'debian/0.17-4'
uploaded to Debian unstable
David Bremner [Wed, 19 Feb 2014 01:38:55 +0000 (21:38 -0400)]
changelog stanza for 0.17-4
David Bremner [Wed, 19 Feb 2014 01:05:14 +0000 (21:05 -0400)]
debian: update ruby binary extension install path
From Christian Hofstaedler, Debian bug 739120:
When ruby-defaults > 1:2.0 will be uploaded to sid, the version of
Ruby provided by the 'ruby' and 'ruby-dev' packages will change to
version 2.0. This version change includes a change to the path for
binary extensions.
This patch works for Ruby 1.9.1 as well as Ruby 2.0, so it's safe to
apply now.
Jed Brown [Thu, 13 Feb 2014 15:04:22 +0000 (08:04 -0700)]
emacs: update alist for mail-archive.com API change
Searching by Message-Id no longer works via the old mail-archive.com
API, though I have contacted them in hopes that they restore it to
prevent dead links. Anyway, the new API is cleaner.
Acked-by: Austin Clements <amdragon@MIT.EDU>
W. Trevor King [Fri, 14 Feb 2014 16:48:55 +0000 (08:48 -0800)]
nmbug-status: Hardcode UTF-8 instead of using the user's locale
David [1] and Tomi [2] both feel that the user's choice of LANG is not
explicit enough to have such a strong effect on nmbug-status. For
example, cron jobs usually default to LANG=C, and that is going to
give you ASCII output:
$ LANG=C python -c 'import locale; print(locale.getpreferredencoding())'
ANSI_X3.4-1968
Trying to print Unicode author names (and other strings) in that
encoding would crash nmbug-status with a UnicodeEncodeError. To avoid
that, this patch hardcodes UTF-8, which can handle generic Unicode,
and is the preferred encoding (regardless of LANG settings) for
everyone who has chimed in on the list so far. I'd prefer trusting
LANG, but in the absence of any users that prefer non-UTF-8 encodings
I'm fine with this approach.
While we could achieve the same effect on the output content by
dropping the previous patch (nmbug-status: Encode output using the
user's locale), Tomi also wanted UTF-8 hardcoded as the config-file
encoding [2]. Keeping the output encoding patch and then adding this
to hardcode both the config-file and output encodings at once seems
the easiest route, now that
fd29d3f (nmbug-status: Decode Popen output
using the user's locale, 2014-02-10) has landed in master.
[1]: id="877g8z4v4x.fsf@zancas.localnet"
http://article.gmane.org/gmane.mail.notmuch.general/17202
[2]: id="m2vbwj79lu.fsf@guru.guru-group.fi"
http://article.gmane.org/gmane.mail.notmuch.general/17209
W. Trevor King [Fri, 14 Feb 2014 16:48:54 +0000 (08:48 -0800)]
nmbug-status: Encode output using the user's locale
Instead of always writing UTF-8, allow the user to configure the
output encoding using their locale. This is useful for previewing
output in the terminal, for poor souls that don't use UTF-8 locales
;).
W. Trevor King [Fri, 14 Feb 2014 16:48:53 +0000 (08:48 -0800)]
nmbug-status: Add inter-message padding
We already had the tbody with a blank row separating threads (which is
not colored); this commit adds a bit of spacing to separate messages
within a thread. It will also add a bit of colored padding above the
first message and below the final message, but the main goal is to add
padding *between* two-row message blocks.
<--- new padding
thread-1, message-1, row-1 (class="message-first")
thread-1, message-1, row-2 (class="message-last")
<--- new padding
spacer tbody with a blank row
<--- new padding
thread-2, message-1, row-1 (class="message-first")
thread-2, message-1, row-2 (class="message-last")
<--- new padding
<--- new padding
thread-2, message-2, row-1 (class="message-first")
thread-2, message-2, row-2 (class="message-last")
<--- new padding
W. Trevor King [Fri, 14 Feb 2014 16:48:52 +0000 (08:48 -0800)]
nmbug-status: Color threads in HTML output
Add tbody sections so we don't have to color every row. Multiple
tbody sections are allowed [1]. Use CSS 3's nth-child to handle
even/odd coloring (skipping the spacer rows) [2], which is supported
on the major browsers [3].
border-spacing is from CCS 2.1 [4,5]. I'm using it to avoid
whitespace between td cells.
border-radius is from CCS 3 [6,7]. I'm using it to make the colored
sections a bit less harsh. I tried adding rounded borders to the
tbody itself doesn't work, but I couldn't get that to work without
setting the tbody's display to 'block'. That rounded the corners, but
collapsed the cell spacing (e.g. columns were no longer aligned).
This commit's by-corner-td approach is not particularly elegant, but
it works. The td padding entries just ensure that the cell body is
suitably far from the edges that it doesn't fall outside of the
rounded corners.
The doubled-braces are escapes from Python's str.format.
[1]: http://www.w3.org/TR/html5/tabular-data.html#the-table-element
[2]: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
[3]: https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child#Browser_compatibility
[4]: http://www.w3.org/TR/CSS2/tables.html#propdef-border-spacing
[5]: https://developer.mozilla.org/en-US/docs/Web/CSS/border-spacing#Browser_compatibility
[6]: http://www.w3.org/TR/css3-background/#the-border-radius
[7]: https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius#Browser_compatibility
Austin Clements [Thu, 13 Feb 2014 06:50:59 +0000 (01:50 -0500)]
new: Detect dirent.d_type support at configure time
Support for dirent.d_type is OS-specific. Previously, we used
_DIRENT_HAVE_D_TYPE to detect support for this, but this is apparently
a glic-ism (FreeBSD, for example, supports d_type, but does not define
this). Since there's no cross-platform way to detect support for
dirent.d_type, detect it using a test compile at configure time.
W. Trevor King [Thu, 13 Feb 2014 16:47:20 +0000 (08:47 -0800)]
nmbug-status: Escape &, <, and > in HTML display data
'message-id' and 'from' now have sensitive characters escaped using
xml.sax.saxutils.escape [1]. The 'subject' data was already being
converted to a link into Gmane; I've escape()d that too, so it doesn't
need to be handled ain the same block as 'message-id' and 'from'.
This prevents broken HTML by if subjects etc. contain characters that
would otherwise be interpreted as HTML markup.
[1]: http://docs.python.org/3/library/xml.sax.utils.html#xml.sax.saxutils.escape
W. Trevor King [Thu, 13 Feb 2014 16:47:18 +0000 (08:47 -0800)]
nmbug-status: Use <code> and <p> markup where appropriate
* Wrap free text in <p> tags.
* Convert <blockquote> to <p><code> for query strings.
* Wrap message-id-term (id:"...") in <code>.
The <code> tags get nicer default markup (smaller monospace font) for
notmuch query terms [1]. The <p> tags don't have much effect without
attached CSS, but bare text (phrasing content [2]) in <body> (which
expects flow content [3,4]) feels wrong.
[1]: http://www.w3.org/TR/html5/text-level-semantics.html#the-code-element
[2]: http://www.w3.org/TR/html5/dom.html#phrasing-content-1
[3]: http://www.w3.org/TR/html5/dom.html#flow-content-1
[4]: http://www.w3.org/TR/html5/sections.html#the-body-element
W. Trevor King [Thu, 13 Feb 2014 16:47:17 +0000 (08:47 -0800)]
nmbug-status: Slug the title when using it as an id
Also allow manual id overrides from the JSON config. Sluggin avoids
errors like:
Bad value '#Possible bugs' for attribute href on element a:
Whitespace in fragment component. Use %20 in place of spaces.
from http://validator.w3.org.
I tried just quoting the titles (e.g. 'Possible%20bugs'), but that
didn't work (at least with Firefox 24.2.0). Slugging avoids any
ambiguity over when the quotes are expanded in the client. The specs
are unclear about quoting, saying only [1]:
Value: Any string, with the following restrictions:
must be at least one character long
must not contain any space characters
[1]: http://dev.w3.org/html5/markup/global-attributes.html#common.attrs.id
W. Trevor King [Thu, 13 Feb 2014 16:47:16 +0000 (08:47 -0800)]
nmbug-status: Anchor with h3 ids instead of a names
HTML 5 allows id attributes on all HTML elements [1], but restricts
names to particular cases [2]. Attaching the id attribute to the h3
element allows us to drop the anchor a element altogether.
[1]: http://www.w3.org/TR/html5/dom.html#the-id-attribute
[2]: http://www.w3.org/TR/html5/index.html#attributes-1
Gaute Hope [Sun, 9 Feb 2014 10:50:48 +0000 (11:50 +0100)]
doc: notmuch_result_move_to_next -> notmuch_tags_move_to_next
Fix typo in docs.
W. Trevor King [Mon, 10 Feb 2014 18:40:34 +0000 (10:40 -0800)]
nmbug-status: Convert from XHTML 1.0 to HTML 5
HTML 5 for the win :). I also de-namespaced the language; the HTML 5
spec allows a vestigial xml:lang attribute, but it's a no-op [1], so I
stripped it.
This shouldn't break anything at tethera, which already serves the
status as text/html:
$ wget -S http://nmbug.tethera.net/status/
--2014-02-02 21:20:39-- http://nmbug.tethera.net/status/
Resolving nmbug.tethera.net... 87.98.215.224
Connecting to nmbug.tethera.net|87.98.215.224|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Type: text/html
...
This also matches the Content-Type in the generated HTML's http-equiv
meta.
[1]: http://www.w3.org/TR/html5/dom.html#the-lang-and-xml:lang-attributes
W. Trevor King [Mon, 10 Feb 2014 18:40:33 +0000 (10:40 -0800)]
nmbug-status: Normalize table HTML indentation
I don't think I've ever seen '</td><td>{value}\n' before :p. The new
formatting avoids mixing tag levels and content across lines.
W. Trevor King [Mon, 10 Feb 2014 18:40:32 +0000 (10:40 -0800)]
nmbug-status: Add an OrderedDict stub for Python 2.6
Tomi Ollila and David Bremner (and presumably others) are running
Python 2.6 on their nmbug-status boxes, so it makes sense to keep
support for that version. This commit adds a really minimal
OrderedDict stub (e.g. it doesn't handle key removal), but it gets the
job done for Page._get_threads. Once we reach a point where Python
2.6 is no longer important (it's already out of it's security-fix
window [1]), we can pull this stub back out.
[1]: http://www.python.org/download/releases/2.6.9/
W. Trevor King [Mon, 10 Feb 2014 18:40:31 +0000 (10:40 -0800)]
nmbug-status: Add Page and HtmlPage for modular rendering
I was having trouble understanding the logic of the longish print_view
function, so I refactored the output generation into modular bits.
The basic text rendering is handled by Page, which has enough hooks
that HtmlPage can borrow the logic and slot-in HTML generators.
By modularizing the logic it should also be easier to build other
renderers if folks want to customize the layout for other projects.
Timezones
=========
This commit has not effect on the output, except that some dates have
been converted from the sender's timezone to UTC due to:
- val = m.get_header(header)
- ...
- if header == 'date':
- val = str.join(' ', val.split(None)[1:4])
- val = str(datetime.datetime.strptime(val, '%d %b %Y').date())
...
+ value = str(datetime.datetime.utcfromtimestamp(
+ message.get_date()).date())
I also tweaked the HTML header date to be utcnow instead of the local
now() to make all times independent of the generator's local time.
This matches Gmane, which converts all Date headers to UTC (although
they use a 'GMT' suffix). Notmuch uses
g_mime_utils_header_decode_date to calculate the UTC timestamps, but
uses a NULL tz_offset which drops the information we'd need to get
back to the sender's local time [1]. With the generator's local time
arbitrarily different from the sender's and viewer's local time,
sticking with UTC seems the best bet.
[1]: https://developer.gnome.org/gmime/stable/gmime-gmime-utils.html#g-mime-utils-header-decode-date
W. Trevor King [Mon, 10 Feb 2014 18:40:30 +0000 (10:40 -0800)]
nmbug-status: Add a Python-3-compatible urllib.parse.quote import
Python 2's urllib.quote [1] has moved to urllib.parse.quote in Python
3 [2].
[1]: http://docs.python.org/2/library/urllib.html#urllib.quote
[2]: http://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote
W. Trevor King [Mon, 10 Feb 2014 18:40:29 +0000 (10:40 -0800)]
nmbug-status: Consolidate HTML header printing
Make this all one big string, using '...{date}...'.format(date=...) to
inject the date [1]. This syntax was added in Python 2.6, and is
preferred to %-formatting in Python 3 [1].
[1]: http://docs.python.org/2/library/stdtypes.html#str.format
W. Trevor King [Mon, 10 Feb 2014 18:40:28 +0000 (10:40 -0800)]
nmbug-status: Don't require write access
The database in only used for notmuch.Query, so there's no need for
write access. This allows nmbug-status to run while the database is
being updated, without raising:
A Xapian exception occurred opening database: Unable to get write lock on …: already locked
Traceback (most recent call last):
File "./nmbug-status", line 182, in <module>
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
File "/…/notmuch/database.py", line 154, in __init__
self.open(path, mode)
File "/…/notmuch/database.py", line 214, in open
raise NotmuchError(status)
notmuch.errors.XapianError
W. Trevor King [Mon, 10 Feb 2014 18:40:27 +0000 (10:40 -0800)]
nmbug-status: Consolidate functions and main code
The definitions of Thread, output_with_separator, and print_view were
between the main argparse and view-printing code. Group them together
with our existing read_config at the top of the module, which makes
for easier reading in the main section.
I also:
* Made 'headers' a print_view argument instead of a module-level
global. The list -> tuple conversion avoids having a mutable
default argument, which makes some people jumpy ;).
* Made 'db' a print_view argument instead of relying on the global
namespace to access it from print_view.
W. Trevor King [Mon, 10 Feb 2014 18:40:26 +0000 (10:40 -0800)]
nmbug-status: Add metavars for --config and --get-query
Now the suggested usage (listed by 'nmbug-status --help') is:
usage: nmbug-status [-h] [--text] [--config PATH] [--list-views]
[--get-query VIEW]
instead of the less obvious:
usage: nmbug-status [-h] [--text] [--config CONFIG] [--list-views]
[--get-query GET_QUERY]
W. Trevor King [Mon, 10 Feb 2014 18:40:25 +0000 (10:40 -0800)]
nmbug-status: Factor config-loading out into read_config
By isolating this peripheral handling, we make the core logic of
nmbug-status easier to read.
W. Trevor King [Mon, 10 Feb 2014 18:40:24 +0000 (10:40 -0800)]
nmbug-status: Decode Popen output using the user's locale
Avoid:
$ ./nmbug-status --list-views
Traceback (most recent call last):
File "./nmbug-status", line 47, in <module>
'cat-file', 'blob', sha1+':status-config.json'],
TypeError: can't concat bytes to str
by explicitly converting the byte-stream read from Popen into a
Unicode string. On Python 2, this conversion is str -> unicode; on
Python 3 it is bytes -> str.
_ENCODING is derived from the user's locale (or system default) in an
attempt to match Git's output encoding. It may be more robust to skip
the encoding/decoding by using a Python wrapper like pygit2 [1] for
Git access. That's a fairly heavy dependency though, and using the
locale will probably work.
[1]: http://www.pygit2.org/
W. Trevor King [Mon, 10 Feb 2014 18:40:23 +0000 (10:40 -0800)]
nmbug-status: Use email.utils instead of rfc822
rfc822 has been deprecated since Python 2.3, and it's gone in
Python 3 [1].
[1]: http://docs.python.org/2/library/rfc822.html
W. Trevor King [Mon, 10 Feb 2014 18:40:22 +0000 (10:40 -0800)]
nmbug-status: Convert to Python-3-compatible print functions
We shouldn't require folks to install Python 2 to run nmbug-status.
Tomi Ollila [Mon, 27 Jan 2014 20:23:37 +0000 (22:23 +0200)]
emacs: initialize ido(-completing-read) in emacs 23.[123]
Otherwise `ido-completing-read' will freeze after PROMPT is displayed.
Jani Nikula [Sun, 2 Feb 2014 12:49:09 +0000 (14:49 +0200)]
completion: bash completion for notmuch new --quiet option
notmuch new now has --quiet option, complete it too.
Jani Nikula [Sun, 2 Feb 2014 16:47:57 +0000 (18:47 +0200)]
configure: only install bash completion if supported
Our bash completion depends on bash-completion 1.90 or later. Only
install where available.
Tomi Ollila [Mon, 27 Jan 2014 20:32:12 +0000 (22:32 +0200)]
emacs: ad-activate 'mm-shr after ad-disable-advice 'mm-shr
Imitated from "Enabling advice" in Emacs lisp manual...
ad-disable-advice by itself only changes the enable flag for a
piece of advice. To make the change take effect in the
advised definition, the advice needs to be activated again.
Jani Nikula [Sun, 26 Jan 2014 18:58:46 +0000 (20:58 +0200)]
test: add basic tests for notmuch new --quiet option
This does not cover all the possible paths notmuch new could output
stuff, but it's better than nothing.
David Bremner [Sun, 26 Jan 2014 18:44:27 +0000 (14:44 -0400)]
emacs: add notmuch-assert-cli-sane to notmuch-hello
This is meant to be the friendly entrypoint, so let's do something
better than the mangled output described in
id:
5228989D.
8030607@fifthhorseman.net
David Bremner [Sun, 26 Jan 2014 18:36:37 +0000 (14:36 -0400)]
emacs: add function notmuch-assert-cli-sane
If the CLI seems borked, signal an error, and log a suggestion for the
user about how to recover.
David Bremner [Sun, 26 Jan 2014 18:13:48 +0000 (14:13 -0400)]
emacs: add a function to heuristically test if the CLI is configured OK.
We cache the result so that we can call the function many places
without worrying about the cost.
Jani Nikula [Sun, 19 Jan 2014 20:32:28 +0000 (22:32 +0200)]
man: document notmuch new --quiet option
Jani Nikula [Sun, 19 Jan 2014 20:32:27 +0000 (22:32 +0200)]
cli: add --quiet option to notmuch new
Tie it to --verbose (resulting in verbosity levels of quiet, normal,
and verbose) but leave --debug orthogonal. Do some drive-by cleaning
while at it.
Jani Nikula [Sun, 19 Jan 2014 20:32:26 +0000 (22:32 +0200)]
cli: abstract notmuch new result printing
The notmuch_new_command() function has grown huge, chop it up a
bit. This should also be helpful when adding a --quiet option to
notmuch new. No functional changes.
Jani Nikula [Sun, 19 Jan 2014 20:32:25 +0000 (22:32 +0200)]
cli: for loop is more customary
With the happy day stop condition within the while, it was
confusing. Switch to the paradigm for loop. No functional changes.
Jani Nikula [Sun, 19 Jan 2014 20:32:24 +0000 (22:32 +0200)]
cli: use dirent_type in count_files too
Avoid an extra stat per file, if possible, also when counting the
files for initial indexing.
Jani Nikula [Sun, 19 Jan 2014 20:32:23 +0000 (22:32 +0200)]
cli: only check the ignore list if needed
Premature optimization is the root of all evil, but this is simple
enough.
Jani Nikula [Sun, 19 Jan 2014 20:32:22 +0000 (22:32 +0200)]
cli: extract single message addition in notmuch new to clarify code
The add_files() function has grown huge, chop it up a bit. No
functional changes.
David Bremner [Sat, 25 Jan 2014 03:07:43 +0000 (23:07 -0400)]
lib: update documentation for notmuch_database_get_directory
Clarify that using the directory after destroying the corresponding
database is not permitted.
This is implicit in the description of notmuch_database_destroy, but
it doesn't hurt to be explicit, and we do express similar "ownership"
relationships at other places in the docs.
Tomi Ollila [Sat, 25 Jan 2014 12:33:55 +0000 (14:33 +0200)]
build: delete the default .SUFFIXES
All implicit rules in notmuch Makefiles are "pattern rules"; Deleting the
default suffixes (to support obsolete, old-fashioned "suffix rules") from
make reduces the output of 'make -d' by 40 to 90 percent, helping e.g.
debugging make problems.
David Bremner [Thu, 23 Jan 2014 12:24:01 +0000 (08:24 -0400)]
notmuch-show: detect NULL pointer returned from notmuch_query_search_threads
We want to return an error status, not 0 or (worse) segfault.
David Bremner [Thu, 23 Jan 2014 12:24:00 +0000 (08:24 -0400)]
lib: make notmuch_threads_valid return FALSE when passed NULL
Without this patch, the example code in the header docs crashes for certain
invalid queries (see id:871u00oimv.fsf@approx.mit.edu)
David Bremner [Thu, 23 Jan 2014 12:23:59 +0000 (08:23 -0400)]
test: add known broken test exit code of notmuch show
This test catches a segfault on a syntactically invalid query. It also
catches a problem with my initial fix, which still returned 0.