summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/mhlib.py62
1 files changed, 56 insertions, 6 deletions
diff --git a/Lib/mhlib.py b/Lib/mhlib.py
index e53ed9c..79eee26 100644
--- a/Lib/mhlib.py
+++ b/Lib/mhlib.py
@@ -12,6 +12,7 @@
# s = mh.getprofile(key) # profile entry (None if not set)
# path = mh.getpath() # mailbox pathname
# name = mh.getcontext() # name of current folder
+# mh.setcontext(name) # set name of current folder
#
# list = mh.listfolders() # names of top-level folders
# list = mh.listallfolders() # names of all folders, including subfolders
@@ -31,6 +32,7 @@
# list = f.listmessages() # list of messages in folder (as numbers)
# n = f.getcurrent() # get current message
# f.setcurrent(n) # set current message
+# list = f.parsesequence(seq) # parse msgs syntax into list of messages
# n = f.getlast() # get last message (0 if no messagse)
# f.setlast(n) # set last message (internal use only)
#
@@ -69,6 +71,7 @@ FOLDER_PROTECT = 0700
# Imported modules
import os
+import sys
from stat import ST_NLINK
import regex
import string
@@ -108,7 +111,7 @@ class MH:
# Routine to print an error. May be overridden by a derived class
def error(self, msg, *args):
- sys.stderr.write('MH error: %\n' % (msg % args))
+ sys.stderr.write('MH error: %s\n' % (msg % args))
# Return a profile entry, None if not found
def getprofile(self, key):
@@ -125,6 +128,13 @@ class MH:
if not context: context = 'inbox'
return context
+ # Set the name of the current folder
+ def setcontext(self, context):
+ fn = os.path.join(self.getpath(), 'context')
+ f = open(fn, "w")
+ f.write("Current-Folder: %s\n" % context)
+ f.close()
+
# Return the names of the top-level folders
def listfolders(self):
folders = []
@@ -206,7 +216,7 @@ class MH:
def makefolder(self, name):
protect = pickline(self.profile, 'Folder-Protect')
if protect and isnumeric(protect):
- mode = eval('0' + protect)
+ mode = string.atoi(protect, 8)
else:
mode = FOLDER_PROTECT
os.mkdir(os.path.join(self.getpath(), name), mode)
@@ -275,8 +285,9 @@ class Folder:
def listmessages(self):
messages = []
for name in os.listdir(self.getfullname()):
- if isnumeric(name):
- messages.append(eval(name))
+ if name[0] != "," and \
+ numericprog.match(name) == len(name):
+ messages.append(string.atoi(name))
messages.sort()
if messages:
self.last = max(messages)
@@ -329,9 +340,46 @@ class Folder:
def setcurrent(self, n):
updateline(self.getsequencesfilename(), 'cur', str(n), 0)
+ # Parse an MH sequence specification into a message list.
+ def parsesequence(self, seq):
+ if seq == "all":
+ return self.listmessages()
+ try:
+ n = string.atoi(seq, 10)
+ except string.atoi_error:
+ n = 0
+ if n > 0:
+ return [n]
+ if regex.match("^last:", seq) >= 0:
+ try:
+ n = string.atoi(seq[5:])
+ except string.atoi_error:
+ n = 0
+ if n > 0:
+ return self.listmessages()[-n:]
+ if regex.match("^first:", seq) >= 0:
+ try:
+ n = string.atoi(seq[6:])
+ except string.atoi_error:
+ n = 0
+ if n > 0:
+ return self.listmessages()[:n]
+ dict = self.getsequences()
+ if dict.has_key(seq):
+ return dict[seq]
+ context = self.mh.getcontext()
+ # Complex syntax -- use pick
+ pipe = os.popen("pick +%s %s 2>/dev/null" % (self.name, seq))
+ data = pipe.read()
+ sts = pipe.close()
+ self.mh.setcontext(context)
+ if sts:
+ raise Error, "unparseable sequence %s" % `seq`
+ items = string.split(data)
+ return map(string.atoi, items)
+
# Open a message -- returns a Message object
def openmessage(self, n):
- path = self.getmessagefilename(n)
return Message(self, n)
# Remove one or more messages -- may raise os.error
@@ -762,7 +810,7 @@ def updateline(file, key, value, casefold = 1):
if value is None:
newline = None
else:
- newline = '%s: %s' % (key, value)
+ newline = '%s: %s\n' % (key, value)
for i in range(len(lines)):
line = lines[i]
if prog.match(line) == len(line):
@@ -774,10 +822,12 @@ def updateline(file, key, value, casefold = 1):
else:
if newline is not None:
lines.append(newline)
+ tempfile = file + "~"
f = open(tempfile, 'w')
for line in lines:
f.write(line)
f.close()
+ os.rename(tempfile, file)
# Test program