6 Commits

Author SHA1 Message Date
9f42c68279 chore: release 26.1.4 2026-04-19 11:59:17 +02:00
031781761c fix: preserve release logs during pre-push release 2026-04-19 11:46:11 +02:00
9413c23cc5 fixed color crash 2026-04-19 11:33:15 +02:00
Micha
c8d3289a9b chore: release 26.1.3 2026-01-03 18:17:27 +01:00
Micha
c063add947 docs: add 26.1.3 changelog entry 2026-01-03 18:14:32 +01:00
Micha
610c569b83 docs: add 26.1.2 changelog entry 2026-01-03 18:09:50 +01:00
8 changed files with 85 additions and 46 deletions

View File

@@ -1,6 +1,12 @@
# Changelog # Changelog
## 26.1.3
- Fixed version handling for changelogs.
## 26.1.2 (2025-01-03)
- Synced version.json to 26.1.2.
## 26.1.1 (2025-01-03) ## 26.1.1 (2025-01-03)
- Fixed changelog extraction in publish script. - Fixed changelog extraction in publish script.

View File

@@ -23,6 +23,7 @@ struct PreferencesView: View {
} }
} }
@EnvironmentObject private var sparkleUpdater: SparkleUpdater @EnvironmentObject private var sparkleUpdater: SparkleUpdater
@Environment(\.colorScheme) private var colorScheme
@AppStorage("pingInterval") private var storedPingInterval: Int = 10 @AppStorage("pingInterval") private var storedPingInterval: Int = 10
@AppStorage("refreshInterval") private var storedRefreshInterval: Int = 60 @AppStorage("refreshInterval") private var storedRefreshInterval: Int = 60
@@ -143,12 +144,39 @@ struct PreferencesView: View {
} }
private func backgroundColor(for tab: Tab) -> Color { private func backgroundColor(for tab: Tab) -> Color {
if selection == tab { if selection == tab {
return Color.accentColor return sidebarSelectionColor
} }
if hoveredTab == tab { if hoveredTab == tab {
return Color.accentColor.opacity(0.2) return sidebarHoverColor
}
return sidebarBaseColor
}
private var sidebarSelectionColor: Color {
switch colorScheme {
case .dark:
return Color(red: 0.22, green: 0.45, blue: 0.88)
default:
return Color(red: 0.10, green: 0.39, blue: 0.90)
}
}
private var sidebarHoverColor: Color {
switch colorScheme {
case .dark:
return Color(red: 0.20, green: 0.22, blue: 0.27)
default:
return Color(red: 0.87, green: 0.91, blue: 0.98)
}
}
private var sidebarBaseColor: Color {
switch colorScheme {
case .dark:
return Color(red: 0.15, green: 0.16, blue: 0.19)
default:
return Color(red: 0.96, green: 0.97, blue: 0.99)
} }
return Color.accentColor.opacity(0.08)
} }
} }

View File

