diff --git a/Tools/scripts/cvsfiles.py b/Tools/scripts/cvsfiles.py
index 5b691f6..d133a40 100755
--- a/Tools/scripts/cvsfiles.py
+++ b/Tools/scripts/cvsfiles.py
@@ -20,53 +20,53 @@
 
 def main():
     try:
-	opts, args = getopt.getopt(sys.argv[1:], "n:")
+        opts, args = getopt.getopt(sys.argv[1:], "n:")
     except getopt.error, msg:
-	print msg
-	print __doc__,
-	return 1
+        print msg
+        print __doc__,
+        return 1
     global cutofftime
     newerfile = None
     for o, a in opts:
-	if o == '-n':
-	    cutofftime = getmtime(a)
+        if o == '-n':
+            cutofftime = getmtime(a)
     if args:
-	for arg in args:
-	    process(arg)
+        for arg in args:
+            process(arg)
     else:
-	process(".")
+        process(".")
 
 def process(dir):
     cvsdir = 0
     subdirs = []
     names = os.listdir(dir)
     for name in names:
-	fullname = os.path.join(dir, name)
-	if name == "CVS":
-	    cvsdir = fullname
-	else:
-	    if os.path.isdir(fullname):
-		if not os.path.islink(fullname):
-		    subdirs.append(fullname)
+        fullname = os.path.join(dir, name)
+        if name == "CVS":
+            cvsdir = fullname
+        else:
+            if os.path.isdir(fullname):
+                if not os.path.islink(fullname):
+                    subdirs.append(fullname)
     if cvsdir:
-	entries = os.path.join(cvsdir, "Entries")
-	for e in open(entries).readlines():
-	    words = string.split(e, '/')
-	    if words[0] == '' and words[1:]:
-		name = words[1]
-		fullname = os.path.join(dir, name)
-		if cutofftime and getmtime(fullname) <= cutofftime:
-		    pass
-		else:
-		    print fullname
+        entries = os.path.join(cvsdir, "Entries")
+        for e in open(entries).readlines():
+            words = string.split(e, '/')
+            if words[0] == '' and words[1:]:
+                name = words[1]
+                fullname = os.path.join(dir, name)
+                if cutofftime and getmtime(fullname) <= cutofftime:
+                    pass
+                else:
+                    print fullname
     for sub in subdirs:
-	process(sub)
+        process(sub)
 
 def getmtime(filename):
     try:
-	st = os.stat(filename)
+        st = os.stat(filename)
     except os.error:
-	return 0
+        return 0
     return st[stat.ST_MTIME]
 
 sys.exit(main())
diff --git a/Tools/scripts/fixnotice.py b/Tools/scripts/fixnotice.py
index 4287ca2..cf6f140 100755
--- a/Tools/scripts/fixnotice.py
+++ b/Tools/scripts/fixnotice.py
@@ -50,9 +50,9 @@
 def main():
     args = sys.argv[1:]
     if not args:
-	print "No arguments."
+        print "No arguments."
     for arg in args:
-	process(arg)
+        process(arg)
 
 def process(arg):
     f = open(arg)
@@ -60,8 +60,8 @@
     f.close()
     i = string.find(data, OLD_NOTICE)
     if i < 0:
-##	print "No old notice in", arg
-	return
+##         print "No old notice in", arg
+        return
     data = data[:i] + NEW_NOTICE + data[i+len(OLD_NOTICE):]
     new = arg + ".new"
     backup = arg + ".bak"
diff --git a/Tools/scripts/linktree.py b/Tools/scripts/linktree.py
index 73825c9..677be39 100755
--- a/Tools/scripts/linktree.py
+++ b/Tools/scripts/linktree.py
@@ -55,22 +55,25 @@
 		print old + ': warning: cannot listdir:', msg
 		return
 	for name in names:
