Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62128,62130,62132,62134-62135,62137,62139-62140,62144,62146,62151,62155,62157,62162-62174 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r62167 | martin.v.loewis | 2008-04-05 17:45:25 +0200 (Sa, 05 Apr 2008) | 1 line

  Extend sizes of various fields, to support the CRT90 merge module.
........
  r62168 | martin.v.loewis | 2008-04-05 17:48:36 +0200 (Sa, 05 Apr 2008) | 1 line

  Add two features to distinguish between private and SxS CRT.
........
  r62169 | martin.v.loewis | 2008-04-05 17:50:58 +0200 (Sa, 05 Apr 2008) | 1 line

  Add script to merge msvcr90.
........
  r62170 | andrew.kuchling | 2008-04-05 17:57:46 +0200 (Sa, 05 Apr 2008) | 1 line

  Markup fixes; write PEP 3118 section
........
  r62173 | georg.brandl | 2008-04-05 19:45:58 +0200 (Sa, 05 Apr 2008) | 2 lines

  Mention that the tuple returned by __reduce__ is pickled as normal.
........
  r62174 | andrew.kuchling | 2008-04-05 20:15:30 +0200 (Sa, 05 Apr 2008) | 1 line

  Write PEP 3119 section
........
diff --git a/Tools/msi/merge.py b/Tools/msi/merge.py
new file mode 100644
index 0000000..aa26122
--- /dev/null
+++ b/Tools/msi/merge.py
@@ -0,0 +1,70 @@
+import msilib,os,win32com,tempfile

+PCBUILD="PCBuild"

+from config import *

+

+Win64 = "amd64" in PCBUILD

+

+mod_dir = os.path.join(os.environ["ProgramFiles"], "Common Files", "Merge Modules")

+if Win64:

+    modules = ["Microsoft_VC90_CRT_x86.msm", "policy_8_0_Microsoft_VC80_CRT_x86_x64.msm"]

+    msi = "python-%s.amd64.msi" % full_current_version

+else:

+    modules = ["Microsoft_VC90_CRT_x86.msm","policy_8_0_Microsoft_VC80_CRT_x86.msm"]

+    msi = "python-%s.msi" % full_current_version

+for i, n in enumerate(modules):

+    modules[i] = os.path.join(mod_dir, n)

+

+def merge(msi, feature, rootdir, modules):

+    cab_and_filecount = []

+    # Step 1: Merge databases, extract cabfiles

+    m = msilib.MakeMerge2()

+    m.OpenLog("merge.log")

+    print "Opened Log"

+    m.OpenDatabase(msi)

+    print "Opened DB"

+    for module in modules:

+        print module

+        m.OpenModule(module,0)

+        print "Opened Module",module

+        m.Merge(feature, rootdir)

+        print "Errors:"

+        for e in m.Errors:

+            print e.Type, e.ModuleTable, e.DatabaseTable

+            print "   Modkeys:",

+            for s in e.ModuleKeys: print s,

+            print

+            print "   DBKeys:",

+            for s in e.DatabaseKeys: print s,

+            print

+        cabname = tempfile.mktemp(suffix=".cab")

+        m.ExtractCAB(cabname)

+        cab_and_filecount.append((cabname, len(m.ModuleFiles)))

+        m.CloseModule()

+    m.CloseDatabase(True)

+    m.CloseLog()

+

+    # Step 2: Add CAB files

+    i = msilib.MakeInstaller()

+    db = i.OpenDatabase(msi, win32com.client.constants.msiOpenDatabaseModeTransact)

+

+    v = db.OpenView("SELECT LastSequence FROM Media")

+    v.Execute(None)

+    maxmedia = -1

+    while 1:

+        r = v.Fetch()

+        if not r: break

+        seq = r.IntegerData(1)

+        if seq > maxmedia:

+            maxmedia = seq

+    print "Start of Media", maxmedia

+

+    for cabname, count in cab_and_filecount:

+        stream = "merged%d" % maxmedia