@@ -17,6 +17,10 @@ import SwiftUI
struct ResourcesView: View { struct ResourcesView: View {
@Binding var server: Server @Binding var server: Server
private var displayInfo: ServerInfo {
server.info ?? .placeholder
}
var body: some View { var body: some View {
GeometryReader { geometry in GeometryReader { geometry in
ScrollView { ScrollView {
@@ -25,40 +29,40 @@ struct ResourcesView: View {
Text("CPU Load") Text("CPU Load")
} value: { } value: {
LoadBarCell( LoadBarCell(
percent: (server.info?.load.percent)!, percent: displayInfo.load.percent,
load1: (server.info?.load.minute1)!, load1: displayInfo.load.minute1,
load5: (server.info?.load.minute5)!, load5: displayInfo.load.minute5,
load15: (server.info?.load.minute15)! load15: displayInfo.load.minute15
) )
} }
TableRowView { TableRowView {
Text("Memory") Text("Memory")
} value: { } value: {
UsageBarCell( UsageBarCell(
free: (server.info?.memory.free)!, free: displayInfo.memory.free,
used: (server.info?.memory.used)!, used: displayInfo.memory.used,
total: (server.info?.memory.total)!, total: displayInfo.memory.total,
percent: (server.info?.memory.percent)! percent: displayInfo.memory.percent
) )
} }
TableRowView { TableRowView {
Text("Swap") Text("Swap")
} value: { } value: {
UsageBarCell( UsageBarCell(
free: (server.info?.swap.free)!, free: displayInfo.swap.free,
used: (server.info?.swap.used)!, used: displayInfo.swap.used,
total: (server.info?.swap.total)!, total: displayInfo.swap.total,
percent: (server.info?.swap.percent)! percent: displayInfo.swap.percent
) )
} }
TableRowView { TableRowView {
Text("SSD") Text("SSD")
} value: { } value: {
UsageBarCell( UsageBarCell(
free: (server.info?.diskSpace.free)!, free: displayInfo.diskSpace.free,
used: (server.info?.diskSpace.used)!, used: displayInfo.diskSpace.used,
total: (server.info?.diskSpace.total)!, total: displayInfo.diskSpace.total,
percent: (server.info?.diskSpace.percent)! percent: displayInfo.diskSpace.percent
) )
} }
} }

32
Sparkle/appcast.xml vendored
View File

@@ -2,6 +2,22 @@
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0"> <rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel> <channel>
<title>iKeyMon</title> <title>iKeyMon</title>
<item>
<title>26.1.3</title>
<pubDate>Sun, 19 Apr 2026 11:53:25 +0200</pubDate>
<sparkle:version>170</sparkle:version>
<sparkle:shortVersionString>26.1.4</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.1.4/iKeyMon-26.1.4.zip" length="3065263" type="application/octet-stream" sparkle:edSignature="kDxHy5KsxeCYz3N4aIEiZAFnqz6lLg4dHCLG6FL+j37xEpFmZM0lfHL2A15Jg936GeE+iGf6WrQJFInhHAvGDg=="/>
</item>
<item>
<title>26.1.3</title>
<pubDate>Sat, 03 Jan 2026 18:17:26 +0100</pubDate>
<sparkle:version>167</sparkle:version>
<sparkle:shortVersionString>26.1.3</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.1.3/iKeyMon-26.1.3.zip" length="3007204" type="application/octet-stream" sparkle:edSignature="u8a/cDZFPV0a21y+1q7HpZjQQv8r7GtlrHqyinDtgI6jI5Sv5q26x0sTagPrmrwwydIj3hWFmHN/iYp/PomaCw=="/>
</item>
<item> <item>
<title>26.1.2</title> <title>26.1.2</title>
<pubDate>Sat, 03 Jan 2026 18:05:27 +0100</pubDate> <pubDate>Sat, 03 Jan 2026 18:05:27 +0100</pubDate>
@@ -10,21 +26,5 @@
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion> <sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.1.2/iKeyMon-26.1.2.zip" length="3007173" type="application/octet-stream" sparkle:edSignature="CiNeGZ9h4WtI/ZOW371EAEKGK0vWdu1VhBk5ewh2hoq+4C8R9DbnQvDyHvwFy4wh6VpLahp/mXr4gV5alEIRCw=="/> <enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.1.2/iKeyMon-26.1.2.zip" length="3007173" type="application/octet-stream" sparkle:edSignature="CiNeGZ9h4WtI/ZOW371EAEKGK0vWdu1VhBk5ewh2hoq+4C8R9DbnQvDyHvwFy4wh6VpLahp/mXr4gV5alEIRCw=="/>
</item> </item>
<item>
<title>26.1.1</title>
<pubDate>Sat, 03 Jan 2026 16:34:21 +0100</pubDate>
<sparkle:version>162</sparkle:version>
<sparkle:shortVersionString>26.1.1</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.1.1/iKeyMon-26.1.1.zip" length="3007145" type="application/octet-stream" sparkle:edSignature="iIRDl2//fBGMkI0AwE5PzSOZO5fowONqEx/6EH3SLnWxj6LC0LQh+SifVAwpf4g5/zPEMXNrLl+CZB7LEz/HCw=="/>
</item>
<item>
<title>26.0.70</title>
<pubDate>Sat, 03 Jan 2026 15:49:42 +0100</pubDate>
<sparkle:version>154</sparkle:version>
<sparkle:shortVersionString>26.0.70</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.70/iKeyMon-26.0.70.zip" length="3007098" type="application/octet-stream" sparkle:edSignature="XZA2xs40EZnexsv/DvzjiH2yiQACqlU+KSDFGqFQTgCTFEPxg6w/qx1cuolgHD3kQJm/svRTNYRR4OVYt9UQBA=="/>
</item>
</channel> </channel>
</rss> </rss>

View File

@@ -4,7 +4,7 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REMOTE_NAME="${1:-origin}" REMOTE_NAME="${1:-origin}"
QUIET_RELEASE="${QUIET_RELEASE:-1}" QUIET_RELEASE="${QUIET_RELEASE:-1}"
RELEASE_LOG="${RELEASE_LOG:-$ROOT_DIR/build/release.log}" RELEASE_LOG="${RELEASE_LOG:-$ROOT_DIR/.git/release.log}"
if [[ -n "${SKIP_RELEASE:-}" ]]; then if [[ -n "${SKIP_RELEASE:-}" ]]; then
echo "release: skipped (SKIP_RELEASE=1)" echo "release: skipped (SKIP_RELEASE=1)"
@@ -76,7 +76,7 @@ else
fi fi
if SKIP_RELEASE=1 git -C "$ROOT_DIR" push --quiet "$REMOTE_NAME" "${release_local_ref:-refs/heads/master}:${release_remote_ref:-refs/heads/master}"; then if SKIP_RELEASE=1 git -C "$ROOT_DIR" push --quiet "$REMOTE_NAME" "${release_local_ref:-refs/heads/master}:${release_remote_ref:-refs/heads/master}"; then
echo "release: success v${NEW_VERSION}" echo "release: success v${NEW_VERSION} (release commit already pushed; stopping original push)"
exit 1 exit 1
else else
echo "release: push failed (log: $RELEASE_LOG)" echo "release: push failed (log: $RELEASE_LOG)"

View File

@@ -322,7 +322,7 @@
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements; CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\""; DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
DEVELOPMENT_TEAM = Q5486ZVAFT; DEVELOPMENT_TEAM = Q5486ZVAFT;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
@@ -337,7 +337,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 26.1.2; MARKETING_VERSION = 26.1.4;
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon; PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
@@ -353,7 +353,7 @@
CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements; CODE_SIGN_ENTITLEMENTS = iKeyMon.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\""; DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
DEVELOPMENT_TEAM = Q5486ZVAFT; DEVELOPMENT_TEAM = Q5486ZVAFT;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
@@ -368,7 +368,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 26.1.2; MARKETING_VERSION = 26.1.4;
PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon; PRODUCT_BUNDLE_IDENTIFIER = net.24unix.iKeyMon;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;

View File

@@ -3,6 +3,7 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BUILD_DIR="$ROOT_DIR/build" BUILD_DIR="$ROOT_DIR/build"
DERIVED_DATA_DIR="$BUILD_DIR/derived-data"
ARTIFACTS_DIR="$ROOT_DIR/dist" ARTIFACTS_DIR="$ROOT_DIR/dist"
SCHEME="iKeyMon" SCHEME="iKeyMon"
PROJECT="iKeyMon.xcodeproj" PROJECT="iKeyMon.xcodeproj"
@@ -141,18 +142,18 @@ export SPARKLE_APPCAST_OUTPUT
"$ROOT_DIR/scripts/sync_version.sh" "$ROOT_DIR/scripts/sync_version.sh"
rm -rf "$BUILD_DIR" "$ARTIFACTS_DIR" rm -rf "$DERIVED_DATA_DIR" "$ARTIFACTS_DIR"
mkdir -p "$ARTIFACTS_DIR" mkdir -p "$BUILD_DIR" "$ARTIFACTS_DIR"
xcodebuild \ xcodebuild \
-project "$ROOT_DIR/$PROJECT" \ -project "$ROOT_DIR/$PROJECT" \
-scheme "$SCHEME" \ -scheme "$SCHEME" \
-configuration Release \ -configuration Release \
-derivedDataPath "$BUILD_DIR" \ -derivedDataPath "$DERIVED_DATA_DIR" \
CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_ALLOWED=NO \
clean build clean build
APP_PATH="$BUILD_DIR/Build/Products/Release/iKeyMon.app" APP_PATH="$DERIVED_DATA_DIR/Build/Products/Release/iKeyMon.app"
if [[ ! -d "$APP_PATH" ]]; then if [[ ! -d "$APP_PATH" ]]; then
echo "❌ Failed to find built app at $APP_PATH" echo "❌ Failed to find built app at $APP_PATH"
exit 1 exit 1

View File

@@ -1,3 +1,3 @@
{ {
"marketing_version": "26.1.2" "marketing_version": "26.1.4"
} }