From 24c4a5a823630fafa1caefcf13c2fb7ae6436ddd Mon Sep 17 00:00:00 2001 From: Test Date: Tue, 3 Mar 2026 19:46:37 +0100 Subject: [PATCH] fix: display correct app version as build number in status bar - build.rs: remove unreliable git rev-list --count logic - lib.rs: parse build number from Tauri package version at runtime - Release version 0.20260303.281 -> 'b281' - Dev version 0.1.0 -> 'dev' - StatusBar.tsx: build number is clickable (triggers check for updates) - App.tsx: pass handleCheckForUpdates to StatusBar - Tests: unit tests for parse_build_label + StatusBar click behavior --- src-tauri/build.rs | 11 --------- src-tauri/src/lib.rs | 37 ++++++++++++++++++++++--------- src/App.tsx | 2 +- src/components/StatusBar.test.tsx | 12 ++++++++++ src/components/StatusBar.tsx | 13 +++++++++-- 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 18915739..d860e1e6 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,14 +1,3 @@ fn main() { - let count = std::process::Command::new("git") - .args(["rev-list", "--count", "HEAD"]) - .output() - .ok() - .filter(|o| o.status.success()) - .and_then(|o| String::from_utf8(o.stdout).ok()) - .map(|s| s.trim().to_string()) - .unwrap_or_else(|| "DEV".to_string()); - - println!("cargo:rustc-env=BUILD_NUMBER={}", count); - tauri_build::build() } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 09aa8fb3..b376c0c4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -116,9 +116,19 @@ fn git_commit(vault_path: String, message: String) -> Result { git::git_commit(&vault_path, &message) } +fn parse_build_label(version: &str) -> String { + let parts: Vec<&str> = version.split('.').collect(); + match parts.as_slice() { + [_, minor, patch] if minor.len() >= 6 => format!("b{}", patch), + [_, _, _] => "dev".to_string(), + _ => "b?".to_string(), + } +} + #[tauri::command] -fn get_build_number() -> String { - format!("b{}", env!("BUILD_NUMBER")) +fn get_build_number(app_handle: tauri::AppHandle) -> String { + let version = app_handle.package_info().version.to_string(); + parse_build_label(&version) } #[tauri::command] @@ -540,14 +550,21 @@ mod tests { } #[test] - fn get_build_number_returns_prefixed_value() { - let result = get_build_number(); - assert!( - result.starts_with('b'), - "expected 'b' prefix, got: {}", - result - ); - assert_ne!(result, "b0", "build number should not fall back to 0"); + fn parse_build_label_release_version() { + assert_eq!(parse_build_label("0.20260303.281"), "b281"); + assert_eq!(parse_build_label("0.20251215.42"), "b42"); + } + + #[test] + fn parse_build_label_dev_version() { + assert_eq!(parse_build_label("0.1.0"), "dev"); + assert_eq!(parse_build_label("0.0.0"), "dev"); + } + + #[test] + fn parse_build_label_malformed() { + assert_eq!(parse_build_label("invalid"), "b?"); + assert_eq!(parse_build_label(""), "b?"); } } diff --git a/src/App.tsx b/src/App.tsx index ba2010aa..4307717b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -450,7 +450,7 @@ function App() { - setSelection({ kind: 'filter', filter: 'changes' })} hasGitHub={!!settings.github_token} syncStatus={autoSync.syncStatus} lastSyncTime={autoSync.lastSyncTime} conflictCount={autoSync.conflictFiles.length} lastCommitInfo={autoSync.lastCommitInfo} onTriggerSync={autoSync.triggerSync} onOpenConflictResolver={handleOpenConflictResolver} zoomLevel={zoom.zoomLevel} onZoomReset={zoom.zoomReset} buildNumber={buildNumber} indexingProgress={indexing.progress} onRemoveVault={vaultSwitcher.removeVault} /> + setSelection({ kind: 'filter', filter: 'changes' })} hasGitHub={!!settings.github_token} syncStatus={autoSync.syncStatus} lastSyncTime={autoSync.lastSyncTime} conflictCount={autoSync.conflictFiles.length} lastCommitInfo={autoSync.lastCommitInfo} onTriggerSync={autoSync.triggerSync} onOpenConflictResolver={handleOpenConflictResolver} zoomLevel={zoom.zoomLevel} onZoomReset={zoom.zoomReset} buildNumber={buildNumber} onCheckForUpdates={handleCheckForUpdates} indexingProgress={indexing.progress} onRemoveVault={vaultSwitcher.removeVault} /> setToastMessage(null)} /> diff --git a/src/components/StatusBar.test.tsx b/src/components/StatusBar.test.tsx index d541d24b..f0757361 100644 --- a/src/components/StatusBar.test.tsx +++ b/src/components/StatusBar.test.tsx @@ -35,6 +35,18 @@ describe('StatusBar', () => { expect(screen.getByText('b?')).toBeInTheDocument() }) + it('calls onCheckForUpdates when clicking build number', () => { + const onCheckForUpdates = vi.fn() + render() + fireEvent.click(screen.getByTestId('status-build-number')) + expect(onCheckForUpdates).toHaveBeenCalledOnce() + }) + + it('build number has "Check for updates" title', () => { + render() + expect(screen.getByTitle('Check for updates')).toBeInTheDocument() + }) + it('does not display branch name', () => { render() expect(screen.queryByText('main')).not.toBeInTheDocument() diff --git a/src/components/StatusBar.tsx b/src/components/StatusBar.tsx index 8e4d7703..882275ae 100644 --- a/src/components/StatusBar.tsx +++ b/src/components/StatusBar.tsx @@ -30,6 +30,7 @@ interface StatusBarProps { zoomLevel?: number onZoomReset?: () => void buildNumber?: string + onCheckForUpdates?: () => void indexingProgress?: IndexingProgress onRemoveVault?: (path: string) => void } @@ -281,7 +282,7 @@ function PendingBadge({ count, onClick }: { count: number; onClick?: () => void ) } -export function StatusBar({ noteCount, modifiedCount = 0, vaultPath, vaults, onSwitchVault, onOpenSettings, onOpenLocalFolder, onConnectGitHub, onClickPending, hasGitHub, syncStatus = 'idle', lastSyncTime = null, conflictCount = 0, lastCommitInfo, onTriggerSync, onOpenConflictResolver, zoomLevel = 100, onZoomReset, buildNumber, indexingProgress, onRemoveVault }: StatusBarProps) { +export function StatusBar({ noteCount, modifiedCount = 0, vaultPath, vaults, onSwitchVault, onOpenSettings, onOpenLocalFolder, onConnectGitHub, onClickPending, hasGitHub, syncStatus = 'idle', lastSyncTime = null, conflictCount = 0, lastCommitInfo, onTriggerSync, onOpenConflictResolver, zoomLevel = 100, onZoomReset, buildNumber, onCheckForUpdates, indexingProgress, onRemoveVault }: StatusBarProps) { const [, setTick] = useState(0) useEffect(() => { const id = setInterval(() => setTick((t) => t + 1), 30_000) @@ -293,7 +294,15 @@ export function StatusBar({ noteCount, modifiedCount = 0, vaultPath, vaults, onS
| - {buildNumber ?? 'b?'} + { e.currentTarget.style.background = 'var(--hover)' } : undefined} + onMouseLeave={onCheckForUpdates ? (e) => { e.currentTarget.style.background = 'transparent' } : undefined} + >{buildNumber ?? 'b?'} | {lastCommitInfo && }