Re: [PATCH v3] nmbug: Translate to Python
authorW. Trevor King <wking@tremily.us>
Wed, 6 Aug 2014 23:21:31 +0000 (16:21 +1700)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 18:04:08 +0000 (10:04 -0800)
3e/a902df136832b2dff0a17e15907f5b40926d06 [new file with mode: 0644]

diff --git a/3e/a902df136832b2dff0a17e15907f5b40926d06 b/3e/a902df136832b2dff0a17e15907f5b40926d06
new file mode 100644 (file)
index 0000000..134561e
--- /dev/null
@@ -0,0 +1,218 @@
+Return-Path: <wking@tremily.us>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 19DC1431FAF\r
+       for <notmuch@notmuchmail.org>; Wed,  6 Aug 2014 16:21:38 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.1\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.1 tagged_above=-999 required=5\r
+       tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,\r
+       RCVD_IN_DNSWL_NONE=-0.0001] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id tGHyp2wqZOC6 for <notmuch@notmuchmail.org>;\r
+       Wed,  6 Aug 2014 16:21:34 -0700 (PDT)\r
+Received: from qmta08.emeryville.ca.mail.comcast.net\r
+       (qmta08.emeryville.ca.mail.comcast.net [76.96.30.80])\r
+       by olra.theworths.org (Postfix) with ESMTP id 06F39431FAE\r
+       for <notmuch@notmuchmail.org>; Wed,  6 Aug 2014 16:21:33 -0700 (PDT)\r
+Received: from omta17.emeryville.ca.mail.comcast.net ([76.96.30.73])\r
+       by qmta08.emeryville.ca.mail.comcast.net with comcast\r
+       id bas61o0021afHeLA8bMY6H; Wed, 06 Aug 2014 23:21:32 +0000\r
+Received: from odin.tremily.us ([24.18.63.50])\r
+       by omta17.emeryville.ca.mail.comcast.net with comcast\r
+       id bbMX1o00P152l3L8dbMYDM; Wed, 06 Aug 2014 23:21:32 +0000\r
+Received: by odin.tremily.us (Postfix, from userid 1000)\r
+       id 6A4C512BD95C; Wed,  6 Aug 2014 16:21:31 -0700 (PDT)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tremily.us; s=odin;\r
+       t=1407367291; bh=6KhD8cv7Gv5cvBdTmHDN5v6dULkD2duvwQ7FTfc2ouA=;\r
+       h=Date:From:To:Cc:Subject:References:In-Reply-To;\r
+       b=ZN25iZCPAAtSECzW+EOgGtm9p+FYV5mG1GbPan2i7/wxSeylcZccIp1diRogqUMYH\r
+       WJbH8Y2sODzDIheACbHjp7/DH5+t23BRBugqM6z/3RPQ2+fCQ4/fPDQo45d9VPS9NL\r
+       nVR84CgjUFKRwZAcu/HxIxx7ltA7du9HgNbBm/EE=\r
+Date: Wed, 6 Aug 2014 16:21:31 -0700\r
+From: "W. Trevor King" <wking@tremily.us>\r
+To: David Bremner <bremner@debian.org>\r
+Subject: Re: [PATCH v3] nmbug: Translate to Python\r
+Message-ID: <20140806232131.GH31313@odin.tremily.us>\r
+References:\r
+ <84447a0ed48412e1587761d560d18cb5affd4f66.1405897133.git.wking@tremily.us>\r
+       <878un36bd5.fsf@maritornes.cs.unb.ca>\r
+MIME-Version: 1.0\r
+Content-Type: multipart/signed; micalg=pgp-sha1;\r
+       protocol="application/pgp-signature"; boundary="ewQ5hdP4CtoTt3oD"\r
+Content-Disposition: inline\r
+In-Reply-To: <878un36bd5.fsf@maritornes.cs.unb.ca>\r
+OpenPGP: id=39A2F3FA2AB17E5D8764F388FC29BDCDF15F5BE8;\r
+       url=http://tremily.us/pubkey.txt\r
+User-Agent: Mutt/1.5.23 (2014-03-12)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net;\r
+       s=q20140121; t=1407367292;\r
+       bh=JXAFOANff+cuqgs9iFvc4Yn7+eq/YsqzPVQnyVXUChY=;\r
+       h=Received:Received:Received:Date:From:To:Subject:Message-ID:\r
+       MIME-Version:Content-Type;\r
+       b=oCRl+rW6Fo1Bo1YHorirThJQDj9Xg7lZAEyIcdrnfrwvSYbNh3bonoezLsPpCYDGp\r
+       Y4DIjlXoxETUEbQWnrmMoTajaRO41NLRq9nclRUt2WnoH+AxcrAevD3PIwP4rQEAVR\r
+       RaJafv7nvynB+B6eoQaLkQ2vRub3cb3ZuxU7zaT7v8+eGw38/Bm2waqMSsbozb05Ws\r
+       hPNhB3m7Fwwqw1zGWq3EWFVxxn2qgiLW9PSGnahloSAnJvmEh8PNkjcMSRMwIuB+4L\r
+       4oiiUNIk3/qnuvhad8WCZsFQrgYGSIYXfUS3Ja6husk6DaAd3shNz0+jjguZZBl7p/\r
+       mzfnrGoxMNydg==\r
+Cc: notmuch@notmuchmail.org\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Wed, 06 Aug 2014 23:21:38 -0000\r
+\r
+\r
+--ewQ5hdP4CtoTt3oD\r
+Content-Type: text/plain; charset=utf-8\r
+Content-Disposition: inline\r
+Content-Transfer-Encoding: quoted-printable\r
+\r
+On Mon, Aug 04, 2014 at 09:14:46PM -0300, David Bremner wrote:\r
+> W. Trevor King writes:\r
+> > * Commands are no longer split into "most common", "other useful",\r
+> >   and "less common" sets.  If we need something like this, I'd\r
+> >   prefer workflow examples highlighting common commands in the\r
+> >   module docstring (available with 'nmbug --help').\r
+>=20\r
+> I don't feel strongly about this, but I remember implementing it by\r
+> request in the first version. OTOH, I think you shortened up the\r
+> main help string when you split it.\r
+\r
+I didn't intentionally remove any information.  I think it's just\r
+shorter because command-specific details are now in the\r
+command-specific docstring/help.\r
+\r
+> We may want to think about a seperate man page as a follow project.\r
+\r
+Works for me, but I think it would look a lot like the wiki page [1].\r
+\r
+> One thing I did notice is that there is no hint to call nmbug\r
+> {command} --help in the main docstring.\r
+\r
+I'll add that in v4.\r
+\r
+> > +#!/usr/bin/env python\r
+> > +# Copyright (c) 2011 David Bremner\r
+> > +# License: same as notmuch\r
+>=20\r
+> You should add your self, update the date, and probably explicitly\r
+> state the license, as in Carl's patch for nmbug-status.\r
+\r
+Will do in v4.\r
+\r
+> > +__version__ =3D '0.2'\r
+>=20\r
+> Do we need/want a version distinct from that of notmuch?\r
+\r
+nmbug is very loosely bound to the notmuch core.  To me it feels like\r
+a separate project that happens to share the same version control\r
+repository.  I'm happy to synchronize versions, but then we have to\r
+remember to bump the nmbug version for each notmuch release.\r
+\r
+> > +def _hex_quote(string, safe=3D'+@=3D:,'):\r
+>=20\r
+> I'm not sure I really understand what makes a function/variable\r
+> "private" and hence prefixed with _ in your translation.\r
+\r
+The public interface is what I thought was reasonably stable for folks\r
+who want to call nmbug as a Python library.  It's basically the\r
+command-line functionality, with a few other helpers that seemed\r
+important enough to be worth preserving.  If we keep a separate nmbug\r
+version, I'd cut major releases for anything that broke compatibility\r
+on a public function.  I don't need to use nmbug as a library myself,\r
+so this might all be over-engineered ;).\r
+\r
+> > +    status, tree, stderr =3D _git(\r
+>=20\r
+> as a non-native speaker of python, I find this a bit hard to read.\r
+> How about adding some parens to make the multiple return more clear,\r
+> so\r
+>=20\r
+>     (status, tree, stderr) =3D _git(\r
+\r
+That's legal, but I rarely see the parenthesized version in the wild.\r
+For examples showing the unparenthesized version, see [2,3].\r
+Parentheses are optional for Python tuples [4], so you'd only want\r
+them if =E2=80=98=3D=E2=80=99 had a higher precedence than =E2=80=98,=E2=80=\r
+=99.  That's my argument for\r
+the unparenthesized version, but feel free to overrule me ;).\r
+\r
+> I did notice that merging was noticably noisier than I remembered.=20\r
+>=20\r
+> > +    output =3D _collections.defaultdict(\r
+> > +        lambda : _collections.defaultdict( # {tag: status_string}\r
+> > +            lambda : ' '))  # default local status\r
+>=20\r
+> The initial comment is confusing (to me) because it looks like code.\r
+> The two layers of defaultdict are a bit confusing too; it would help\r
+> to mention the key of the outer dictionary.\r
+\r
+In v4, I'll use a leading comment for the whole structure, instead of\r
+interleaving the comments.  I'll also mention explicitly that the\r
+outer layer is keyed by message id.\r
+\r
+> I guess it makes sense to go for a relatively straight translation\r
+> as a first step; I did wonder about whether using the python\r
+> bindings to notmuch would speed things up.  Any ideas about how to\r
+> even figure out where the bottlenecks are?\r
+\r
+You could profile the Python script [5].  With my usual workflow, the\r
+existing implementation isn't generating too many subprocesses.\r
+Loading the database is probably slow though, so I'd expect reasonable\r
+gains everywhere we call notmuch more than once.  I expect checkout\r
+out working directories to also be slow, for the few command that do\r
+that on behalf of Git.\r
+\r
+Cheers,\r
+Trevor\r
+\r
+\r
+[1]: http://notmuchmail.org/nmbug/\r
+[2]: https://docs.python.org/3.4/tutorial/introduction.html#first-steps-tow=\r
+ards-programming\r
+[3]: http://legacy.python.org/dev/peps/pep-3132/\r
+[4]: https://docs.python.org/3.4/reference/expressions.html#parenthesized-f=\r
+orms\r
+[5]: https://docs.python.org/3.4/library/profile.html\r
+\r
+--=20\r
+This email may be signed or encrypted with GnuPG (http://www.gnupg.org).\r
+For more information, see http://en.wikipedia.org/wiki/Pretty_Good_Privacy\r
+\r
+--ewQ5hdP4CtoTt3oD\r
+Content-Type: application/pgp-signature; name="signature.asc"\r
+Content-Description: OpenPGP digital signature\r
+\r
+-----BEGIN PGP SIGNATURE-----\r
+Version: GnuPG v2\r
+\r
+iQIcBAEBAgAGBQJT4rh5AAoJEG8/JgBt8ol8Vy0P/2kCLd5L+IERhLY0GO8a9CQD\r
+IazSnIzlMtYmeN97VM85zimoLnbhxnB7ATIGNk5B2tT43nB/t1Op2rd9ZqEzNExL\r
+UcCokyTxDFvyfGtV1JqPA1hwgHcxr8ghGkA56NRxYCah9DixMd0zsmTbPaDfYuJq\r
+S/if3LtByeTcD8Usgy9ZdU8A87ZR8Hrb+bOtWOr9OGFq38cNx7ymx9+OdNhi+KKU\r
+ZHGasavcqxuGC5HEMkmJh0vpsOpJw+gVEuaNKnW29jG/vZnu5FVloH2YXfifdjDu\r
+OLJ7bHhKZQ2uUGwdmX/2FViUSwW4/+j/YtkxKmJ9g2ekt5ro6PWuYnwVJlo00aZY\r
+Vh2XnidzogjrpEkfZkeMyozIondW9tGLzx4ZJc52/jb0quMTdlIQFBuqb0vjnKp7\r
+mhuifQZqabqOZIw6wuknThTWVOADqhgmb8oEEOMPEnG3V5fFljYAa8mMln8lIkpW\r
+/5tCw3TeOlubk9EnEhRy0Y0hX9Qfdi9dPk6t63CMiT4hk7+No97WYEBK+CvPmby6\r
+aZcSQr68E2zOYk8M6TPIv4PmyJc0r88M/BGPoj1hPw9B2wuKKzx3RW8JlvdjHJS/\r
+0rG++DgCfHAXr4AxuwKy2ltjhiSJDlWC9054CNrnNhfdvl5N0rQJJ9PxtbJtJMFJ\r
+xMzRS4BP2lBK6uemj19x\r
+=DaTM\r
+-----END PGP SIGNATURE-----\r
+\r
+--ewQ5hdP4CtoTt3oD--\r