mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-07 01:15:33 +00:00
list installed kmp and data about them
use that data to only install kmp if it is newer than existing one
This commit is contained in:
parent
e4413f1e28
commit
6ae5ed93e1
3 changed files with 111 additions and 18 deletions
|
|
@ -1,6 +1,7 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import tempfile
|
||||
import zipfile
|
||||
import sys
|
||||
|
|
@ -8,6 +9,8 @@ import os.path
|
|||
import requests
|
||||
from kmpmetadata import parsemetadata, determine_filetype
|
||||
from get_kmp import get_kmp, get_keyboard_data
|
||||
from list_installed_kmp import kmp_version
|
||||
from uninstall_kmp import uninstall_kmp
|
||||
from os import listdir, makedirs
|
||||
from shutil import copy2
|
||||
|
||||
|
|
@ -53,21 +56,29 @@ def install_kmp(inputfile, withkmn=False):
|
|||
# if 'lastModifiedDate' in kbdata:
|
||||
# lastModifiedDate = datetime(kbdata['lastModifiedDate'])
|
||||
# print("Last Modified Date:", lastModifiedDate)
|
||||
if 'sourcePath' in kbdata:
|
||||
base_url = "https://raw.github.com/keymanapp/keyboards/master/" + kbdata['sourcePath']
|
||||
kmn_url = base_url + "/source/" + kbid + ".kmn"
|
||||
response = requests.get(kmn_url)
|
||||
if response.status_code == 200:
|
||||
downloadfile = os.path.join(tmpdirname, kbid + ".kmn")
|
||||
with open(downloadfile, 'wb') as f:
|
||||
f.write(response.content)
|
||||
print("Installing", kbid + ".kmn", "as keyman file, mininum version:", kbdata['minKeymanVersion'])
|
||||
if not os.path.isdir(kbdir):
|
||||
if kbdata:
|
||||
if 'sourcePath' in kbdata:
|
||||
base_url = "https://raw.github.com/keymanapp/keyboards/master/" + kbdata['sourcePath']
|
||||
kmn_url = base_url + "/source/" + kbid + ".kmn"
|
||||
response = requests.get(kmn_url)
|
||||
if response.status_code == 200:
|
||||
downloadfile = os.path.join(tmpdirname, kbid + ".kmn")
|
||||
with open(downloadfile, 'wb') as f:
|
||||
f.write(response.content)
|
||||
print("Installing", kbid + ".kmn", "as keyman file, mininum version:", kbdata['minKeymanVersion'])
|
||||
if not os.path.isdir(kbdir):
|
||||
os.makedirs(kbdir)
|
||||
copy2(downloadfile, kbdir)
|
||||
else:
|
||||
print("install_kmp.py: error: no kmn source file so not installing")
|
||||
exit(4)
|
||||
if not os.path.isdir(kbdir):
|
||||
os.makedirs(kbdir)
|
||||
copy2(downloadfile, kbdir)
|
||||
else:
|
||||
print("no kmn source file so not installing")
|
||||
exit(4)
|
||||
with open(os.path.join(kbdir, kbid + '.json'), 'w') as outfile:
|
||||
json.dump(kbdata, outfile)
|
||||
print("Installing api data file", kbid + ".json", "as keyman file")
|
||||
else:
|
||||
print("install_kmp.py: error: cannot download keyboard data so not installing.")
|
||||
|
||||
for f in files:
|
||||
fpath = os.path.join(tmpdirname, f['name'])
|
||||
|
|
@ -88,7 +99,7 @@ def install_kmp(inputfile, withkmn=False):
|
|||
os.makedirs(kbdir)
|
||||
copy2(fpath, kbdir)
|
||||
else:
|
||||
print("No kmp.json found in", inputfile)
|
||||
print("install_kmp.py: error: No kmp.json found in", inputfile)
|
||||
|
||||
|
||||
def main():
|
||||
|
|
@ -104,17 +115,31 @@ def main():
|
|||
if args.f:
|
||||
name, ext = os.path.splitext(args.f)
|
||||
if ext != ".kmp":
|
||||
print("install_kmp.py Input file", args.f, "is not a kmp file")
|
||||
print("install_kmp.py Input file", args.f, "is not a kmp file.")
|
||||
print("install_kmp.py -f <kmpfile>")
|
||||
sys.exit(2)
|
||||
|
||||
if not os.path.isfile(args.f):
|
||||
print("install_kmp.py Keyman kmp file", args.f, "not found")
|
||||
print("install_kmp.py Keyman kmp file", args.f, "not found.")
|
||||
print("install_kmp.py -f <kmpfile>")
|
||||
sys.exit(2)
|
||||
|
||||
install_kmp(args.f)
|
||||
elif args.k:
|
||||
installed_kmp_ver = kmp_version(args.k)
|
||||
kbdata = get_keyboard_data(args.k)
|
||||
if not kbdata:
|
||||
print("install_kmp.py: error: Could not download keyboard data for", args.k)
|
||||
if installed_kmp_ver:
|
||||
# print("Found installed version", installed_kmp_ver)
|
||||
# print("Api knows about version", kbdata['version'])
|
||||
if kbdata['version'] == installed_kmp_ver:
|
||||
print("install_kmp.py The %s version of the %s keyboard is already installed." % (installed_kmp_ver, args.k))
|
||||
sys.exit(0)
|
||||
elif float(kbdata['version']) > float(installed_kmp_ver):
|
||||
print("install_kmp.py A newer version of %s keyboard is available. Uninstalling old version %s then downloading and installing new version %s." % (args.k, installed_kmp_ver, kbdata['version']))
|
||||
uninstall_kmp(args.k)
|
||||
|
||||
kmpfile = get_kmp(args.k)
|
||||
if kmpfile:
|
||||
install_kmp(kmpfile, True)
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ def print_files(files, extracted_dir):
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
def parsemetadata(jsonfile, verbose):
|
||||
def parsemetadata(jsonfile, verbose=False):
|
||||
info = system = keyboards = files = options = nonexistent = None
|
||||
extracted_dir = os.path.dirname(jsonfile)
|
||||
|
||||
|
|
|
|||
68
linux/keyman-config/list_installed_kmp.py
Executable file
68
linux/keyman-config/list_installed_kmp.py
Executable file
|
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import os
|
||||
#import configparser
|
||||
import json
|
||||
from kmpmetadata import parsemetadata
|
||||
from get_kmp import get_keyboard_data
|
||||
|
||||
def get_installed_kmp():
|
||||
installed_keyboards = {}
|
||||
check_paths = [ "/usr/share/keyman", "/usr/local/share/keyman" ]
|
||||
for keymanpath in check_paths:
|
||||
for o in os.listdir(keymanpath):
|
||||
if os.path.isdir(os.path.join(keymanpath,o)):
|
||||
metadata = parsemetadata(os.path.join(keymanpath, o, "kmp.json"))
|
||||
name = md_name = version = md_version = description = kbdata = None
|
||||
kbjson = os.path.join(keymanpath, o, o + ".json")
|
||||
if os.path.isfile(kbjson):
|
||||
with open(kbjson, "r") as read_file:
|
||||
kbdata = json.load(read_file)
|
||||
else:
|
||||
kbdata = get_keyboard_data(o)
|
||||
if kbdata:
|
||||
if 'description' in kbdata:
|
||||
description = kbdata['description']
|
||||
version = kbdata['version']
|
||||
name = kbdata['name']
|
||||
if metadata:
|
||||
info = metadata[0]
|
||||
md_version = info['version']['description']
|
||||
md_name = info['name']['description']
|
||||
if not name:
|
||||
version = md_version
|
||||
name = md_name
|
||||
|
||||
installed_keyboards[o] = { "id" : o, "name" : name, "kmpname" : md_name, "version" : version, "kmpversion" : md_version, "path" : keymanpath, "description" : description}
|
||||
return installed_keyboards
|
||||
|
||||
|
||||
def kmp_version(keyboardid):
|
||||
installed_kmp = get_installed_kmp()
|
||||
if keyboardid in installed_kmp:
|
||||
return installed_kmp[keyboardid]['version']
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def main():
|
||||
installed_kmp = get_installed_kmp()
|
||||
# print(installed_kmp)
|
||||
# print(sorted(installed_kmp))
|
||||
print("--- Installed keyboards ---")
|
||||
for kmp in sorted(installed_kmp):
|
||||
print(installed_kmp[kmp]['name'] + ", version:", installed_kmp[kmp]['version'] + ", id:", kmp)
|
||||
if installed_kmp[kmp]['version'] != installed_kmp[kmp]['kmpversion']:
|
||||
print("Version mismatch. Installed keyboard is %s. Website says it is %s." % (installed_kmp[kmp]['kmpversion'], installed_kmp[kmp]['version']))
|
||||
if installed_kmp[kmp]['name'] != installed_kmp[kmp]['kmpname']:
|
||||
print("Name mismatch. Installed keyboard is %s. Website says it is %s." % (installed_kmp[kmp]['name'], installed_kmp[kmp]['kmpname']))
|
||||
|
||||
if installed_kmp[kmp]['description']:
|
||||
print(installed_kmp[kmp]['description'])
|
||||
else:
|
||||
print("No description")
|
||||
print(os.linesep)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Add table
Reference in a new issue