Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94d1b3fec4 | ||
|
|
4352ae1476 | ||
|
|
846e0b149b | ||
|
|
11ca4dbede | ||
|
|
1d8bdfe491 | ||
|
|
4f5a07822f | ||
|
|
67709dfda6 | ||
|
|
6753226087 | ||
|
|
a3671acf38 | ||
|
|
0aa773a0b3 | ||
|
|
adbc061d0b | ||
|
|
4deae63d43 | ||
|
|
b570006074 | ||
|
|
fd0d8d1adb | ||
|
|
78d5bd9bd5 | ||
|
|
091fd4ef38 | ||
|
|
656d6403fd | ||
|
|
db4c2aa930 | ||
|
|
8f72fd0fea |
2
NOTES.md
2
NOTES.md
@@ -5,5 +5,5 @@
|
|||||||
|
|
||||||
add a marker for "reboot required"
|
add a marker for "reboot required"
|
||||||
|
|
||||||
dummy22
|
dummy2233
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ GITEA_REPO="iKeyMon"
|
|||||||
# optional Sparkle feed helpers:
|
# optional Sparkle feed helpers:
|
||||||
# SPARKLE_EDDSA_KEY_FILE="$HOME/.config/Sparkle/iKeyMon.key"
|
# SPARKLE_EDDSA_KEY_FILE="$HOME/.config/Sparkle/iKeyMon.key"
|
||||||
# SPARKLE_DOWNLOAD_BASE_TEMPLATE="https://git.24unix.net/tracer/iKeyMon/releases/download/v{{VERSION}}"
|
# SPARKLE_DOWNLOAD_BASE_TEMPLATE="https://git.24unix.net/tracer/iKeyMon/releases/download/v{{VERSION}}"
|
||||||
|
# If you prefer SPARKLE_DOWNLOAD_BASE_URL, it will automatically append `/v<version>` for you.
|
||||||
# SPARKLE_APPCAST_OUTPUT="$ROOT_DIR/Sparkle/appcast.xml" # default
|
# SPARKLE_APPCAST_OUTPUT="$ROOT_DIR/Sparkle/appcast.xml" # default
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -65,8 +65,9 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct PHPInterpreter: Codable, Hashable, Identifiable, Equatable {
|
struct PHPInterpreter: Codable, Hashable, Identifiable, Equatable {
|
||||||
var id: String { versionFull }
|
var id: String { [fullVersion, path ?? ""].joined(separator: "|") }
|
||||||
let version: String
|
let version: String
|
||||||
|
let fullVersion: String
|
||||||
let path: String?
|
let path: String?
|
||||||
let configFile: String?
|
let configFile: String?
|
||||||
let extensions: [String]
|
let extensions: [String]
|
||||||
@@ -75,6 +76,7 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
|
|
||||||
init(
|
init(
|
||||||
version: String,
|
version: String,
|
||||||
|
fullVersion: String? = nil,
|
||||||
path: String? = nil,
|
path: String? = nil,
|
||||||
configFile: String? = nil,
|
configFile: String? = nil,
|
||||||
extensions: [String] = [],
|
extensions: [String] = [],
|
||||||
@@ -82,6 +84,7 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
maxExecutionTime: String? = nil
|
maxExecutionTime: String? = nil
|
||||||
) {
|
) {
|
||||||
self.version = version
|
self.version = version
|
||||||
|
self.fullVersion = fullVersion ?? version
|
||||||
self.path = path
|
self.path = path
|
||||||
self.configFile = configFile
|
self.configFile = configFile
|
||||||
self.extensions = extensions
|
self.extensions = extensions
|
||||||
@@ -89,8 +92,8 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
self.maxExecutionTime = maxExecutionTime
|
self.maxExecutionTime = maxExecutionTime
|
||||||
}
|
}
|
||||||
|
|
||||||
var versionFull: String {
|
var versionWithPath: String {
|
||||||
var components = [version]
|
var components = [fullVersion]
|
||||||
if let path, !path.isEmpty {
|
if let path, !path.isEmpty {
|
||||||
components.append(path)
|
components.append(path)
|
||||||
}
|
}
|
||||||
@@ -162,12 +165,18 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var formattedServerTime: String {
|
var formattedServerTime: String {
|
||||||
guard let date = ServerInfo.isoFormatter.date(from: serverTime) else {
|
let normalizedServerTime = ServerInfo.normalizedServerTime(serverTime)
|
||||||
return serverTime
|
|
||||||
}
|
if let date = ServerInfo.serverTimeParsers
|
||||||
|
.lazy
|
||||||
|
.compactMap({ $0.date(from: normalizedServerTime) })
|
||||||
|
.first {
|
||||||
return ServerInfo.displayFormatter.string(from: date)
|
return ServerInfo.displayFormatter.string(from: date)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return serverTime
|
||||||
|
}
|
||||||
|
|
||||||
var operatingSystemSummary: String? {
|
var operatingSystemSummary: String? {
|
||||||
guard let operatingSystem else { return nil }
|
guard let operatingSystem else { return nil }
|
||||||
let components = [
|
let components = [
|
||||||
@@ -181,19 +190,42 @@ struct ServerInfo: Codable, Hashable, Equatable {
|
|||||||
// MARK: - Helpers & Sample Data
|
// MARK: - Helpers & Sample Data
|
||||||
|
|
||||||
extension ServerInfo {
|
extension ServerInfo {
|
||||||
private static let isoFormatter: ISO8601DateFormatter = {
|
private static let serverTimeParsers: [ISO8601DateFormatter] = {
|
||||||
let formatter = ISO8601DateFormatter()
|
let withFractional = ISO8601DateFormatter()
|
||||||
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds, .withColonSeparatorInTimeZone]
|
withFractional.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
|
||||||
return formatter
|
|
||||||
|
let withoutFractional = ISO8601DateFormatter()
|
||||||
|
withoutFractional.formatOptions = [.withInternetDateTime]
|
||||||
|
|
||||||
|
let noColonTimeZone = ISO8601DateFormatter()
|
||||||
|
noColonTimeZone.formatOptions = [.withFullDate, .withTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]
|
||||||
|
|
||||||
|
return [withFractional, withoutFractional, noColonTimeZone]
|
||||||
}()
|
}()
|
||||||
|
|
||||||
private static let displayFormatter: DateFormatter = {
|
private static let displayFormatter: DateFormatter = {
|
||||||
let formatter = DateFormatter()
|
let formatter = DateFormatter()
|
||||||
|
formatter.locale = .autoupdatingCurrent
|
||||||
formatter.dateStyle = .medium
|
formatter.dateStyle = .medium
|
||||||
formatter.timeStyle = .medium
|
formatter.timeStyle = .medium
|
||||||
return formatter
|
return formatter
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private static func normalizedServerTime(_ value: String) -> String {
|
||||||
|
if value.range(of: #"[+-]\d{2}:\d{2}$"#, options: .regularExpression) != nil {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
guard value.range(of: #"[+-]\d{4}$"#, options: .regularExpression) != nil else {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
var normalized = value
|
||||||
|
let insertionIndex = normalized.index(normalized.endIndex, offsetBy: -2)
|
||||||
|
normalized.insert(":", at: insertionIndex)
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
static let placeholder = ServerInfo(
|
static let placeholder = ServerInfo(
|
||||||
hostname: "preview.example.com",
|
hostname: "preview.example.com",
|
||||||
ipAddresses: ["192.168.1.1", "fe80::1"],
|
ipAddresses: ["192.168.1.1", "fe80::1"],
|
||||||
|
|||||||
@@ -278,6 +278,7 @@ private extension APIv2_12 {
|
|||||||
|
|
||||||
struct AdditionalInterpreter: Decodable {
|
struct AdditionalInterpreter: Decodable {
|
||||||
let version: String
|
let version: String
|
||||||
|
let versionFull: String?
|
||||||
let path: String?
|
let path: String?
|
||||||
let configFile: String?
|
let configFile: String?
|
||||||
}
|
}
|
||||||
@@ -398,6 +399,7 @@ private extension APIv2_12 {
|
|||||||
additionalPHPInterpreters: additionalPhpInterpreters?.map {
|
additionalPHPInterpreters: additionalPhpInterpreters?.map {
|
||||||
ServerInfo.PHPInterpreter(
|
ServerInfo.PHPInterpreter(
|
||||||
version: $0.version,
|
version: $0.version,
|
||||||
|
fullVersion: $0.versionFull,
|
||||||
path: $0.path,
|
path: $0.path,
|
||||||
configFile: $0.configFile,
|
configFile: $0.configFile,
|
||||||
extensions: [],
|
extensions: [],
|
||||||
|
|||||||
@@ -278,6 +278,7 @@ private extension APIv2_13 {
|
|||||||
|
|
||||||
struct AdditionalInterpreter: Decodable {
|
struct AdditionalInterpreter: Decodable {
|
||||||
let version: String
|
let version: String
|
||||||
|
let versionFull: String?
|
||||||
let path: String?
|
let path: String?
|
||||||
let configFile: String?
|
let configFile: String?
|
||||||
}
|
}
|
||||||
@@ -398,6 +399,7 @@ private extension APIv2_13 {
|
|||||||
additionalPHPInterpreters: additionalPhpInterpreters?.map {
|
additionalPHPInterpreters: additionalPhpInterpreters?.map {
|
||||||
ServerInfo.PHPInterpreter(
|
ServerInfo.PHPInterpreter(
|
||||||
version: $0.version,
|
version: $0.version,
|
||||||
|
fullVersion: $0.versionFull,
|
||||||
path: $0.path,
|
path: $0.path,
|
||||||
configFile: $0.configFile,
|
configFile: $0.configFile,
|
||||||
extensions: [],
|
extensions: [],
|
||||||
|
|||||||
@@ -5,12 +5,6 @@
|
|||||||
// Created by tracer on 03.04.25.
|
// Created by tracer on 03.04.25.
|
||||||
//
|
//
|
||||||
|
|
||||||
//
|
|
||||||
// ResourcesBarRow.swift
|
|
||||||
// iKeyMon
|
|
||||||
//
|
|
||||||
// Created by tracer on 31.03.25.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
@@ -32,6 +26,8 @@ struct InfoCell: View {
|
|||||||
.font(monospaced ? .system(.body, design: .monospaced) : .body)
|
.font(monospaced ? .system(.body, design: .monospaced) : .body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if let subtext {
|
// if let subtext {
|
||||||
// Text(subtext)
|
// Text(subtext)
|
||||||
// .font(.caption)
|
// .font(.caption)
|
||||||
|
|||||||
@@ -106,7 +106,13 @@ struct GeneralView: View {
|
|||||||
if interpreters.isEmpty {
|
if interpreters.isEmpty {
|
||||||
return ["None"]
|
return ["None"]
|
||||||
}
|
}
|
||||||
return interpreters.map { $0.versionFull }
|
let versions = interpreters
|
||||||
|
.map { $0.fullVersion }
|
||||||
|
.filter { !$0.isEmpty }
|
||||||
|
if versions.isEmpty {
|
||||||
|
return ["None"]
|
||||||
|
}
|
||||||
|
return [versions.joined(separator: " • ")]
|
||||||
}(),
|
}(),
|
||||||
monospaced: true
|
monospaced: true
|
||||||
)
|
)
|
||||||
|
|||||||
40
Sparkle/appcast.xml
vendored
40
Sparkle/appcast.xml
vendored
@@ -1,30 +1,30 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
<rss xmlns:ns0="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>
|
<item>
|
||||||
<title>26.0.21</title>
|
<title>26.0.36</title>
|
||||||
<pubDate>Wed, 26 Nov 2025 18:44:41 +0100</pubDate>
|
<pubDate>Mon, 08 Dec 2025 18:45:16 +0100</pubDate>
|
||||||
<ns0:version>49</ns0:version>
|
<sparkle:version>75</sparkle:version>
|
||||||
<ns0:shortVersionString>26.0.21</ns0:shortVersionString>
|
<sparkle:shortVersionString>26.0.36</sparkle:shortVersionString>
|
||||||
<ns0:minimumSystemVersion>15.2</ns0:minimumSystemVersion>
|
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
||||||
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.21/iKeyMon-26.0.21.zip" length="4802995" type="application/octet-stream" ns0:edSignature="bYXN15YyKlSmHKNXPizEW2WrVXQSgD5XOgbtzOYNL+maG8DB/jZ08A+cYtGgqUeSRd+X6Z5Ue+Tpdn4/ewsFBw==" />
|
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.36/iKeyMon-26.0.36.zip" length="4813975" type="application/octet-stream" sparkle:edSignature="RvHYE1oDbjzYMWFcj9RVk7Nzq1k8CDKWY8CfTiKjrkY6r9pDR6KjFoHIimVfizN+JyaGcyUaaqzPlNqUsKx3DA=="/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>26.0.20</title>
|
<title>26.0.35</title>
|
||||||
<pubDate>Wed, 26 Nov 2025 18:36:41 +0100</pubDate>
|
<pubDate>Mon, 08 Dec 2025 18:37:47 +0100</pubDate>
|
||||||
<ns0:version>47</ns0:version>
|
<sparkle:version>73</sparkle:version>
|
||||||
<ns0:shortVersionString>26.0.20</ns0:shortVersionString>
|
<sparkle:shortVersionString>26.0.35</sparkle:shortVersionString>
|
||||||
<ns0:minimumSystemVersion>15.2</ns0:minimumSystemVersion>
|
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
||||||
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.20/iKeyMon-26.0.20.zip" length="4802865" type="application/octet-stream" ns0:edSignature="hCJu2I1Db/TaU6pCs1gZi9EO5igr49Fjt/VNnyD8+jm45WINuhzGc4lShcLPxUQTy4iNHnVhmOPYwlthVMXPAg==" />
|
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.35/iKeyMon-26.0.35.zip" length="4813406" type="application/octet-stream" sparkle:edSignature="alIJ2iC/hI4KOY59TMQl7WKXUbHbexVnALDJwq+wqSBJ4QOBwHj+5xc2JpBvNs1kbwgefU+kSNkeMqKFcBbNDQ=="/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>26.0.16</title>
|
<title>26.0.34</title>
|
||||||
<pubDate>Tue, 25 Nov 2025 18:34:19 +0100</pubDate>
|
<pubDate>Mon, 08 Dec 2025 18:27:07 +0100</pubDate>
|
||||||
<ns0:version>39</ns0:version>
|
<sparkle:version>71</sparkle:version>
|
||||||
<ns0:shortVersionString>26.0.16</ns0:shortVersionString>
|
<sparkle:shortVersionString>26.0.34</sparkle:shortVersionString>
|
||||||
<ns0:minimumSystemVersion>15.2</ns0:minimumSystemVersion>
|
<sparkle:minimumSystemVersion>15.2</sparkle:minimumSystemVersion>
|
||||||
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.16/iKeyMon-26.0.16.zip" length="4801351" type="application/octet-stream" ns0:edSignature="lbQEpxEElRxwyRdm0LQIxsnfh8o8Kt66wQlcl4PBs68lBmjkq0b/5EsVCElWQb0Nei/GCk6I/m2mSNL7mA3wBQ==" />
|
<enclosure url="https://git.24unix.net/tracer/iKeyMon/releases/download/v26.0.34/iKeyMon-26.0.34.zip" length="4813395" type="application/octet-stream" sparkle:edSignature="vZJsW6B0UgOqrK9XrsHqPRANveYpgzZdnLXbTUGXzyvwLkD8MIqNjjyfGMHe2E3f8zOmF2XKa4hrKNdrHwxPDQ=="/>
|
||||||
</item>
|
</item>
|
||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
@@ -3,9 +3,11 @@ 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}"
|
||||||
|
RELEASE_LOG="${RELEASE_LOG:-$ROOT_DIR/build/release.log}"
|
||||||
|
|
||||||
if [[ -n "${SKIP_RELEASE:-}" ]]; then
|
if [[ -n "${SKIP_RELEASE:-}" ]]; then
|
||||||
echo "⚙️ SKIP_RELEASE set — skipping automated release build."
|
echo "release: skipped (SKIP_RELEASE=1)"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -34,29 +36,49 @@ if [[ "$should_release" != true ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "🚀 Detected push to master — bumping version and building release..."
|
if [[ "$QUIET_RELEASE" == "1" ]]; then
|
||||||
|
mkdir -p "$(dirname "$RELEASE_LOG")"
|
||||||
|
: >"$RELEASE_LOG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
run_logged() {
|
||||||
|
if [[ "$QUIET_RELEASE" == "1" ]]; then
|
||||||
|
"$@" >>"$RELEASE_LOG" 2>&1
|
||||||
|
else
|
||||||
|
"$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "$QUIET_RELEASE" == "1" ]]; then
|
||||||
|
NEW_VERSION="$("$ROOT_DIR/scripts/bump_version.sh" 2>>"$RELEASE_LOG" | tee -a "$RELEASE_LOG")"
|
||||||
|
else
|
||||||
NEW_VERSION="$("$ROOT_DIR/scripts/bump_version.sh")"
|
NEW_VERSION="$("$ROOT_DIR/scripts/bump_version.sh")"
|
||||||
echo "🔢 marketing_version -> ${NEW_VERSION}"
|
fi
|
||||||
"$ROOT_DIR/scripts/sync_version.sh"
|
run_logged "$ROOT_DIR/scripts/sync_version.sh"
|
||||||
|
|
||||||
git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj"
|
git -C "$ROOT_DIR" add "$ROOT_DIR/version.json" "$ROOT_DIR/iKeyMon.xcodeproj/project.pbxproj"
|
||||||
|
|
||||||
"$ROOT_DIR/scripts/build_release.sh"
|
echo "release: building v${NEW_VERSION}..."
|
||||||
|
if ! run_logged "$ROOT_DIR/scripts/build_release.sh"; then
|
||||||
|
echo "release: failed (log: $RELEASE_LOG)"
|
||||||
|
exit 1
|
||||||
|
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 "⚠️ No release changes detected; skipping release commit."
|
echo "release: no changes detected; skipping commit"
|
||||||
else
|
else
|
||||||
git -C "$ROOT_DIR" commit -m "chore: release ${NEW_VERSION}"
|
run_logged git -C "$ROOT_DIR" commit -m "chore: release ${NEW_VERSION}" || {
|
||||||
echo "📝 Committed release ${NEW_VERSION}."
|
echo "release: commit failed (log: $RELEASE_LOG)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "📤 Pushing release commit..."
|
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 "$REMOTE_NAME" "${release_local_ref:-refs/heads/master}:${release_remote_ref:-refs/heads/master}"; then
|
echo "release: success v${NEW_VERSION}"
|
||||||
echo "✅ Release ${NEW_VERSION} pushed. Original push cancelled (already done)."
|
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "❌ Failed to push release ${NEW_VERSION}. Please resolve manually."
|
echo "release: push failed (log: $RELEASE_LOG)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -6,5 +6,7 @@
|
|||||||
<string>https://git.24unix.net/tracer/iKeyMon/raw/branch/master/Sparkle/appcast.xml</string>
|
<string>https://git.24unix.net/tracer/iKeyMon/raw/branch/master/Sparkle/appcast.xml</string>
|
||||||
<key>SUPublicEDKey</key>
|
<key>SUPublicEDKey</key>
|
||||||
<string>EgJgrOGQ79L5me616jA7kDCEOgx+Rg11uYLYLLIyzTI=</string>
|
<string>EgJgrOGQ79L5me616jA7kDCEOgx+Rg11uYLYLLIyzTI=</string>
|
||||||
|
<key>SUEnableInstallerLauncherService</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -4,9 +4,15 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.downloads.read-write</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.network.client</key>
|
<key>com.apple.security.network.client</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.security.automation.apple-events</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
5221016D2EE5E82700D04952 /* appcast.xml in Resources */ = {isa = PBXBuildFile; fileRef = 5221016B2EE5E82700D04952 /* appcast.xml */; };
|
||||||
52A9B79F2EC8E7EE004DD4A2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B7872EC8E7EE004DD4A2 /* Assets.xcassets */; };
|
52A9B79F2EC8E7EE004DD4A2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B7872EC8E7EE004DD4A2 /* Assets.xcassets */; };
|
||||||
52A9B8222EC8FA8A004DD4A2 /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B8212EC8FA8A004DD4A2 /* CHANGELOG.md */; };
|
52A9B8222EC8FA8A004DD4A2 /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B8212EC8FA8A004DD4A2 /* CHANGELOG.md */; };
|
||||||
52A9B9722ECF751C004DD4A2 /* signing.env.example in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B9712ECF751C004DD4A2 /* signing.env.example */; };
|
52A9B9722ECF751C004DD4A2 /* signing.env.example in Resources */ = {isa = PBXBuildFile; fileRef = 52A9B9712ECF751C004DD4A2 /* signing.env.example */; };
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
5203C24D2D997D2800576D4A /* iKeyMon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iKeyMon.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
5203C24D2D997D2800576D4A /* iKeyMon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iKeyMon.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
5221016B2EE5E82700D04952 /* appcast.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = appcast.xml; sourceTree = "<group>"; };
|
||||||
52A9B7872EC8E7EE004DD4A2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
52A9B7872EC8E7EE004DD4A2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
52A9B7882EC8E7EE004DD4A2 /* iKeyMon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = iKeyMon.entitlements; sourceTree = "<group>"; };
|
52A9B7882EC8E7EE004DD4A2 /* iKeyMon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = iKeyMon.entitlements; sourceTree = "<group>"; };
|
||||||
52A9B8212EC8FA8A004DD4A2 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
|
52A9B8212EC8FA8A004DD4A2 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
|
||||||
@@ -76,6 +78,7 @@
|
|||||||
52A9B9712ECF751C004DD4A2 /* signing.env.example */,
|
52A9B9712ECF751C004DD4A2 /* signing.env.example */,
|
||||||
52A9BEC92ED3874F004DD4A2 /* README.md */,
|
52A9BEC92ED3874F004DD4A2 /* README.md */,
|
||||||
52A9BD122ED37E08004DD4A2 /* Frameworks */,
|
52A9BD122ED37E08004DD4A2 /* Frameworks */,
|
||||||
|
5221016C2EE5E82700D04952 /* Sparkle */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -87,6 +90,14 @@
|
|||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5221016C2EE5E82700D04952 /* Sparkle */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5221016B2EE5E82700D04952 /* appcast.xml */,
|
||||||
|
);
|
||||||
|
path = Sparkle;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
52A9BD122ED37E08004DD4A2 /* Frameworks */ = {
|
52A9BD122ED37E08004DD4A2 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -166,6 +177,7 @@
|
|||||||
files = (
|
files = (
|
||||||
52A9B8222EC8FA8A004DD4A2 /* CHANGELOG.md in Resources */,
|
52A9B8222EC8FA8A004DD4A2 /* CHANGELOG.md in Resources */,
|
||||||
52A9BECA2ED3874F004DD4A2 /* README.md in Resources */,
|
52A9BECA2ED3874F004DD4A2 /* README.md in Resources */,
|
||||||
|
5221016D2EE5E82700D04952 /* appcast.xml in Resources */,
|
||||||
52A9B79F2EC8E7EE004DD4A2 /* Assets.xcassets in Resources */,
|
52A9B79F2EC8E7EE004DD4A2 /* Assets.xcassets in Resources */,
|
||||||
52A9B9722ECF751C004DD4A2 /* signing.env.example in Resources */,
|
52A9B9722ECF751C004DD4A2 /* signing.env.example in Resources */,
|
||||||
);
|
);
|
||||||
@@ -310,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 = 56;
|
CURRENT_PROJECT_VERSION = 75;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -325,7 +337,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 26.0.26;
|
MARKETING_VERSION = 26.0.36;
|
||||||
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;
|
||||||
@@ -341,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 = 56;
|
CURRENT_PROJECT_VERSION = 75;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
DEVELOPMENT_TEAM = Q5486ZVAFT;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -356,7 +368,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 26.0.26;
|
MARKETING_VERSION = 26.0.36;
|
||||||
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;
|
||||||
|
|||||||
@@ -32,8 +32,13 @@ generate_appcast() {
|
|||||||
local download_prefix=""
|
local download_prefix=""
|
||||||
if [[ -n "${SPARKLE_DOWNLOAD_BASE_TEMPLATE:-}" ]]; then
|
if [[ -n "${SPARKLE_DOWNLOAD_BASE_TEMPLATE:-}" ]]; then
|
||||||
download_prefix="${SPARKLE_DOWNLOAD_BASE_TEMPLATE//\{\{VERSION\}\}/$VERSION}"
|
download_prefix="${SPARKLE_DOWNLOAD_BASE_TEMPLATE//\{\{VERSION\}\}/$VERSION}"
|
||||||
else
|
elif [[ -n "${SPARKLE_DOWNLOAD_BASE_URL:-}" ]]; then
|
||||||
download_prefix="${SPARKLE_DOWNLOAD_BASE_URL:-}"
|
download_prefix="${SPARKLE_DOWNLOAD_BASE_URL%/}/v${VERSION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure the version segment is present to match Gitea's /download/vX.Y.Z/ layout.
|
||||||
|
if [[ -n "$download_prefix" ]] && [[ "$download_prefix" != *"/$VERSION"* ]]; then
|
||||||
|
download_prefix="${download_prefix%/}/v${VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z "$generator" || -z "${SPARKLE_EDDSA_KEY_FILE:-}" || -z "$download_prefix" ]]; then
|
if [[ -z "$generator" || -z "${SPARKLE_EDDSA_KEY_FILE:-}" || -z "$download_prefix" ]]; then
|
||||||
@@ -41,6 +46,9 @@ generate_appcast() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local sparkle_cache="$HOME/Library/Caches/Sparkle_generate_appcast"
|
||||||
|
rm -rf "$sparkle_cache"
|
||||||
|
|
||||||
local output="$SPARKLE_APPCAST_OUTPUT"
|
local output="$SPARKLE_APPCAST_OUTPUT"
|
||||||
mkdir -p "$(dirname "$output")"
|
mkdir -p "$(dirname "$output")"
|
||||||
local staging_dir
|
local staging_dir
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"marketing_version": "26.0.26"
|
"marketing_version": "26.0.36"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user