[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