Merged revisions 76993-76994 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r76993 | tarek.ziade | 2009-12-22 00:12:41 +0100 (Tue, 22 Dec 2009) | 1 line

  Fixed #7556: editing the MSVC manifest file with a regexp was throwing an error
........
  r76994 | tarek.ziade | 2009-12-22 00:16:09 +0100 (Tue, 22 Dec 2009) | 1 line

  forgot to add the win32 test in the unittest skip call
........
diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py
index c84fb0b..ad021b5 100644
--- a/Lib/distutils/msvc9compiler.py
+++ b/Lib/distutils/msvc9compiler.py
@@ -646,28 +646,8 @@
                 mfid = 1
             else:
                 mfid = 2
-                try:
-                    # Remove references to the Visual C runtime, so they will
-                    # fall through to the Visual C dependency of Python.exe.
-                    # This way, when installed for a restricted user (e.g.
-                    # runtimes are not in WinSxS folder, but in Python's own
-                    # folder), the runtimes do not need to be in every folder
-                    # with .pyd's.
-                    manifest_f = open(temp_manifest, "rb")
-                    manifest_buf = manifest_f.read()
-                    manifest_f.close()
-                    pattern = re.compile(
-                        r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
-                        r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
-                        re.DOTALL)
-                    manifest_buf = re.sub(pattern, "", manifest_buf)
-                    pattern = "<dependentAssembly>\s*</dependentAssembly>"
-                    manifest_buf = re.sub(pattern, "", manifest_buf)
-                    manifest_f = open(temp_manifest, "wb")
-                    manifest_f.write(manifest_buf)
-                    manifest_f.close()
-                except IOError:
-                    pass
+                # Remove references to the Visual C runtime
+                self._remove_visual_c_ref(temp_manifest)
             out_arg = '-outputresource:%s;%s' % (output_filename, mfid)
             try:
                 self.spawn(['mt.exe', '-nologo', '-manifest',
@@ -677,6 +657,33 @@
         else:
             log.debug("skipping %s (up-to-date)", output_filename)
 
+    def _remove_visual_c_ref(self, manifest_file):
+        try:
+            # Remove references to the Visual C runtime, so they will
+            # fall through to the Visual C dependency of Python.exe.
+            # This way, when installed for a restricted user (e.g.
+            # runtimes are not in WinSxS folder, but in Python's own
+            # folder), the runtimes do not need to be in every folder
+            # with .pyd's.
+            manifest_f = open(manifest_file)
+            try:
+                manifest_buf = manifest_f.read()
+            finally:
+                manifest_f.close()
+            pattern = re.compile(
+                r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
+                r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
+                re.DOTALL)
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            pattern = "<dependentAssembly>\s*</dependentAssembly>"
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            manifest_f = open(manifest_file, 'w')
+            try:
+                manifest_f.write(manifest_buf)
+            finally:
+                manifest_f.close()
+        except IOError:
+            pass
 
     # -- Miscellaneous methods -----------------------------------------
     # These are all used by the 'gen_lib_options() function, in
diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py
index 05d34e6..8a908d9 100644
--- a/Lib/distutils/tests/test_msvc9compiler.py
+++ b/Lib/distutils/tests/test_msvc9compiler.py
@@ -1,18 +1,73 @@
 """Tests for distutils.msvc9compiler."""
 import sys
 import unittest
+import os
 
 from distutils.errors import DistutilsPlatformError
+from distutils.tests import support
 
-class msvc9compilerTestCase(unittest.TestCase):
+_MANIFEST = """\
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
+          manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false">
+        </requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT"
+         version="9.0.21022.8" processorArchitecture="x86"
+         publicKeyToken="XXXX">
+      </assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC"
+        version="9.0.21022.8" processorArchitecture="x86"
+        publicKeyToken="XXXX"></assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+</assembly>
+"""
+
+_CLEANED_MANIFEST = """\
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
+          manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false">
+        </requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+
+  </dependency>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC"
+        version="9.0.21022.8" processorArchitecture="x86"
+        publicKeyToken="XXXX"></assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+</assembly>"""
+
+@unittest.skipUnless(sys.platform=="win32", "These tests are only for win32")
+class msvc9compilerTestCase(support.TempdirManager,
+                            unittest.TestCase):
 
     def test_no_compiler(self):
         # makes sure query_vcvarsall throws
         # a DistutilsPlatformError if the compiler
         # is not found
-        if sys.platform != 'win32':
-            # this test is only for win32
-            return
         from distutils.msvccompiler import get_build_version
         if get_build_version() < 8.0:
             # this test is only for MSVC8.0 or above
@@ -31,9 +86,6 @@
             msvc9compiler.find_vcvarsall = old_find_vcvarsall
 
     def test_reg_class(self):
-        if sys.platform != 'win32':
-            # this test is only for win32
-            return
         from distutils.msvccompiler import get_build_version
         if get_build_version() < 8.0:
             # this test is only for MSVC8.0 or above
@@ -56,6 +108,27 @@
         keys = Reg.read_keys(HKCU, r'Control Panel')
         self.assertTrue('Desktop' in keys)
 
+    def test_remove_visual_c_ref(self):
+        from distutils.msvc9compiler import MSVCCompiler
+        tempdir = self.mkdtemp()
+        manifest = os.path.join(tempdir, 'manifest')
+        f = open(manifest, 'w')
+        f.write(_MANIFEST)
+        f.close()
+
+        compiler = MSVCCompiler()
+        compiler._remove_visual_c_ref(manifest)
+
+        # see what we got
+        f = open(manifest)
+        # removing trailing spaces
+        content = '\n'.join([line.rstrip() for line in f.readlines()])
+        f.close()
+
+        # makes sure the manifest was properly cleaned
+        self.assertEquals(content, _CLEANED_MANIFEST)
+
+
 def test_suite():
     return unittest.makeSuite(msvc9compilerTestCase)