blob: e569108a48fb27afcbcbb81bb9773c157517abda [file] [log] [blame]
Guido van Rossumfff3a1ee1992-04-06 14:04:58 +00001# Module 'packmail' -- create a self-unpacking shell archive.
2
3# This module works on UNIX and on the Mac; the archives can unpack
4# themselves only on UNIX.
Guido van Rossum217a5fa1990-12-26 15:40:07 +00005
Guido van Rossumd9596e31992-03-31 19:05:11 +00006import os
Guido van Rossum217a5fa1990-12-26 15:40:07 +00007from stat import ST_MTIME
8
Guido van Rossumfff3a1ee1992-04-06 14:04:58 +00009# Print help
10def help():
Tim Peters182b5ac2004-07-18 06:16:08 +000011 print 'All fns have a file open for writing as first parameter'
12 print 'pack(f, fullname, name): pack fullname as name'
13 print 'packsome(f, directory, namelist): selected files from directory'
14 print 'packall(f, directory): pack all files from directory'
15 print 'packnotolder(f, directory, name): pack all files from directory'
16 print ' that are not older than a file there'
17 print 'packtree(f, directory): pack entire directory tree'
Guido van Rossumfff3a1ee1992-04-06 14:04:58 +000018
Guido van Rossum217a5fa1990-12-26 15:40:07 +000019# Pack one file
20def pack(outfp, file, name):
Tim Peters182b5ac2004-07-18 06:16:08 +000021 fp = open(file, 'r')
22 outfp.write('echo ' + name + '\n')
23 outfp.write('sed "s/^X//" >"' + name + '" <<"!"\n')
24 while 1:
25 line = fp.readline()
26 if not line: break
27 if line[-1:] != '\n':
28 line = line + '\n'
29 outfp.write('X' + line)
30 outfp.write('!\n')
31 fp.close()
Guido van Rossum217a5fa1990-12-26 15:40:07 +000032
33# Pack some files from a directory
34def packsome(outfp, dirname, names):
Tim Peters182b5ac2004-07-18 06:16:08 +000035 for name in names:
36 print name
37 file = os.path.join(dirname, name)
38 pack(outfp, file, name)
Guido van Rossum217a5fa1990-12-26 15:40:07 +000039
40# Pack all files from a directory
41def packall(outfp, dirname):
Tim Peters182b5ac2004-07-18 06:16:08 +000042 names = os.listdir(dirname)
43 try:
44 names.remove('.')
45 except:
46 pass
47 try:
48 names.remove('..')
49 except:
50 pass
51 names.sort()
52 packsome(outfp, dirname, names)
Guido van Rossum217a5fa1990-12-26 15:40:07 +000053
54# Pack all files from a directory that are not older than a give one
55def packnotolder(outfp, dirname, oldest):
Tim Peters182b5ac2004-07-18 06:16:08 +000056 names = os.listdir(dirname)
57 try:
58 names.remove('.')
59 except:
60 pass
61 try:
62 names.remove('..')
63 except:
64 pass
65 oldest = os.path.join(dirname, oldest)
66 st = os.stat(oldest)
67 mtime = st[ST_MTIME]
68 todo = []
69 for name in names:
70 print name, '...',
71 st = os.stat(os.path.join(dirname, name))
72 if st[ST_MTIME] >= mtime:
73 print 'Yes.'
74 todo.append(name)
75 else:
76 print 'No.'
77 todo.sort()
78 packsome(outfp, dirname, todo)
Guido van Rossumfa540641991-04-07 13:40:56 +000079
80# Pack a whole tree (no exceptions)
81def packtree(outfp, dirname):
Tim Peters182b5ac2004-07-18 06:16:08 +000082 print 'packtree', dirname
83 outfp.write('mkdir ' + unixfix(dirname) + '\n')
84 names = os.listdir(dirname)
85 try:
86 names.remove('.')
87 except:
88 pass
89 try:
90 names.remove('..')
91 except:
92 pass
93 subdirs = []
94 for name in names:
95 fullname = os.path.join(dirname, name)
96 if os.path.isdir(fullname):
97 subdirs.append(fullname)
98 else:
99 print 'pack', fullname
100 pack(outfp, fullname, unixfix(fullname))
101 for subdirname in subdirs:
102 packtree(outfp, subdirname)
Guido van Rossumfa540641991-04-07 13:40:56 +0000103
104def unixfix(name):
Tim Peters182b5ac2004-07-18 06:16:08 +0000105 comps = name.split(os.sep)
106 res = ''
107 for comp in comps:
108 if comp:
109 if res: res = res + '/'
110 res = res + comp
111 return res