[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