* Use Deskflow Name * Remove business-oriented options from issue templates * Remove business-oriented workflow * Bump version to 3.0.0 (to avoid confusion with previously used version numbers 1.x & 2.x) * Update readme to reflect new project name and goals * Found some more "synergy" to rename * Rename `synlib` to `app` * Rename `syntool` to `deskflow-legacy` * Rename `synwinhk` to `dfwhook` * Rename dirs from synergy to deskflow * Rename more "Synergy" files * Rename app bundle ID * Fixed copyright typo * Rename only title in serial key dialog (to be moved downstream later) * Preserve original serial key window for moving downstream * Restore dialogs ready for moving downstream * Rename `QDeskflowApplication` to `DeskflowApplication` (the Q is confusing) * Restore Volker's original project name * Fixed mimetype * Fixed weird grammar * Fixed (more) weird grammar * Broken link, restoring (but we should move all links out of source) * Broken link, restoring (but we should move all links out of source) * Add write permission to valgrind-analysis.yml * Restore AUR conflicts * Apply Clang format * Update ChangeLog * Back out version change --------- Co-authored-by: Nick Bolton <nick@symless.com>
130 lines
4.6 KiB
Python
130 lines
4.6 KiB
Python
# Deskflow -- mouse and keyboard sharing utility
|
|
# Copyright (C) 2024 Symless Ltd.
|
|
#
|
|
# This package is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# found in the file LICENSE that should have accompanied this file.
|
|
#
|
|
# This package is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import yaml
|
|
import lib.env as env
|
|
import lib.cmd_utils as cmd_utils
|
|
|
|
config_file = "config.yaml"
|
|
root_key = "config"
|
|
deps_key = "dependencies"
|
|
command_key = "command"
|
|
command_pre_key = "command-pre"
|
|
subprojects_key = "subprojects"
|
|
arrow = " ➤ "
|
|
|
|
|
|
class ConfigKeyError(RuntimeError):
|
|
def __init__(self, config_file, key):
|
|
self.config_file = config_file
|
|
self.key = key
|
|
|
|
def __str__(self):
|
|
return f"Not found in {self.config_file}: {self.key}"
|
|
|
|
|
|
def _get(dict, key, key_parent=None, required=True):
|
|
value = dict.get(key)
|
|
|
|
if required and not value:
|
|
key_path = f"{root_key}{arrow}{key_parent}{arrow}{key}" if key_parent else key
|
|
raise ConfigKeyError(config_file, key_path)
|
|
|
|
return value
|
|
|
|
|
|
class Config:
|
|
"""Reads the project configuration YAML file."""
|
|
|
|
def __init__(self):
|
|
|
|
with open(config_file, "r") as f:
|
|
data = yaml.safe_load(f)
|
|
|
|
self.os_name = env.get_os()
|
|
|
|
print("Config for OS:", self.os_name)
|
|
self.root = _get(data, root_key)
|
|
self.os = _get(self.root, self.os_name)
|
|
|
|
def get_os_value(self, key, required=True, linux_distro=None):
|
|
if linux_distro:
|
|
# recurse with the linux distro as the key parameter to get the base distro key.
|
|
distro = self.get_os_value(key=linux_distro)
|
|
return _get(distro, key, f"{self.os_name}{arrow}{linux_distro}", required)
|
|
else:
|
|
return _get(self.os, key, self.os_name, required)
|
|
|
|
def get_qt_config(self):
|
|
qt_key = "qt"
|
|
qt = self.get_os_deps_value(qt_key)
|
|
|
|
parent_key = f"{self.os_name}{arrow}{deps_key}"
|
|
mirror_url = _get(qt, "mirror", parent_key)
|
|
version = _get(qt, "version", parent_key)
|
|
base_dir = _get(qt, "base-dir", parent_key)
|
|
modules = _get(qt, "modules", parent_key, required=False)
|
|
|
|
return mirror_url, version, base_dir, modules
|
|
|
|
def get_os_deps_value(self, key, required=True, linux_distro=None):
|
|
deps = self.get_os_value(deps_key, required, linux_distro)
|
|
if linux_distro:
|
|
key_parent = f"{self.os_name}{arrow}{linux_distro}{arrow}{deps_key}"
|
|
else:
|
|
key_parent = f"{self.os_name}{arrow}{deps_key}"
|
|
return _get(deps, key, key_parent, required)
|
|
|
|
def get_os_deps_command(self, key=command_key, required=True, linux_distro=None):
|
|
command = self.get_os_deps_value(key, required, linux_distro)
|
|
if command:
|
|
return cmd_utils.strip_continuation_sequences(command)
|
|
else:
|
|
return None
|
|
|
|
def get_os_subprojects(self):
|
|
distro, _distro_like, _distro_version = env.get_linux_distro()
|
|
return self.get_os_value(subprojects_key, linux_distro=distro, required=False)
|
|
|
|
def get_subproject_deps_command(self, subproject_name):
|
|
subprojects = _get(self.root, subprojects_key)
|
|
subproject = _get(subprojects, subproject_name, subprojects_key)
|
|
deps_parent = f"{subprojects_key}{arrow}{subproject_name}"
|
|
deps = _get(subproject, deps_key, deps_parent)
|
|
|
|
if env.is_linux():
|
|
distro, _distro_like, _distro_version = env.get_linux_distro()
|
|
if not distro:
|
|
raise RuntimeError("Unable to detect Linux distro")
|
|
|
|
command = _get(deps, distro, f"{deps_parent}{arrow}{deps_key}")
|
|
else:
|
|
command = _get(deps, self.os_name, f"{deps_parent}{arrow}{deps_key}")
|
|
|
|
return cmd_utils.strip_continuation_sequences(command)
|
|
|
|
def get_os_deps_command_pre(self, required=True, linux_distro=None):
|
|
return self.get_os_deps_command(command_pre_key, required, linux_distro)
|
|
|
|
def get_windows_ci_config(self):
|
|
choco_ci_key = "ci"
|
|
choco_ci = self.get_os_deps_value(choco_ci_key)
|
|
|
|
choco_ci_path = f"{self.os_name}{arrow}{deps_key}{arrow}{choco_ci_key}"
|
|
edit_config = _get(choco_ci, "edit-config", choco_ci_path)
|
|
skip_packages = _get(choco_ci, "skip-packages", choco_ci_path)
|
|
|
|
return edit_config, skip_packages
|