-	    if name not in (os.curdir, os.pardir):
-		oldname = os.path.join(old, name)
-		linkname = os.path.join(link, name)
-		newname = os.path.join(new, name)
-		if debug > 1: print oldname, newname, linkname
-		if os.path.isdir(oldname) and not os.path.islink(oldname):
-			try:
-				os.mkdir(newname, 0777)
-				ok = 1
-			except:
-				print newname + ': warning: cannot mkdir:', msg
-				ok = 0
-			if ok:
-				linkname = os.path.join(os.pardir, linkname)
-				linknames(oldname, newname, linkname)
-		else:
-			os.symlink(linkname, newname)
+		if name not in (os.curdir, os.pardir):
+			oldname = os.path.join(old, name)
+			linkname = os.path.join(link, name)
+			newname = os.path.join(new, name)
+			if debug > 1: print oldname, newname, linkname
+			if os.path.isdir(oldname) and \
+			   not os.path.islink(oldname):
+				try:
+					os.mkdir(newname, 0777)
+					ok = 1
+				except:
+					print newname + \
+					      ': warning: cannot mkdir:', msg
+					ok = 0
+				if ok:
+					linkname = os.path.join(os.pardir,
+								linkname)
+					linknames(oldname, newname, linkname)
+			else:
+				os.symlink(linkname, newname)
 
 sys.exit(main())
diff --git a/Tools/scripts/logmerge.py b/Tools/scripts/logmerge.py
index 51a5627..c26df30 100755
--- a/Tools/scripts/logmerge.py
+++ b/Tools/scripts/logmerge.py
@@ -26,25 +26,25 @@
 
 import os, sys, getopt, string, re
 
-sep1 = '='*77 + '\n'			# file separator
-sep2 = '-'*28 + '\n'			# revision separator
+sep1 = '='*77 + '\n'                    # file separator
+sep2 = '-'*28 + '\n'                    # revision separator
 
 def main():
     """Main program"""
     truncate_last = 0
     opts, args = getopt.getopt(sys.argv[1:], "-t")
     for o, a in opts:
-	if o == '-t':
-	    truncate_last = 1
+        if o == '-t':
+            truncate_last = 1
     database = []
     while 1:
-	chunk = read_chunk(sys.stdin)
-	if not chunk:
-	    break
-	records = digest_chunk(chunk)
-	if truncate_last:
-	    del records[-1]
-	database[len(database):] = records
+        chunk = read_chunk(sys.stdin)
+        if not chunk:
+            break
+        records = digest_chunk(chunk)
+        if truncate_last:
+            del records[-1]
+        database[len(database):] = records
     database.sort()
     database.reverse()
     format_output(database)
@@ -58,19 +58,19 @@
     chunk = []
     lines = []
     while 1:
-	line = fp.readline()
-	if not line:
-	    break
-	if line == sep1:
-	    if lines:
-		chunk.append(lines)
-	    break
-	if line == sep2:
-	    if lines:
-		chunk.append(lines)
-		lines = []
-	else:
-	    lines.append(line)
+        line = fp.readline()
+        if not line:
+            break
+        if line == sep1:
+            if lines:
+                chunk.append(lines)
+            break
+        if line == sep2:
+            if lines:
+                chunk.append(lines)
+                lines = []
+        else:
+            lines.append(line)
     return chunk
 
 def digest_chunk(chunk):
@@ -79,53 +79,53 @@
     key = 'Working file:'
     keylen = len(key)
     for line in lines:
-	if line[:keylen] == key:
-	    working_file = string.strip(line[keylen:])
-	    break
+        if line[:keylen] == key:
+            working_file = string.strip(line[keylen:])
+            break
     else:
-	working_file = None
+        working_file = None
     records = []
     for lines in chunk[1:]:
