Fixing MacOS build issue. Improving documentation.

This commit is contained in:
Rukira 2026-08-25 09:40:28 +01:00
parent cfd093af72
commit 616fd21872
4 changed files with 65 additions and 31 deletions

View file

@ -6,13 +6,13 @@ This guide provides step-by-step instructions for installing and running **WoW B
## Download
Download the appropriate installer for your platform from the **[GitHub Releases](https://github.com/rukira/wow-backup/releases)** page:
Download the appropriate installer for your platform from the **[latest release](https://git.asarius.site/rukira/wow-backup/releases)**:
| Platform | Package Format | Installer File Pattern |
|---|---|---|
|--------------------------|---|---|
| **macOS** | DMG Disk Image | `WoW Backup-<version>.dmg` |
| **Windows** | Windows Installer (MSI) | `WoW Backup-<version>.msi` |
| **Linux** | Debian Package (DEB) | `wow-backup_<version>_amd64.deb` |
| **Linux** (Experimental) | Debian Package (DEB) | `wow-backup_<version>_amd64.deb` |
---
@ -27,16 +27,10 @@ Download the appropriate installer for your platform from the **[GitHub Releases
Because WoW Backup is distributed without Apple Developer ID code-signing notarization, macOS Gatekeeper may show a warning on first launch (*"WoW Backup cannot be opened because the developer cannot be verified"* or *"Apple could not verify that WoW Backup is free of malware"*).
To launch the app for the first time:
- **Option A (Finder)**:
1. Open Finder and navigate to `/Applications`.
2. Right-click (or Control-click) on **WoW Backup.app** and choose **Open**.
3. In the security popup, click **Open**.
- **Option B (Terminal)**:
Run the following command in Terminal to clear the quarantine attribute:
```shell
xattr -d com.apple.quarantine "/Applications/WoW Backup.app"
```
1. Open **System Settings**
2. Navigate to **Security & Privacy**.
3. Click **Open Anyway** under **Allow apps downloaded from**.
4. Restart WoW Backup.
---
@ -68,17 +62,3 @@ If Windows Defender SmartScreen flags the installer (*"Windows protected your PC
```
3. Launch **WoW Backup** from your desktop application launcher or run `wowbackup` in the terminal.
---
## First-Time Setup & Overview
Once started, WoW Backup runs discreetly in the system tray / menu bar:
1. **Accessing Dashboard**: Click the tray icon in the macOS menu bar or Windows/Linux system tray to open the application window.
2. **Settings Configuration**:
- Navigate to **Settings** (gear icon).
- Set your **World of Warcraft Installation Folder** (e.g. `_retail_` or `_classic_`).
- Select your **Backup Destination Folder**.
- Set your preferred **Daily Backup Time**, **Retention Policy** (number of backups to keep), and **Compression Mode** (`ZIP` or folder replication).
- Optionally enable **Launch at Startup** so backups occur automatically without manual intervention.
3. **Lifecycle**: Closing the main window hides it to the tray while keeping the scheduler running. To quit the application completely, select **Quit** from the tray menu.

View file

@ -31,6 +31,9 @@ kotlin {
implementation(libs.logback.classic)
implementation(libs.material.kolor)
}
commonTest.dependencies {
implementation(kotlin("test"))
}
}
}
@ -72,6 +75,8 @@ compose.desktop {
packageName = "WoW Backup"
packageVersion = appVersion
modules("java.naming", "java.sql", "java.instrument", "jdk.unsupported")
macOS {
bundleID = "com.rukira.wowbackup"
iconFile.set(project.file("src/jvmMain/resources/icon.icns"))

View file

@ -12,7 +12,12 @@ import java.io.File
object LoggingSetup {
private var initialized = false
fun init() {
if (initialized) return
initialized = true
val logDir = AppDirectories.logsDir
val logFile = File(logDir, "wowbackup.log")
@ -26,7 +31,7 @@ object LoggingSetup {
val rollingPolicy = SizeAndTimeBasedRollingPolicy<ILoggingEvent>().apply {
this.context = context
fileNamePattern = "${logDir}/wowbackup.%d{yyyy-MM-dd}.%i.log.gz"
fileNamePattern = "${logDir.absolutePath}/wowbackup.%d{yyyy-MM-dd}.%i.log.gz"
setMaxFileSize(FileSize.valueOf("10MB"))
maxHistory = 30
setTotalSizeCap(FileSize.valueOf("100MB"))
@ -46,5 +51,10 @@ object LoggingSetup {
val rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME)
rootLogger.addAppender(fileAppender)
Thread.setDefaultUncaughtExceptionHandler { thread, throwable ->
val uncaughtLogger = LoggerFactory.getLogger("UncaughtExceptionHandler")
uncaughtLogger.error("Uncaught exception on thread [${thread.name}]", throwable)
}
}
}

View file

@ -0,0 +1,39 @@
package com.rukira.wowbackup.logging
import com.rukira.wowbackup.platform.AppDirectories
import io.github.oshai.kotlinlogging.KotlinLogging
import java.io.File
import kotlin.test.Test
import kotlin.test.assertTrue
class LoggingSetupTest {
private val testLogger = KotlinLogging.logger {}
@Test
fun testLoggingSetupInitializesAndWritesToFile() {
LoggingSetup.init()
val logsDir = AppDirectories.logsDir
assertTrue(logsDir.exists(), "Logs directory should exist")
assertTrue(logsDir.isDirectory, "Logs directory should be a directory")
val testMessage = "Test log entry for unit verification - ${System.currentTimeMillis()}"
testLogger.info { testMessage }
val logFile = File(logsDir, "wowbackup.log")
assertTrue(logFile.exists(), "wowbackup.log file should exist")
val content = logFile.readText()
assertTrue(content.contains(testMessage), "wowbackup.log should contain the logged message")
}
@Test
fun testAppDirectoriesLogsDir() {
val appDataDir = AppDirectories.appDataDir
val logsDir = AppDirectories.logsDir
assertTrue(logsDir.absolutePath.startsWith(appDataDir.absolutePath), "Logs dir should be inside app data dir")
assertTrue(logsDir.name == "logs", "Logs directory should be named 'logs'")
}
}