[game-data-packager] 06/06: Use {context:value} syntax for context-specific engine or install_to
Simon McVittie
smcv at debian.org
Mon Jan 25 01:14:29 UTC 2016
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 2176e41c05d982bf022f8a6bd3f0d7b931f31586
Author: Simon McVittie <smcv at debian.org>
Date: Mon Jan 25 01:11:46 2016 +0000
Use {context:value} syntax for context-specific engine or install_to
In fact this generalizes slightly from what's required for that change,
supporting it for anything that goes through
PackagingSystem.substitute().
This makes GameDataPackage and GameData completely format- and
distribution-agnostic, with all the distro-specifics happening in
the PackagingTask.
---
data/heretic.yaml | 12 ++------
data/hexen.yaml | 16 ++--------
data/quake3.yaml | 10 +++----
data/rott.yaml | 13 ++++-----
data/spear-of-destiny.yaml | 19 ++++++------
data/strife.yaml | 8 ++---
data/wolf3d.yaml | 28 ++++++++++--------
game_data_packager/__init__.py | 50 +++++++++++++++-----------------
game_data_packager/build.py | 37 +++++++++++++++++++----
game_data_packager/games/doom_common.py | 37 +++++++++++++----------
game_data_packager/games/z_code.py | 4 +--
game_data_packager/packaging/__init__.py | 11 +++++++
12 files changed, 136 insertions(+), 109 deletions(-)
diff --git a/data/heretic.yaml b/data/heretic.yaml
index ad094ab..229089a 100644
--- a/data/heretic.yaml
+++ b/data/heretic.yaml
@@ -8,7 +8,9 @@ copyright: © 1994 Raven Software
plugin: doom_common
wiki: Heretic
-engine: "chocolate-heretic | heretic-engine"
+engine:
+ deb: "chocolate-heretic | heretic-engine"
+ generic: chocolate-doom
help_text: |
Please provide HERETIC.WAD from Heretic v1.3, and/or HERETIC1.WAD
@@ -27,10 +29,6 @@ packages:
steam:
id: 2390
path: "common/Heretic Shadow of the Serpent Riders"
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
install:
- heretic.wad
@@ -39,10 +37,6 @@ packages:
demo_for: heretic-wad
component: non-free
replaces: heretic-shareware-data
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
install:
- heretic1.wad
license:
diff --git a/data/hexen.yaml b/data/hexen.yaml
index 60a9de3..63c2d9e 100644
--- a/data/hexen.yaml
+++ b/data/hexen.yaml
@@ -20,7 +20,9 @@ help_text: |
plugin: doom_common
wiki: Hexen
-engine: "chocolate-hexen | hexen-engine"
+engine:
+ deb: "chocolate-hexen | hexen-engine"
+ generic: chocolate-doom
packages:
hexen-wad:
@@ -29,10 +31,6 @@ packages:
steam:
id: 2360
path: "common/Hexen"
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
install:
- hexen.wad
@@ -42,10 +40,6 @@ packages:
breaks:
- deb: chocolate-doom (<< 2)
replaces: hexen-deathkings-data
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
steam:
id: 2370
path: "common/Hexen Deathkings of the Dark Citadel"
@@ -58,10 +52,6 @@ packages:
replaces: hexen-demo-data
breaks:
- deb: chocolate-doom (<< 2.2.0)
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
demo_for: hexen-wad
install:
- hexendemo.wad
diff --git a/data/quake3.yaml b/data/quake3.yaml
index bd5e57a..1df8e57 100644
--- a/data/quake3.yaml
+++ b/data/quake3.yaml
@@ -2,7 +2,9 @@
longname: Quake III Arena
franchise: Quake
copyright: © 1999 id Software
-engine: quake3 | quake3-server
+engine:
+ deb: quake3 | quake3-server
+ generic: ioquake3
genre: First-person shooter
wikibase: http://quake.wikia.com/wiki/
wiki: Quake_III_Arena
@@ -42,10 +44,8 @@ packages:
steam:
id: 2200
path: "common/Quake 3 Arena"
- rpm:
- engine: ioquake3
- mageia:
- install_to: usr/share/ioquake3
+ install_to:
+ mageia: usr/share/ioquake3
gog:
url: quake_iii_gold
# We deliberately only put baseq3 in the search path, not
diff --git a/data/rott.yaml b/data/rott.yaml
index fab0657..ecfbbb3 100644
--- a/data/rott.yaml
+++ b/data/rott.yaml
@@ -1,7 +1,9 @@
---
longname: Rise of the Triad
copyright: © 1995 Apogee Software
-engine: rott
+engine:
+ fedora: rott-registered
+ generic: rott
genre: First-person shooter
help_text: |
@@ -27,8 +29,9 @@ packages:
description: |
Use the 'rott-shareware' command to play this game.
suggests: rott-registered-data
- fedora:
- engine: rott-shareware
+ engine:
+ fedora: rott-shareware
+ generic: rott
install:
- DEMO1_3.DMO
- DEMO2_3.DMO
@@ -48,8 +51,6 @@ packages:
Use the 'rott-commercial' command to play this game.
depends: rott-data
- fedora:
- engine: rott-registered
url_misc: https://3drealms.com/catalog/rise-triad-dark-war_44/
install_to: $assets/rott
install:
@@ -66,8 +67,6 @@ packages:
longname: "Extreme Rise of the Triad"
description: |
Use the 'rott-commercial -filertl extreme.rtl' command to play this game.
- fedora:
- engine: rott-registered
install_to: $assets/rott
install:
- EXTREME.RTL
diff --git a/data/spear-of-destiny.yaml b/data/spear-of-destiny.yaml
index bf526b7..d6d3116 100644
--- a/data/spear-of-destiny.yaml
+++ b/data/spear-of-destiny.yaml
@@ -64,9 +64,10 @@ packages:
deb: spear-of-destiny-mission1-data | spear-of-destiny-mission2-data | spear-of-destiny-mission3-data
generic: spear-of-destiny-mission-pack
install_to: usr/share/games/wolf3d
- fedora:
- engine: wolf4sdl-spear
- install_to: usr/share/spear/full
+ engine:
+ fedora: wolf4sdl-spear
+ install_to:
+ fedora: usr/share/spear/full
install:
- audiohed.sod
- audiot.sod
@@ -82,8 +83,8 @@ packages:
Each mission consists of 21 levels.
install_to: usr/share/games/wolf3d
- fedora:
- install_to: usr/share/spear/full
+ install_to:
+ fedora: usr/share/spear/full
provides: spear-of-destiny-mission-pack
install:
- gamemaps.sd1
@@ -100,8 +101,8 @@ packages:
description: "Each mission pack provides 21 levels."
wiki: Return_to_Danger
install_to: usr/share/games/wolf3d
- fedora:
- install_to: usr/share/spear/full
+ install_to:
+ fedora: usr/share/spear/full
provides: spear-of-destiny-mission-pack
install:
- gamemaps.sd2
@@ -114,8 +115,8 @@ packages:
description: "Each mission pack provides 21 levels."
wiki: Ultimate_Challenge
install_to: usr/share/games/wolf3d
- fedora:
- install_to: usr/share/spear/full
+ install_to:
+ fedora: usr/share/spear/full
provides: spear-of-destiny-mission-pack
install:
- gamemaps.sd3
diff --git a/data/strife.yaml b/data/strife.yaml
index 03d5f1b..4ca6d16 100644
--- a/data/strife.yaml
+++ b/data/strife.yaml
@@ -9,7 +9,9 @@ copyright: © 1996 Rogue Entertainment
plugin: doom_common
wiki: Strife
genre: Role Playing
-engine: "chocolate-strife | strife-engine"
+engine:
+ deb: "chocolate-strife | strife-engine"
+ generic: chocolate-doom
help_text: |
Please provide the STRIFE1.WAD and VOICES.WAD from
@@ -27,10 +29,6 @@ packages:
id: 317040
path: common/Strife
native: true
- fedora:
- engine: chocolate-doom
- suse:
- engine: chocolate-doom
install:
- strife1.wad
- voices.wad
diff --git a/data/wolf3d.yaml b/data/wolf3d.yaml
index 3d5decf..c25c460 100644
--- a/data/wolf3d.yaml
+++ b/data/wolf3d.yaml
@@ -75,9 +75,11 @@ packages:
* Episode 6: Confrontation
provides: wolf3d-data
mutually_exclusive: True
- fedora:
- engine: wolf4sdl-registered-id
- install_to: usr/share/wolf3d/registered-id
+ engine:
+ fedora: wolf4sdl-registered-id
+ install_to:
+ fedora: usr/share/wolf3d/registered-id
+ generic: usr/share/games/wolf3d
steam:
id: 2270
path: common/Wolfenstein 3D
@@ -85,7 +87,6 @@ packages:
url: wolfenstein_3d_and_spear_of_destiny
game: wolfenstein_3d
url_misc: https://3drealms.com/catalog/wolfenstein-3d_25/
- install_to: usr/share/games/wolf3d
install:
- audiohed.wl6
- audiot.wl6
@@ -110,10 +111,12 @@ packages:
* Episode 6: Confrontation
provides: wolf3d-data
mutually_exclusive: True
- fedora:
- engine: wolf4sdl-registered-id
- install_to: usr/share/wolf3d/registered-id
- install_to: usr/share/games/wolf3d
+ engine:
+ fedora:
+ wolf4sdl-registered-id
+ install_to:
+ fedora: usr/share/wolf3d/registered-id
+ generic: usr/share/games/wolf3d
install:
- audiohed.wl6
- audiot.wl6
@@ -138,10 +141,11 @@ packages:
* Episode 6: Confrontation
provides: wolf3d-data
conflicts: wolf3d-data
- fedora:
- engine: wolf4sdl-registered-apogee
- install_to: usr/share/wolf3d/registered-apogee
- install_to: usr/share/games/wolf3d
+ engine:
+ fedora: wolf4sdl-registered-apogee
+ install_to:
+ fedora: usr/share/wolf3d/registered-apogee
+ generic: usr/share/games/wolf3d
install:
- audiohed.wl6
- audiot.wl6
diff --git a/game_data_packager/__init__.py b/game_data_packager/__init__.py
index 7786a46..0839105 100644
--- a/game_data_packager/__init__.py
+++ b/game_data_packager/__init__.py
@@ -34,7 +34,7 @@ from .build import (PackagingTask)
from .data import (PackageRelation, WantedFile)
from .paths import (DATADIR, USE_VFS)
from .util import ascii_safe
-from .version import (DISTRO, FORMAT, GAME_PACKAGE_VERSION)
+from .version import (GAME_PACKAGE_VERSION)
logging.basicConfig()
logger = logging.getLogger(__name__)
@@ -102,9 +102,11 @@ class GameDataPackage(object):
# put 'usr/share/games/quake3/baseq3/pak1.pk3' in the .deb.
# The default is 'usr/share/games/' plus the binary package's name.
if name.endswith('-data'):
- self.install_to = '$assets/' + name[:len(name) - 5]
+ self.default_install_to = '$assets/' + name[:len(name) - 5]
else:
- self.install_to = '$assets/' + name
+ self.default_install_to = '$assets/' + name
+
+ self.install_to = self.default_install_to
# If true, this package is allowed to be empty
self.empty = False
@@ -388,6 +390,9 @@ class GameData(object):
if k in self.data:
setattr(self, k, self.data[k])
+ if isinstance(self.engine, dict) and 'generic' not in self.engine:
+ self.engine['generic'] = None
+
assert type(self.missing_langs) is list
if 'aliases' in self.data:
@@ -669,6 +674,17 @@ class GameData(object):
if k in d:
setattr(package, k, d[k])
+ if isinstance(package.engine, dict):
+ if isinstance(self.engine, dict):
+ for k in self.engine:
+ package.engine.setdefault(k, self.engine[k])
+ else:
+ package.engine.setdefault('generic', self.engine)
+
+ if isinstance(package.install_to, dict):
+ package.install_to.setdefault('generic',
+ package.default_install_to)
+
if 'better_version' in d:
assert 'better_versions' not in d
package.better_versions = set([d['better_version']])
@@ -701,26 +717,8 @@ class GameData(object):
package.relations[rel].append(pr)
- for port in (
- # packaging formats (we treat "debian" as "any dpkg-based"
- # for historical reasons)
- 'debian', 'rpm',
- # specific distributions
- 'arch', 'fedora', 'mageia', 'suse',
- ):
-
- for k in d.get(port, {}):
- if k in ('engine', 'install_to', 'description'):
- # FIXME: this object's contents should be 1:1 mapped
- # from the YAML, and not format- or distribution-specific.
- # Distribution-specific stuff should be done in the
- # PackagingTask or PackagingSystem
- if port in d and (FORMAT == port or DISTRO == port or
- (FORMAT == 'deb' and port == 'debian')):
- setattr(package, k, d[port][k])
- else:
- raise AssertionError('%s: unknown key %r in port %r' %
- (package.name, k, port))
+ for port in ('debian', 'rpm', 'arch', 'fedora', 'mageia', 'suse'):
+ assert port not in d
assert self.copyright or package.copyright, package.name
assert package.component in ('main', 'contrib', 'non-free', 'local')
@@ -743,9 +741,9 @@ class GameData(object):
assert package.name not in packages, \
"%s should not be in its own %s set" % (package.name, rel)
- if 'install_to' in d:
- assert '$assets/' + package.name != d['install_to'] + '-data', \
- "install_to %s is extraneous" % package.name
+ if 'install_to' in d and isinstance(d['install_to'], str):
+ assert d['install_to'] != package.default_install_to, \
+ "install_to for %s is extraneous" % package.name
if 'demo_for' in d:
if package.disks is None:
diff --git a/game_data_packager/build.py b/game_data_packager/build.py
index 63ec622..fc9853d 100644
--- a/game_data_packager/build.py
+++ b/game_data_packager/build.py
@@ -1304,7 +1304,10 @@ class PackagingTask(object):
if package.expansion_for:
pkginfo.write('depend = %s\n' % package.expansion_for)
else:
- engine = package.engine or self.game.engine
+ engine = self.packaging.substitute(
+ package.engine or self.game.engine,
+ package.name)
+
if engine and len(engine.split()) == 1:
pkginfo.write('depend = %s\n' % engine)
@@ -1397,7 +1400,9 @@ class PackagingTask(object):
if package.expansion_for:
spec.write('Requires: %s\n' % package.expansion_for)
else:
- engine = package.engine or self.game.engine
+ engine = self.packaging.substitute(
+ package.engine or self.game.engine,
+ package.name)
if engine and len(engine.split()) == 1:
spec.write('Requires: %s\n' % engine)
@@ -1665,7 +1670,10 @@ class PackagingTask(object):
if package.mutually_exclusive:
dep['replaces'] |= dep['provides']
- engine = package.engine or self.game.engine
+ engine = self.packaging.substitute(
+ package.engine or self.game.engine,
+ package.name)
+
if engine and '>=' in engine:
dep['breaks'].add(engine.replace('>=', '<<'))
engine = engine.split()[0]
@@ -1772,7 +1780,10 @@ class PackagingTask(object):
copyright = package.copyright or self.game.copyright
long_desc += ' Published by: ' + copyright.split(' ', 2)[2]
- engine = package.engine or self.game.engine
+ engine = self.packaging.substitute(
+ package.engine or self.game.engine,
+ package.name)
+
if engine and package.section == 'games':
long_desc += '\n .\n'
if '|' in engine:
@@ -1798,8 +1809,14 @@ class PackagingTask(object):
return os.path.join(DATADIR, package.name + '.control.in')
def look_for_engines(self, packages, force=False):
- engines = set(p.engine or self.game.engine for p in packages)
+ engines = set()
+
+ for p in packages:
+ engines.add(self.packaging.substitute(p.engine or self.game.engine,
+ p.name))
+
engines.discard(None)
+
if not engines:
return
@@ -2029,9 +2046,16 @@ class PackagingTask(object):
self.packaging.install_packages(debs, method=args.install_method,
gain_root=args.gain_root_command)
- engines_alt = set((p.engine or self.game.engine) for p in ready)
+
+ engines_alt = set()
+
+ for p in ready:
+ engines_alt.add(self.packaging.substitute(p.engine or self.game.engine,
+ p.name))
+
engines_alt.discard(None)
engines = set()
+
for engine_alt in engines_alt:
for engine in reversed(engine_alt.split('|')):
engine = engine.split('(')[0].strip()
@@ -2039,6 +2063,7 @@ class PackagingTask(object):
break
else:
engines.add(engine)
+
if engines:
print('it is recommended to also install this game engine: %s' % ', '.join(engines))
diff --git a/game_data_packager/games/doom_common.py b/game_data_packager/games/doom_common.py
index d0cff19..7b95c7a 100644
--- a/game_data_packager/games/doom_common.py
+++ b/game_data_packager/games/doom_common.py
@@ -64,23 +64,17 @@ class DoomGameData(GameData):
assert self.wiki
if self.engine is None:
- self.engine = "chocolate-doom | doom-engine"
+ self.engine = {
+ 'deb': "chocolate-doom | doom-engine",
+ 'generic': 'chocolate-doom'
+ }
+
if self.genre is None:
self.genre = 'First-person shooter'
- package_map = {
- 'doom-engine': 'doom',
- 'boom-engine': 'boom',
- 'heretic-engine': 'heretic',
- 'hexen-engine': 'hexen',
- 'doomsday': 'doomsday-compat',
- }
-
for package in self.packages.values():
package.install_to = '$assets/doom'
- engine = package.engine or self.engine
- engine = engine.split('|')[-1].strip()
- package.program = package_map.get(engine, engine)
+
if 'main_wads' in self.data['packages'][package.name]:
package.main_wads = self.data['packages'][package.name]['main_wads']
else:
@@ -104,6 +98,19 @@ class DoomTask(PackagingTask):
super(DoomTask, self).fill_extra_files(package, destdir)
for main_wad, quirks in package.main_wads.items():
+ package_map = {
+ 'doom-engine': 'doom',
+ 'boom-engine': 'boom',
+ 'heretic-engine': 'heretic',
+ 'hexen-engine': 'hexen',
+ 'doomsday': 'doomsday-compat',
+ }
+
+ engine = self.packaging.substitute(package.engine or self.game.engine,
+ package.name)
+ engine = engine.split('|')[-1].strip()
+ program = package_map.get(engine, engine)
+
wad_base = os.path.splitext(main_wad)[0]
pixdir = os.path.join(destdir, 'usr/share/pixmaps')
@@ -144,7 +151,7 @@ class DoomTask(PackagingTask):
if 'name' in quirks:
entry['Name'] += ' - ' + quirks['name']
entry['GenericName'] = self.game.genre + ' game'
- entry['TryExec'] = package.program
+ entry['TryExec'] = program
install_to = self.packaging.substitute(package.install_to,
package.name).lstrip('/')
@@ -158,7 +165,7 @@ class DoomTask(PackagingTask):
+ ' -file /' + install_to + '/' + main_wad)
else:
args = '-iwad /' + install_to + '/' + main_wad
- entry['Exec'] = package.program + ' ' + args
+ entry['Exec'] = program + ' ' + args
entry['Icon'] = desktop_file
entry['Terminal'] = 'false'
entry['Type'] = 'Application'
@@ -172,7 +179,7 @@ class DoomTask(PackagingTask):
self.packaging.override_lintian(destdir, package.name,
'desktop-command-not-in-package',
'usr/share/applications/%s.desktop %s' %
- (desktop_file, package.program))
+ (desktop_file, program))
if FORMAT == 'deb':
debdir = os.path.join(destdir, 'DEBIAN')
diff --git a/game_data_packager/games/z_code.py b/game_data_packager/games/z_code.py
index 61eae9b..c20c71f 100644
--- a/game_data_packager/games/z_code.py
+++ b/game_data_packager/games/z_code.py
@@ -43,8 +43,8 @@ class ZCodeGameData(GameData):
assert package.z_file
if self.engine is None:
- # RPM format can't handle alternatives and will ignore this
- self.engine = 'gargoyle-free | zcode-interpreter'
+ self.engine = { 'deb': 'gargoyle-free | zcode-interpreter' }
+
if self.genre is None:
self.genre = 'Adventure'
diff --git a/game_data_packager/packaging/__init__.py b/game_data_packager/packaging/__init__.py
index eb16b49..df07f88 100644
--- a/game_data_packager/packaging/__init__.py
+++ b/game_data_packager/packaging/__init__.py
@@ -120,6 +120,17 @@ class PackagingSystem(metaclass=ABCMeta):
raise NotImplementedError
def substitute(self, template, package, **kwargs):
+ if isinstance(template, dict):
+ for c in self._contexts:
+ if c in template:
+ template = template[c]
+ break
+ else:
+ return None
+
+ if template is None:
+ return template
+
if '$' not in template:
return template
--
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