-	revline = lines[0]
-	dateline = lines[1]
-	text = lines[2:]
-	words = string.split(dateline)
-	author = None
-	if len(words) >= 3 and words[0] == 'date:':
-	    dateword = words[1]
-	    timeword = words[2]
-	    if timeword[-1:] == ';':
-		timeword = timeword[:-1]
-	    date = dateword + ' ' + timeword
-	    if len(words) >= 5 and words[3] == 'author:':
-		author = words[4]
-		if author[-1:] == ';':
-		    author = author[:-1]
-	else:
-	    date = None
-	    text.insert(0, revline)
-	words = string.split(revline)
-	if len(words) >= 2 and words[0] == 'revision':
-	    rev = words[1]
-	else:
-	    rev = None
-	    text.insert(0, revline)
-	records.append((date, working_file, rev, author, text))
+        revline = lines[0]
+        dateline = lines[1]
+        text = lines[2:]
+        words = string.split(dateline)
+        author = None
+        if len(words) >= 3 and words[0] == 'date:':
+            dateword = words[1]
+            timeword = words[2]
+            if timeword[-1:] == ';':
+                timeword = timeword[:-1]
+            date = dateword + ' ' + timeword
+            if len(words) >= 5 and words[3] == 'author:':
+                author = words[4]
+                if author[-1:] == ';':
+                    author = author[:-1]
+        else:
+            date = None
+            text.insert(0, revline)
+        words = string.split(revline)
+        if len(words) >= 2 and words[0] == 'revision':
+            rev = words[1]
+        else:
+            rev = None
+            text.insert(0, revline)
+        records.append((date, working_file, rev, author, text))
     return records
-	
+        
 def format_output(database):
     prevtext = None
     prev = []
     database.append((None, None, None, None, None)) # Sentinel
     for (date, working_file, rev, author, text) in database:
-	if text != prevtext:
-	    if prev:
-		print sep2,
-		for (p_date, p_working_file, p_rev, p_author) in prev:
-		    print p_date, p_author, p_working_file
-		sys.stdout.writelines(prevtext)
-	    prev = []
-	prev.append((date, working_file, rev, author))
-	prevtext = text
+        if text != prevtext:
+            if prev:
+                print sep2,
+                for (p_date, p_working_file, p_rev, p_author) in prev:
+                    print p_date, p_author, p_working_file
+                sys.stdout.writelines(prevtext)
+            prev = []
+        prev.append((date, working_file, rev, author))
+        prevtext = text
 
 main()
diff --git a/Tools/scripts/mailerdaemon.py b/Tools/scripts/mailerdaemon.py
index f2e8ac4..c065eb2 100755
--- a/Tools/scripts/mailerdaemon.py
+++ b/Tools/scripts/mailerdaemon.py
@@ -11,264 +11,266 @@
 
 class ErrorMessage(rfc822.Message):
     def __init__(self, fp):
-	rfc822.Message.__init__(self, fp)
+        rfc822.Message.__init__(self, fp)
 
     def is_warning(self):
-	sub = self.getheader('Subject')
-	if not sub:
-	    return 0
-	sub = string.lower(sub)
-	if sub[:12] == 'waiting mail': return 1
-	if string.find(sub, 'warning') >= 0: return 1
-	self.sub = sub
-	return 0
+        sub = self.getheader('Subject')
+        if not sub:
+            return 0
+        sub = string.lower(sub)
+        if sub[:12] == 'waiting mail': return 1
+        if string.find(sub, 'warning') >= 0: return 1
+        self.sub = sub
+        return 0
 
     def get_errors(self):
-	for p in EMPARSERS:
-	    self.rewindbody()
-	    try:
-		return p(self.fp, self.sub)
-	    except Unparseable:
-		pass
-	raise Unparseable
+        for p in EMPARSERS:
+            self.rewindbody()
+            try:
+                return p(self.fp, self.sub)
+            except Unparseable:
+                pass
+        raise Unparseable
 
 sendmail_pattern = regex.compile('[0-9][0-9][0-9] ')
 def emparse_sendmail(fp, sub):
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
 
-	# Check that we're not in the returned message yet
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	line = string.split(line)
-	if len(line) > 3 and \
-	   ((line[0] == '-----' and line[1] == 'Transcript') or
-	    (line[0] == '---' and line[1] == 'The' and
-	     line[2] == 'transcript') or
-	    (line[0] == 'While' and line[1] == 'talking' and line[2] == 'to')):
-	    # Yes, found it!
-	    break
+        # Check that we're not in the returned message yet
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        line = string.split(line)
+        if len(line) > 3 and \
+           ((line[0] == '-----' and line[1] == 'Transcript') or
+            (line[0] == '---' and line[1] == 'The' and
+             line[2] == 'transcript') or
+            (line[0] == 'While' and
+	     line[1] == 'talking' and
+	     line[2] == 'to')):
+            # Yes, found it!
+            break
 
     errors = []
     found_a_line = 0
     warnings = 0
     while 1:
