[game-data-packager] 06/11: Use JSON for launcher metadata to allow nested data structures

Simon McVittie smcv at debian.org
Wed Jan 13 00:06:51 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 9f72cbb3543abd7f7049d091d2742ddb6f12c6f6
Author: Simon McVittie <smcv at debian.org>
Date:   Tue Jan 12 22:38:29 2016 +0000

    Use JSON for launcher metadata to allow nested data structures
    
    As with the game metadata, I'm using YAML as a source format, because
    JSON is really annoying to hand-edit.
---
 Makefile                        |  5 +++
 runtime/launch-unreal-gold.yaml | 19 +++++++++++
 runtime/launch-unreal.yaml      | 18 ++++++++++
 runtime/launcher.py             | 75 ++++++++++++-----------------------------
 runtime/unreal-gold.desktop     | 10 ------
 runtime/unreal.desktop          | 10 ------
 6 files changed, 64 insertions(+), 73 deletions(-)

diff --git a/Makefile b/Makefile
index d661feb..fb0b1e7 100644
--- a/Makefile
+++ b/Makefile
@@ -85,6 +85,10 @@ out/%.png: data/%.svg
 out/%.svgz: out/%.svg
 	gzip -nc $< > $@
 
+out/launch-%.json: runtime/launch-%.yaml
+	mkdir -p out
+	$(PYTHON) tools/yaml2json.py $< $@
+
 clean:
 	rm -f ./out/bash_completion
 	rm -f ./out/changelog.gz
