From 2a9d563a4d9c17bf72c1acc0ebbcd0c78c54effa Mon Sep 17 00:00:00 2001 From: Tomi Ollila Date: Wed, 24 Oct 2012 10:17:25 +0300 Subject: [PATCH] [PATCH 2/2] contrib/nmbug/nmbug-status: combine thread messages --- 7b/ae78c30bf2563389250f1aea5ec1ce81f9ca95 | 194 ++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 7b/ae78c30bf2563389250f1aea5ec1ce81f9ca95 diff --git a/7b/ae78c30bf2563389250f1aea5ec1ce81f9ca95 b/7b/ae78c30bf2563389250f1aea5ec1ce81f9ca95 new file mode 100644 index 000000000..e6195ec0b --- /dev/null +++ b/7b/ae78c30bf2563389250f1aea5ec1ce81f9ca95 @@ -0,0 +1,194 @@ +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 1865D431FAF + for ; Wed, 24 Oct 2012 00:17:25 -0700 (PDT) +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 6U-e4UKVsqtX for ; + Wed, 24 Oct 2012 00:17:24 -0700 (PDT) +Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34]) + by olra.theworths.org (Postfix) with ESMTP id 15637431FAE + for ; Wed, 24 Oct 2012 00:17:24 -0700 (PDT) +Received: by guru.guru-group.fi (Postfix, from userid 501) + id AA3BC100372; Wed, 24 Oct 2012 10:17:26 +0300 (EEST) +From: Tomi Ollila +To: notmuch@notmuchmail.org +Subject: [PATCH 2/2] contrib/nmbug/nmbug-status: combine thread messages +Date: Wed, 24 Oct 2012 10:17:25 +0300 +Message-Id: <1351063045-26117-1-git-send-email-tomi.ollila@iki.fi> +X-Mailer: git-send-email 1.7.1 +In-Reply-To: <1351061999-25473-1-git-send-email-tomi.ollila@iki.fi> +References: <1351061999-25473-1-git-send-email-tomi.ollila@iki.fi> +Cc: tomi.ollila@iki.fi +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: Wed, 24 Oct 2012 07:17:25 -0000 + +Newer patch email containing In-Reply-To: to an email sent some time ago +(i.e. to a "thread") was not visible in that "thread" in patch view when +another patch "thread" was submitted in between. This change collects +all messages in every (notmuch-created) thread together before printing +all these threads out in a patch view. + +Thanks to Ethan Glasser-Camp for initial review and suggestions with +code examples. +--- + +Replaces: id:"1351061999-25473-2-git-send-email-tomi.ollila@iki.fi" +Change: restored out = {} where it was (and should be) + +Notes: + +Thread class was added for convenience at late time to replace tuple +containing last dict & lines list; It could be more utilized -- my excuse +of not doing so is to minimize change... + +OrderedDict could be used in place of threadlist but that requires +Python 2.7 (I used python 2.6 where argparse.py was copied to cwd; +also nmbug site uses python 2.6...). + +The table row separator '\n
\n' +is a hack; If someone knows better simple semantic alternative that +could be used later... + + contrib/nmbug/nmbug-status | 68 ++++++++++++++++++++++++++++--------------- + 1 files changed, 44 insertions(+), 24 deletions(-) + +diff --git a/contrib/nmbug/nmbug-status b/contrib/nmbug/nmbug-status +index c663409..b0e5060 100755 +--- a/contrib/nmbug/nmbug-status ++++ b/contrib/nmbug/nmbug-status +@@ -51,12 +51,19 @@ if args.text: + else: + output_format = 'html' + +-headers = ['date', 'from', 'subject'] +-last = {} ++class Thread: ++ def __init__(self, last, lines): ++ self.last = last ++ self.lines = lines ++ ++ def join_utf8_with_newlines(self): ++ return '\n'.join( (line.encode('utf-8') for line in self.lines) ) + +-def clear_last(): +- for header in headers: +- last[header] = '' ++def output_with_separator(threadlist, sep): ++ outputs = (thread.join_utf8_with_newlines() for thread in threadlist) ++ print sep.join(outputs) ++ ++headers = ['date', 'from', 'subject'] + + def print_view(title, query, comment): + +@@ -64,7 +71,11 @@ def print_view(title, query, comment): + q_new = notmuch.Query(db, query_string) + q_new.set_sort(notmuch.Query.SORT.OLDEST_FIRST) + +- last['thread_id'] = '' ++ last_thread_id = '' ++ threads = {} ++ threadlist = [] ++ last = None ++ lines = None + + if output_format == 'html': + print '

%s

' % (title, title) +@@ -80,8 +91,20 @@ def print_view(title, query, comment): + out = {} + + thread_id = m.get_thread_id() +- if thread_id != last['thread_id']: +- clear_last() ++ ++ if thread_id != last_thread_id: ++ if threads.has_key(thread_id): ++ last = threads[thread_id].last ++ lines = threads[thread_id].lines ++ else: ++ last = {} ++ lines = [] ++ thread = Thread(last, lines) ++ threads[thread_id] = thread ++ for h in headers: ++ last[h] = '' ++ threadlist.append(thread) ++ last_thread_id = thread_id + + for header in headers: + val = m.get_header(header) +@@ -94,38 +117,35 @@ def print_view(title, query, comment): + if val == '': + val = addr.split('@')[0] + +- if last[header] == val: ++ if header != 'subject' and last[header] == val: + out[header] = '' + else: +- out[header] = val.encode('utf-8') ++ out[header] = val + last[header] = val + + mid = m.get_message_id() + out['id'] = 'id:"%s"' % mid + + if output_format == 'html': +- # XXX using
is a hack, but ... // 20111216 too +- if thread_id != last['thread_id']: +- br = '
' +- else: +- br = '' + + out['subject'] = '
%s' \ + % (urllib.quote(mid), out['subject']) + +- print ' %s %s' % (br, out['date']) +- print '%s %s' % (br, out['id']) +- print '' +- print ' %s' % out['from'] +- print '%s' % out['subject'] +- print '\n' ++ lines.append(' %s' % out['date']) ++ lines.append('%s' % out['id']) ++ lines.append('') ++ lines.append(' %s' % out['from']) ++ lines.append('%s' % out['subject']) ++ lines.append('') + else: +- print '%(date)-10.10s %(from)-20.20s %(subject)-40.40s\n%(id)72s\n' % out +- +- last['thread_id'] = thread_id ++ lines.append('%(date)-10.10s %(from)-20.20s %(subject)-40.40s\n%(id)72s' % out) + + if output_format == 'html': ++ output_with_separator(threadlist, ++ '\n
\n') + print '' ++ else: ++ output_with_separator(threadlist, '\n\n') + + # main program + +-- +1.7.1 + -- 2.26.2