aboutsummaryrefslogtreecommitdiffhomepage
Commit message (Collapse)AuthorAge
* nmbug-status: Encode output using the user's localeGravatar W. Trevor King2014-02-14
| | | | | | | 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 ;).
* nmbug-status: Add inter-message paddingGravatar W. Trevor King2014-02-14
| | | | | | | | | | | | | | | | | | | | | | 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
* nmbug-status: Color threads in HTML outputGravatar W. Trevor King2014-02-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* new: Detect dirent.d_type support at configure timeGravatar Austin Clements2014-02-14
| | | | | | | | 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.
* nmbug-status: Escape &, <, and > in HTML display dataGravatar W. Trevor King2014-02-14
| | | | | | | | | | | | '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
* nmbug-status: Use <code> and <p> markup where appropriateGravatar W. Trevor King2014-02-13
| | | | | | | | | | | | | | | | * 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
* nmbug-status: Slug the title when using it as an idGravatar W. Trevor King2014-02-13
| | | | | | | | | | | | | | | | | | | | | | 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
* nmbug-status: Anchor with h3 ids instead of a namesGravatar W. Trevor King2014-02-13
| | | | | | | | | 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
* doc: notmuch_result_move_to_next -> notmuch_tags_move_to_nextGravatar Gaute Hope2014-02-13
| | | | Fix typo in docs.
* nmbug-status: Convert from XHTML 1.0 to HTML 5Gravatar W. Trevor King2014-02-10
| | | | | | | | | | | | | | | | | | | | | | | | 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
* nmbug-status: Normalize table HTML indentationGravatar W. Trevor King2014-02-10
| | | | | 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.
* nmbug-status: Add an OrderedDict stub for Python 2.6Gravatar W. Trevor King2014-02-10
| | | | | | | | | | | | 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/
* nmbug-status: Add Page and HtmlPage for modular renderingGravatar W. Trevor King2014-02-10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* nmbug-status: Add a Python-3-compatible urllib.parse.quote importGravatar W. Trevor King2014-02-10
| | | | | | | | 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
* nmbug-status: Consolidate HTML header printingGravatar W. Trevor King2014-02-10
| | | | | | | | 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
* nmbug-status: Don't require write accessGravatar W. Trevor King2014-02-10
| | | | | | | | | | | | | | | | 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
* nmbug-status: Consolidate functions and main codeGravatar W. Trevor King2014-02-10
| | | | | | | | | | | | | | | | 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.
* nmbug-status: Add metavars for --config and --get-queryGravatar W. Trevor King2014-02-10
| | | | | | | | | | | | 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]
* nmbug-status: Factor config-loading out into read_configGravatar W. Trevor King2014-02-10
| | | | | By isolating this peripheral handling, we make the core logic of nmbug-status easier to read.
* nmbug-status: Decode Popen output using the user's localeGravatar W. Trevor King2014-02-10
| | | | | | | | | | | | | | | | | | | | | | 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/
* nmbug-status: Use email.utils instead of rfc822Gravatar W. Trevor King2014-02-10
| | | | | | | 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
* nmbug-status: Convert to Python-3-compatible print functionsGravatar W. Trevor King2014-02-10
| | | | We shouldn't require folks to install Python 2 to run nmbug-status.
* emacs: initialize ido(-completing-read) in emacs 23.[123]Gravatar Tomi Ollila2014-02-03
| | | | Otherwise `ido-completing-read' will freeze after PROMPT is displayed.
* completion: bash completion for notmuch new --quiet optionGravatar Jani Nikula2014-02-03
| | | | notmuch new now has --quiet option, complete it too.
* configure: only install bash completion if supportedGravatar Jani Nikula2014-02-03
| | | | | Our bash completion depends on bash-completion 1.90 or later. Only install where available.
* emacs: ad-activate 'mm-shr after ad-disable-advice 'mm-shrGravatar Tomi Ollila2014-01-30
| | | | | | | | 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.
* test: add basic tests for notmuch new --quiet optionGravatar Jani Nikula2014-01-27
| | | | | This does not cover all the possible paths notmuch new could output stuff, but it's better than nothing.
* emacs: add notmuch-assert-cli-sane to notmuch-helloGravatar David Bremner2014-01-26
| | | | | | | 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
* emacs: add function notmuch-assert-cli-saneGravatar David Bremner2014-01-26
| | | | | If the CLI seems borked, signal an error, and log a suggestion for the user about how to recover.
* emacs: add a function to heuristically test if the CLI is configured OK.Gravatar David Bremner2014-01-26
| | | | | We cache the result so that we can call the function many places without worrying about the cost.
* man: document notmuch new --quiet optionGravatar Jani Nikula2014-01-26
|
* cli: add --quiet option to notmuch newGravatar Jani Nikula2014-01-26
| | | | | | 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.
* cli: abstract notmuch new result printingGravatar Jani Nikula2014-01-26
| | | | | | 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.
* cli: for loop is more customaryGravatar Jani Nikula2014-01-26
| | | | | With the happy day stop condition within the while, it was confusing. Switch to the paradigm for loop. No functional changes.
* cli: use dirent_type in count_files tooGravatar Jani Nikula2014-01-26
| | | | | Avoid an extra stat per file, if possible, also when counting the files for initial indexing.
* cli: only check the ignore list if neededGravatar Jani Nikula2014-01-26
| | | | | Premature optimization is the root of all evil, but this is simple enough.
* cli: extract single message addition in notmuch new to clarify codeGravatar Jani Nikula2014-01-26
| | | | | The add_files() function has grown huge, chop it up a bit. No functional changes.
* lib: update documentation for notmuch_database_get_directoryGravatar David Bremner2014-01-26
| | | | | | | | | 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.
* build: delete the default .SUFFIXESGravatar Tomi Ollila2014-01-25
| | | | | | | 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.
* notmuch-show: detect NULL pointer returned from notmuch_query_search_threadsGravatar David Bremner2014-01-24
| | | | We want to return an error status, not 0 or (worse) segfault.
* lib: make notmuch_threads_valid return FALSE when passed NULLGravatar David Bremner2014-01-24
| | | | | Without this patch, the example code in the header docs crashes for certain invalid queries (see id:871u00oimv.fsf@approx.mit.edu)
* test: add known broken test exit code of notmuch showGravatar David Bremner2014-01-24
| | | | | This test catches a segfault on a syntactically invalid query. It also catches a problem with my initial fix, which still returned 0.
* man: update notmuch-dump man page for new default.Gravatar David Bremner2014-01-24
| | | | | | Actually the previous default was not documented explicitely. I moved the batch-tag section first because it seemed that the formats were previously documented in order default, other.
* notmuch dump: default to batch-tag format.Gravatar David Bremner2014-01-24
| | | | | Although we didn't formally deprecate the old format, the new one has been available for a year.
* cli: abstract common config get/set codeGravatar Jani Nikula2014-01-18
| | | | Pretty straightforward abstraction similar to get/set list.
* lib: fix error handlingGravatar Tomi Valkeinen2014-01-18
| | | | | | | | | | | | | | | Currently if a Xapian exception happens in notmuch_message_get_header, the exception is not caught leading to crash. In notmuch_message_get_date the exception is caught, but an internal error is raised, again leading to crash. This patch fixes the error handling by making both functions catch the Xapian exceptions, print an error and return NULL or 0. The 'notmuch->exception_reported' is also set, as is done elsewhere, even if I don't really get the idea of that field. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@iki.fi>
* cli: close config and do talloc report also on errorsGravatar Jani Nikula2014-01-18
| | | | Seems like the sensible thing to do.
* cli: clean up exit status code returned by the cli commandsGravatar Jani Nikula2014-01-18
| | | | | | Apart from the status codes for format mismatches, the non-zero exit status codes have been arbitrary. Make the cli consistently return either EXIT_SUCCESS or EXIT_FAILURE.
* emacs: tree: use tag-format-tagsGravatar Mark Walters2014-01-18
| | | | | | | | | | | | | | | | | Previously tree did not use tag-format-tags: since tree wants to distinguish matching messages from non-matching messages it is not a perfect fit. However, in preparation for allowing tag-changes to be shown (i.e., added or deleted tags to be indicated) it is convenient to make all places displaying tags call the same routines. We modify notmuch-tag-format-tags slightly so that it can take and argument for the default characteristics of the face before the special tag features are applied. This also means that things like the star symbol for flagged messages all work in tree.
* emacs: tree: default face for matching/non-matching messagesGravatar Mark Walters2014-01-18
| | | | | | | | | | | This adds default faces for matching and non-matching messages. This makes it easier for a user to do broad customization without having to customize every field. It also fits more neatly with the next patch which switches to using notmuch-tag-format-tags for tag formatting. We set the field specific face customization to nil for all the fields which use the message default face to make it clear to a user which fields customizations are being used.