summaryrefslogtreecommitdiffstats
path: root/Tools/msi
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2012-03-06 16:53:12 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2012-03-06 16:53:12 (GMT)
commit41add01317b324dd1d3ff6651c08964d0bd1af44 (patch)
tree6ed7769c140bc7309d5586391d8ed15adfc6f432 /Tools/msi
parent2318699f591fdfd31fcb3b52058e8a4a21aa1fcd (diff)
downloadcpython-41add01317b324dd1d3ff6651c08964d0bd1af44.zip
cpython-41add01317b324dd1d3ff6651c08964d0bd1af44.tar.gz
cpython-41add01317b324dd1d3ff6651c08964d0bd1af44.tar.bz2
Use hg manifest to compute list of library files to include.
Diffstat (limited to 'Tools/msi')
-rw-r--r--Tools/msi/msi.py165
1 files changed, 39 insertions, 126 deletions
diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py
index 0e3ec50..a18debc 100644
--- a/Tools/msi/msi.py
+++ b/Tools/msi/msi.py
@@ -2,11 +2,11 @@
# (C) 2003 Martin v. Loewis
# See "FOO" in comments refers to MSDN sections with the title FOO.
import msilib, schema, sequence, os, glob, time, re, shutil, zipfile
+import subprocess, tempfile
from msilib import Feature, CAB, Directory, Dialog, Binary, add_data
import uisample
from win32com.client import constants
from distutils.spawn import find_executable
-import tempfile
# Settings can be overridden in config.py below
# 0 for official python.org releases
@@ -909,31 +909,27 @@ class PyDirectory(Directory):
kw['componentflags'] = 2 #msidbComponentAttributesOptional
Directory.__init__(self, *args, **kw)
- def check_unpackaged(self):
- self.unpackaged_files.discard('__pycache__')
- self.unpackaged_files.discard('.svn')
- if self.unpackaged_files:
- print "Warning: Unpackaged files in %s" % self.absolute
- print self.unpackaged_files
-
-
-def inside_test(dir):
- if dir.physical in ('test', 'tests'):
- return True
- if dir.basedir:
- return inside_test(dir.basedir)
- return False
+def hgmanifest():
+ # Fetch file list from Mercurial
+ process = subprocess.Popen(['hg', 'manifest'], stdout=subprocess.PIPE)
+ stdout, stderr = process.communicate()
+ # Create nested directories for file tree
+ result = {}
+ for line in stdout.splitlines():
+ components = line.split('/')
+ d = result
+ while len(components) > 1:
+ d1 = d.setdefault(components[0], {})
+ d = d1
+ del components[0]
+ d[components[0]] = None
+ return result
-def in_packaging_tests(dir):
- if dir.physical == 'tests' and dir.basedir.physical == 'packaging':
- return True
- if dir.basedir:
- return in_packaging_tests(dir.basedir)
- return False
# See "File Table", "Component Table", "Directory Table",
# "FeatureComponents Table"
def add_files(db):
+ hgfiles = hgmanifest()
cab = CAB("python")
tmpfiles = []
# Add all executables, icons, text files into the TARGETDIR component
@@ -995,123 +991,40 @@ def add_files(db):
# Add all .py files in Lib, except tkinter, test
dirs = []
- pydirs = [(root,"Lib")]
+ pydirs = [(root, "Lib", hgfiles["Lib"], default_feature)]
while pydirs:
# Commit every now and then, or else installer will complain
db.Commit()
- parent, dir = pydirs.pop()
- if dir == ".svn" or dir == '__pycache__' or dir.startswith("plat-"):
+ parent, dir, files, feature = pydirs.pop()
+ if dir.startswith("plat-"):
continue
- elif dir in ["tkinter", "idlelib", "Icons"]:
+ if dir in ["tkinter", "idlelib", "turtledemo"]:
if not have_tcl:
continue
+ feature = tcltk
tcltk.set_current()
- elif dir in ('test', 'tests') or inside_test(parent):
- testsuite.set_current()
+ elif dir in ('test', 'tests'):
+ feature = testsuite
elif not have_ctypes and dir == "ctypes":
continue
- else:
- default_feature.set_current()
+ feature.set_current()
lib = PyDirectory(db, cab, parent, dir, dir, "%s|%s" % (parent.make_short(dir), dir))
- # Add additional files
dirs.append(lib)
- lib.glob("*.txt")
- if dir=='site-packages':
- lib.add_file("README.txt", src="README")
- continue
- files = lib.glob("*.py")
- files += lib.glob("*.pyw")
- if files:
- # Add an entry to the RemoveFile table to remove bytecode files.
- lib.remove_pyc()
- # package READMEs if present
- lib.glob("README")
- if dir=='Lib':
- lib.add_file("sysconfig.cfg")
- if dir=='test' and parent.physical=='Lib':
- lib.add_file("185test.db")
- lib.add_file("audiotest.au")
- lib.add_file("sgml_input.html")
- lib.add_file("testtar.tar")
- lib.add_file("test_difflib_expect.html")
- lib.add_file("check_soundcard.vbs")
- lib.add_file("empty.vbs")
- lib.add_file("Sine-1000Hz-300ms.aif")
- lib.glob("*.uue")
- lib.glob("*.pem")
- lib.glob("*.pck")
- lib.glob("cfgparser.*")
- lib.add_file("zip_cp437_header.zip")
- lib.add_file("zipdir.zip")
- lib.add_file("mime.types")
- if dir=='capath':
- lib.glob("*.0")
- if dir=='tests' and parent.physical=='distutils':
- lib.add_file("Setup.sample")
- if dir=='decimaltestdata':
- lib.glob("*.decTest")
- if dir=='xmltestdata':
- lib.glob("*.xml")
- lib.add_file("test.xml.out")
- if dir=='output':
- lib.glob("test_*")
- if dir=='sndhdrdata':
- lib.glob("sndhdr.*")
- if dir=='idlelib':
- lib.glob("*.def")
- lib.add_file("idle.bat")
- lib.add_file("ChangeLog")
- if dir=="Icons":
- lib.glob("*.gif")
- lib.add_file("idle.icns")
- if dir=="command" and parent.physical in ("distutils", "packaging"):
- lib.glob("wininst*.exe")
- lib.add_file("command_template")
- if dir=="lib2to3":
- lib.removefile("pickle", "*.pickle")
- if dir=="macholib":
- lib.add_file("README.ctypes")
- lib.glob("fetch_macholib*")
- if dir=='turtledemo':
- lib.add_file("turtle.cfg")
- if dir=="pydoc_data":
- lib.add_file("_pydoc.css")
- if dir.endswith('.dist-info'):
- lib.add_file('INSTALLER')
- lib.add_file('REQUESTED')
- lib.add_file('RECORD')
- lib.add_file('METADATA')
- lib.glob('RESOURCES')
- if dir.endswith('.egg-info') or dir == 'EGG-INFO':
- lib.add_file('PKG-INFO')
- if in_packaging_tests(parent):
- lib.glob('*.html')
- lib.glob('*.tar.gz')
- if dir=='fake_dists':
- # cannot use glob since there are also egg-info directories here
- lib.add_file('cheese-2.0.2.egg-info')
- lib.add_file('nut-funkyversion.egg-info')
- lib.add_file('strawberry-0.6.egg')
- lib.add_file('truffles-5.0.egg-info')
- lib.add_file('babar.cfg')
- lib.add_file('babar.png')
- if dir=="data" and parent.physical=="test_email":
- # This should contain all non-.svn files listed in subversion
- for f in os.listdir(lib.absolute):
- if f.endswith(".txt") or f==".svn":continue
- if f.endswith(".au") or f.endswith(".gif"):
- lib.add_file(f)
+ has_py = False
+ for name, subdir in files.items():
+ if subdir is None:
+ assert os.path.isfile(os.path.join(lib.absolute, name))
+ if name == 'README':
+ lib.add_file("README.txt", src="README")
else:
- print("WARNING: New file %s in test/test_email/data" % f)
- if dir=='tests' and parent.physical == 'packaging':
- lib.add_file('SETUPTOOLS-PKG-INFO2')
- lib.add_file('SETUPTOOLS-PKG-INFO')
- lib.add_file('PKG-INFO')
- for f in os.listdir(lib.absolute):
- if os.path.isdir(os.path.join(lib.absolute, f)):
- pydirs.append((lib, f))
- for d in dirs:
- d.check_unpackaged()
+ lib.add_file(name)
+ has_py = has_py or name.endswith(".py") or name.endswith(".pyw")
+ else:
+ assert os.path.isdir(os.path.join(lib.absolute, name))
+ pydirs.append((lib, name, subdir, feature))
+
+ if has_py:
+ lib.remove_pyc()
# Add DLLs
default_feature.set_current()
lib = DLLs