chiark / gitweb /
agpl.py: Include a `MANIFEST' file explaining where things came from.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 27 Mar 2013 21:24:16 +0000 (21:24 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 27 Mar 2013 21:29:53 +0000 (21:29 +0000)
agpl.py

diff --git a/agpl.py b/agpl.py
index b89330cb56de6e64f66303af0743e7dd184fc819..20b61668e9331d7348ef34b36f3413375820b22e 100644 (file)
--- a/agpl.py
+++ b/agpl.py
 ### <http://www.gnu.org/licenses/>.
 
 import contextlib as CTX
 ### <http://www.gnu.org/licenses/>.
 
 import contextlib as CTX
+import grp as GR
 import os as OS
 import os as OS
+import pwd as PW
 import shlex as SL
 import shutil as SH
 import subprocess as SUB
 import sys as SYS
 import tarfile as TAR
 import tempfile as TF
 import shlex as SL
 import shutil as SH
 import subprocess as SUB
 import sys as SYS
 import tarfile as TAR
 import tempfile as TF
+import time as T
+
+from cStringIO import StringIO
 
 from auto import PACKAGE, VERSION
 import util as U
 
 from auto import PACKAGE, VERSION
 import util as U
@@ -105,8 +110,32 @@ def source(out):
   else:
     tf = TAR.open(fileobj = out, mode = 'w|gz')
     tf.posix = True
   else:
     tf = TAR.open(fileobj = out, mode = 'w|gz')
     tf.posix = True
-  for d in dirs_to_dump():
-    dump_dir(d, tf, '%s-%s' % (PACKAGE, VERSION))
+  root = '%s-%s' % (PACKAGE, VERSION)
+  seen = set()
+  dirmap = []
+  festout = StringIO()
+  for dir in dirs_to_dump():
+    dir = dir.rstrip('/')
+    base = OS.path.basename(dir)
+    if base not in seen:
+      name = base
+    else:
+      for i in I.count():
+        name = '%s.%d' % (base, i)
+        if name not in seen: break
+    dirmap.append((dir + '/', name))
+    festout.write('%s = %s\n' % (name, dir))
+  fest = festout.getvalue()
+  ti = TAR.TarInfo(OS.path.join(root, 'MANIFEST'))
+  ti.size = len(fest)
+  ti.mtime = T.time()
+  ti.mode = 0664
+  ti.type = TAR.REGTYPE
+  uid = OS.getuid(); ti.uid, ti.uname = uid, PW.getpwuid(uid).pw_name
+  gid = OS.getgid(); ti.gid, ti.gname = gid, GR.getgrgid(gid).gr_name
+  tf.addfile(ti, fileobj = StringIO(fest))
+  for dir, name in dirmap:
+    dump_dir(dir, tf, root)
   tf.close()
 
 ###----- That's all, folks --------------------------------------------------
   tf.close()
 
 ###----- That's all, folks --------------------------------------------------