-	line = fp.readline()
-	if not line:
-	    break
-	line = line[:-1]
-	if not line:
-	    continue
-	if sendmail_pattern.match(line) == 4:
-	    # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
-	    if line[0] == '5':
-		errors.append(line)
-	    elif line[0] == '4':
-		warnings = 1
-	    else:
-		raise Unparseable
-	line = string.split(line)
-	if line and line[0][:3] == '---':
-	    break
-	found_a_line = 1
+        line = fp.readline()
+        if not line:
+            break
+        line = line[:-1]
+        if not line:
+            continue
+        if sendmail_pattern.match(line) == 4:
+            # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
+            if line[0] == '5':
+                errors.append(line)
+            elif line[0] == '4':
+                warnings = 1
+            else:
+                raise Unparseable
+        line = string.split(line)
+        if line and line[0][:3] == '---':
+            break
+        found_a_line = 1
     # special case for CWI sendmail
     if len(line) > 1 and line[1] == 'Undelivered':
-	while 1:
-	    line = fp.readline()
-	    if not line:
-		break
-	    line = string.strip(line)
-	    if not line:
-		break
-	    errors.append(line + ': ' + sub)
+        while 1:
+            line = fp.readline()
+            if not line:
+                break
+            line = string.strip(line)
+            if not line:
+                break
+            errors.append(line + ': ' + sub)
     # Empty transcripts are ok, others without an error are not.
     if found_a_line and not (errors or warnings):
-	raise Unparseable
+        raise Unparseable
     return errors
     
 def emparse_cts(fp, sub):
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
 
-	# Check that we're not in the returned message yet
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	line = string.split(line)
-	if len(line) > 3 and line[0][:2] == '|-' and line[1] == 'Failed' \
-	   and line[2] == 'addresses':
-	    # Yes, found it!
-	    break
+        # Check that we're not in the returned message yet
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        line = string.split(line)
+        if len(line) > 3 and line[0][:2] == '|-' and line[1] == 'Failed' \
+           and line[2] == 'addresses':
+            # Yes, found it!
+            break
 
     errors = []
     while 1:
-	line = fp.readline()
-	if not line:
-	    break
-	line = line[:-1]
-	if not line:
-	    continue
-	if line[:2] == '|-':
-	    break
-	errors.append(line)
+        line = fp.readline()
+        if not line:
+            break
+        line = line[:-1]
+        if not line:
+            continue
+        if line[:2] == '|-':
+            break
+        errors.append(line)
     return errors
 
 def emparse_aol(fp, sub):
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
-	if line:
-	    break
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
+        if line:
+            break
     exp = 'The mail you sent could not be delivered to:'
     if line[:len(exp)] != exp:
-	raise Unparseable
+        raise Unparseable
     errors = []
     while 1:
-	line = fp.readline()
-	if sendmail_pattern.match(line) == 4:
-	    # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
-	    if line[0] == '5':
-		errors.append(line)
-	    elif line[0] != '4':
-		raise Unparseable
-	elif line == '\n':
-	    break
-	else:
-	    raise Unparseable
+        line = fp.readline()
+        if sendmail_pattern.match(line) == 4:
+            # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
+            if line[0] == '5':
+                errors.append(line)
+            elif line[0] != '4':
+                raise Unparseable
+        elif line == '\n':
+            break
+        else:
+            raise Unparseable
     return errors
     
 def emparse_compuserve(fp, sub):
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
-	if line:
-	    break
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
+        if line:
+            break
     exp = 'Your message could not be delivered for the following reason:'
     if line[:len(exp)] != exp:
-	raise Unparseable
+        raise Unparseable
     errors = []
     while 1:
