Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
## 3.8.0
* Add configurable DCS-BIOS git repository - #533 (@emcek)
* Allow checkout remote git branches for BIOS - #530 (@emcek)
* Internal:
* remove `psutil` library - #531 (@emcek)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[![image](https://img.shields.io/badge/pypi-v3.7.1-blue.svg)](https://pypi.org/project/dcspy/)
[![image](https://img.shields.io/badge/pypi-v3.8.0-blue.svg)](https://pypi.org/project/dcspy/)
[![Python CI](https://github.com/emcek/dcspy/actions/workflows/python-ci.yml/badge.svg?branch=master)](https://github.com/emcek/dcspy/actions/workflows/python-ci.yml)
[![Coverage Status](https://coveralls.io/repos/github/emcek/dcspy/badge.svg?branch=master)](https://coveralls.io/github/emcek/dcspy?branch=master)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/5270a4fc2ba24261a3bfa7361150e8ff)](https://app.codacy.com/gh/emcek/dcspy/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ Versions of DCSpy are currently being supported with security updates.

| Version | Supported |
|---------|--------------------|
| 3.8.x | :white_check_mark: |
| 3.7.x | :white_check_mark: |
| 3.6.x | :white_check_mark: |
| <3.5.x | :x: |
| <3.6.x | :x: |

## Reporting a Vulnerability

Expand Down
4 changes: 3 additions & 1 deletion docs/bios_live.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ DCSpy basically copy latest changes from DCS-BIOS repository into your `Save Gam

Another option you can specify is `DCS-BIOS Git reference`, where `master` (recommended default value) means latest commit. But you can use any branch or commit ID.

You can even use own DCS-BIOS fork, just enter URL adress of repostory. It is requre to click **Repair** button to remove old repo and clone new one.

Example:

![image](https://github.com/emcek/dcspy/assets/475312/7d1da9db-a123-456f-bf7a-78d70344ba8c)

![image](https://github.com/emcek/dcspy/assets/475312/5e088539-a086-4375-8e1e-161287a04f18)
![image](https://github.com/user-attachments/assets/e2aca438-09b9-406d-88bf-5cf70b45b44b)
4 changes: 2 additions & 2 deletions inno/dcspy.iss
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "dcspy"
#define MyAppVersion "3.7.1"
#define MyAppVersion "3.8.0"
#define MyAppPublisher "Michał Plichta"
#define MyAppURL "https://dcspy.readthedocs.io/en/latest/"
#define MyAppExeName "dcspy.exe"
Expand Down Expand Up @@ -33,7 +33,7 @@ LicenseFile=D:\a\dcspy\dcspy\LICENSE.md
; Uncomment the following line to run in non administrative install mode (install for current user only).
;PrivilegesRequired=lowest
OutputDir=D:\a\dcspy\dcspy\inno
OutputBaseFilename=dcspy_3.7.1_setup
OutputBaseFilename=dcspy_3.8.0_setup
SetupIconFile=D:\a\dcspy\dcspy\inno\SetupClassicIcon.ico
SolidCompression=yes
WizardStyle=modern
Expand Down
2 changes: 1 addition & 1 deletion sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ sonar.organization=emcek

# This is the name and version displayed in the SonarCloud UI.
sonar.projectName=dcspy
sonar.projectVersion=3.7.1
sonar.projectVersion=3.8.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
sonar.sources=src
Expand Down
2 changes: 1 addition & 1 deletion src/dcs_py.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMessageBox

__version__ = '3.7.1'
__version__ = '3.8.0'


def start_dcspy(cli_args: Namespace) -> None:
Expand Down
15 changes: 12 additions & 3 deletions src/dcspy/migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from packaging import version

from dcspy.models import ConfigValue, DcspyConfigYaml, __version__
from dcspy.models import BIOS_REPO_ADDR, ConfigValue, DcspyConfigYaml, __version__
from dcspy.utils import DEFAULT_YAML_FILE, defaults_cfg, get_config_yaml_location

LOG = getLogger(__name__)
Expand Down Expand Up @@ -56,9 +56,18 @@ def _filter_api_ver_func(cfg_ver: str) -> Iterator[Callable[[DcspyConfigYaml], N
yield globals()['_api_ver_{}'.format(api_ver.replace('.', '_'))]


def _api_ver_3_8_0(cfg: DcspyConfigYaml) -> None:
"""
Migrate to version 3.8.0.

:param cfg: Configuration dictionary
"""
_add_key(cfg, 'git_bios_repo', BIOS_REPO_ADDR)


def _api_ver_3_7_0(cfg: DcspyConfigYaml) -> None:
"""
Migrate to version 3.7.1.
Migrate to version 3.7.0.

:param cfg: Configuration dictionary
"""
Expand All @@ -70,7 +79,7 @@ def _api_ver_3_7_0(cfg: DcspyConfigYaml) -> None:

def _api_ver_3_5_0(cfg: DcspyConfigYaml) -> None:
"""
Migrate to version 3.5.1.
Migrate to version 3.5.0.

:param cfg: Configuration dictionary
"""
Expand Down
3 changes: 2 additions & 1 deletion src/dcspy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from PIL import Image, ImageDraw, ImageFont
from pydantic import BaseModel, ConfigDict, RootModel, field_validator

__version__ = '3.7.1'
__version__ = '3.8.0'

# Network
SEND_ADDR: Final = ('127.0.0.1', 7778)
Expand All @@ -40,6 +40,7 @@
LOCAL_APPDATA: Final = True
DCSPY_REPO_NAME: Final = 'emcek/dcspy'
BIOS_REPO_NAME: Final = 'DCS-Skunkworks/dcs-bios'
BIOS_REPO_ADDR: Final = f'https://github.com/{BIOS_REPO_NAME}.git'
DEFAULT_FONT_NAME: Final = 'consola.ttf'
CTRL_LIST_SEPARATOR: Final = '--'
CONFIG_YAML: Final = 'config.yaml'
Expand Down
94 changes: 60 additions & 34 deletions src/dcspy/qt_gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ def __init__(self, cli_args=Namespace(), cfg_dict: DcspyConfigYaml | None = None
self.ctrl_depiction: dict[str, ControlDepiction] = {}
self.input_reqs: dict[str, dict[str, GuiPlaneInputRequest]] = {}
self.git_exec = is_git_exec_present()
self.bios_git_addr = self.config['git_bios_repo']
self.l_bios = version.Version('0.0.0')
self.r_bios = version.Version('0.0.0')
self.systray = QSystemTrayIcon()
Expand Down Expand Up @@ -170,8 +171,9 @@ def _init_settings(self) -> None:
self.pb_dcspy_check.clicked.connect(self._dcspy_check_clicked)
self.pb_bios_check.clicked.connect(self._bios_check_clicked)
self.pb_bios_repair.clicked.connect(self._bios_repair_clicked)
self.le_bios_live.textEdited.connect(self._is_git_object_exists)
self.le_bios_live.returnPressed.connect(partial(self._bios_check_clicked, silence=False))
self.le_bios_ref.textEdited.connect(self._is_git_object_exists)
self.le_bios_ref.returnPressed.connect(partial(self._bios_check_clicked, silence=False))
self.le_bios_repo.textEdited.connect(self._bios_git_repo_chnaged)
self.cb_bios_live.toggled.connect(self._cb_bios_live_toggled)
self.sp_completer.valueChanged.connect(self._set_find_value) # generate json/bios
self.tw_gkeys.currentCellChanged.connect(self._save_current_cell)
Expand Down Expand Up @@ -239,18 +241,18 @@ def _init_menu_bar(self) -> None:
def _init_autosave(self) -> None:
"""Initialize of autosave."""
widget_dict = {
'le_dcsdir': 'textChanged', 'le_biosdir': 'textChanged', 'le_font_name': 'textEdited', 'le_bios_live': 'returnPressed',
'hs_large_font': 'valueChanged', 'hs_medium_font': 'valueChanged', 'hs_small_font': 'valueChanged', 'hs_debug_font_size': 'valueChanged',
'sp_completer': 'valueChanged', 'combo_planes': 'currentIndexChanged', 'toolbar': 'visibilityChanged', 'dw_gkeys': 'visibilityChanged',
'a_icons_only': 'triggered', 'a_text_only': 'triggered', 'a_text_beside': 'triggered', 'a_text_under': 'triggered',
'a_mode_light': 'triggered', 'a_mode_dark': 'triggered', 'a_mode_system': 'triggered',
'cb_autostart': 'toggled', 'cb_show_gui': 'toggled', 'cb_check_ver': 'toggled', 'cb_ded_font': 'toggled', 'cb_lcd_screenshot': 'toggled',
'cb_verbose': 'toggled', 'cb_autoupdate_bios': 'toggled', 'cb_bios_live': 'toggled', 'cb_debug_enable': 'toggled',
'rb_g19': 'toggled', 'rb_g13': 'toggled', 'rb_g15v1': 'toggled', 'rb_g15v2': 'toggled', 'rb_g510': 'toggled',
'rb_g910': 'toggled', 'rb_g710': 'toggled', 'rb_g110': 'toggled', 'rb_g103': 'toggled', 'rb_g105': 'toggled',
'rb_g11': 'toggled', 'rb_g35': 'toggled', 'rb_g633': 'toggled', 'rb_g930': 'toggled', 'rb_g933': 'toggled',
'rb_g600': 'toggled', 'rb_g300': 'toggled', 'rb_g400': 'toggled', 'rb_g700': 'toggled', 'rb_g9': 'toggled',
'rb_mx518': 'toggled', 'rb_g402': 'toggled', 'rb_g502': 'toggled', 'rb_g602': 'toggled',
'le_dcsdir': 'textChanged', 'le_biosdir': 'textChanged', 'le_font_name': 'textEdited', 'le_bios_ref': 'returnPressed',
'le_bios_repo': 'returnPressed', 'hs_large_font': 'valueChanged', 'hs_medium_font': 'valueChanged', 'hs_small_font': 'valueChanged',
'hs_debug_font_size': 'valueChanged', 'sp_completer': 'valueChanged', 'combo_planes': 'currentIndexChanged',
'toolbar': 'visibilityChanged', 'dw_gkeys': 'visibilityChanged', 'a_icons_only': 'triggered', 'a_text_only': 'triggered',
'a_text_beside': 'triggered', 'a_text_under': 'triggered', 'a_mode_light': 'triggered', 'a_mode_dark': 'triggered',
'a_mode_system': 'triggered', 'cb_autostart': 'toggled', 'cb_show_gui': 'toggled', 'cb_check_ver': 'toggled',
'cb_ded_font': 'toggled', 'cb_lcd_screenshot': 'toggled', 'cb_verbose': 'toggled', 'cb_autoupdate_bios': 'toggled',
'cb_bios_live': 'toggled', 'cb_debug_enable': 'toggled', 'rb_g19': 'toggled', 'rb_g13': 'toggled', 'rb_g15v1': 'toggled',
'rb_g15v2': 'toggled', 'rb_g510': 'toggled', 'rb_g910': 'toggled', 'rb_g710': 'toggled', 'rb_g110': 'toggled', 'rb_g103': 'toggled',
'rb_g105': 'toggled', 'rb_g11': 'toggled', 'rb_g35': 'toggled', 'rb_g633': 'toggled', 'rb_g930': 'toggled', 'rb_g933': 'toggled',
'rb_g600': 'toggled', 'rb_g300': 'toggled', 'rb_g400': 'toggled', 'rb_g700': 'toggled', 'rb_g9': 'toggled', 'rb_mx518': 'toggled',
'rb_g402': 'toggled', 'rb_g502': 'toggled', 'rb_g602': 'toggled',
}
for widget_name, trigger_method in widget_dict.items():
getattr(getattr(self, widget_name), trigger_method).connect(self.save_configuration)
Expand All @@ -261,8 +263,9 @@ def _trigger_refresh_data(self) -> None:
self._is_dir_exists(text=self.le_dcsdir.text(), widget_name='le_dcsdir')
self._is_dir_dcs_bios(text=self.bios_path, widget_name='le_biosdir')
if self.cb_bios_live.isChecked():
self.le_bios_live.setEnabled(True)
self._is_git_object_exists(text=self.le_bios_live.text())
self.le_bios_ref.setEnabled(True)
self.le_bios_repo.setEnabled(True)
self._is_git_object_exists(text=self.le_bios_ref.text())
for logitech_dev in ALL_DEV:
logi_dev_rb_name = f'rb_{logitech_dev.klass.lower()}'
dev = getattr(self, logi_dev_rb_name)
Expand Down Expand Up @@ -895,13 +898,13 @@ def _is_git_object_exists(self, text: str) -> bool | None:
:return: True if a git object exists, False otherwise.
"""
if self.cb_bios_live.isChecked():
self._set_completer_for_git_ref()
git_ref = is_git_object(repo_dir=self.bios_repo_path, git_obj=text)
LOG.debug(f'Git reference: {text} in {self.bios_repo_path} exists: {git_ref}')
if git_ref:
self.le_bios_live.setStyleSheet('')
self._set_completer_for_git_ref()
self.le_bios_ref.setStyleSheet('')
return True
self.le_bios_live.setStyleSheet('color: red;')
self.le_bios_ref.setStyleSheet('color: red;')
return False
return None

Expand All @@ -915,7 +918,7 @@ def _get_bios_full_version(self, silence=True) -> str:
sha_commit = 'N/A'
if self.git_exec and self.cb_bios_live.isChecked():
try:
sha_commit = check_github_repo(git_ref=self.le_bios_live.text(), repo_dir=self.bios_repo_path, repo=BIOS_REPO_NAME, update=False)
sha_commit = check_github_repo(git_ref=self.le_bios_ref.text(), repo_dir=self.bios_repo_path, repo=self.le_bios_repo.text(), update=False)
except Exception as exc:
LOG.debug(f'{exc}')
if not silence:
Expand All @@ -929,25 +932,42 @@ def _cb_bios_live_toggled(self, state: bool) -> None:
:param state: True if checked, False if unchecked.
"""
if state:
self.le_bios_live.setEnabled(True)
self._is_git_object_exists(text=self.le_bios_live.text())
self.le_bios_ref.setEnabled(True)
self.le_bios_repo.setEnabled(True)
self.l_bios_ref.setEnabled(True)
self.l_bios_repo.setEnabled(True)
self._is_git_object_exists(text=self.le_bios_ref.text())
else:
self.le_bios_live.setEnabled(False)
self.le_bios_live.setStyleSheet('')
self.le_bios_ref.setEnabled(False)
self.le_bios_repo.setEnabled(False)
self.l_bios_ref.setEnabled(False)
self.l_bios_repo.setEnabled(False)
self.le_bios_ref.setStyleSheet('')
self._clean_bios_files()
self._bios_check_clicked(silence=False)

def _set_completer_for_git_ref(self) -> None:
"""Set-ups completer for Git references of the DCS-BIOS git repository."""
if not self._git_refs_count:
git_refs = get_all_git_refs(repo_dir=self.bios_repo_path)
git_refs = get_all_git_refs(repo_dir=self.bios_repo_path)
if self._git_refs_count != len(git_refs):
self._git_refs_count = len(git_refs)
completer = QCompleter(git_refs)
completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion)
completer.setFilterMode(Qt.MatchFlag.MatchContains)
completer.setModelSorting(QCompleter.ModelSorting.CaseInsensitivelySortedModel)
self.le_bios_live.setCompleter(completer)
self.le_bios_ref.setCompleter(completer)

def _bios_git_repo_chnaged(self, text: str) -> None:
"""
Show info at statusbar when BIOS Git repostory changed.

:param text: Git repository sddress
"""
self.le_bios_repo.setStyleSheet('')
if self.bios_git_addr != text:
self.statusbar.showMessage('BIOS git address changes, please click Repair')
self.le_bios_repo.setStyleSheet('color: red;')

# <=><=><=><=><=><=><=><=><=><=><=> check dcspy updates <=><=><=><=><=><=><=><=><=><=><=>
def _dcspy_check_clicked(self) -> None:
Expand Down Expand Up @@ -1016,8 +1036,8 @@ def _start_bios_update(self, silence: bool) -> None:
:param silence: Perform action with silence
"""
if self.cb_bios_live.isChecked():
clone_worker: QRunnable | WorkerSignalsMixIn = GitCloneWorker(git_ref=self.le_bios_live.text(), bios_path=self.bios_path,
to_path=self.bios_repo_path, repo=BIOS_REPO_NAME, silence=silence)
clone_worker: QRunnable | WorkerSignalsMixIn = GitCloneWorker(git_ref=self.le_bios_ref.text(), bios_path=self.bios_path,
to_path=self.bios_repo_path, repo=self.le_bios_repo.text(), silence=silence)
signal_handlers = {
'progress': self._progress_by_abs_value,
'stage': self.statusbar.showMessage,
Expand Down Expand Up @@ -1083,7 +1103,7 @@ def _clone_bios_completed(self, result) -> None:
install_result = self._handling_export_lua(temp_dir=self.bios_repo_path / 'Scripts')
install_result = f'{install_result}\n\nUsing Git/Live version.'
self.statusbar.showMessage(sha)
self._is_git_object_exists(text=self.le_bios_live.text())
self._is_git_object_exists(text=self.le_bios_ref.text())
self._reload_table_gkeys()
if not silence:
self._show_message_box(kind_of=MsgBoxTypes.INFO, title=f'Updated {self.l_bios}', message=install_result)
Expand Down Expand Up @@ -1241,6 +1261,7 @@ def _bios_repair_clicked(self) -> None:
self._clean_bios_files()
self._remove_dcs_bios_repo_dir()
self._start_bios_update(silence=False)
self.le_bios_repo.setStyleSheet('')

def _clean_bios_files(self) -> None:
"""Clean all DCS-BIOS directories and files."""
Expand Down Expand Up @@ -1335,7 +1356,8 @@ def apply_configuration(self, cfg: dict) -> None:
getattr(self, f'rb_{cfg["device"].lower()}').toggle()
self.le_dcsdir.setText(cfg['dcs'])
self.le_biosdir.setText(cfg['dcsbios'])
self.le_bios_live.setText(cfg['git_bios_ref'])
self.le_bios_ref.setText(cfg['git_bios_ref'])
self.le_bios_repo.setText(cfg['git_bios_repo'])
self.cb_bios_live.setChecked(cfg['git_bios'])
self.addDockWidget(Qt.DockWidgetArea(int(cfg['gkeys_area'])), self.dw_gkeys)
self.dw_gkeys.setFloating(bool(cfg['gkeys_float']))
Expand Down Expand Up @@ -1367,7 +1389,8 @@ def save_configuration(self) -> None:
'dcsbios': self.le_biosdir.text(),
'font_name': self.le_font_name.text(),
'git_bios': self.cb_bios_live.isChecked(),
'git_bios_ref': self.le_bios_live.text(),
'git_bios_ref': self.le_bios_ref.text(),
'git_bios_repo': self.le_bios_repo.text(),
'font_mono_l': self.mono_font['large'],
'font_mono_m': self.mono_font['medium'],
'font_mono_s': self.mono_font['small'],
Expand Down Expand Up @@ -1698,6 +1721,8 @@ def _find_children(self) -> None:
self.l_description: QLabel = self.findChild(QLabel, 'l_description')
self.l_identifier: QLabel = self.findChild(QLabel, 'l_identifier')
self.l_range: QLabel = self.findChild(QLabel, 'l_range')
self.l_bios_ref: QLabel = self.findChild(QLabel, 'l_bios_ref')
self.l_bios_repo: QLabel = self.findChild(QLabel, 'l_bios_repo')

self.a_start: QAction = self.findChild(QAction, 'a_start')
self.a_stop: QAction = self.findChild(QAction, 'a_stop')
Expand Down Expand Up @@ -1747,7 +1772,8 @@ def _find_children(self) -> None:
self.le_dcsdir: QLineEdit = self.findChild(QLineEdit, 'le_dcsdir')
self.le_biosdir: QLineEdit = self.findChild(QLineEdit, 'le_biosdir')
self.le_font_name: QLineEdit = self.findChild(QLineEdit, 'le_font_name')
self.le_bios_live: QLineEdit = self.findChild(QLineEdit, 'le_bios_live')
self.le_bios_ref: QLineEdit = self.findChild(QLineEdit, 'le_bios_ref')
self.le_bios_repo: QLineEdit = self.findChild(QLineEdit, 'le_bios_repo')
self.le_custom: QLineEdit = self.findChild(QLineEdit, 'le_custom')

self.rb_g19: QRadioButton = self.findChild(QRadioButton, 'rb_g19')
Expand Down Expand Up @@ -1930,7 +1956,7 @@ def __init__(self, git_ref: str, bios_path: Path, to_path: Path, repo: str, sile
Inherits from QRunnable to handler worker thread setup, signals and wrap-up.

:param git_ref: Git reference
:param repo: Valid git repository user/name
:param repo: Valid git repository address
:param bios_path: Path to DCS-BIOS
:param to_path: Path to which the repository should be cloned to
:param silence: Perform action with silence
Expand Down
Loading
Loading