# Module 'packmail' -- create a self-unpacking shell archive.

# This module works on UNIX and on the Mac; the archives can unpack
# themselves only on UNIX.

import os
from stat import ST_MTIME
import string

# Print help
def help():
	print 'All fns have a file open for writing as first parameter'
	print 'pack(f, fullname, name): pack fullname as name'
	print 'packsome(f, directory, namelist): selected files from directory'
	print 'packall(f, directory): pack all files from directory'
	print 'packnotolder(f, directory, name): pack all files from directory'
	print '                        that are not older than a file there'
	print 'packtree(f, directory): pack entire directory tree'

# Pack one file
def pack(outfp, file, name):
	fp = open(file, 'r')
	outfp.write('echo ' + name + '\n')
	outfp.write('sed "s/^X//" >' + name + ' <<"!"\n')
	while 1:
		line = fp.readline()
		if not line: break
		if line[-1:] <> '\n':
			line = line + '\n'
		outfp.write('X' + line)
	outfp.write('!\n')
	fp.close()

# Pack some files from a directory
def packsome(outfp, dirname, names):
	for name in names:
		print name
		file = os.path.join(dirname, name)
		pack(outfp, file, name)

# Pack all files from a directory
def packall(outfp, dirname):
	names = os.listdir(dirname)
	try:
	    names.remove('.')
	except:
	    pass
	try:
	    names.remove('..')
	except:
	    pass
	names.sort()
	packsome(outfp, dirname, names)

# Pack all files from a directory that are not older than a give one
def packnotolder(outfp, dirname, oldest):
	names = os.listdir(dirname)
	try:
	    names.remove('.')
	except:
	    pass
	try:
	    names.remove('..')
	except:
	    pass
	oldest = os.path.join(dirname, oldest)
	st = os.stat(oldest)
	mtime = st[ST_MTIME]
	todo = []
	for name in names:
		print name, '...',
		st = os.stat(os.path.join(dirname, name))
		if st[ST_MTIME] >= mtime:
			print 'Yes.'
			todo.append(name)
		else:
			print 'No.'
	todo.sort()
	packsome(outfp, dirname, todo)

# Pack a whole tree (no exceptions)
def packtree(outfp, dirname):
	print 'packtree', dirname
	outfp.write('mkdir ' + unixfix(dirname) + '\n')
	names = os.listdir(dirname)
	try:
	    names.remove('.')
	except:
	    pass
	try:
	    names.remove('..')
	except:
	    pass
	subdirs = []
	for name in names:
		fullname = os.path.join(dirname, name)
		if os.path.isdir(fullname):
			subdirs.append(fullname)
		else:
			print 'pack', fullname
			pack(outfp, fullname, unixfix(fullname))
	for subdirname in subdirs:
		packtree(outfp, subdirname)

def unixfix(name):
	comps = string.splitfields(name, os.sep)
	res = ''
	for comp in comps:
		if comp:
			if res: res = res + '/'
			res = res + comp
	return res
