aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman')
-rw-r--r--Mailman/Archiver/Archiver.py6
-rw-r--r--Mailman/Archiver/HyperArch.py42
-rw-r--r--Mailman/Archiver/pipermail.py4
3 files changed, 42 insertions, 10 deletions
diff --git a/Mailman/Archiver/Archiver.py b/Mailman/Archiver/Archiver.py
index 903031cd..8c41f0f8 100644
--- a/Mailman/Archiver/Archiver.py
+++ b/Mailman/Archiver/Archiver.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2003 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -166,7 +166,9 @@ class Archiver:
raise
def ExternalArchive(self, ar, txt):
- d = SafeDict({'listname': self.internal_name()})
+ d = SafeDict({'listname': self.internal_name(),
+ 'hostname': self.host_name,
+ })
cmd = ar % d
extarch = os.popen(cmd, 'w')
extarch.write(txt)
diff --git a/Mailman/Archiver/HyperArch.py b/Mailman/Archiver/HyperArch.py
index ea09b877..328e0dcc 100644
--- a/Mailman/Archiver/HyperArch.py
+++ b/Mailman/Archiver/HyperArch.py
@@ -83,6 +83,13 @@ if sys.platform == 'darwin':
resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
+try:
+ True, False
+except NameError:
+ True = 1
+ False = 0
+
+
def html_quote(s, lang=None):
repls = ( ('&', '&'),
@@ -159,21 +166,44 @@ quotedpat = re.compile(r'^([>|:]|>)+')
-# This doesn't need to be a weakref instance because it's just storing
-# strings. Keys are (templatefile, lang) tuples.
+# Like Utils.maketext() but with caching to improve performance.
+#
+# _templatefilepathcache is used to associate a (templatefile, lang, listname)
+# key with the file system path to a template file. This path is the one that
+# the Utils.findtext() function has computed is the one to match the values in
+# the key tuple.
+#
+# _templatecache associate a file system path as key with the text
+# returned after processing the contents of that file by Utils.findtext()
+#
+# We keep two caches to reduce the amount of template text kept in memory,
+# since the _templatefilepathcache is a many->one mapping and _templatecache
+# is a one->one mapping. Imagine 1000 lists all using the same default
+# English template.
+
+_templatefilepathcache = {}
_templatecache = {}
def quick_maketext(templatefile, dict=None, lang=None, mlist=None):
+ if mlist is None:
+ listname = ''
+ else:
+ listname = mlist._internal_name
if lang is None:
if mlist is None:
lang = mm_cfg.DEFAULT_SERVER_LANGUAGE
else:
lang = mlist.preferred_language
- template = _templatecache.get((templatefile, lang))
- if template is None:
+ cachekey = (templatefile, lang, listname)
+ filepath = _templatefilepathcache.get(cachekey)
+ if filepath:
+ template = _templatecache.get(filepath)
+ if filepath is None or template is None:
# Use the basic maketext, with defaults to get the raw template
- template = Utils.maketext(templatefile, lang=lang, raw=1)
- _templatecache[(templatefile, lang)] = template
+ template, filepath = Utils.findtext(templatefile, lang=lang,
+ raw=True, mlist=mlist)
+ _templatefilepathcache[cachekey] = filepath
+ _templatecache[filepath] = template
# Copied from Utils.maketext()
text = template
if dict is not None:
diff --git a/Mailman/Archiver/pipermail.py b/Mailman/Archiver/pipermail.py
index e2e6c062..210030ed 100644
--- a/Mailman/Archiver/pipermail.py
+++ b/Mailman/Archiver/pipermail.py
@@ -7,7 +7,7 @@ import os
import re
import sys
import time
-from email.Utils import parseaddr, parsedate_tz
+from email.Utils import parseaddr, parsedate_tz, mktime_tz
import cPickle as pickle
from cStringIO import StringIO
from string import lowercase
@@ -224,7 +224,7 @@ class Article:
return None
date = parsedate_tz(datestr)
try:
- return time.mktime(date[:9])
+ return mktime_tz(date)
except (TypeError, ValueError, OverflowError):
return None
date = floatdate('date')