Compare commits

..
11 Commits
Author SHA1 Message Date
aclist d8239f1c34 Merge pull request #405 from aclist/chore/update-licenses
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
chore: list missing library
2026-07-12 12:34:32 +09:00
aclist 8c3ec4512a chore: list missing library 2026-07-12 12:34:00 +09:00
aclist 1a18c8ff02 Merge pull request #404 from aclist/fix/app-path-tests
chore: update tests to reflect get_app_path() changes
2026-07-12 12:23:05 +09:00
aclist 92c23ec609 chore: update tests to reflect get_app_path() changes 2026-07-12 12:22:12 +09:00
aclist e9d4054e76 Merge pull request #403 from aclist/prerelease/7.0.0b16
Mirror to Codeberg / mirror-to-codeberg (push) Waiting to run
chore: bump version
2026-07-12 10:35:11 +09:00
aclist 1c9e026f70 chore: bump version 2026-07-12 10:34:24 +09:00
aclist eb076b7dcd Merge pull request #402 from aclist/fix/clean-acf
chore: drop comment
2026-07-12 10:32:27 +09:00
aclist 8629e02670 chore: drop comment 2026-07-12 10:30:06 +09:00
aclist 3ba38f30ad Merge pull request #401 from aclist/feat/collapsible-changelog
feat: collapsible changelog
2026-07-12 10:28:18 +09:00
aclist 7c37fd8b6e Merge pull request #400 from aclist/feat/shortcuts
feat: generate Steam shortcut
2026-07-12 10:27:27 +09:00
aclist 27d444ea6f feat: parse changelog chunks 2026-07-11 22:59:28 +09:00
10 changed files with 113 additions and 49 deletions

No files matched your search

