[game-data-packager] 02/08: Cache apt and dpkg data rather than repeatedly running the tools

Simon McVittie smcv at debian.org
Thu Apr 30 13:25:03 UTC 2015


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch master
in repository game-data-packager.

commit e2de410da4979ad5dd390d282a6491ad0a06372c
Author: Simon McVittie <smcv at debian.org>
Date:   Thu Apr 30 09:12:12 2015 +0100

    Cache apt and dpkg data rather than repeatedly running the tools
    
    This also stops is_installed() from relying on /usr/share/doc,
    which it is meant to be valid to delete.
---
 game_data_packager/__init__.py     |  9 +++---
 game_data_packager/games/z_code.py |  5 +--
 game_data_packager/util.py         | 65 ++++++++++++++++++++++++--------------
 3 files changed, 50 insertions(+), 29 deletions(-)

diff --git a/game_data_packager/__init__.py b/game_data_packager/__init__.py
index d3d408e..85149f2 100644
--- a/game_data_packager/__init__.py
+++ b/game_data_packager/__init__.py
@@ -50,7 +50,7 @@ from .util import (MEBIBYTE,
         mkdir_p,
         rm_rf,
         human_size,
-        is_installed,
+        PACKAGE_CACHE,
         lang_score,
         which)
 from .version import GAME_PACKAGE_VERSION
@@ -2244,7 +2244,7 @@ class GameData(object):
         for engine_alt in engines_alt:
             for engine in reversed(engine_alt.split('|')):
                 engine = engine.split('(')[0].strip()
-                if is_installed(engine):
+                if PACKAGE_CACHE.is_installed(engine):
                     break
             else:
                 engines.add(engine)
@@ -2388,7 +2388,7 @@ class GameData(object):
 
             if (package.expansion_for
               and self.packages[package.expansion_for] not in possible
-              and not is_installed(package.expansion_for)):
+              and not PACKAGE_CACHE.is_installed(package.expansion_for)):
                 for fullgame in possible:
                     if fullgame.type == 'full':
                         logger.warning("won't generate '%s' expansion, because "
@@ -2622,7 +2622,8 @@ class GameData(object):
             return True
 
         # unace-nonfree package diverts /usr/bin/unace from unace package
-        if fmt == 'unace-nonfree' and is_installed('unace-nonfree'):
+        if (fmt == 'unace-nonfree' and
+                PACKAGE_CACHE.is_installed('unace-nonfree')):
             return True
 
         logger.warning('cannot unpack "%s": tool "%s" is not ' +
diff --git a/game_data_packager/games/z_code.py b/game_data_packager/games/z_code.py
index e5420e7..9ab3deb 100644
--- a/game_data_packager/games/z_code.py
+++ b/game_data_packager/games/z_code.py
@@ -22,7 +22,7 @@ import os
 
 from .. import GameData
 from ..paths import DATADIR
-from ..util import (TemporaryUmask, is_installed, mkdir_p)
+from ..util import (TemporaryUmask, PACKAGE_CACHE, mkdir_p)
 
 logger = logging.getLogger('game-data-packager.games.z_code')
 
@@ -49,7 +49,8 @@ class ZCodeGameData(GameData):
 
             entry = desktop['Desktop Entry']
             entry['Name'] = package.longname or self.longname
-            if is_installed('frotz') and not is_installed('gargoyle-free'):
+            if (PACKAGE_CACHE.is_installed('frotz') and
+                    not PACKAGE_CACHE.is_installed('gargoyle-free')):
                 engine = 'frotz'
                 entry['Terminal'] = 'true'
             else:
diff --git a/game_data_packager/util.py b/game_data_packager/util.py
index 4e2c292..3179d2f 100644
--- a/game_data_packager/util.py
+++ b/game_data_packager/util.py
@@ -78,29 +78,48 @@ def copy_with_substitutions(from_, to, **kwargs):
             line = line.replace(k, v)
         to.write(line)
 
-def is_installed(package):
-    # FIXME: this shouldn't be hard-coded
-    if package == 'doom-engine':
-        return (is_installed('chocolate-doom')
-             or is_installed('prboom-plus')
-             or is_installed('doomsday'))
-    if package == 'boom-engine':
-        return (is_installed('prboom-plus')
-             or is_installed('doomsday'))
-    if package in ('heretic-engine', 'hexen-engine'):
-        return (is_installed('chocolate-doom')
-             or is_installed('doomsday'))
-
-    return os.path.isdir(os.path.join('/usr/share/doc', package))
-
-def is_available(package):
-    proc = subprocess.Popen(['apt-cache', 'pkgnames', package],
-                            universal_newlines=True,
-                            stdout=subprocess.PIPE)
-    for line in proc.stdout:
-        if line.rstrip() == package:
-            return True
-    return False
+class PackageCache:
+    installed = None
+    available = None
+
+    def is_installed(self, package):
+        if self.installed is None:
+            cache = set()
+            proc = subprocess.Popen(['dpkg-query', '--show',
+                        '--showformat', '${Package}\\n'],
+                    universal_newlines=True,
+                    stdout=subprocess.PIPE)
+            for line in proc.stdout:
+                cache.add(line.rstrip())
+            self.installed = cache
+
+        # FIXME: this shouldn't be hard-coded
+        if package == 'doom-engine':
+            return (self.is_installed('chocolate-doom')
+                 or self.is_installed('prboom-plus')
+                 or self.is_installed('doomsday'))
+        if package == 'boom-engine':
+            return (self.is_installed('prboom-plus')
+                 or self.is_installed('doomsday'))
+        if package in ('heretic-engine', 'hexen-engine'):
+            return (self.is_installed('chocolate-doom')
+                 or self.is_installed('doomsday'))
+
+        return package in self.installed
+
+    def is_available(self, package):
+        if self.available is None:
+            cache = set()
+            proc = subprocess.Popen(['apt-cache', 'pkgnames'],
+                    universal_newlines=True,
+                    stdout=subprocess.PIPE)
+            for line in proc.stdout:
+                cache.add(line.rstrip())
+            self.available = cache
+
+        return package in self.available
+
+PACKAGE_CACHE = PackageCache()
 
 def prefered_lang():
     lang_raw = []

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/game-data-packager.git



More information about the Pkg-games-commits mailing list