+        msilib.add_data(db, "Media",

+                [(maxmedia+1, maxmedia+count, None, "#"+stream, None, None)])

+        msilib.add_stream(db, stream,  cabname)

+        os.unlink(cabname)

+        maxmedia += count

+    db.Commit()

+

+merge(msi, "SharedCRT", "TARGETDIR", modules)

diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py
index 08b759c..6a228be 100644
--- a/Tools/msi/msi.py
+++ b/Tools/msi/msi.py
@@ -799,6 +799,12 @@
     default_feature = Feature(db, "DefaultFeature", "Python",
                               "Python Interpreter and Libraries",
                               1, directory = "TARGETDIR")
+    shared_crt = Feature(db, "SharedCRT", "MSVCRT", "C Run-Time (system-wide)", 0,
+                         level=0)
+    private_crt = Feature(db, "PrivateCRT", "MSVCRT", "C Run-Time (private)", 0,
+                          level=0)
+    add_data(db, "Condition", [("SharedCRT", 1, sys32cond),
+                               ("PrivateCRT", 1, "not "+sys32cond)])
     # We don't support advertisement of extensions
     ext_feature = Feature(db, "Extensions", "Register Extensions",
                           "Make this Python installation the default Python installation", 3,
@@ -899,7 +905,7 @@
     DLLs = PyDirectory(db, cab, root, srcdir + "/" + PCBUILD, "DLLs", "DLLS|DLLs")
     # XXX determine dependencies
     if MSVCR == "90":
-        root.start_component("msvcr90")
+        root.start_component("msvcr90", feature=private_crt)
         for file, kw in extract_msvcr90():
             root.add_file(file, **kw)
             if file.endswith("manifest"):
diff --git a/Tools/msi/schema.py b/Tools/msi/schema.py
index 7a3e797..d028a11 100644
--- a/Tools/msi/schema.py
+++ b/Tools/msi/schema.py
@@ -18,7 +18,7 @@
 ActionText.add_field(3,'Template',7936)
 
 AdminExecuteSequence = Table('AdminExecuteSequence')
-AdminExecuteSequence.add_field(1,'Action',11592)
+AdminExecuteSequence.add_field(1,'Action',0x2DFF)
 AdminExecuteSequence.add_field(2,'Condition',7679)
 AdminExecuteSequence.add_field(3,'Sequence',5378)
 
@@ -28,12 +28,12 @@
 Condition.add_field(3,'Condition',7679)
 
 AdminUISequence = Table('AdminUISequence')
-AdminUISequence.add_field(1,'Action',11592)
+AdminUISequence.add_field(1,'Action',0x2DFF)
 AdminUISequence.add_field(2,'Condition',7679)
 AdminUISequence.add_field(3,'Sequence',5378)
 
 AdvtExecuteSequence = Table('AdvtExecuteSequence')
-AdvtExecuteSequence.add_field(1,'Action',11592)
+AdvtExecuteSequence.add_field(1,'Action',0x2DFF)
 AdvtExecuteSequence.add_field(2,'Condition',7679)
 AdvtExecuteSequence.add_field(3,'Sequence',5378)
 
@@ -83,7 +83,7 @@
 Feature.add_field(4,'Description',8191)
 Feature.add_field(5,'Display',5378)
 Feature.add_field(6,'Level',1282)
-Feature.add_field(7,'Directory_',7496)
+Feature.add_field(7,'Directory_',0x1DFF)
 Feature.add_field(8,'Attributes',1282)
 
 Binary = Table('Binary')
@@ -91,15 +91,15 @@
 Binary.add_field(2,'Data',2304)
 
 BindImage = Table('BindImage')
-BindImage.add_field(1,'File_',11592)
+BindImage.add_field(1,'File_',0x2DFF)
 BindImage.add_field(2,'Path',7679)
 
 File = Table('File')
-File.add_field(1,'File',11592)
-File.add_field(2,'Component_',3400)
+File.add_field(1,'File',0x2DFF)
+File.add_field(2,'Component_',0xDFF)
 File.add_field(3,'FileName',4095)
 File.add_field(4,'FileSize',260)
-File.add_field(5,'Version',7496)
+File.add_field(5,'Version',0x1DFF)
 File.add_field(6,'Language',7444)
 File.add_field(7,'Attributes',5378)
 File.add_field(8,'Sequence',1282)
@@ -114,7 +114,7 @@
 Class = Table('Class')
 Class.add_field(1,'CLSID',11558)
 Class.add_field(2,'Context',11552)
-Class.add_field(3,'Component_',11592)
+Class.add_field(3,'Component_',0x2DFF)
 Class.add_field(4,'ProgId_Default',7679)
 Class.add_field(5,'Description',8191)
 Class.add_field(6,'AppId_',7462)
@@ -127,12 +127,12 @@
 Class.add_field(13,'Attributes',5378)
 
 Component = Table('Component')
-Component.add_field(1,'Component',11592)
+Component.add_field(1,'Component',0x2DFF)
 Component.add_field(2,'ComponentId',7462)
-Component.add_field(3,'Directory_',3400)
+Component.add_field(3,'Directory_',0xDFF)
 Component.add_field(4,'Attributes',1282)
 Component.add_field(5,'Condition',7679)
-Component.add_field(6,'KeyPath',7496)
+Component.add_field(6,'KeyPath',0x1DFF)
 
 Icon = Table('Icon')
 Icon.add_field(1,'Name',11592)
@@ -158,12 +158,12 @@
 CompLocator.add_field(3,'Type',5378)
 
 Complus = Table('Complus')
-Complus.add_field(1,'Component_',11592)
+Complus.add_field(1,'Component_',0x2DFF)
 Complus.add_field(2,'ExpType',13570)
 
 Directory = Table('Directory')
-Directory.add_field(1,'Directory',11592)
-Directory.add_field(2,'Directory_Parent',7496)
+Directory.add_field(1,'Directory',0x2DFF)
+Directory.add_field(2,'Directory_Parent',0x1DFF)
 Directory.add_field(3,'DefaultDir',4095)
 
 Control = Table('Control')
@@ -207,13 +207,13 @@
 ControlEvent.add_field(6,'Ordering',5378)
 
 CreateFolder = Table('CreateFolder')
-CreateFolder.add_field(1,'Directory_',11592)
-CreateFolder.add_field(2,'Component_',11592)
+CreateFolder.add_field(1,'Directory_',0x2DFF)
+CreateFolder.add_field(2,'Component_',0x2DFF)
 
 CustomAction = Table('CustomAction')
-CustomAction.add_field(1,'Action',11592)
+CustomAction.add_field(1,'Action',0x2DFF)
 CustomAction.add_field(2,'Type',1282)
-CustomAction.add_field(3,'Source',7496)
+CustomAction.add_field(3,'Source',0x1DFF)
 CustomAction.add_field(4,'Target',7679)
 
 DrLocator = Table('DrLocator')
@@ -224,8 +224,8 @@
 
 DuplicateFile = Table('DuplicateFile')
 DuplicateFile.add_field(1,'FileKey',11592)
-DuplicateFile.add_field(2,'Component_',3400)
-DuplicateFile.add_field(3,'File_',3400)
+DuplicateFile.add_field(2,'Component_',0xDFF)
+DuplicateFile.add_field(3,'File_',0xDFF)
 DuplicateFile.add_field(4,'DestName',8191)
 DuplicateFile.add_field(5,'DestFolder',7496)
 
@@ -233,7 +233,7 @@
 Environment.add_field(1,'Environment',11592)
 Environment.add_field(2,'Name',4095)
 Environment.add_field(3,'Value',8191)
-Environment.add_field(4,'Component_',3400)
+Environment.add_field(4,'Component_',0xDFF)
 
 Error = Table('Error')
 Error.add_field(1,'Error',9474)
@@ -247,7 +247,7 @@
 
 Extension = Table('Extension')
 Extension.add_field(1,'Extension',11775)
-Extension.add_field(2,'Component_',11592)
+Extension.add_field(2,'Component_',0x2DFF)
 Extension.add_field(3,'ProgId_',7679)
 Extension.add_field(4,'MIME_',7488)
 Extension.add_field(5,'Feature_',3366)
@@ -259,10 +259,10 @@
 
 FeatureComponents = Table('FeatureComponents')
 FeatureComponents.add_field(1,'Feature_',11558)
-FeatureComponents.add_field(2,'Component_',11592)
+FeatureComponents.add_field(2,'Component_',0x2DFF)
 
 FileSFPCatalog = Table('FileSFPCatalog')
-FileSFPCatalog.add_field(1,'File_',11592)
+FileSFPCatalog.add_field(1,'File_',0x2DFF)
 FileSFPCatalog.add_field(2,'SFPCatalog_',11775)
 
 SFPCatalog = Table('SFPCatalog')
@@ -271,7 +271,7 @@
 SFPCatalog.add_field(3,'Dependency',7424)
 
 Font = Table('Font')
-Font.add_field(1,'File_',11592)
+Font.add_field(1,'File_',0x2DFF)
 Font.add_field(2,'FontTitle',7552)
 
 IniFile = Table('IniFile')
@@ -282,7 +282,7 @@
 IniFile.add_field(5,'Key',3968)
 IniFile.add_field(6,'Value',4095)
 IniFile.add_field(7,'Action',1282)
-IniFile.add_field(8,'Component_',3400)
+IniFile.add_field(8,'Component_',0xDFF)
 
 IniLocator = Table('IniLocator')
 IniLocator.add_field(1,'Signature_',11592)
@@ -293,18 +293,18 @@
 IniLocator.add_field(6,'Type',5378)
 
 InstallExecuteSequence = Table('InstallExecuteSequence')
-InstallExecuteSequence.add_field(1,'Action',11592)
+InstallExecuteSequence.add_field(1,'Action',0x2DFF)
 InstallExecuteSequence.add_field(2,'Condition',7679)
 InstallExecuteSequence.add_field(3,'Sequence',5378)
 
 InstallUISequence = Table('InstallUISequence')
-InstallUISequence.add_field(1,'Action',11592)
+InstallUISequence.add_field(1,'Action',0x2DFF)
 InstallUISequence.add_field(2,'Condition',7679)
 InstallUISequence.add_field(3,'Sequence',5378)
 
 IsolatedComponent = Table('IsolatedComponent')
-IsolatedComponent.add_field(1,'Component_Shared',11592)
-IsolatedComponent.add_field(2,'Component_Application',11592)
+IsolatedComponent.add_field(1,'Component_Shared',0x2DFF)
+IsolatedComponent.add_field(2,'Component_Application',0x2DFF)
 
 LaunchCondition = Table('LaunchCondition')
 LaunchCondition.add_field(1,'Condition',11775)
@@ -340,7 +340,7 @@
 
 MoveFile = Table('MoveFile')
 MoveFile.add_field(1,'FileKey',11592)
-MoveFile.add_field(2,'Component_',3400)
+MoveFile.add_field(2,'Component_',0xDFF)
 MoveFile.add_field(3,'SourceName',8191)
 MoveFile.add_field(4,'DestName',8191)
 MoveFile.add_field(5,'SourceFolder',7496)
@@ -348,14 +348,14 @@
 MoveFile.add_field(7,'Options',1282)
 
 MsiAssembly = Table('MsiAssembly')
-MsiAssembly.add_field(1,'Component_',11592)
+MsiAssembly.add_field(1,'Component_',0x2DFF)
 MsiAssembly.add_field(2,'Feature_',3366)
-MsiAssembly.add_field(3,'File_Manifest',7496)
-MsiAssembly.add_field(4,'File_Application',7496)
+MsiAssembly.add_field(3,'File_Manifest',0x1DFF)
+MsiAssembly.add_field(4,'File_Application',0x1DFF)
 MsiAssembly.add_field(5,'Attributes',5378)
 
 MsiAssemblyName = Table('MsiAssemblyName')
-MsiAssemblyName.add_field(1,'Component_',11592)
+MsiAssemblyName.add_field(1,'Component_',0x2DFF)
 MsiAssemblyName.add_field(2,'Name',11775)
 MsiAssemblyName.add_field(3,'Value',3583)
 
@@ -370,7 +370,7 @@
 MsiDigitalSignature.add_field(4,'Hash',6400)
 
 MsiFileHash = Table('MsiFileHash')
-MsiFileHash.add_field(1,'File_',11592)
+MsiFileHash.add_field(1,'File_',0x2DFF)
 MsiFileHash.add_field(2,'Options',1282)
 MsiFileHash.add_field(3,'HashPart1',260)
 MsiFileHash.add_field(4,'HashPart2',260)
@@ -388,14 +388,14 @@
 
 ODBCDriver = Table('ODBCDriver')
 ODBCDriver.add_field(1,'Driver',11592)
-ODBCDriver.add_field(2,'Component_',3400)
+ODBCDriver.add_field(2,'Component_',0xDFF)
 ODBCDriver.add_field(3,'Description',3583)
-ODBCDriver.add_field(4,'File_',3400)
-ODBCDriver.add_field(5,'File_Setup',7496)
+ODBCDriver.add_field(4,'File_',0xDFF)
+ODBCDriver.add_field(5,'File_Setup',0x1DFF)
 
 ODBCDataSource = Table('ODBCDataSource')
-ODBCDataSource.add_field(1,'DataSource',11592)
-ODBCDataSource.add_field(2,'Component_',3400)
+ODBCDataSource.add_field(1,'DataSource',0x2DFF)
+ODBCDataSource.add_field(2,'Component_',0xDFF)
 ODBCDataSource.add_field(3,'Description',3583)
 ODBCDataSource.add_field(4,'DriverDescription',3583)
 ODBCDataSource.add_field(5,'Registration',1282)
@@ -407,10 +407,10 @@
 
 ODBCTranslator = Table('ODBCTranslator')
 ODBCTranslator.add_field(1,'Translator',11592)
-ODBCTranslator.add_field(2,'Component_',3400)
+ODBCTranslator.add_field(2,'Component_',0xDFF)
 ODBCTranslator.add_field(3,'Description',3583)
-ODBCTranslator.add_field(4,'File_',3400)
-ODBCTranslator.add_field(5,'File_Setup',7496)
+ODBCTranslator.add_field(4,'File_',0xDFF)
+ODBCTranslator.add_field(5,'File_Setup',0x1DFF)
 
 Patch = Table('Patch')
 Patch.add_field(1,'File_',11592)
@@ -427,7 +427,7 @@
 PublishComponent = Table('PublishComponent')
 PublishComponent.add_field(1,'ComponentId',11558)
 PublishComponent.add_field(2,'Qualifier',11775)
-PublishComponent.add_field(3,'Component_',11592)
+PublishComponent.add_field(3,'Component_',0x2DFF)
 PublishComponent.add_field(4,'AppData',8191)
 PublishComponent.add_field(5,'Feature_',3366)
 
@@ -443,12 +443,12 @@
 RadioButton.add_field(9,'Help',7986)
 
 Registry = Table('Registry')
-Registry.add_field(1,'Registry',11592)
+Registry.add_field(1,'Registry',0x2DFF)
 Registry.add_field(2,'Root',1282)
 Registry.add_field(3,'Key',4095)
 Registry.add_field(4,'Name',8191)
 Registry.add_field(5,'Value',7936)
-Registry.add_field(6,'Component_',3400)
+Registry.add_field(6,'Component_',0xDFF)
 
 RegLocator = Table('RegLocator')
 RegLocator.add_field(1,'Signature_',11592)
@@ -459,7 +459,7 @@
 
 RemoveFile = Table('RemoveFile')
 RemoveFile.add_field(1,'FileKey',11592)
-RemoveFile.add_field(2,'Component_',3400)
+RemoveFile.add_field(2,'Component_',0xDFF)
 RemoveFile.add_field(3,'FileName',8191)
 RemoveFile.add_field(4,'DirProperty',3400)
 RemoveFile.add_field(5,'InstallMode',1282)
@@ -472,24 +472,24 @@
 RemoveIniFile.add_field(5,'Key',3968)
 RemoveIniFile.add_field(6,'Value',8191)
 RemoveIniFile.add_field(7,'Action',1282)
-RemoveIniFile.add_field(8,'Component_',3400)
+RemoveIniFile.add_field(8,'Component_',0xDFF)
 
 RemoveRegistry = Table('RemoveRegistry')
 RemoveRegistry.add_field(1,'RemoveRegistry',11592)
 RemoveRegistry.add_field(2,'Root',1282)
 RemoveRegistry.add_field(3,'Key',4095)
 RemoveRegistry.add_field(4,'Name',8191)
-RemoveRegistry.add_field(5,'Component_',3400)
+RemoveRegistry.add_field(5,'Component_',0xDFF)
 
 ReserveCost = Table('ReserveCost')
 ReserveCost.add_field(1,'ReserveKey',11592)
-ReserveCost.add_field(2,'Component_',3400)
+ReserveCost.add_field(2,'Component_',0xDFF)
 ReserveCost.add_field(3,'ReserveFolder',7496)
 ReserveCost.add_field(4,'ReserveLocal',260)
 ReserveCost.add_field(5,'ReserveSource',260)
 
 SelfReg = Table('SelfReg')
-SelfReg.add_field(1,'File_',11592)
+SelfReg.add_field(1,'File_',0x2DFF)
 SelfReg.add_field(2,'Cost',5378)
 
 ServiceControl = Table('ServiceControl')
@@ -498,7 +498,7 @@
 ServiceControl.add_field(3,'Event',1282)
 ServiceControl.add_field(4,'Arguments',8191)
 ServiceControl.add_field(5,'Wait',5378)
-ServiceControl.add_field(6,'Component_',3400)
+ServiceControl.add_field(6,'Component_',0xDFF)
 
 ServiceInstall = Table('ServiceInstall')
 ServiceInstall.add_field(1,'ServiceInstall',11592)
@@ -512,14 +512,14 @@
 ServiceInstall.add_field(9,'StartName',7679)
 ServiceInstall.add_field(10,'Password',7679)
 ServiceInstall.add_field(11,'Arguments',7679)
-ServiceInstall.add_field(12,'Component_',3400)
+ServiceInstall.add_field(12,'Component_',0xDFF)
 ServiceInstall.add_field(13,'Description',8191)
 
 Shortcut = Table('Shortcut')
 Shortcut.add_field(1,'Shortcut',11592)
-Shortcut.add_field(2,'Directory_',3400)
+Shortcut.add_field(2,'Directory_',0xDFF)
 Shortcut.add_field(3,'Name',3968)
-Shortcut.add_field(4,'Component_',3400)
+Shortcut.add_field(4,'Component_',0xDFF)
 Shortcut.add_field(5,'Target',3400)
 Shortcut.add_field(6,'Arguments',7679)
 Shortcut.add_field(7,'Description',8191)
@@ -550,10 +550,10 @@
 TypeLib = Table('TypeLib')
 TypeLib.add_field(1,'LibID',11558)
 TypeLib.add_field(2,'Language',9474)
-TypeLib.add_field(3,'Component_',11592)
+TypeLib.add_field(3,'Component_',0x2DFF)
 TypeLib.add_field(4,'Version',4356)
 TypeLib.add_field(5,'Description',8064)
-TypeLib.add_field(6,'Directory_',7496)
+TypeLib.add_field(6,'Directory_',0x1DFF)
 TypeLib.add_field(7,'Feature_',3366)
 TypeLib.add_field(8,'Cost',4356)