From 123326c53a4f00d735d5c639636ded1ebd2bd21c Mon Sep 17 00:00:00 2001 From: david Date: Mon, 9 Jul 2012 23:09:06 +1800 Subject: [PATCH] [PATCH v2] contrib/nmbug: add nmbug-status script --- 8b/149676c20b9a4bb297958877a91f0561b6eba2 | 290 ++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 8b/149676c20b9a4bb297958877a91f0561b6eba2 diff --git a/8b/149676c20b9a4bb297958877a91f0561b6eba2 b/8b/149676c20b9a4bb297958877a91f0561b6eba2 new file mode 100644 index 000000000..461079cfd --- /dev/null +++ b/8b/149676c20b9a4bb297958877a91f0561b6eba2 @@ -0,0 +1,290 @@ +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 BBADB431FBC + for ; Sun, 8 Jul 2012 22:09:20 -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 v7+e3PUe27Ra for ; + Sun, 8 Jul 2012 22:09:18 -0700 (PDT) +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 EC803431FAE + for ; Sun, 8 Jul 2012 22:09:17 -0700 (PDT) +Received: from remotemail by tesseract.cs.unb.ca with local (Exim 4.72) + (envelope-from ) + id 1So6Di-0004dM-Ky; Mon, 09 Jul 2012 02:09:14 -0300 +Received: (nullmailer pid 29417 invoked by uid 1000); + Mon, 09 Jul 2012 05:09:08 -0000 +From: david@tethera.net +To: notmuch@notmuchmail.org +Subject: [PATCH v2] contrib/nmbug: add nmbug-status script +Date: Sun, 8 Jul 2012 23:09:06 -0600 +Message-Id: <1341810546-28857-1-git-send-email-david@tethera.net> +X-Mailer: git-send-email 1.7.10 +In-Reply-To: <1341689754-15243-2-git-send-email-david@tethera.net> +References: <1341689754-15243-2-git-send-email-david@tethera.net> +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: Mon, 09 Jul 2012 05:09:20 -0000 + +From: David Bremner + +This is (almost) the same script as has been used for +http://nmbug.tethera.net/status for a while now. The only change is +that the configuration is not hardcoded anymore. By default the config +is fetched from a special branch in the nmbug repo that contains only +config info. The idea is that push access to this branch can be +restricted a bit more than the tags, since it will change the +appearence of the web pages. +--- + +The change here is to extract the configuration from a branch in the +nmbug repo. This will allow multiple people to update the layout of the status page. + + contrib/nmbug/nmbug-status | 141 ++++++++++++++++++++++++++++++++++++++ + contrib/nmbug/status-config.json | 65 ++++++++++++++++++ + 2 files changed, 206 insertions(+) + create mode 100755 contrib/nmbug/nmbug-status + create mode 100644 contrib/nmbug/status-config.json + +diff --git a/contrib/nmbug/nmbug-status b/contrib/nmbug/nmbug-status +new file mode 100755 +index 0000000..cee9d3d +--- /dev/null ++++ b/contrib/nmbug/nmbug-status +@@ -0,0 +1,141 @@ ++#!/usr/bin/python ++# ++# Copyright (c) 2011-2012 David Bremner ++# License: Same as notmuch ++# dependencies ++# - python 2.6 for json ++# - argparse; either python 2.7, or install seperately ++ ++import datetime ++import notmuch ++import sys ++import rfc822 ++import urllib ++import json ++import argparse ++import os ++import subprocess ++ ++# parse command line arguments ++ ++parser = argparse.ArgumentParser() ++parser.add_argument("--text", help="output plain text format", ++ action="store_true") ++ ++parser.add_argument("--config", help="load config from given file") ++ ++ ++args = parser.parse_args() ++ ++# read config from json file ++ ++if args.config != None: ++ fp = open(args.config) ++else: ++ nmbhome = os.getenv('NMBGIT',os.path.expanduser("~/.nmbug")) ++ ++ fp = subprocess.Popen(['git','--git-dir',nmbhome, ++ 'cat-file','blob','config:status-config.json'], ++ stdout=subprocess.PIPE).stdout ++ ++config=json.load(fp) ++ ++if args.text: ++ format = 'text' ++else: ++ format = 'html' ++ ++headers = ['date', 'from', 'subject'] ++last = {} ++ ++def clear_last(): ++ for header in headers: ++ last[header] = '' ++ ++def print_view(title, query, comment): ++ ++ query_string = " and ".join(query) ++ q_new = notmuch.Query(db, query_string) ++ q_new.set_sort(notmuch.Query.SORT.OLDEST_FIRST) ++ ++ ++ last['thread_id'] = '' ++ ++ if format == 'html': ++ print '