-	line = fp.readline()
-	if not line: break
-	if line[:3] == '---': break
-	line = line[:-1]
-	if not line: continue
-	if line == 'Please resend your message at a later time.':
-	    continue
-	line = 'Compuserve: ' + line
-	errors.append(line)
+        line = fp.readline()
+        if not line: break
+        if line[:3] == '---': break
+        line = line[:-1]
+        if not line: continue
+        if line == 'Please resend your message at a later time.':
+            continue
+        line = 'Compuserve: ' + line
+        errors.append(line)
     return errors
 
 prov_pattern = regex.compile('.* | \(.*\)')
 def emparse_providence(fp, sub):
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
 
-	# Check that we're not in the returned message yet
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	exp = 'The following errors occurred'
-	if line[:len(exp)] == exp:
-	    break
+        # Check that we're not in the returned message yet
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        exp = 'The following errors occurred'
+        if line[:len(exp)] == exp:
+            break
 
     errors = []
     while 1:
-	line = fp.readline()
-	if not line:
-	    break
-	line = line[:-1]
-	if not line:
-	    continue
-	if line[:4] == '----':
-	    break
-	if prov_pattern.match(line) > 0:
-	    errors.append(prov_pattern.group(1))
+        line = fp.readline()
+        if not line:
+            break
+        line = line[:-1]
+        if not line:
+            continue
+        if line[:4] == '----':
+            break
+        if prov_pattern.match(line) > 0:
+            errors.append(prov_pattern.group(1))
 
     if not errors:
-	raise Unparseable
+        raise Unparseable
     return errors
 
 def emparse_x400(fp, sub):
     exp = 'This report relates to your message:'
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
 
-	# Check that we're not in the returned message yet
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	if line[:len(exp)] == exp:
-	    break
+        # Check that we're not in the returned message yet
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        if line[:len(exp)] == exp:
+            break
 
     errors = []
     exp = 'Your message was not delivered to'
     while 1:
-	line = fp.readline()
-	if not line:
-	    break
-	line = line[:-1]
-	if not line:
-	    continue
-	if line[:len(exp)] == exp:
-	    error = string.strip(line[len(exp):])
-	    sep = ': '
-	    while 1:
-		line = fp.readline()
-		if not line:
-		    break
-		line = line[:-1]
-		if not line:
-		    break
-		if line[0] == ' ' and line[-1] != ':':
-		    error = error + sep + string.strip(line)
-		    sep = '; '
-	    errors.append(error)
-	    return errors
+        line = fp.readline()
+        if not line:
+            break
+        line = line[:-1]
+        if not line:
+            continue
+        if line[:len(exp)] == exp:
+            error = string.strip(line[len(exp):])
+            sep = ': '
+            while 1:
+                line = fp.readline()
+                if not line:
+                    break
+                line = line[:-1]
+                if not line:
+                    break
+                if line[0] == ' ' and line[-1] != ':':
+                    error = error + sep + string.strip(line)
+                    sep = '; '
+            errors.append(error)
+            return errors
     raise Unparseable
 
 def emparse_passau(fp, sub):
     exp = 'Unable to deliver message because'
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	if line[:len(exp)] == exp:
-	    break
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        if line[:len(exp)] == exp:
+            break
 
     errors = []
     exp = 'Returned Text follows'
     while 1:
-	line = fp.readline()
-	if not line:
-	    raise Unparseable
-	line = line[:-1]
-	# Check that we're not in the returned message yet
-	if string.lower(line)[:5] == 'from:':
-	    raise Unparseable
-	if not line:
-	    continue
-	if line[:len(exp)] == exp:
-	    return errors
-	errors.append(string.strip(line))
+        line = fp.readline()
+        if not line:
+            raise Unparseable
+        line = line[:-1]
+        # Check that we're not in the returned message yet
+        if string.lower(line)[:5] == 'from:':
+            raise Unparseable
+        if not line:
+            continue
+        if line[:len(exp)] == exp:
+            return errors
+        errors.append(string.strip(line))
 
 EMPARSERS = [emparse_sendmail, emparse_aol, emparse_cts, emparse_compuserve,
-	     emparse_providence, emparse_x400, emparse_passau]
+             emparse_providence, emparse_x400, emparse_passau]
 
 def sort_numeric(a, b):
     a = string.atoi(a)