@@ -131,6 +135,7 @@ install:
 	install -m0644 runtime/*.desktop                       $(DESTDIR)$(datadir)/game-data-packager/
 	install -m0644 runtime/confirm-binary-only.txt         $(DESTDIR)$(datadir)/game-data-packager/
 	install -m0644 runtime/missing-data.txt                $(DESTDIR)$(datadir)/game-data-packager/
+	install -m0644 out/launch-*.json                       $(DESTDIR)$(datadir)/game-data-packager/
 
 	mkdir -p $(DESTDIR)/usr/share/bash-completion/completions
 	install -m0644 data/bash-completion/game-data-packager $(DESTDIR)/usr/share/bash-completion/completions/
diff --git a/runtime/launch-unreal-gold.yaml b/runtime/launch-unreal-gold.yaml
new file mode 100644
index 0000000..62a4303
--- /dev/null
+++ b/runtime/launch-unreal-gold.yaml
@@ -0,0 +1,19 @@
+---
+binary_only: true
+required_files:
+  - System/Core.so
+  - System/Core.u
+  - System/UnrealLinux.bin
+  - Maps/Entry.unr
+base_directories:
+  - /usr/lib/unreal-gold
+  - /usr/lib/unreal
+  - /usr/share/games/unreal-gold
+  - /usr/share/games/unreal
+  - /usr/share/games/unreal-ut99-shared
+link_files: true
+copy_files: ["*.ini"]
+working_directory: ${XDG_DATA_HOME}/unreal-gold/System
+library_path: ["."]
+argv: [./UnrealLinux.bin]
+...
diff --git a/runtime/launch-unreal.yaml b/runtime/launch-unreal.yaml
new file mode 100644
index 0000000..dcc7806
--- /dev/null
+++ b/runtime/launch-unreal.yaml
@@ -0,0 +1,18 @@
+---
+binary_only: true
+required_files:
+  - System/Core.so
+  - System/Core.u
+  - System/UnrealLinux.bin
+  - Maps/Entry.unr
+base_directories:
+  - /usr/lib/unreal-classic
+  - /usr/lib/unreal
+  - /usr/share/games/unreal
+  - /usr/share/games/unreal-ut99-shared
+link_files: true
+copy_files: ["*.ini"]
+working_directory: ${XDG_DATA_HOME}/unreal/System
+library_path: ["."]
+argv: [./UnrealLinux.bin]
+...
diff --git a/runtime/launcher.py b/runtime/launcher.py
index 8d9609d..53b3113 100755
--- a/runtime/launcher.py
+++ b/runtime/launcher.py
@@ -19,9 +19,9 @@
 
 import argparse
 import fnmatch
+import json
 import logging
 import os
-import shlex
 import shutil
 import string
 import sys
@@ -38,17 +38,6 @@ if 'GDP_UNINSTALLED' in os.environ:
 else:
     GDP_DIR = '/usr/share/games/game-data-packager'
 
-GDL_GROUP = 'X-game-data-launcher'
-GDL_KEY_BINARY_ONLY = 'BinaryOnly'
-GDL_KEY_BASE_DIRECTORIES = 'BaseDirectories'
-GDL_KEY_REQUIRED_FILES = 'RequiredFiles'
-GDL_KEY_DOT_DIRECTORY = 'DotDirectory'
-GDL_KEY_LIBRARY_PATH = 'LibraryPath'
-GDL_KEY_LINK_FILES = 'LinkFiles'
-GDL_KEY_COPY_FILES = 'CopyFiles'
-GDL_KEY_WORKING_DIRECTORY = 'WorkingDirectory'
-GDL_KEY_EXEC = 'Exec'
-
 # Normalize environment so we can use ${XDG_DATA_HOME} unconditionally.
 # Do this before we use GLib functions that might create worker threads,
 # because setenv() is not thread-safe.
@@ -118,63 +107,43 @@ class Launcher:
             GLib.KEY_FILE_DESKTOP_KEY_ICON)
         logger.debug('Icon: %s', self.icon_name)
 
-        self.binary_only = self.keyfile.get_boolean(GDL_GROUP,
-            GDL_KEY_BINARY_ONLY)
+        if 'GDP_UNINSTALLED' in os.environ:
+            import yaml
+            self.data = yaml.load(open('%s/launch-%s.yaml' % (GDP_DIR, self.id),
+                encoding='utf-8'), Loader=yaml.CSafeLoader)
+        else:
+            self.data = json.load(open('%s/launch-%s.json' % (GDP_DIR, self.id),
+                encoding='utf-8'))
+
+        self.binary_only = self.data['binary_only']
         logger.debug('Binary-only: %r', self.binary_only)
-        self.required_files = list(map(expand,
-                self.keyfile.get_string_list(GDL_GROUP,
-                    GDL_KEY_REQUIRED_FILES)))
+        self.required_files = list(map(expand, self.data['required_files']))
         logger.debug('Checked files: %r', sorted(self.required_files))
 
-        try:
-            self.dot_directory = expand(self.keyfile.get_string(GDL_GROUP,
-                GDL_KEY_DOT_DIRECTORY))
-        except:
-            self.dot_directory = expand('${XDG_DATA_HOME}/' + self.id)
+        self.dot_directory = expand(self.data.get('dot_directory',
+                    '${XDG_DATA_HOME}/' + self.id))
         logger.debug('Dot directory: %s', self.dot_directory)
 
-        try:
-            self.base_directories = list(map(expand,
-                    self.keyfile.get_string_list(GDL_GROUP,
-                        GDL_KEY_BASE_DIRECTORIES)))
-        except:
-            # this launcher is for binary-only games so assume /usr/lib
-            self.base_directories = ['/usr/lib/' + self.id]
+        self.base_directories = list(map(expand,
+                        self.data.get('base_directories',
+                            '/usr/lib/' + self.id)))
         logger.debug('Base directories: %r', self.base_directories)
 
-        try:
-            self.library_path = self.keyfile.get_string_list(GDL_GROUP,
-                GDL_KEY_LIBRARY_PATH)
-        except:
-            self.library_path = []
+        self.library_path = self.data.get('library_path', [])
         logger.debug('Library path: %r', self.library_path)
 
-        try:
-            self.working_directory = expand(self.keyfile.get_string(GDL_GROUP,
-                GDL_KEY_WORKING_DIRECTORY))
-        except:
-            self.working_directory = None
+        self.working_directory = expand(self.data.get('working_directory',
+                    None))
         logger.debug('Working directory: %s', self.working_directory)
 
-        try:
-            self.link_files = self.keyfile.get_boolean(GDL_GROUP,
-                GDL_KEY_LINK_FILES)
-        except:
-            self.link_files = False
+        self.link_files = self.data.get('link_files', False)
         logger.debug('Link files: %r', self.link_files)
 
         if self.link_files:
-            try:
-                self.copy_files = self.keyfile.get_string_list(GDL_GROUP,
-                    GDL_KEY_COPY_FILES)
-            except:
-                self.copy_files = []
+            self.copy_files = self.data.get('copy_files', [])
             logger.debug('... but copy files matching: %r', self.copy_files)
-        else:
-            self.copy_files = []
 
-        exec_ = self.keyfile.get_string(GDL_GROUP, GDL_KEY_EXEC)
-        self.argv = list(map(expand, shlex.split(exec_)))
+        self.argv = list(map(expand, self.data.get('argv', False)))
         logger.debug('Arguments: %r', self.argv)
 
         self.exit_status = 1
diff --git a/runtime/unreal-gold.desktop b/runtime/unreal-gold.desktop
index 9cf33cc..da5f0cd 100644
--- a/runtime/unreal-gold.desktop
+++ b/runtime/unreal-gold.desktop
@@ -8,13 +8,3 @@ Terminal=false
 Type=Application
 Categories=Game;ActionGame;
 Keywords=first person shooter;fps;3d;epic megagames;epic games;digital extremes;return to na pali;
-
-[X-game-data-launcher]
-BinaryOnly=true
-RequiredFiles=System/Core.so;System/Core.u;System/UnrealLinux.bin;Maps/Entry.unr;
-BaseDirectories=/usr/lib/unreal-gold;/usr/lib/unreal;/usr/share/games/unreal-gold;/usr/share/games/unreal;/usr/share/games/unreal-ut99-shared;
-LinkFiles=true
-CopyFiles=*.ini;
-WorkingDirectory=${XDG_DATA_HOME}/unreal-gold/System
-LibraryPath=.;
-Exec=./UnrealLinux.bin
diff --git a/runtime/unreal.desktop b/runtime/unreal.desktop
index 3d35e56..b2b0dce 100644
--- a/runtime/unreal.desktop
+++ b/runtime/unreal.desktop
@@ -8,13 +8,3 @@ Terminal=false
 Type=Application
 Categories=Game;ActionGame;
 Keywords=first person shooter;fps;3d;epic megagames;epic games;digital extremes;return to na pali;
-
-[X-game-data-launcher]
-BinaryOnly=true
-RequiredFiles=System/Core.so;System/Core.u;System/UnrealLinux.bin;Maps/Entry.unr;
-BaseDirectories=/usr/lib/unreal-classic;/usr/lib/unreal;/usr/share/games/unreal;/usr/share/games/unreal-ut99-shared;
-LinkFiles=true
-CopyFiles=*.ini;
-WorkingDirectory=${XDG_DATA_HOME}/unreal/System
-LibraryPath=.;
-Exec=./UnrealLinux.bin

-- 
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