+29 -28
View File
@@ -1,6 +1,7 @@
# Changelog # Changelog
## Added ## [7.0.0] Unreleased
### Added
- Setup wizard - Setup wizard
- Changelog text wrapping and formatting - Changelog text wrapping and formatting
- Changelog ships with source - Changelog ships with source
@@ -44,7 +45,7 @@
- Generate Steam shortcuts and cover art - Generate Steam shortcuts and cover art
- Warn user if background downloads are disabled - Warn user if background downloads are disabled
## Changed ### Changed
- Conform to PEP 440 versioning for beta versions - Conform to PEP 440 versioning for beta versions
- Reduce padding on keys button - Reduce padding on keys button
- Boldface breadcrumbs - Boldface breadcrumbs
@@ -61,58 +62,58 @@
- Enable LAN page Empty/Full filters on first run of app - Enable LAN page Empty/Full filters on first run of app
- Propagate subscribed mods to Steam client - Propagate subscribed mods to Steam client
## Dropped ### Dropped
- Debug mode - Debug mode
- Branch switching - Branch switching
- Manual mod install mode (describe rationale) - Manual mod install mode (describe rationale)
- Force update mods - Force update mods
## Fixed ### Fixed
- Longstanding issue with left clicks not registering as tree selection changes after spamming keyboard input - Longstanding issue with left clicks not registering as tree selection changes after spamming keyboard input
- Center server title text on server dialogs - Center server title text on server dialogs
- Rare segfaults when changing maps (threading) - Rare segfaults when changing maps (threading)
- Moved dialogs out of threads - Moved dialogs out of threads
## Unreleased ### Unreleased
- Load offline mods - Load offline mods
- Local documentation - Local documentation
- Raw debug command in context menu - Raw debug command in context menu
## Developer-facing ### Developer-facing
- Add pyproject.toml file - Add pyproject.toml file
- Show deprecation warnings - Show deprecation warnings
- Options -> Dev page - Options -> Dev page
## [6.0.5] 2026-05-17 ## [6.0.5] 2026-05-17
## Changed ### Changed
- Update symlink hash logic to align with DZGUI 7 beta - Update symlink hash logic to align with DZGUI 7 beta
- Update A2S helper to latest commit - Update A2S helper to latest commit
## [6.0.4] 2026-04-13 ## [6.0.4] 2026-04-13
## Fixed ### Fixed
- Update A2S module checksums to support servers with missing description field - Update A2S module checksums to support servers with missing description field
## [6.0.3] 2026-04-12 ## [6.0.3] 2026-04-12
## Fixed ### Fixed
- Use GLibUnix namespace where available when setting up SIGINT callback - Use GLibUnix namespace where available when setting up SIGINT callback
## [6.0.2] 2026-01-26 ## [6.0.2] 2026-01-26
## Fixed ### Fixed
- Explicitly use Python 3.13 when calling subprocesses - Explicitly use Python 3.13 when calling subprocesses
- Raise error correctly from module - Raise error correctly from module
- Do not spawn dialogs from inside of thread when fetching prereqs - Do not spawn dialogs from inside of thread when fetching prereqs
## Changed ### Changed
- Optimize time complexity of startup checks - Optimize time complexity of startup checks
- Optimize coordinate calculation by using local records first - Optimize coordinate calculation by using local records first
- Rename some internal functions - Rename some internal functions
- Wrap entire startup process in dialog - Wrap entire startup process in dialog
## [6.0.1] 2026-01-16 ## [6.0.1] 2026-01-16
## Fixed ### Fixed
- Explicitly use Python 3.13 when calling subprocesses - Explicitly use Python 3.13 when calling subprocesses
## [6.0.0] 2026-01-14 ## [6.0.0] 2026-01-14
## Added ### Added
- Support DayZ Experimental - Support DayZ Experimental
- Ping display on server tables - Ping display on server tables
- Save descriptive text notes on a per-server basis - Save descriptive text notes on a per-server basis
@@ -138,7 +139,7 @@
- Commandline usage help text (GaryBlackbourne) - Commandline usage help text (GaryBlackbourne)
- More descriptive help dialogs when initial dependencies are missing - More descriptive help dialogs when initial dependencies are missing
## Fixed ### Fixed
- Script failing to start when remote endpoints are unavailable (GaryBlackbourne) - Script failing to start when remote endpoints are unavailable (GaryBlackbourne)
- Key stickiness when quickly navigating through entries in tables - Key stickiness when quickly navigating through entries in tables
- Servers returning malformed A2S_INFO blocking server browser from loading - Servers returning malformed A2S_INFO blocking server browser from loading
@@ -177,7 +178,7 @@
- Path discovery during first-time setup when parsing filepaths with whitespaces - Path discovery during first-time setup when parsing filepaths with whitespaces
- First-time setup dialog continuously triggering when DayZ install path had whitespaces in it - First-time setup dialog continuously triggering when DayZ install path had whitespaces in it
## Changed ### Changed
- Require Python 3.13 - Require Python 3.13
- Reduced global API cooldown from 60s to 30s - Reduced global API cooldown from 60s to 30s
- Clarify dialog messages when DayZ path could not be found - Clarify dialog messages when DayZ path could not be found
@@ -189,50 +190,50 @@
- Rewrote distance calculation module (GaryBlackbourne) - Rewrote distance calculation module (GaryBlackbourne)
- Changed preferred client setting from radio toggle to combobox - Changed preferred client setting from radio toggle to combobox
## Dropped ### Dropped
- Ping readout in statusbar - Ping readout in statusbar
- Extraneous information from right statusbar - Extraneous information from right statusbar
## [5.8.3] 2026-01-04 ## [5.8.3] 2026-01-04
## Fixed ### Fixed
- Normalize checksum numbers and dates - Normalize checksum numbers and dates
## [5.8.2] 2026-01-04 ## [5.8.2] 2026-01-04
## Fixed ### Fixed
- Fix regression in symlink routine introduced by previous hotfix - Fix regression in symlink routine introduced by previous hotfix
## [5.8.1] 2025-12-27 ## [5.8.1] 2025-12-27
## Fixed ### Fixed
- Path discovery during first-time setup when parsing filepaths with whitespaces - Path discovery during first-time setup when parsing filepaths with whitespaces
- First-time setup dialog continuously triggering when DayZ install path had whitespaces in it - First-time setup dialog continuously triggering when DayZ install path had whitespaces in it
## [5.8.0] 2025-07-06 ## [5.8.0] 2025-07-06
## Added ### Added
- Filter servers by official/unofficial status - Filter servers by official/unofficial status
- Automatically fetch geolocation records - Automatically fetch geolocation records
## Changed ### Changed
- Updated internal versioning of helper files - Updated internal versioning of helper files
## Fixed ### Fixed
- Corrected erroneous 2024 date in prior changelog entries - Corrected erroneous 2024 date in prior changelog entries
## [5.7.0] 2025-04-17 ## [5.7.0] 2025-04-17
## Added ### Added
- Save application dimensions when quitting and restore on subsequent boot - Save application dimensions when quitting and restore on subsequent boot
## Fixed ### Fixed
- Issues with the window exceeding the bounds of the screen when displaying some table contexts - Issues with the window exceeding the bounds of the screen when displaying some table contexts
## Changed ### Changed
- More direct server ping query method that should return marginally more accurate times - More direct server ping query method that should return marginally more accurate times
## [5.6.7] 2025-04-04 ## [5.6.7] 2025-04-04
## Dropped ### Dropped
- Removed extraneous pre-boot API checks that could cause error messages to be printed if the user had not set up an API key yet - Removed extraneous pre-boot API checks that could cause error messages to be printed if the user had not set up an API key yet
## [5.6.6] 2025-03-16 ## [5.6.6] 2025-03-16
## Changed ### Changed
- Update IP database records for 2025-03 - Update IP database records for 2025-03
## [5.6.5] 2025-03-04 ## [5.6.5] 2025-03-04
## Fixed ### Fixed
- Livonia server results being dropped from batch queries - Livonia server results being dropped from batch queries
## [5.6.4] 2025-02-10 ## [5.6.4] 2025-02-10
-1
View File
@@ -86,7 +86,6 @@ class WorkshopACF(ACF):
def __init__(self, file: Path) -> None: def __init__(self, file: Path) -> None:
super().__init__(file) super().__init__(file)
# TODO: break into workshop parser and generic acf parser
def unpack(self, d: dict, lines: list[Any] = []) -> str: def unpack(self, d: dict, lines: list[Any] = []) -> str:
t1 = "AppWorkshop" t1 = "AppWorkshop"
t2 = ("WorkshopItemsInstalled", "WorkshopItemDetails") t2 = ("WorkshopItemsInstalled", "WorkshopItemDetails")
+54 -5
View File
@@ -1,4 +1,5 @@
import logging import logging
import re
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from importlib import resources from importlib import resources
@@ -32,15 +33,63 @@ class Changelog(HelpMenuMixin, ScrollableMixin, Gtk.ScrolledWindow): # type: ig
# TODO: should long text be wrapped? # TODO: should long text be wrapped?
self.controller = controller self.controller = controller
formatted = format_pango(changelog) self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, margin_top=10)
self.changelog_label = Gtk.Label(valign=Gtk.Align.START, margin=15)
self.changelog_label.set_markup(formatted)
self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.box.add(self.changelog_label)
self.add(self.box) self.add(self.box)
self.connect("key-press-event", self._on_keypress) self.connect("key-press-event", self._on_keypress)
self.connect("key-press-event", self._on_esc_keypress) self.connect("key-press-event", self._on_esc_keypress)
changes = self._parse(changelog)
self._generate_nodes(changes)
self.show_all()
def grab_content_area(self) -> None: def grab_content_area(self) -> None:
self.grab_focus() self.grab_focus()
def _parse_version(self, version: str) -> tuple[str, str]:
pattern = r"(^##\s\[)(.+)(\] )(.+$)"
match = re.match(pattern, version)
if match:
version = match.group(2)
date = match.group(4)
return version, date
raise ValueError("Changelog parse error")
def _generate_nodes(self, releases: list[tuple[str, list[str]]]) -> None:
for header, changes in releases:
for ind in (0, -1):
if changes[ind] == "":
del changes[ind]
text = "\n".join(changes)
formatted = format_pango(text)
label = Gtk.Label(valign=Gtk.Align.START, margin=15, halign=Gtk.Align.START)
label.set_markup(formatted)
version, date = self._parse_version(header)
button_text = f"{version} ({date})"
button = Gtk.Button(label=button_text, margin_start=5)
expander = Gtk.Expander()
expander.set_label_widget(button)
expander.add(label)
self.box.add(expander)
def _parse(self, changelog: str) -> list[tuple[str, list[str]]]:
release = ""
releases: list[tuple[str, list[str]]] = []
release_notes: list[str] = []
for line in changelog.splitlines():
if line.startswith("# "):
continue
if line.startswith("## "):
if release != "":
releases.append((release, release_notes))
release_notes = []
release = ""
release = line
continue
release_notes.append(line.rstrip())
return releases
+2 -2
View File
@@ -4,7 +4,7 @@ description = "DayZ server browser and mod manager for Linux"
authors = [ authors = [
{name = "aclist"} {name = "aclist"}
] ]
version = "7.0.0b15" version = "7.0.0b16"
license = "GPL-3.0-or-later" license = "GPL-3.0-or-later"
license-files = ["LICENSE"] license-files = ["LICENSE"]
readme = "README.md" readme = "README.md"
@@ -76,7 +76,7 @@ build-backend = "setuptools.build_meta"
line-length = 88 line-length = 88
indent-width = 4 indent-width = 4
extend-exclude = ["*lib/a2s"] extend-exclude = ["*lib/a2s"]
lint.unfixable = ["F401"] lint.unfixable = ["F401", "I001"]
[tool.ruff.format] [tool.ruff.format]
quote-style = "double" quote-style = "double"
+1
View File
@@ -12,6 +12,7 @@ This file includes the combined licenses to the following components:
- psutil - psutil
- PyGObject - PyGObject
- python-a2s - python-a2s
- vdf
When shipped as a binary installer, these components are collectively bundled When shipped as a binary installer, these components are collectively bundled
as a turnkey application and used to run the DZGUI utility.\n\n as a turnkey application and used to run the DZGUI utility.\n\n
File renamed without changes.
File renamed without changes.
File renamed without changes.
+27 -13
View File
@@ -1,21 +1,22 @@
import pytest import pytest
from pathlib import Path from pathlib import Path
import dzgui.api.pefile as PeFile import dzgui.api.pefile as PeFile
from dzgui.api.steam import VDFLoadError, AppNotInstalledError, AppMovedError, get_app_path from dzgui.api.steam import (
VDFLoadError,
AppNotInstalledError,
AppMovedError,
get_app_path
)
from dzgui.config.query import get_config from dzgui.config.query import get_config
from dzgui.config.xdg import get_xdg_paths, parse_filepaths from dzgui.config.xdg import get_xdg_paths, parse_filepaths
from dzgui.const.constants import APPID_DAYZ from dzgui.const.constants import APPID_DAYZ, LIBRARYFOLDERS_PATH
from tests.fixtures import fixture_path from tests.fixtures import fixture_path
pytestmark = pytest.mark.pefile pytestmark = pytest.mark.apitest
@pytest.fixture
def second_drive():
return fixture_path("in_library_on_second_drive.vdf")
@pytest.fixture @pytest.fixture
@@ -26,6 +27,8 @@ def default_steam_path():
return conf["default_steam_path"] return conf["default_steam_path"]
# TODO: split into separate test file
# FIXME: use fixtures
def test_pefile_length(default_steam_path): def test_pefile_length(default_steam_path):
try: try:
pe_file_path = PeFile.get_pefile_path(Path(default_steam_path), APPID_DAYZ) pe_file_path = PeFile.get_pefile_path(Path(default_steam_path), APPID_DAYZ)
@@ -52,15 +55,26 @@ def test_invalid_pefile_path():
("malformed.vdf", VDFLoadError), ("malformed.vdf", VDFLoadError),
], ],
) )
def test_not_in_library(fixture, exception): def test_not_in_library(monkeypatch, fixture, exception):
fixture = fixture_path(fixture) import dzgui.api.steam as steam
monkeypatch.setattr(steam, "LIBRARYFOLDERS_PATH", fixture)
folder_path = Path(fixture_path("api"))
with pytest.raises(exception): with pytest.raises(exception):
try: try:
get_app_path(fixture, APPID_DAYZ) get_app_path(folder_path, APPID_DAYZ)
except Exception as e: except Exception as e:
raise e raise e
def test_on_second_drive(second_drive): @pytest.fixture
path = get_app_path(second_drive, APPID_DAYZ) def second_drive():
return "in_library_on_second_drive.vdf"
def test_on_second_drive(monkeypatch, second_drive):
import dzgui.api.steam as steam
monkeypatch.setattr(steam, "LIBRARYFOLDERS_PATH", second_drive)
folder_path = Path(fixture_path("api"))
path = get_app_path(folder_path, APPID_DAYZ)
assert path == Path("/tmp") assert path == Path("/tmp")