@@ -290,62 +292,62 @@
     files.sort(sort_numeric)
     
     for fn in files:
-	# Lets try to parse the file.
-	fp = open(fn)
-	m = ErrorMessage(fp)
-	sender = m.getaddr('From')
-	print '%s\t%-40s\t'%(fn, sender[1]),
+        # Lets try to parse the file.
+        fp = open(fn)
+        m = ErrorMessage(fp)
+        sender = m.getaddr('From')
+        print '%s\t%-40s\t'%(fn, sender[1]),
 
-	if m.is_warning():
-	    print 'warning only'
-	    nwarn = nwarn + 1
-	    if modify:
-		os.unlink(fn)
-	    continue
+        if m.is_warning():
+            print 'warning only'
+            nwarn = nwarn + 1
+            if modify:
+                os.unlink(fn)
+            continue
 
-	try:
-	    errors = m.get_errors()
-	except Unparseable:
-	    print '** Not parseable'
-	    nbad = nbad + 1
-	    continue
-	print len(errors), 'errors'
+        try:
+            errors = m.get_errors()
+        except Unparseable:
+            print '** Not parseable'
+            nbad = nbad + 1
+            continue
+        print len(errors), 'errors'
 
-	# Remember them
-	for e in errors:
-	    try:
-		mm, dd = m.getdate('date')[1:1+2]
-		date = '%s %02d' % (calendar.month_abbr[mm], dd)
-	    except:
-		date = '??????'
-	    if not errordict.has_key(e):
-		errordict[e] = 1
-		errorfirst[e] = '%s (%s)' % (fn, date)
-	    else:
-		errordict[e] = errordict[e] + 1
-	    errorlast[e] = '%s (%s)' % (fn, date)
+        # Remember them
+        for e in errors:
+            try:
+                mm, dd = m.getdate('date')[1:1+2]
+                date = '%s %02d' % (calendar.month_abbr[mm], dd)
+            except:
+                date = '??????'
+            if not errordict.has_key(e):
+                errordict[e] = 1
+                errorfirst[e] = '%s (%s)' % (fn, date)
+            else:
+                errordict[e] = errordict[e] + 1
+            errorlast[e] = '%s (%s)' % (fn, date)
 
-	nok = nok + 1
-	if modify:
-	    os.unlink(fn)
+        nok = nok + 1
+        if modify:
+            os.unlink(fn)
 
     print '--------------'
     print nok, 'files parsed,',nwarn,'files warning-only,',
     print nbad,'files unparseable'
     print '--------------'
     for e in errordict.keys():
-	print errordict[e], errorfirst[e], '-', errorlast[e], '\t', e
+        print errordict[e], errorfirst[e], '-', errorlast[e], '\t', e
 
 def main():
     modify = 0
     if len(sys.argv) > 1 and sys.argv[1] == '-d':
-	modify = 1
-	del sys.argv[1]
+        modify = 1
+        del sys.argv[1]
     if len(sys.argv) > 1:
-	for folder in sys.argv[1:]:
-	    parsedir(folder, modify)
+        for folder in sys.argv[1:]:
+            parsedir(folder, modify)
     else:
-	parsedir('/ufs/jack/Mail/errorsinbox', modify)
+        parsedir('/ufs/jack/Mail/errorsinbox', modify)
 
 if __name__ == '__main__' or sys.argv[0] == __name__:
     main()
diff --git a/Tools/scripts/treesync.py b/Tools/scripts/treesync.py
index 26c3cd5..ded0b17 100755
--- a/Tools/scripts/treesync.py
+++ b/Tools/scripts/treesync.py
@@ -12,11 +12,11 @@
 
     If the files differ:
         if the slave file is newer:
-	    normalize the slave file
-	    if the files still differ:
-	        copy the slave to the master
-	else (the master is newer):
-	    copy the master to the slave
+            normalize the slave file
+            if the files still differ:
+                copy the slave to the master
+        else (the master is newer):
+            copy the master to the slave
     
     normalizing the slave means replacing CRLF with LF when the master
     doesn't use CRLF
