diff --git a/Coder-Desktop/Coder-Desktop/About.swift b/Coder-Desktop/Coder-Desktop/About.swift
index 8849c9b..902ef40 100644
--- a/Coder-Desktop/Coder-Desktop/About.swift
+++ b/Coder-Desktop/Coder-Desktop/About.swift
@@ -31,11 +31,18 @@ enum About {
return coder
}
+ private static var version: NSString {
+ let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
+ let commitHash = Bundle.main.infoDictionary?["CommitHash"] as? String ?? "Unknown"
+ return "Version \(version) - \(commitHash)" as NSString
+ }
+
@MainActor
static func open() {
appActivate()
NSApp.orderFrontStandardAboutPanel(options: [
.credits: credits,
+ .applicationVersion: version,
])
}
}
diff --git a/Coder-Desktop/Coder-Desktop/Info.plist b/Coder-Desktop/Coder-Desktop/Info.plist
index c1bf929..bb759f6 100644
--- a/Coder-Desktop/Coder-Desktop/Info.plist
+++ b/Coder-Desktop/Coder-Desktop/Info.plist
@@ -32,6 +32,8 @@
$(TeamIdentifierPrefix)com.coder.Coder-Desktop.VPN
SUPublicEDKey
- Ae2oQLTcx89/a73XrpOt+IVvqdo+fMTjo3UKEm77VdA=
+ Ae2oQLTcx89/a73XrpOt+IVvqdo+fMTjo3UKEm77VdA=
+ CommitHash
+ $(GIT_COMMIT_HASH)
diff --git a/Coder-Desktop/Coder-Desktop/State.swift b/Coder-Desktop/Coder-Desktop/State.swift
index 902d5a1..faf15e0 100644
--- a/Coder-Desktop/Coder-Desktop/State.swift
+++ b/Coder-Desktop/Coder-Desktop/State.swift
@@ -120,6 +120,7 @@ class AppState: ObservableObject {
_sessionToken = Published(initialValue: keychainGet(for: Keys.sessionToken))
if sessionToken == nil || sessionToken!.isEmpty == true {
clearSession()
+ return
}
client = Client(
url: baseAccessURL!,
diff --git a/Coder-Desktop/project.yml b/Coder-Desktop/project.yml
index 224add8..679afad 100644
--- a/Coder-Desktop/project.yml
+++ b/Coder-Desktop/project.yml
@@ -13,6 +13,7 @@ settings:
base:
MARKETING_VERSION: ${MARKETING_VERSION} # Sets the version number.
CURRENT_PROJECT_VERSION: ${CURRENT_PROJECT_VERSION} # Sets the build number.
+ GIT_COMMIT_HASH: ${GIT_COMMIT_HASH}
ALWAYS_SEARCH_USER_PATHS: NO
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS: YES
diff --git a/Makefile b/Makefile
index e50b060..4172f04 100644
--- a/Makefile
+++ b/Makefile
@@ -32,19 +32,29 @@ $(error MUTAGEN_VERSION must be a valid version)
endif
ifndef CURRENT_PROJECT_VERSION
-CURRENT_PROJECT_VERSION:=$(shell git describe --match 'v[0-9]*' --dirty='.devel' --always --tags)
+# Must be X.Y.Z[.N]
+CURRENT_PROJECT_VERSION:=$(shell ./scripts/version.sh)
endif
ifeq ($(strip $(CURRENT_PROJECT_VERSION)),)
$(error CURRENT_PROJECT_VERSION cannot be empty)
endif
ifndef MARKETING_VERSION
-MARKETING_VERSION:=$(shell git describe --match 'v[0-9]*' --tags --abbrev=0 | sed 's/^v//' | sed 's/-.*$$//')
+# Must be X.Y.Z
+MARKETING_VERSION:=$(shell ./scripts/version.sh --short)
endif
ifeq ($(strip $(MARKETING_VERSION)),)
$(error MARKETING_VERSION cannot be empty)
endif
+ifndef GIT_COMMIT_HASH
+# Must be a valid git commit hash
+GIT_COMMIT_HASH := $(shell ./scripts/version.sh --hash)
+endif
+ifeq ($(strip $(GIT_COMMIT_HASH)),)
+$(error GIT_COMMIT_HASH cannot be empty)
+endif
+
# Define the keychain file name first
KEYCHAIN_FILE := app-signing.keychain-db
# Use shell to get the absolute path only if the file exists
@@ -70,6 +80,7 @@ $(XCPROJECT): $(PROJECT)/project.yml
EXT_PROVISIONING_PROFILE_ID=${EXT_PROVISIONING_PROFILE_ID} \
CURRENT_PROJECT_VERSION=$(CURRENT_PROJECT_VERSION) \
MARKETING_VERSION=$(MARKETING_VERSION) \
+ GIT_COMMIT_HASH=$(GIT_COMMIT_HASH) \
xcodegen
$(PROJECT)/VPNLib/vpn.pb.swift: $(PROJECT)/VPNLib/vpn.proto
diff --git a/scripts/version.sh b/scripts/version.sh
new file mode 100755
index 0000000..602a800
--- /dev/null
+++ b/scripts/version.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+ echo "Usage: $0 [--short] [--hash]"
+ echo " --short Output a CFBundleShortVersionString compatible version (X.Y.Z)"
+ echo " --hash Output only the commit hash"
+ echo " -h, --help Display this help message"
+ echo ""
+ echo "With no flags, outputs: X.Y.Z[.N]"
+}
+
+SHORT=false
+HASH_ONLY=false
+
+while [[ "$#" -gt 0 ]]; do
+ case $1 in
+ --short)
+ SHORT=true
+ shift
+ ;;
+ --hash)
+ HASH_ONLY=true
+ shift
+ ;;
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ *)
+ echo "Unknown parameter passed: $1"
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+if [[ "$HASH_ONLY" == true ]]; then
+ current_hash=$(git rev-parse --short=7 HEAD)
+ echo "$current_hash"
+ exit 0
+fi
+
+describe_output=$(git describe --tags)
+
+# Of the form `vX.Y.Z-N-gHASH`
+if [[ $describe_output =~ ^v([0-9]+\.[0-9]+\.[0-9]+)(-([0-9]+)-g[a-f0-9]+)?$ ]]; then
+ version=${BASH_REMATCH[1]} # X.Y.Z
+ commits=${BASH_REMATCH[3]} # number of commits since tag
+
+ # If we're producing a short version string, or this is a release version
+ # (no commits since tag)
+ if [[ "$SHORT" == true ]] || [[ -z "$commits" ]]; then
+ echo "$version"
+ exit 0
+ fi
+
+ echo "${version}.${commits}"
+else
+ echo "Error: Could not parse git describe output: $describe_output" >&2
+ exit 1
+fi
\ No newline at end of file