Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8d6334d3b4 | |||
| dc8de5a4ea | |||
| 3510474764 | |||
| 9f42c68279 | |||
| 031781761c | |||
| 9413c23cc5 | |||
|
|
c8d3289a9b | ||
|
|
c063add947 | ||
|
|
610c569b83 |
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
30
Sparkle/appcast.xml
vendored
30
Sparkle/appcast.xml
vendored
@@ -3,28 +3,28 @@
|
|||||||
<channel>
|
<channel>
|
||||||
<title>iKeyMon</title>
|
<title>iKeyMon</title>
|
||||||
<item>
|
<item>
|
||||||
<title>26.1.2</title>
|
<title>26.1.5</title>
|
||||||
<pubDate>Sat, 03 Jan 2026 18:05:27 +0100</pubDate>
|
<pubDate>Sun, 19 Apr 2026 12:09:33 +0200</pubDate>
|
||||||
<sparkle:version>164</sparkle:version>
|
<sparkle:version>173</sparkle:version>
|
||||||
<sparkle:shortVersionString>26.1.2</sparkle:shortVersionString>
|
<sparkle:shortVersionString>26.1.5</sparkle:shortVersionString>
|
||||||
<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.5/iKeyMon-26.1.5.zip" length="3065231" type="application/octet-stream" sparkle:edSignature="HVV7iZ4eyJC1VMh2q4GUoAESZnk4HoFU00QlA9qM4X4dJAT5oBEVB55m4wuF4u9iVFAeohkB0vleLlV39mxrBA=="/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>26.1.1</title>
|
<title>26.1.3</title>
|
||||||
<pubDate>Sat, 03 Jan 2026 16:34:21 +0100</pubDate>
|
<pubDate>Sun, 19 Apr 2026 11:53:25 +0200</pubDate>
|
||||||
<sparkle:version>162</sparkle:version>
|
<sparkle:version>170</sparkle:version>
|
||||||
<sparkle:shortVersionString>26.1.1</sparkle:shortVersionString>
|
<sparkle:shortVersionString>26.1.4</sparkle:shortVersionString>
|
||||||
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
<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=="/>
|
<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>
|
||||||
<item>
|
<item>
|
||||||
<title>26.0.70</title>
|
<title>26.1.3</title>
|
||||||
<pubDate>Sat, 03 Jan 2026 15:49:42 +0100</pubDate>
|
<pubDate>Sat, 03 Jan 2026 18:17:26 +0100</pubDate>
|
||||||
<sparkle:version>154</sparkle:version>
|
<sparkle:version>167</sparkle:version>
|
||||||
<sparkle:shortVersionString>26.0.70</sparkle:shortVersionString>
|
<sparkle:shortVersionString>26.1.3</sparkle:shortVersionString>
|
||||||
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
<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=="/>
|
<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>
|
||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
@@ -4,13 +4,19 @@ 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)"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
head_subject="$(git -C "$ROOT_DIR" log -1 --pretty=%s 2>/dev/null || true)"
|
||||||
|
if [[ "$head_subject" =~ ^chore:\ release\ ]]; then
|
||||||
|
echo "release: skipped (HEAD is already a release commit)"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
should_release=false
|
should_release=false
|
||||||
release_local_ref=""
|
release_local_ref=""
|
||||||
release_remote_ref=""
|
release_remote_ref=""
|
||||||
@@ -67,7 +73,8 @@ fi
|
|||||||
git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj" "$ROOT_DIR/Sparkle/appcast.xml"
|
git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj" "$ROOT_DIR/Sparkle/appcast.xml"
|
||||||
|
|
||||||
if git -C "$ROOT_DIR" diff --cached --quiet; then
|
if git -C "$ROOT_DIR" diff --cached --quiet; then
|
||||||
echo "release: no changes detected; skipping commit"
|
echo "release: no changes detected; continuing push"
|
||||||
|
exit 0
|
||||||
else
|
else
|
||||||
run_logged git -C "$ROOT_DIR" commit -m "chore: release ${NEW_VERSION}" || {
|
run_logged git -C "$ROOT_DIR" commit -m "chore: release ${NEW_VERSION}" || {
|
||||||
echo "release: commit failed (log: $RELEASE_LOG)"
|
echo "release: commit failed (log: $RELEASE_LOG)"
|
||||||
@@ -75,10 +82,5 @@ 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
|
echo "release: created commit for v${NEW_VERSION}; run 'git push' again to push the new release commit"
|
||||||
echo "release: success v${NEW_VERSION}"
|
exit 1
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "release: push failed (log: $RELEASE_LOG)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -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 = 173;
|
||||||
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.5;
|
||||||
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 = 173;
|
||||||
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.5;
|
||||||
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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"marketing_version": "26.1.2"
|
"marketing_version": "26.1.5"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user