Date: Thu, 7 May 2009 09:22:09 -0500 (CDT) From: Corey Halpin <chalpin@cs.wisc.edu> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/134337: mail/pyzor: new upstream version (patch) Message-ID: <20090507142209.C1F1060BB@spiff.home.crhalpin.org> Resent-Message-ID: <200905071430.n47EU1Ux011170@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 134337 >Category: ports >Synopsis: mail/pyzor: new upstream version (patch) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: maintainer-update >Submitter-Id: current-users >Arrival-Date: Thu May 07 14:30:01 UTC 2009 >Closed-Date: >Last-Modified: >Originator: Corey Halpin >Release: FreeBSD 7.2-RELEASE i386 >Organization: >Environment: System: FreeBSD spiff.home.crhalpin.org 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri May 1 08:49:13 UTC 2009 root@walker.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 >Description: There's a new upstream version of mail/pyzor. >How-To-Repeat: NA >Fix: The patches in mail/pyzor/files are no longer needed, as fixes for these issues have been incorporated upstream. The attached patch expects to be applied with -E so as to remove those files. diff -ruN /usr/ports/mail/pyzor/Makefile pyzor/Makefile --- /usr/ports/mail/pyzor/Makefile 2009-03-30 13:33:28.000000000 -0500 +++ pyzor/Makefile 2009-05-07 09:00:39.000000000 -0500 @@ -7,8 +7,8 @@ # PORTNAME= pyzor -PORTVERSION= 0.4.0 -PORTREVISION= 5 +PORTVERSION= 0.5.0 +PORTREVISION= 1 CATEGORIES= mail python MASTER_SITES= SF diff -ruN /usr/ports/mail/pyzor/distinfo pyzor/distinfo --- /usr/ports/mail/pyzor/distinfo 2005-11-25 09:30:55.000000000 -0600 +++ pyzor/distinfo 2009-05-07 09:07:01.000000000 -0500 @@ -1,3 +1,3 @@ -MD5 (pyzor-0.4.0.tar.bz2) = ee7afe4cc9d419bce5f29250a01c4374 -SHA256 (pyzor-0.4.0.tar.bz2) = 27b57f485ee94a98b36f5d85cf7f2a61bdff35fc4005946fe5367ced035bd430 -SIZE (pyzor-0.4.0.tar.bz2) = 41764 +MD5 (pyzor-0.5.0.tar.bz2) = 21f5ed92470ab12a7658cc46bf59a3e9 +SHA256 (pyzor-0.5.0.tar.bz2) = 2bf3df9e916861063a73f7b46cb8b27bac6f661fce1362803de9e7921fc155ba +SIZE (pyzor-0.5.0.tar.bz2) = 40654 diff -ruN /usr/ports/mail/pyzor/files/patch-debian-mbox pyzor/files/patch-debian-mbox --- /usr/ports/mail/pyzor/files/patch-debian-mbox 2008-11-04 06:14:23.000000000 -0600 +++ pyzor/files/patch-debian-mbox 1969-12-31 18:00:00.000000000 -0600 @@ -1,378 +0,0 @@ ---- lib/pyzor/client.py.orig Sun Sep 8 22:37:15 2002 -+++ lib/pyzor/client.py Mon Nov 3 13:22:58 2008 -@@ -8,6 +8,7 @@ - import getopt - import tempfile - import mimetools -+import multifile - import sha - - import pyzor -@@ -58,11 +59,6 @@ - self.send(msg, address) - return self.read_response(msg.get_thread()) - -- def shutdown(self, address): -- msg = ShutdownRequest() -- self.send(msg, address) -- return self.read_response(msg.get_thread()) -- - def build_socket(self): - self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - -@@ -132,39 +128,50 @@ - - def run(self): - debug = 0 -- (options, args) = getopt.getopt(sys.argv[1:], 'dh:', ['homedir=']) -- if len(args) < 1: -- self.usage() -- - specified_homedir = None -+ options = None -+ log = None -+ -+ try: -+ (options, args) = getopt.getopt(sys.argv[1:], 'd', ['homedir=', 'log']) -+ except getopt.GetoptError: -+ self.usage() -+ -+ if len(args) < 1: -+ self.usage() - - for (o, v) in options: - if o == '-d': - debug = 1 -- elif o == '-h': -- self.usage() - elif o == '--homedir': - specified_homedir = v -+ elif o == '--log': -+ log = 1 - - self.output = Output(debug=debug) -- - homedir = pyzor.get_homedir(specified_homedir) -- -+ -+ if log: -+ sys.stderr = open(homedir + "/pyzor.log", 'a') -+ sys.stderr.write("\npyzor[" + repr (os.getpid()) + "]:\n") -+ - config = pyzor.Config(homedir) - config.add_section('client') - -- defaults = {'ServersFile': 'servers', -+ defaults = {'ServersFile': 'servers', - 'DiscoverServersURL': ServerList.inform_url, -- 'AccountsFile' : 'accounts', -+ 'AccountsFile': 'accounts', -+ 'Timeout': str(Client.timeout), - } - - for k, v in defaults.items(): - config.set('client', k, v) -- -+ - config.read(os.path.join(homedir, 'config')) - - servers_fn = config.get_filename('client', 'ServersFile') -- -+ Client.timeout = config.getint('client', 'Timeout') -+ - if not os.path.exists(homedir): - os.mkdir(homedir) - -@@ -197,10 +204,13 @@ - def usage(self, s=None): - if s is not None: - sys.stderr.write("%s\n" % s) -- sys.stderr.write("""usage: %s [-d] [--homedir dir] command [cmd_opts] -+ sys.stderr.write(""" -+usage: %s [-d] [--homedir dir] command [cmd_opts] - command is one of: check, report, discover, ping, digest, predigest, -- genkey, shutdown -+ genkey -+ - Data is read on standard input (stdin). -+ - """ - % sys.argv[0]) - sys.exit(2) -@@ -208,9 +218,9 @@ - - - def ping(self, args): -- getopt.getopt(args[1:], '') -- -- if len(args) > 1: -+ try: -+ getopt.getopt(args[1:], '') -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - - runner = ClientRunner(self.client.ping) -@@ -221,30 +231,23 @@ - return runner.all_ok - - -- def shutdown(self, args): -- (opts, args2) = getopt.getopt(args[1:], '') -- -- if len(args2) > 1: -+ def info(self, args): -+ try: -+ (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -- runner = ClientRunner(self.client.shutdown) -- -- for arg in args2: -- server = Address.from_str(arg) -- runner.run(server, (server,)) -- -- return runner.all_ok -+ do_mbox = 'msg' - -- -- def info(self, args): -- getopt.getopt(args[1:], '') -- -- if len(args) > 1: -- self.usage("%s does not take any non-option arguments" % args[0]) -+ for (o, v) in options: -+ if o == '--mbox': -+ do_mbox = 'mbox' - - runner = InfoClientRunner(self.client.info) - -- for digest in FileDigester(sys.stdin, self.digest_spec): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): -+ if digest is None: -+ continue - for server in self.servers: - response = runner.run(server, (digest, server)) - -@@ -252,34 +255,45 @@ - - - def check(self, args): -- getopt.getopt(args[1:], '') -- -- if len(args) > 1: -+ try: -+ (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -+ do_mbox = 'msg' -+ -+ for (o, v) in options: -+ if o == '--mbox': -+ do_mbox = 'mbox' -+ - runner = CheckClientRunner(self.client.check) - -- for digest in FileDigester(sys.stdin, self.digest_spec): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): -+ if digest is None: -+ continue - for server in self.servers: -- response = runner.run(server, (digest, server)) -+ runner.run(server, (digest, server)) - - return (runner.found_hit and not runner.whitelisted) - - - def report(self, args): -- (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -- do_mbox = False -- -- if len(args2) > 1: -+ try: -+ (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -+ do_mbox = 'msg' -+ - for (o, v) in options: - if o == '--mbox': -- do_mbox = True -+ do_mbox = 'mbox' - - all_ok = True - -- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): -+ if digest is None: -+ continue - if not self.send_digest(digest, self.digest_spec, - self.client.report): - all_ok = False -@@ -302,20 +316,22 @@ - - - def whitelist(self, args): -- (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -- -- if len(args2) > 1: -+ try: -+ (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -- do_mbox = False -+ do_mbox = 'msg' - - for (o, v) in options: - if o == '--mbox': -- do_mbox = True -+ do_mbox = 'mbox' - - all_ok = True - -- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): -+ if digest is None: -+ continue - if not self.send_digest(digest, self.digest_spec, - self.client.whitelist): - all_ok = False -@@ -324,32 +340,34 @@ - - - def digest(self, args): -- (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -- -- if len(args2) > 1: -+ try: -+ (options, args2) = getopt.getopt(args[1:], '', ['mbox']) -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -- -- do_mbox = False -+ do_mbox = 'msg' - - for (o, v) in options: - if o == '--mbox': -- do_mbox = True -+ do_mbox = 'mbox' - -- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): -+ if digest is None: -+ continue - sys.stdout.write("%s\n" % digest) - - return True - - - def print_digested(self, args): -- getopt.getopt(args[1:], '') -- -- if len(args) > 1: -+ try: -+ getopt.getopt(args[1:], '') -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - -+ do_mbox = 'msg' - def loop(): -- for digest in FileDigester(sys.stdin, self.digest_spec): -+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox): - pass - - modglobal_apply(globals(), {'DataDigester': PrintingDataDigester}, -@@ -358,9 +376,9 @@ - return True - - def genkey(self, args): -- getopt.getopt(args[1:], '') -- -- if len(args) > 1: -+ try: -+ getopt.getopt(args[1:], '') -+ except getopt.GetoptError: - self.usage("%s does not take any non-option arguments" % args[0]) - - import getpass -@@ -414,7 +432,6 @@ - 'report': report, - 'ping' : ping, - 'genkey': genkey, -- 'shutdown': shutdown, - 'info': info, - 'whitelist': whitelist, - 'digest': digest, -@@ -608,30 +625,36 @@ - - - --class FileDigester(BasicIterator): -- __slots__ = ['digester'] -- -- def __init__(self, fp, spec, mbox=False): -- self.digester = iter(get_file_digester(fp, spec, mbox)) -- self.output = pyzor.Output() -- -- def next(self): -- digest = self.digester.next() -- self.output.debug("calculated digest: %s" % digest) -- return digest -- -- -- --def get_file_digester(fp, spec, mbox, seekable=False): -+def get_input_handler(fp, spec, style='msg', seekable=False): - """Return an object that can be iterated over - to get all the digests from fp according to spec. - mbox is a boolean""" -- if mbox: -+ if style == 'msg': -+ return filter(lambda x: x is not None, -+ (DataDigester(rfc822BodyCleaner(fp), -+ spec, seekable).get_digest(),) -+ ) -+ -+ elif style =='mbox': - return MailboxDigester(fp, spec) - -- return (DataDigester(rfc822BodyCleaner(fp), -- spec, seekable).get_digest(),) -+ elif style == 'digests': -+ return JustDigestsIterator(fp) -+ -+ raise ValueError, "unknown input style" -+ - -+class JustDigestsIterator(BasicIterator): -+ __slots__ = ['fp'] -+ -+ def __init__(self, fp): -+ self.fp = fp -+ -+ def next(self): -+ l = fp.readline() -+ if not l: -+ raise StopIteration -+ return l.rstrip() - - - class MailboxDigester(BasicIterator): -@@ -645,7 +668,12 @@ - self.seekable = seekable - - def next(self): -- next_msg = self.mbox.next() -+ try: -+ next_msg = self.mbox.next() -+ except IOError: -+ print "Error: Please feed mailbox files in on stdin, i.e." -+ print " pyzor digest --mbox < my_mbox_file" -+ next_msg = None - if next_msg is None: - raise StopIteration - return DataDigester(next_msg, self.digest_spec, diff -ruN /usr/ports/mail/pyzor/files/patch-handle_unknown_encodings pyzor/files/patch-handle_unknown_encodings --- /usr/ports/mail/pyzor/files/patch-handle_unknown_encodings 2006-04-15 04:07:49.000000000 -0500 +++ pyzor/files/patch-handle_unknown_encodings 1969-12-31 18:00:00.000000000 -0600 @@ -1,96 +0,0 @@ ---- lib/pyzor/client.py Sun Sep 8 22:37:15 2002 -+++ lib/pyzor/client.py Wed Aug 3 10:58:03 2005 -@@ -466,7 +470,7 @@ - - (fp, offsets) = self.get_line_offsets(fp) - -- # did we get an empty file? -+ # did we get an empty (parsed output)file? - if len(offsets) == 0: - return - -@@ -662,39 +666,66 @@ - self.multifile = None - self.curfile = None - -+ # Check if we got a mail or not. Set type to binary if there is no 'From:' header and -+ # type text/plain with encoding 7bit. 7bit is passed trough anyway so nobody cares. -+ if (not msg.has_key("From") and self.type == 'text' and msg.subtype == 'plain' and msg.getencoding() == '7bit'): -+ self.type = 'binary'; -+ - if self.type == 'text': - encoding = msg.getencoding() -- if encoding == '7bit': -- self.curfile = msg.fp -- else: -- self.curfile = tempfile.TemporaryFile() -- mimetools.decode(msg.fp, self.curfile, encoding) -- self.curfile.seek(0) -- -+ self.curfile = msg.fp -+ if encoding != '7bit': -+ # fix bad encoding name -+ if encoding == '8bits': -+ encoding = '8bit' -+ try: -+ newcurfile = tempfile.TemporaryFile() -+ mimetools.decode(msg.fp, newcurfile, encoding) -+ newcurfile.seek(0) -+ self.curfile = newcurfile -+ except: -+ # ignore encoding on errors, pass msg as is -+ pass -+ - elif self.type == 'multipart': - import multifile - self.multifile = multifile.MultiFile(msg.fp, seekable=False) - self.multifile.push(msg.getparam('boundary')) -- self.multifile.next() -- self.curfile = self.__class__(self.multifile) -- -+ try: -+ self.multifile.next() -+ self.curfile = self.__class__(self.multifile) -+ except: -+ # -+ # Catch multipart decoding errors -+ # -+ fp.seek(0) -+ self.curfile = fp -+ self.type = 'binary' - - if self.type == 'text' or self.type == 'multipart': - assert self.curfile is not None -+ elif self.type == 'binary': -+ try: -+ fp.seek(0) -+ except: -+ pass -+ self.curfile = fp - else: - assert self.curfile is None - - - def readline(self): - l = '' -- if self.type in ('text', 'multipart'): -- l = self.curfile.readline() -- -- if self.type == 'multipart' and not l and self.multifile.next(): -- self.curfile = self.__class__(self.multifile) -- # recursion. Could get messy if -- # we get a bunch of empty multifile parts -- l = self.readline() -+ try: -+ if self.type in ('text', 'multipart', 'binary'): -+ l = self.curfile.readline() -+ if self.type == 'multipart' and not l and self.multifile.next(): -+ self.curfile = self.__class__(self.multifile) -+ # recursion. Could get messy if -+ # we get a bunch of empty multifile parts -+ l = self.readline() -+ except (TypeError, multifile.Error): -+ pass - return l - - diff -ruN /usr/ports/mail/pyzor/files/patch-unknowntype pyzor/files/patch-unknowntype --- /usr/ports/mail/pyzor/files/patch-unknowntype 2006-04-15 04:07:49.000000000 -0500 +++ pyzor/files/patch-unknowntype 1969-12-31 18:00:00.000000000 -0600 @@ -1,12 +0,0 @@ ---- lib/pyzor/client.py Tue Aug 23 14:53:09 2005 -+++ lib/pyzor/client.py Tue Aug 23 14:51:36 2005 -@@ -693,6 +692,9 @@ - # type text/plain with encoding 7bit. 7bit is passed trough anyway so nobody cares. - if (not msg.has_key("From") and self.type == 'text' and msg.subtype == 'plain' and msg.getencoding() == '7bit'): - self.type = 'binary'; -+ -+ if self.type is '': -+ self.type = 'text'; - - if self.type == 'text': - encoding = msg.getencoding() >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090507142209.C1F1060BB>