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