From bc30661e42ffdbf6603664f2543a54bb12d8b7af Mon Sep 17 00:00:00 2001 From: david Date: Sun, 25 Nov 2012 17:20:07 +2000 Subject: [PATCH] [Patch v2 07/17] notmuch-dump: add --format=(batch-tag|sup) --- dd/ed2695e54188aa9506d65842106bc9889d6535 | 178 ++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 dd/ed2695e54188aa9506d65842106bc9889d6535 diff --git a/dd/ed2695e54188aa9506d65842106bc9889d6535 b/dd/ed2695e54188aa9506d65842106bc9889d6535 new file mode 100644 index 000000000..01e2178e0 --- /dev/null +++ b/dd/ed2695e54188aa9506d65842106bc9889d6535 @@ -0,0 +1,178 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 6BFF0431FAF + for ; Sat, 24 Nov 2012 13:20:36 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] + autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id DVO7AneI3bGN for ; + Sat, 24 Nov 2012 13:20:35 -0800 (PST) +Received: from tesseract.cs.unb.ca (tesseract.cs.unb.ca [131.202.240.238]) + (using TLSv1 with cipher AES256-SHA (256/256 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id E48BE431FC0 + for ; Sat, 24 Nov 2012 13:20:32 -0800 (PST) +Received: from fctnnbsc30w-156034089108.dhcp-dynamic.fibreop.nb.bellaliant.net + ([156.34.89.108] helo=zancas.localnet) + by tesseract.cs.unb.ca with esmtpsa + (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) + (envelope-from ) + id 1TcN9M-0006SN-1r; Sat, 24 Nov 2012 17:20:32 -0400 +Received: from bremner by zancas.localnet with local (Exim 4.80) + (envelope-from ) + id 1TcN9G-0008Ct-Im; Sat, 24 Nov 2012 17:20:26 -0400 +From: david@tethera.net +To: notmuch@notmuchmail.org +Subject: [Patch v2 07/17] notmuch-dump: add --format=(batch-tag|sup) +Date: Sat, 24 Nov 2012 17:20:07 -0400 +Message-Id: <1353792017-31459-8-git-send-email-david@tethera.net> +X-Mailer: git-send-email 1.7.10.4 +In-Reply-To: <1353792017-31459-1-git-send-email-david@tethera.net> +References: <1353792017-31459-1-git-send-email-david@tethera.net> +X-Spam_bar: - +Cc: David Bremner +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Sat, 24 Nov 2012 21:20:36 -0000 + +From: David Bremner + +sup is the old format, and remains the default, at least until +restore is converted to parse this format. + +Each line of the batch- format is valid for notmuch tag, (with the +"notmuch tag" omitted from the front of the line). The dump format +only uses query strings of a single message-id. + +Each space seperated tag/message-id is 'hex-encoded' to remove +troubling characters. In particular this format won't have the same +problem with e.g. spaces in message-ids or tags; they will be +round-trip-able. +--- + dump-restore-private.h | 13 +++++++++++++ + notmuch-dump.c | 42 ++++++++++++++++++++++++++++++++++++------ + 2 files changed, 49 insertions(+), 6 deletions(-) + create mode 100644 dump-restore-private.h + +diff --git a/dump-restore-private.h b/dump-restore-private.h +new file mode 100644 +index 0000000..896a004 +--- /dev/null ++++ b/dump-restore-private.h +@@ -0,0 +1,13 @@ ++#ifndef DUMP_RESTORE_PRIVATE_H ++#define DUMP_RESTORE_PRIVATE_H ++ ++#include "hex-escape.h" ++#include "command-line-arguments.h" ++ ++typedef enum dump_formats { ++ DUMP_FORMAT_AUTO, ++ DUMP_FORMAT_BATCH_TAG, ++ DUMP_FORMAT_SUP ++} dump_format_t; ++ ++#endif +diff --git a/notmuch-dump.c b/notmuch-dump.c +index 88f598a..045ca9e 100644 +--- a/notmuch-dump.c ++++ b/notmuch-dump.c +@@ -19,6 +19,7 @@ + */ + + #include "notmuch-client.h" ++#include "dump-restore-private.h" + + int + notmuch_dump_command (unused (void *ctx), int argc, char *argv[]) +@@ -43,7 +44,13 @@ notmuch_dump_command (unused (void *ctx), int argc, char *argv[]) + char *output_file_name = NULL; + int opt_index; + ++ int output_format = DUMP_FORMAT_SUP; ++ + notmuch_opt_desc_t options[] = { ++ { NOTMUCH_OPT_KEYWORD, &output_format, "format", 'f', ++ (notmuch_keyword_t []){ { "sup", DUMP_FORMAT_SUP }, ++ { "batch-tag", DUMP_FORMAT_BATCH_TAG }, ++ { 0, 0 } } }, + { NOTMUCH_OPT_STRING, &output_file_name, "output", 'o', 0 }, + { 0, 0, 0, 0, 0 } + }; +@@ -83,27 +90,50 @@ notmuch_dump_command (unused (void *ctx), int argc, char *argv[]) + */ + notmuch_query_set_sort (query, NOTMUCH_SORT_UNSORTED); + ++ char *buffer = NULL; ++ size_t buffer_size = 0; ++ + for (messages = notmuch_query_search_messages (query); + notmuch_messages_valid (messages); + notmuch_messages_move_to_next (messages)) { + int first = 1; ++ const char *message_id; ++ + message = notmuch_messages_get (messages); ++ message_id = notmuch_message_get_message_id (message); + +- fprintf (output, +- "%s (", notmuch_message_get_message_id (message)); ++ if (output_format == DUMP_FORMAT_SUP) { ++ fprintf (output, "%s (", message_id); ++ } + + for (tags = notmuch_message_get_tags (message); + notmuch_tags_valid (tags); + notmuch_tags_move_to_next (tags)) { +- if (! first) +- fprintf (output, " "); ++ const char *tag_str = notmuch_tags_get (tags); + +- fprintf (output, "%s", notmuch_tags_get (tags)); ++ if (! first) ++ fputs (" ", output); + + first = 0; ++ ++ if (output_format == DUMP_FORMAT_SUP) { ++ fputs (tag_str, output); ++ } else { ++ if (hex_encode (notmuch, tag_str, ++ &buffer, &buffer_size) != HEX_SUCCESS) ++ return 1; ++ fprintf (output, "+%s", buffer); ++ } + } + +- fprintf (output, ")\n"); ++ if (output_format == DUMP_FORMAT_SUP) { ++ fputs (")\n", output); ++ } else { ++ if (hex_encode (notmuch, message_id, ++ &buffer, &buffer_size) != HEX_SUCCESS) ++ return 1; ++ fprintf (output, " -- id:%s\n", buffer); ++ } + + notmuch_message_destroy (message); + } +-- +1.7.10.4 + -- 2.26.2