@@ -37,107 +37,107 @@
     global create_directories, write_master, write_slave
     opts, args = getopt.getopt(sys.argv[1:], "nym:s:d:f:a:")
     for o, a in opts:
-	if o == '-y':
-	    default_answer = "yes"
-	if o == '-n':
-	    default_answer = "no"
-	if o == '-s':
-	    write_slave = a
-	if o == '-m':
-	    write_master = a
-	if o == '-d':
-	    create_directories = a
-	if o == '-f':
-	    create_files = a
-	if o == '-a':
-	    create_files = create_directories = write_slave = write_master = a
+        if o == '-y':
+            default_answer = "yes"
+        if o == '-n':
+            default_answer = "no"
+        if o == '-s':
+            write_slave = a
+        if o == '-m':
+            write_master = a
+        if o == '-d':
+            create_directories = a
+        if o == '-f':
+            create_files = a
+        if o == '-a':
+            create_files = create_directories = write_slave = write_master = a
     try:
-	[slave, master] = args
+        [slave, master] = args
     except ValueError:
-	print "usage: python", sys.argv[0] or "treesync.py",
-	print "[-n] [-y] [-m y|n|a] [-s y|n|a] [-d y|n|a] [-f n|y|a]",
-	print "slavedir masterdir"
-	return
+        print "usage: python", sys.argv[0] or "treesync.py",
+        print "[-n] [-y] [-m y|n|a] [-s y|n|a] [-d y|n|a] [-f n|y|a]",
+        print "slavedir masterdir"
+        return
     process(slave, master)
     
 def process(slave, master):
     cvsdir = os.path.join(master, "CVS")
     if not os.path.isdir(cvsdir):
-	print "skipping master subdirectory", master
-	print "-- not under CVS"
-	return
+        print "skipping master subdirectory", master
+        print "-- not under CVS"
+        return
     print "-"*40
     print "slave ", slave
     print "master", master
     if not os.path.isdir(slave):
-	if not okay("create slave directory %s?" % slave,
-		    answer=create_directories):
-	    print "skipping master subdirectory", master
-	    print "-- no corresponding slave", slave
-	    return
-	print "creating slave directory", slave
-	try:
-	    os.mkdir(slave)
-	except os.error, msg:
-	    print "can't make slave directory", slave, ":", msg
-	    return
-	else:
-	    print "made slave directory", slave
+        if not okay("create slave directory %s?" % slave,
+                    answer=create_directories):
+            print "skipping master subdirectory", master
+            print "-- no corresponding slave", slave
+            return
+        print "creating slave directory", slave
+        try:
+            os.mkdir(slave)
+        except os.error, msg:
+            print "can't make slave directory", slave, ":", msg
+            return
+        else:
+            print "made slave directory", slave
     cvsdir = None
     subdirs = []
     names = os.listdir(master)
     for name in names:
-	mastername = os.path.join(master, name)
-	slavename = os.path.join(slave, name)
-	if name == "CVS":
-	    cvsdir = mastername
-	else:
-	    if os.path.isdir(mastername) and not os.path.islink(mastername):
-		subdirs.append((slavename, mastername))
+        mastername = os.path.join(master, name)
+        slavename = os.path.join(slave, name)
+        if name == "CVS":
+            cvsdir = mastername
+        else:
+            if os.path.isdir(mastername) and not os.path.islink(mastername):
+                subdirs.append((slavename, mastername))
     if cvsdir:
-	entries = os.path.join(cvsdir, "Entries")
-	for e in open(entries).readlines():
-	    words = string.split(e, '/')
-	    if words[0] == '' and words[1:]:
-		name = words[1]
-		s = os.path.join(slave, name)
-		m = os.path.join(master, name)
-		compare(s, m)
+        entries = os.path.join(cvsdir, "Entries")
+        for e in open(entries).readlines():
+            words = string.split(e, '/')
+            if words[0] == '' and words[1:]:
+                name = words[1]
+                s = os.path.join(slave, name)
+                m = os.path.join(master, name)
+                compare(s, m)
     for (s, m) in subdirs:
