chiark / gitweb /
wip ownsource system stuff
[hippotat.git] / hippotatlib / ownsource.py
index b434f32294c4a71207a012764dea453ff76721d7..4f1db677aa16fcc6b9ac19c4f4f522f139e99ab0 100644 (file)
@@ -33,13 +33,14 @@ class SourceShipmentPreparer():
     s.rune_portmanteau = r'''
             outfile=$1; shift
             rm -f "$outfile"
-            GZIP=-9 tar zcf "$outfile" "$@"'
+            GZIP=-1 tar zcf "$outfile" "$@"
     '''
     s.manifest_name='0000-MANIFEST.txt'
     # private
     s._destdir = destdir
     s._outcounter = 0
     s._manifest = []
+    s._dirmap = { }
 
   def src_filter_glob(s, src): # default s.src_filter
     for pat in s.src_filter_globs:
@@ -99,24 +100,33 @@ class SourceShipmentPreparer():
     script += ' -print0'
     return script
 
+  def manifest_append(s, name, infol):
+    s._manifest.append((name, ' '.join(infol)))
+
   def new_output_name(s, nametail, infol):
     s._outcounter += 1
     name = '%04d-%s' % (s._outcounter, nametail)
-    s._manifest.append((name, ' '.join(infol)))
+    s.manifest_append(name, infol)
     return name
 
-  def new_output_fh(s, nametail, infol):
-    name = s.new_output_name(nametail, infol)
-    return s.open_output_fh(name, 'wb')
-
   def open_output_fh(s, name, mode):
     return open(os.path.join(s._destdir, name), mode)
 
   def mk_from_dir(s, d, infol):
+    try: name = s._dirmap[d]
+    except KeyError: pass
+    else:
+      s.manifest_append(name, infol)
+      return
+
     if s.show_pathnames: infol.append(d)
     find_rune = s.src_find_rune(d)
     total_rune = s.rune_cpio % find_rune
-    fh = s.new_output_fh('src.cpio', infol)
+
+    name = s.new_output_name('src.cpio', infol)
+    s._dirmap[d] = name
+    fh = s.open_output_fh(name, 'wb')
+
     subprocess.run(s.rune_shell + [total_rune],
                    cwd=d,
                    stdin=subprocess.DEVNULL,
@@ -131,20 +141,30 @@ class SourceShipmentPreparer():
     d = s.src_parentfinder(d, infol)
     s.mk_from_dir(d, infol)
 
+  def mk_from_module(s, m, infol):
+    try: file = m.__file__
+    except AttributeError: return
+    infol.append(m.__name__)
+    s.mk_from_src(file, infol)
+    s.manifest_append(None, ['spong',file])
+    #s.report_from_package(file, infol)
+
   def mk_from_srcs(s, dirs=sys.path):
     s.mk_from_src(sys.argv[0], ['argv[0]'])
     for d in sys.path:
       s.mk_from_src(d, ['sys.path'])
+    for m in sys.modules.values():
+      s.mk_from_module(m, ['sys.modules'])
 
   def mk_portmanteau(s):
     cmdl = s.rune_shell + [ s.rune_portmanteau, 'x',
                             s.output_name, s.manifest_name ]
     mfh = s.open_output_fh(s.manifest_name,'w')
     for (name, info) in s._manifest:
-      cmdl.append(name)
+      if name is not None: cmdl.append(name)
       print('%s\t%s' % (name,info), file=mfh)
     mfh.close()
-    subprocess.run(s.rune_shell + cmdl,
+    subprocess.run(cmdl,
                    cwd=s._destdir,
                    stdin=subprocess.DEVNULL,
                    stdout=sys.stderr,