Commits

Martin von Löwis committed 7f7cbdb

Reuse componentids for *.dll across minor releases.
Indicate to the user when this is an upgrade installation.
Make CHM file non-advertised.

Comments (0)

Files changed (2)

     'parser.pyd',
     ])
 
+# Well-known component UUIDs
+# These are needed for SharedDLLs reference counter; if
+# a different UUID was used for each incarnation of, say,
+# python24.dll, an upgrade would set the reference counter
+# from 1 to 2 (due to what I consider a bug in MSI)
+# Using the same UUID is fine since these files are versioned,
+# so Installer will always keep the newest version.
+msvcr71_uuid = "{8666C8DD-D0B4-4B42-928E-A69E32FA5D4D}"
+pythondll_uuid = {
+    "24":"{9B81E618-2301-4035-AC77-75D9ABEB7301}",
+    "25":"{2e41b118-38bd-4c1b-a840-6977efd1b911}"
+    } [major+minor]
+    
+
 # Build the mingw import library, libpythonXY.a
 # This requires 'nm' and 'dlltool' executables on your PATH
 def build_mingw_lib(lib_file, def_file, dll_file, mingw_lib):
     # accordingly.
     add_data(db, "Property", [("UpgradeCode", uc),
                               ("WhichUsers", "ALL"),
+                              ("ProductLine", "Python%s%s" % (major, minor)),
                              ])
     db.Commit()
     return db
              [("DlgFont8", "Tahoma", 9, None, 0),
               ("DlgFontBold8", "Tahoma", 8, None, 1), #bold
               ("VerdanaBold10", "Verdana", 10, None, 1),
+              ("VerdanaRed9", "Verdana", 9, 255, 0),
              ])
 
     compileargs = r"-Wi [TARGETDIR]Lib\compileall.py -f -x badsyntax [TARGETDIR]Lib"
     seldlg = PyDialog(db, "SelectDirectoryDlg", x, y, w, h, modal, title,
                     "Next", "Next", "Cancel")
     seldlg.title("Select Destination Directory")
+    c = seldlg.text("Existing", 135, 25, 235, 30, 0x30003,
+                    "{\VerdanaRed9}This update will replace your existing [ProductLine] installation.")
+    c.condition("Hide", 'REMOVEOLDVERSION="" and REMOVEOLDSNAPSHOT=""')
     seldlg.text("Description", 135, 50, 220, 40, 0x30003,
                "Please select a directory for the [ProductName] files.")
 
     dlldir = PyDirectory(db, cab, root, srcdir, "DLLDIR", ".")
     pydll = "python%s%s.dll" % (major, minor)
     pydllsrc = srcdir + "/PCBuild/" + pydll
-    dlldir.start_component("DLLDIR", flags = 8, keyfile = pydll)
+    dlldir.start_component("DLLDIR", flags = 8, keyfile = pydll, uuid = pythondll_uuid)
     installer = msilib.MakeInstaller()
     pyversion = installer.FileVersion(pydllsrc, 0)
     if not snapshot:
                     language=installer.FileVersion(pydllsrc, 1))
     # XXX determine dependencies
     version, lang = extract_msvcr71()
-    dlldir.start_component("msvcr71", flags=8, keyfile="msvcr71.dll")
+    dlldir.start_component("msvcr71", flags=8, keyfile="msvcr71.dll", uuid=msvcr71_uuid)
     dlldir.add_file("msvcr71.dll", src=os.path.abspath("msvcr71.dll"),
                     version=version, language=lang)
     tmpfiles.append("msvcr71.dll")
     lib.add_file('python%s%s.lib' % (major, minor))
     # Add the mingw-format library
     if have_mingw:
-	lib.add_file('libpython%s%s.a' % (major, minor))
+        lib.add_file('libpython%s%s.a' % (major, minor))
     if have_tcl:
         # Add Tcl/Tk
         tcldirs = [(root, '../tcltk/lib', 'tcl')]
              # msidbComponentAttributesRegistryKeyPath = 4
              [("REGISTRY", msilib.gen_uuid(), "TARGETDIR", 4, None,
                "InstallPath"),
+              ("REGISTRY.doc", msilib.gen_uuid(), "TARGETDIR", 4, None,
+               "Documentation"),
               ("REGISTRY.def", msilib.gen_uuid(), "TARGETDIR", 4,
                None, None)] + tcldata)
     # See "FeatureComponents Table".
         tcldata = [(tcltk.id, "pythonw.exe")]
     add_data(db, "FeatureComponents",
              [(default_feature.id, "REGISTRY"),
+              (htmlfiles.id, "REGISTRY.doc"),
               (ext_feature.id, "REGISTRY.def")] +
               tcldata
               )
               ("PythonPath", -1, prefix+r"\PythonPath", "",
                r"[TARGETDIR]Lib;[TARGETDIR]DLLs;[TARGETDIR]Lib\lib-tk", "REGISTRY"),
               ("Documentation", -1, prefix+r"\Help\Main Python Documentation", "",
-               r"[TARGETDIR]Doc\Python%s%s.chm" % (major, minor), "REGISTRY"),
+               r"[TARGETDIR]Doc\Python%s%s.chm" % (major, minor), "REGISTRY.doc"),
               ("Modules", -1, prefix+r"\Modules", "+", None, "REGISTRY"),
               ("AppPaths", -1, r"Software\Microsoft\Windows\CurrentVersion\App Paths\Python.exe",
                "", r"[TARGETDIR]Python.exe", "REGISTRY.def")
              [# Advertised shortcuts: targets are features, not files
               ("Python", "MenuDir", "PYTHON|Python (command line)", "python.exe",
                default_feature.id, None, None, None, "python_icon.exe", 2, None, "TARGETDIR"),
-              ("Manual", "MenuDir", "MANUAL|Python Manuals", "documentation",
-               htmlfiles.id, None, None, None, None, None, None, None),
+              # Advertising the Manual breaks on (some?) Win98, and the shortcut lacks an
+              # icon first.
+              #("Manual", "MenuDir", "MANUAL|Python Manuals", "documentation",
+              # htmlfiles.id, None, None, None, None, None, None, None),
               ## Non-advertised shortcuts: must be associated with a registry component
+              ("Manual", "MenuDir", "MANUAL|Python Manuals", "REGISTRY.doc",
+               "[#Python%s%s.chm]" % (major,minor), None,
+               None, None, None, None, None, None),
               ("Uninstall", "MenuDir", "UNINST|Uninstall Python", "REGISTRY",
                SystemFolderName+"msiexec",  "/x%s" % product_code,
                None, None, None, None, None, None),

Tools/msi/msilib.py

             blogical = None
         add_data(db, "Directory", [(logical, blogical, default)])
 
-    def start_component(self, component = None, feature = None, flags = None, keyfile = None):
+    def start_component(self, component = None, feature = None, flags = None, keyfile = None, uuid=None):
         """Add an entry to the Component table, and make this component the current for this
         directory. If no component name is given, the directory name is used. If no feature
         is given, the current feature is used. If no flags are given, the directory's default
         table."""
         if flags is None:
             flags = self.componentflags
-        uuid = gen_uuid()
+        if uuid is None:
+            uuid = gen_uuid()
+        else:
+            uuid = uuid.upper()
         if component is None:
             component = self.logical
         self.component = component
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.