-	process(s, m)
+        process(s, m)
 
 def compare(slave, master):
     try:
-	sf = open(slave, 'r')
+        sf = open(slave, 'r')
     except IOError:
-	sf = None
+        sf = None
     try:
-	mf = open(master, 'rb')
+        mf = open(master, 'rb')
     except IOError:
-	mf = None
+        mf = None
     if not sf:
-	if not mf:
-	    print "Neither master nor slave exists", master
-	    return
-	print "Creating missing slave", slave
-	copy(master, slave, answer=create_files)
-	return
+        if not mf:
+            print "Neither master nor slave exists", master
+            return
+        print "Creating missing slave", slave
+        copy(master, slave, answer=create_files)
+        return
     if not mf:
-	print "Not updating missing master", master
-	return
+        print "Not updating missing master", master
+        return
     if sf and mf:
-	if identical(sf, mf):
-	    return
+        if identical(sf, mf):
+            return
     sft = mtime(sf)
     mft = mtime(mf)
     if mft > sft:
-	# Master is newer -- copy master to slave
-	sf.close()
-	mf.close()
-	print "Master             ", master
-	print "is newer than slave", slave
-	copy(master, slave, answer=write_slave)
-	return
+        # Master is newer -- copy master to slave
+        sf.close()
+        mf.close()
+        print "Master             ", master
+        print "is newer than slave", slave
+        copy(master, slave, answer=write_slave)
+        return
     # Slave is newer -- copy slave to master
     print "Slave is", sft-mft, "seconds newer than master"
     # But first check what to do about CRLF
@@ -146,20 +146,20 @@
     mf.close()
     sf.close()
     if fun:
-	print "***UPDATING MASTER (BINARY COPY)***"
-	copy(slave, master, "rb", answer=write_master)
+        print "***UPDATING MASTER (BINARY COPY)***"
+        copy(slave, master, "rb", answer=write_master)
     else:
-	print "***UPDATING MASTER***"
-	copy(slave, master, "r", answer=write_master)
+        print "***UPDATING MASTER***"
+        copy(slave, master, "r", answer=write_master)
 
 BUFSIZE = 16*1024
 
 def identical(sf, mf):
     while 1:
-	sd = sf.read(BUFSIZE)
-	md = mf.read(BUFSIZE)
-	if sd != md: return 0
-	if not sd: break
+        sd = sf.read(BUFSIZE)
+        md = mf.read(BUFSIZE)
+        if sd != md: return 0
+        if not sd: break
     return 1
 
 def mtime(f):
@@ -168,36 +168,36 @@
 
 def funnychars(f):
     while 1:
-	buf = f.read(BUFSIZE)
-	if not buf: break
-	if '\r' in buf or '\0' in buf: return 1
+        buf = f.read(BUFSIZE)
+        if not buf: break
+        if '\r' in buf or '\0' in buf: return 1
     return 0
 
 def copy(src, dst, rmode="rb", wmode="wb", answer='ask'):
     print "copying", src
     print "     to", dst
     if not okay("okay to copy? ", answer):
-	return
+        return
     f = open(src, rmode)
     g = open(dst, wmode)
     while 1:
-	buf = f.read(BUFSIZE)
-	if not buf: break
-	g.write(buf)
+        buf = f.read(BUFSIZE)
+        if not buf: break
+        g.write(buf)
     f.close()
     g.close()
 
 def okay(prompt, answer='ask'):
     answer = string.lower(string.strip(answer))
     if not answer or answer[0] not in 'ny':
-	answer = raw_input(prompt)
-	answer = string.lower(string.strip(answer))
-	if not answer:
-	    answer = default_answer
+        answer = raw_input(prompt)
+        answer = string.lower(string.strip(answer))
+        if not answer:
+            answer = default_answer
     if answer[:1] == 'y':
-	return 1
+        return 1
     if answer[:1] == 'n':
-	return 0
+        return 0
     print "Yes or No please -- try again:"
     return okay(prompt)
 