%s

' % title ++ print comment ++ print 'The view is generated from the following query:' ++ print '
' ++ print query_string ++ print '
' ++ print '\n' ++ ++ for m in q_new.search_messages(): ++ ++ out = {}; ++ ++ thread_id = m.get_thread_id() ++ if thread_id != last['thread_id']: ++ clear_last() ++ ++ for header in headers: ++ 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()) ++ elif header == 'from': ++ val = rfc822.parseaddr(val)[0] ++ ++ if last[header] == val: ++ out[header] = "" ++ else: ++ out[header] = val.encode('utf-8') ++ last[header] = val ++ ++ mid = m.get_message_id() ++ out['id'] = 'id:"%s"' % mid ++ ++ if 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 " " ++ print " \n" ++ else: ++ print '%(date)-10.10s %(from)-20.20s %(subject)-40.40s\n%(id)72s\n' % out ++ ++ last['thread_id'] = thread_id ++ ++ if format == 'html': ++ print '
%s %s" % (br, out['date']) ++ print "%s %s" % (br, out['id']) ++ print "
%s" % out['from'] ++ print "%s" % out['subject'] ++ print "
' ++ ++# main program ++ ++db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE) ++ ++if format == 'html': ++ print ''' ++ ++ ++ ++ ++Notmuch Patches ++ ++'''; ++ print '

Notmuch Patches

' ++ print 'Generated: %s
' % datetime.datetime.utcnow().date() ++ print 'For more infomation see nmbug' ++ ++for view in config['views']: ++ print_view(**view) ++ ++if format == 'html': ++ print '\n' +diff --git a/contrib/nmbug/status-config.json b/contrib/nmbug/status-config.json +new file mode 100644 +index 0000000..6b4934f +--- /dev/null ++++ b/contrib/nmbug/status-config.json +@@ -0,0 +1,65 @@ ++{ ++ "views": [ ++ { ++ "comment": "Unresolved bugs (or just need tag updating).", ++ "query": [ ++ "tag:notmuch::bug", ++ "not tag:notmuch::fixed", ++ "not tag:notmuch::wontfix" ++ ], ++ "title": "Bugs" ++ }, ++ { ++ "comment": "These patches are under consideration for pushing.", ++ "query": [ ++ "tag:notmuch::patch and not tag:notmuch::pushed", ++ "not tag:notmuch::obsolete and not tag:notmuch::wip", ++ "not tag:notmuch::stale and not tag:notmuch::contrib", ++ "not tag:notmuch::moreinfo", ++ "not tag:notmuch::python", ++ "not tag:notmuch::vim", ++ "not tag:notmuch::wontfix", ++ "not tag:notmuch::needs-review" ++ ], ++ "title": "Maybe Ready (Core and Emacs)" ++ }, ++ { ++ "comment": "These python related patches might be ready to push, or they might just need updated tags.", ++ "query": [ ++ "tag:notmuch::patch and not tag:notmuch::pushed", ++ "not tag:notmuch::obsolete and not tag:notmuch::wip", ++ "not tag:notmuch::stale and not tag:notmuch::contrib", ++ "not tag:notmuch::moreinfo", ++ "not tag:notmuch::wontfix", ++ " tag:notmuch::python", ++ "not tag:notmuch::needs-review" ++ ], ++ "title": "Maybe Ready (Python)" ++ }, ++ { ++ "comment": "These vim related patches might be ready to push, or they might just need updated tags.", ++ "query": [ ++ "tag:notmuch::patch and not tag:notmuch::pushed", ++ "not tag:notmuch::obsolete and not tag:notmuch::wip", ++ "not tag:notmuch::stale and not tag:notmuch::contrib", ++ "not tag:notmuch::moreinfo", ++ "not tag:notmuch::wontfix", ++ "tag:notmuch::vim", ++ "not tag:notmuch::needs-review" ++ ], ++ "title": "Maybe Ready (vim)" ++ }, ++ { ++ "comment": "These patches are under review, or waiting for feedback.", ++ "query": [ ++ "tag:notmuch::patch", ++ "not tag:notmuch::pushed", ++ "not tag:notmuch::obsolete", ++ "not tag:notmuch::stale", ++ "not tag:notmuch::wontfix", ++ "(tag:notmuch::moreinfo or tag:notmuch::needs-review)" ++ ], ++ "title": "Review" ++ } ++ ] ++} +-- +1.7.10 + -- 2.26.2