From ea57792a520eb00371e96b15a1004d083ce96415 Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Fri, 15 Feb 2019 02:22:21 -0600 Subject: [PATCH 1/8] Add sanity check on .kmx name --- linux/keyman-config/keyman_config/install_kmp.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/linux/keyman-config/keyman_config/install_kmp.py b/linux/keyman-config/keyman_config/install_kmp.py index 9d02050eb0..5f87ec8d15 100755 --- a/linux/keyman-config/keyman_config/install_kmp.py +++ b/linux/keyman-config/keyman_config/install_kmp.py @@ -4,6 +4,7 @@ import argparse import json import logging import os.path +import re import subprocess import sys import tempfile @@ -234,6 +235,13 @@ def install_kmp_user(inputfile, online=False): elif ftype == KMFileTypes.KM_SOURCE: #TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load pass + elif ftype == KMFileTypes.KM_KMX: + # Sanity check case-sensitivity of keyboard file + kmx_id = re.sub('.kmx', '', f['name']) + for index, kb in enumerate(keyboards): + if kmx_id.lower() == kb['id'] and kmx_id != kb['id']: + keyboards[index]['file'] = f['name'] + install_keyboards_to_ibus(keyboards, packageDir) else: logging.error("install_kmp.py: error: No kmp.json or kmp.inf found in %s", inputfile) @@ -249,7 +257,10 @@ def install_keyboards_to_ibus(keyboards, packageDir): if bus: # install all kmx for first lang not just packageID for kb in keyboards: - kmx_file = os.path.join(packageDir, kb['id'] + ".kmx") + if kb['file']: + kmx_file = os.path.join(packageDir, kb['file']) + else: + kmx_file = os.path.join(packageDir, kb['id'] + ".kmx") if "languages" in kb and len(kb["languages"]) > 0: logging.debug(kb["languages"][0]) keyboard_id = "%s:%s" % (kb["languages"][0]['id'], kmx_file) From b13e4b135adf97e3480352767f3b9c47087a5f41 Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Sun, 17 Feb 2019 03:15:15 -0600 Subject: [PATCH 2/8] Sanitize packageID and keyboard filename As needed, lower-case the packageID and .kmx filename. --- .../keyman-config/keyman_config/install_kmp.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/linux/keyman-config/keyman_config/install_kmp.py b/linux/keyman-config/keyman_config/install_kmp.py index 5f87ec8d15..c7d9b85c43 100755 --- a/linux/keyman-config/keyman_config/install_kmp.py +++ b/linux/keyman-config/keyman_config/install_kmp.py @@ -116,6 +116,10 @@ def check_keyman_dir(basedir, error_message): raise InstallError(InstallStatus.Abort, error_message) os.mkdir(keyman_dir) +def extract_package_id(inputfile): + packageID, ext = os.path.splitext(os.path.basename(inputfile)) + return packageID.lower(), ext + def install_kmp_shared(inputfile, online=False): """ Install a kmp file to /usr/local/share/keyman @@ -128,7 +132,7 @@ def install_kmp_shared(inputfile, online=False): check_keyman_dir('/usr/local/share/doc', "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman") check_keyman_dir('/usr/local/share/fonts', "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts") - packageID, ext = os.path.splitext(os.path.basename(inputfile)) + packageID, ext = extract_package_id(inputfile) packageDir = os.path.join('/usr/local/share/keyman', packageID) kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID) kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID) @@ -192,7 +196,7 @@ def install_kmp_shared(inputfile, online=False): raise InstallError(InstallStatus.Abort, message) def install_kmp_user(inputfile, online=False): - packageID, ext = os.path.splitext(os.path.basename(inputfile)) + packageID, ext = extract_package_id(inputfile) packageDir=user_keyboard_dir(packageID) if not os.path.isdir(packageDir): os.makedirs(packageDir) @@ -236,11 +240,11 @@ def install_kmp_user(inputfile, online=False): #TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load pass elif ftype == KMFileTypes.KM_KMX: - # Sanity check case-sensitivity of keyboard file + # Sanitize keyboard filename if not lower case kmx_id = re.sub('.kmx', '', f['name']) for index, kb in enumerate(keyboards): if kmx_id.lower() == kb['id'] and kmx_id != kb['id']: - keyboards[index]['file'] = f['name'] + os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx')) install_keyboards_to_ibus(keyboards, packageDir) else: @@ -257,10 +261,7 @@ def install_keyboards_to_ibus(keyboards, packageDir): if bus: # install all kmx for first lang not just packageID for kb in keyboards: - if kb['file']: - kmx_file = os.path.join(packageDir, kb['file']) - else: - kmx_file = os.path.join(packageDir, kb['id'] + ".kmx") + kmx_file = os.path.join(packageDir, kb['id'] + ".kmx") if "languages" in kb and len(kb["languages"]) > 0: logging.debug(kb["languages"][0]) keyboard_id = "%s:%s" % (kb["languages"][0]['id'], kmx_file) From 677f9546a3833fde19386a4112dcab49ab04422e Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Sun, 17 Feb 2019 21:23:51 -0600 Subject: [PATCH 3/8] Sanitize the keyboard id for ibus --- linux/keyman-config/keyman_config/ibus_util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linux/keyman-config/keyman_config/ibus_util.py b/linux/keyman-config/keyman_config/ibus_util.py index 9108656367..611393b517 100644 --- a/linux/keyman-config/keyman_config/ibus_util.py +++ b/linux/keyman-config/keyman_config/ibus_util.py @@ -27,9 +27,10 @@ def install_to_ibus(bus, keyboard_id): # bus = IBus.Bus() logging.debug("installing to ibus") ibus_settings = Gio.Settings.new("org.freedesktop.ibus.general") - preload_engines = ibus_settings.get_strv("preload-engines") + preload_engines = ibus_settings.getr_strv("preload-engines") logging.debug(preload_engines) if keyboard_id not in preload_engines: + preload_engines.clear() preload_engines.append(keyboard_id) logging.debug(preload_engines) ibus_settings.set_strv("preload-engines", preload_engines) From d42130baba30df27b349128b723c0275f580032d Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 19 Feb 2019 06:13:53 +0700 Subject: [PATCH 4/8] Fix typo --- linux/keyman-config/keyman_config/ibus_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/keyman-config/keyman_config/ibus_util.py b/linux/keyman-config/keyman_config/ibus_util.py index 611393b517..415587b38b 100644 --- a/linux/keyman-config/keyman_config/ibus_util.py +++ b/linux/keyman-config/keyman_config/ibus_util.py @@ -27,7 +27,7 @@ def install_to_ibus(bus, keyboard_id): # bus = IBus.Bus() logging.debug("installing to ibus") ibus_settings = Gio.Settings.new("org.freedesktop.ibus.general") - preload_engines = ibus_settings.getr_strv("preload-engines") + preload_engines = ibus_settings.get_strv("preload-engines") logging.debug(preload_engines) if keyboard_id not in preload_engines: preload_engines.clear() From 6af594a3441b5c782981203b924d3efe9b441d93 Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Wed, 20 Feb 2019 07:41:22 -0600 Subject: [PATCH 5/8] Address review comments --- linux/keyman-config/keyman_config/ibus_util.py | 1 - linux/keyman-config/keyman_config/install_kmp.py | 11 +++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/linux/keyman-config/keyman_config/ibus_util.py b/linux/keyman-config/keyman_config/ibus_util.py index 415587b38b..9108656367 100644 --- a/linux/keyman-config/keyman_config/ibus_util.py +++ b/linux/keyman-config/keyman_config/ibus_util.py @@ -30,7 +30,6 @@ def install_to_ibus(bus, keyboard_id): preload_engines = ibus_settings.get_strv("preload-engines") logging.debug(preload_engines) if keyboard_id not in preload_engines: - preload_engines.clear() preload_engines.append(keyboard_id) logging.debug(preload_engines) ibus_settings.set_strv("preload-engines", preload_engines) diff --git a/linux/keyman-config/keyman_config/install_kmp.py b/linux/keyman-config/keyman_config/install_kmp.py index c7d9b85c43..1ed0dada7a 100755 --- a/linux/keyman-config/keyman_config/install_kmp.py +++ b/linux/keyman-config/keyman_config/install_kmp.py @@ -4,7 +4,6 @@ import argparse import json import logging import os.path -import re import subprocess import sys import tempfile @@ -118,7 +117,7 @@ def check_keyman_dir(basedir, error_message): def extract_package_id(inputfile): packageID, ext = os.path.splitext(os.path.basename(inputfile)) - return packageID.lower(), ext + return packageID.lower() def install_kmp_shared(inputfile, online=False): """ @@ -132,7 +131,7 @@ def install_kmp_shared(inputfile, online=False): check_keyman_dir('/usr/local/share/doc', "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman") check_keyman_dir('/usr/local/share/fonts', "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts") - packageID, ext = extract_package_id(inputfile) + packageID = extract_package_id(inputfile) packageDir = os.path.join('/usr/local/share/keyman', packageID) kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID) kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID) @@ -196,7 +195,7 @@ def install_kmp_shared(inputfile, online=False): raise InstallError(InstallStatus.Abort, message) def install_kmp_user(inputfile, online=False): - packageID, ext = extract_package_id(inputfile) + packageID = extract_package_id(inputfile) packageDir=user_keyboard_dir(packageID) if not os.path.isdir(packageDir): os.makedirs(packageDir) @@ -241,8 +240,8 @@ def install_kmp_user(inputfile, online=False): pass elif ftype == KMFileTypes.KM_KMX: # Sanitize keyboard filename if not lower case - kmx_id = re.sub('.kmx', '', f['name']) - for index, kb in enumerate(keyboards): + kmx_id, ext = os.path.splitext(os.path.basename(f['name'])) + for kb in keyboards: if kmx_id.lower() == kb['id'] and kmx_id != kb['id']: os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx')) From c98667a6027c3366fef4e764460895c40c868231 Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Wed, 20 Feb 2019 20:04:54 -0600 Subject: [PATCH 6/8] Check .kmx names in install_kmp_shared Also update history.md --- linux/history.md | 9 +++++++++ linux/keyman-config/keyman_config/ibus_util.py | 1 + linux/keyman-config/keyman_config/install_kmp.py | 9 ++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/linux/history.md b/linux/history.md index db4c44a28e..1de3868866 100644 --- a/linux/history.md +++ b/linux/history.md @@ -1,5 +1,14 @@ # Keyman for Linux Version History +## 2019-02-22 11.0.111 beta +* use lowercase ID and kmx filenames when installing .kmp packages (#1601) + +## 2019-02-20 11.0.110 beta +* update readme about launchpad (#1574) + +## 2019-02-18 11.0.109 beta +* add appstream appdata file for km-config (#1543) + ## 2019-02-15 11.0.108 beta * handle keyboard package install/uninstall when languages aren't defined (#1585) diff --git a/linux/keyman-config/keyman_config/ibus_util.py b/linux/keyman-config/keyman_config/ibus_util.py index 9108656367..afa9acc9fa 100644 --- a/linux/keyman-config/keyman_config/ibus_util.py +++ b/linux/keyman-config/keyman_config/ibus_util.py @@ -30,6 +30,7 @@ def install_to_ibus(bus, keyboard_id): preload_engines = ibus_settings.get_strv("preload-engines") logging.debug(preload_engines) if keyboard_id not in preload_engines: + # TODO: in the event preload_engines contains upper-case keyboards, we'll need to uninstall_from_ibus #1601 preload_engines.append(keyboard_id) logging.debug(preload_engines) ibus_settings.set_strv("preload-engines", preload_engines) diff --git a/linux/keyman-config/keyman_config/install_kmp.py b/linux/keyman-config/keyman_config/install_kmp.py index 1ed0dada7a..5e9169fa5f 100755 --- a/linux/keyman-config/keyman_config/install_kmp.py +++ b/linux/keyman-config/keyman_config/install_kmp.py @@ -177,10 +177,17 @@ def install_kmp_shared(inputfile, online=False): name, ext = os.path.splitext(f['name']) ldmlfile = os.path.join(packageDir, name+".ldml") output_ldml(ldmlfile, ldml) - # Special handling of icon to convert to PNG elif ftype == KMFileTypes.KM_ICON: + # Special handling of icon to convert to PNG logging.info("Converting %s to PNG and installing both as keyman files", f['name']) checkandsaveico(fpath) + elif ftype == KMFileTypes.KM_KMX: + # Sanitize keyboard filename if not lower case + kmx_id, ext = os.path.splitext(os.path.basename(f['name'])) + for kb in keyboards: + if kmx_id.lower() == kb['id'] and kmx_id != kb['id']: + os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx')) + for kb in keyboards: # install all kmx for first lang not just packageID kmx_file = os.path.join(packageDir, kb['id'] + ".kmx") From bce5269b5a6cf7839234c6cc35d80117d125131f Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Wed, 20 Feb 2019 20:08:21 -0600 Subject: [PATCH 7/8] Resolve merge conflict in history.md --- linux/history.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linux/history.md b/linux/history.md index 1de3868866..98644b5f2b 100644 --- a/linux/history.md +++ b/linux/history.md @@ -6,8 +6,8 @@ ## 2019-02-20 11.0.110 beta * update readme about launchpad (#1574) -## 2019-02-18 11.0.109 beta -* add appstream appdata file for km-config (#1543) +## 2019-02-18 11.0.109 beta +* add appstream appdata file for keyman-config (#1543) ## 2019-02-15 11.0.108 beta * handle keyboard package install/uninstall when languages aren't defined (#1585) From 81094918fb2577c8239336dc4ecf442bf23e231f Mon Sep 17 00:00:00 2001 From: darcywong00 Date: Wed, 20 Feb 2019 20:09:33 -0600 Subject: [PATCH 8/8] Second attempt for history.md --- linux/history.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/history.md b/linux/history.md index 98644b5f2b..a4980285d3 100644 --- a/linux/history.md +++ b/linux/history.md @@ -7,7 +7,7 @@ * update readme about launchpad (#1574) ## 2019-02-18 11.0.109 beta -* add appstream appdata file for keyman-config (#1543) +* create appstream appdata for keyman-config (#1543) ## 2019-02-15 11.0.108 beta * handle keyboard package install/uninstall when languages aren't defined (#1585)