]> granicus.if.org Git - python/commitdiff
Added two keys to database format: User-install-skips is an array of pathname
authorJack Jansen <jack.jansen@cwi.nl>
Sun, 1 Jun 2003 20:57:12 +0000 (20:57 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Sun, 1 Jun 2003 20:57:12 +0000 (20:57 +0000)
prefixes, any file that is skipped during a per-user install that matches
this set is *not* an error; Systemwide-only is a boolean that says the
package cannot be installer per-user.

Lib/plat-mac/pimp.py

index c26ecc93742d20d6a5f063a2562f948dcafa8570..b0fb6ce0f6e746f75ba29c525227927f0f15019d 100644 (file)
@@ -78,7 +78,7 @@ class PimpUnpacker:
         self._dir = dir
         self._renames = renames
                 
-    def unpack(self, archive, output=None):
+    def unpack(self, archive, output=None, package=None):
         return None
         
 class PimpCommandUnpacker(PimpUnpacker):
@@ -86,7 +86,7 @@ class PimpCommandUnpacker(PimpUnpacker):
     
     _can_rename = False
     
-    def unpack(self, archive, output=None):
+    def unpack(self, archive, output=None, package=None):
         cmd = self.argument % archive
         if _cmd(output, self._dir, cmd):
             return "unpack command failed"
@@ -96,7 +96,7 @@ class PimpTarUnpacker(PimpUnpacker):
     
     _can_rename = True
     
-    def unpack(self, archive, output=None):
+    def unpack(self, archive, output=None, package=None):
         tf = tarfile.open(archive, "r")
         members = tf.getmembers()
         skip = []
@@ -132,9 +132,11 @@ class PimpTarUnpacker(PimpUnpacker):
             tf.extract(member, self._dir)
         if skip:
             names = [member.name for member in skip if member.name[-1] != '/']
+            if package:
+                names = package.filterExpectedSkips(names)
             if names:
                 return "Not all files were unpacked: %s" % " ".join(names)
-        
+                        
 ARCHIVE_FORMATS = [
     (".tar.Z", PimpTarUnpacker, None),
     (".taz", PimpTarUnpacker, None),
@@ -180,6 +182,9 @@ class PimpPreferences:
             installDir = DEFAULT_INSTALLDIR
             self.installLocations = []
         self.installDir = installDir
+        
+    def isUserInstall(self):
+        return self.installDir != DEFAULT_INSTALLDIR
 
     def check(self):
         """Check that the preferences make sense: directories exist and are
@@ -370,7 +375,9 @@ ALLOWED_KEYS = [
     "Pre-install-command",
     "Post-install-command",
     "Prerequisites",
-    "MD5Sum"
+    "MD5Sum",
+    "User-install-skips",
+    "Systemwide-only",
 ]
 
 class PimpPackage:
@@ -394,6 +401,7 @@ class PimpPackage:
     def shortdescription(self): return self.description().splitlines()[0]
     def homepage(self): return self._dict.get('Home-page')
     def downloadURL(self): return self._dict.get('Download-URL')
+    def systemwideOnly(self): return self._dict.get('Systemwide-only')
     
     def fullname(self):
         """Return the full name "name-version-flavor" of a package.
@@ -485,6 +493,10 @@ class PimpPackage:
             return [(None, 
                 "%s: This package cannot be installed automatically (no Download-URL field)" %
                     self.fullname())]
+        if self.systemwideOnly() and self._db.preferences.isUserInstall():
+            return [(None,
+                "%s: This package can only be installed system-wide" %
+                    self.fullname())]
         if not self._dict.get('Prerequisites'):
             return []
         for item in self._dict['Prerequisites']:
@@ -617,6 +629,22 @@ class PimpPackage:
                 if not line in sys.path:
                     sys.path.append(line)           
 
+    def filterExpectedSkips(self, names):
+        """Return a list that contains only unpexpected skips"""
+        if not self._db.preferences.isUserInstall():
+            return names
+        expected_skips = self._dict.get('User-install-skips')
+        if not expected_skips:
+            return names
+        newnames = []
+        for name in names:
+            for skip in expected_skips:
+                if name[:len(skip)] == skip:
+                    break
+            else:
+                newnames.append(name)
+        return newnames
+
 class PimpPackage_binary(PimpPackage):
 
     def unpackPackageOnly(self, output=None):
@@ -659,7 +687,7 @@ class PimpPackage_binary(PimpPackage):
             install_renames.append((oldloc, newloc))
                 
         unpacker = unpackerClass(arg, dir="/", renames=install_renames)
-        rv = unpacker.unpack(self.archiveFilename, output=output)
+        rv = unpacker.unpack(self.archiveFilename, output=output, package=self)
         if rv:
             return rv