All notable changes to Sven are documented here.
Format: Keep a Changelog Versioning: Semantic Versioning
- Repo history readability: Remove foreground color from server-only (S) commit decorations —
FileDecoration.colorwas coloring entire label text, making commits above BASE unreadable on dark themes - Remove
sven.decorator.serverColorsetting (no longer needed; S badge still appears without text color override)
- New test suites: 28 integration tests for real SVN operations
- Test helpers:
svnTestRepo.tsfor temp repo creation/teardown - Parser coverage: Real SVN output for info, status, log, blame parsers
- Scenarios: File lifecycle, changelists, branches, conflicts
- CI compatible: All tests run on GitHub CI (Ubuntu, Windows, macOS)
- Deflake Windows unit CI in legacy E2E suites by switching from
setup(...this.skip())to per-testtestIfReady(...)guards, preventing fixture access when suite preflight fails.
npx vitest run src/test/commands.test.ts src/test/repository.test.ts src/test/phase10.test.ts src/test/svn.test.ts src/test/svnFinder.test.ts$env:CI='true'; npm test
- Deflake legacy E2E suites on Windows CI by replacing
suiteSetup-only skip flow withsuiteReadygating incommands,repository,phase10, andsvnsuites. - Deflake
svnFinderE2E assertions by skipping binary-dependent tests whensvnis unavailable. - Deflake
remoteChangeServicecallback-error test by awaiting explicit second-poll signal with bounded timeout instead of fixed sleep.
npx vitest run src/test/commands.test.ts src/test/repository.test.ts src/test/phase10.test.ts src/test/svn.test.ts src/test/svnFinder.test.ts$env:CI='true'; npm test
- Fix CI-only unhandled rejection in
phase10suite by adding teardown settle delay before temp repo removal (Failed to execute svnfrom in-flight background status poll).
npx vitest run src/test/phase10.test.tsCI=true npm test
- Fix Linux/macOS
svnAuthCachecross-platform assertion flake by validating stable cache-dir suffix/absolute path instead of mocked-home prefix.
npx vitest run src/test/unit/services/svnAuthCache.test.tsCI=true npm test
- Fix cross-platform unit failures: use canonical SVN auth cache path (
auth/svn.simple) and reject Windows-absolute path forms invalidateFilePathon all platforms. - Harden SCM input-box setup to tolerate proposal-gated properties in stable VS Code hosts.
- Stabilize VS Code harness activation with explicit binary/command preflight checks and actionable spawn failures.
- Stabilize path/auth/svn-finder suites and narrow
.vscode-test.mjsto stable E2E targets. - Full local CI gate green:
npm run lint,npm run security:validate-errors,npm run build,CI=true npm test.
- Resolve TypeScript fail set in command, blame, security, and harness suites.
- Restore sinon stub compatibility for
child_process/fs.watchmocking under Vitest. - Make
npm testcross-platform by replacing POSIX-only CI shell check with Node runtime check.
- Full gate green:
npm run build:ts,npm run lint,npm test(1747/1747).
- Expand blame fail-cluster tests (
blameProvider) for lifecycle, event, mapping, and fallback branches. - Expand security sanitizer tests (debug timeout flow + sanitized error log extraction).
- Full unit suite green: 1747/1747 tests.
src/blame/blameProvider.ts: ~85% → ~96% lines.src/security/errorSanitizer.ts: ~37% → ~97% lines.- Global
src/**coverage increased to ~47-48% range.
- Harden validation against decoded path traversal and encoded URL path metacharacters.
- Support root-stripped XML shapes in diff/list parsers.
- Correct changelist repository resolution when
nullrepositories are returned.
- Modernize legacy Vitest suites to ESM-safe mocking and current command/parser behavior.
- Stabilize cross-platform/path-sensitive tests (ResourceGroupManager, add/addRemove, prompt, auth cache, svnRepository).
- Full unit suite green: 1709/1709 tests.
- Mock VS Code command registry now supports
thisArgbinding, matching realregisterCommandbehavior. SwitchBranchnow accepts relative branch paths from branch picker; absolute URLs still validated.- Base command resource selection now tolerates undefined entries instead of throwing.
- Modernize command e2e commit tests for staged/quick-commit flow.
- Add mock harness tests for config defaults, command binding, and
workspace.textDocumentstracking.
- Modernize legacy Mocha-style suites for Vitest (
vi.spyOnover ESM export reassignment) in checkout/ignore/open command tests. - Add Mocha-compat harness coverage (done callback,
this.timeout, sync+asyncthis.skip). - Expand VS Code test mock for command registry and missing workspace/window/scm APIs used by legacy suites.
- Increase unit test and hook timeout defaults for legacy suite parity (
60s).
- Consolidate shared command helpers across stage/unstage/revert/changelist/pull/copy-path/commit/reveal/property/lock flows to reduce duplication.
- Extract reusable command error utilities for more consistent command execution and error handling.
- Lock action ordering: Prioritize explicit lock actions before cleanup fallback to avoid incorrect lock handling.
- Lint script scope: Restrict lint scripts to TypeScript paths to avoid hangs on bundled JavaScript output.
- Add regression coverage for shared helper behavior.
- Add local agent and launch setup for contributor workflows.
- SCM context menu: "Diff with External Tool" now works from SCM Changes view
- File History highlight: Viewed revision now selected/highlighted when using "Open this revision"
- Broken command links: Fix all
command:svn.*→command:sven.*in walkthroughs and welcome messages - Welcome messages: File History pane now correctly describes auto-update behavior
- Version alignment: Align
@types/vscodewithengines.vscode(fixes CI packaging)
- Use standard markdown for development notice (Positron compatibility)
- Exclude
.vscodeignorefrom VSIX package (reduces package size) - Update README badges (CI status, marketplace downloads, license)
- Add active development notice to README
- LCS-based line mapping: Blame annotations now align with working copy content even when file is modified
- Previously, blame decorations appeared on wrong lines if local changes added/removed lines
- Uses Longest Common Subsequence algorithm to map BASE line numbers to working copy
- Deleted lines: Blame info hidden (no longer exists in working copy)
- Modified lines: Context anchoring preserves blame through content changes
- DRY: Extract
mapBlameLineNumber()helper (eliminates 4× duplicate code blocks) - DRY: Move date formatting to shared
util/formatting.ts - Performance: Add LCS index structures for O(1) lookups (vs O(n) array.find)
- SVN --limit bug: Text search filters (author/message/path) now search entire history
- Previously,
--limitrestricted commits searched, not results returned - If author had no commits in first 50, filter returned nothing
- Now: Search full history without limit, apply client-side truncation
- Document version tracking: Blame cache now validates against VS Code document version
- Previously, blame annotations showed stale line numbers after
svn updateor external changes - Now: Cache invalidates automatically when document version changes
- Bundle iconv-lite: Direct import instead of dynamic require from VS Code's node_modules
- Fixes "Missing dependency: iconv-lite" error in Theia IDE and other VS Code forks
- Increased throttle delay: 100ms → 300ms for file watcher events (3x reduction in callback overhead)
- Bulk operation guard: Skip file watcher during Update/SwitchBranch/Merge operations (zero watcher overhead during bulk ops)
- Engine downgrade: vscode ^1.104.0 for Antigravity IDE support
- Fixed config listener leak:
authConfigDisposablenow cleaned up on deactivation - Cache cleanup: Repository.dispose() clears needsLock/eol/mime/lock caches
- Narrowed file watcher: Changed from
**to**/.svn/{wc.db,entries}for repo discovery - Deduplicated code: Removed duplicate
getParentFolderStatus()in decorator (-13 lines)
- Auto-props:
getAutoProps(),setAutoProps(),removeAutoProps()now use generic property methods - Ignore patterns: New
modifyIgnorePatterns()helper for read-modify-write operations - Code organization: Added section comments for property method groups
- DRYer code: 11 property methods now share core
getProperty/setProperty/deleteProperty
- New private method:
executeProcess()handles auth, spawning, timeout, cancellation - Reduced duplication:
exec()andexecBuffer()now share core process logic - Line reduction: svn.ts reduced from 716 to 565 lines (-151 lines, -21%)
- New helpers in Command base:
filterResources(),toUris(),toPaths(),resourcesToPaths() - Reduced duplication: Stage, Unstage, Revert, Commit commands use shared helpers
- Type safety:
filterResources()uses type guard instead of unsafe cast
- SVN jargon mapped: EOL→"Line Ending", MIME→"File Type", Blame→"Annotations", Changelist→"Change Group"
- Ellipsis added: Dialog-opening commands now end with "..." (Merge..., Switch Branch..., Search History...)
- Consistent naming: "Set Line Ending Style (EOL)...", "Show Annotations (Blame)", "Go to Your Version (BASE)"
- Terminology module:
src/constants/terminology.tsprovides humanize() helper for consistent naming
- New command: "SVN: Show Terminology Help..." opens quick-pick with 12 glossary entries
- Core concepts: BASE, HEAD, PREV, Working Copy, Revision, Lock, Annotations (Blame)
- Searchable: matchOnDetail enabled - search by term or definition
- 2-step flow: File selection → Message input (with
conventionalCommits: false) - Step indicators: Added "(1/2)", "(2/2)" to QuickPick titles for clarity
- Settings-based: Pre-commit update controlled by
sven.commit.autoUpdate(not modals) - Inline validation: Empty message shows error in InputBox, not modal dialog
- New command: "SVN: Manage Properties..." opens quick-pick with 5 categories
- Categories: Line Endings (EOL), File Types (MIME), Auto-Properties, Ignore Patterns, Lock Settings
- Consolidates: 6+ property commands into single entry point
- New doc:
docs/DESIGN_SYSTEM.mddocuments visual patterns - Color palette: gitDecoration mappings, lock colors, revision badges
- Badge system: Single-char (A/M/D/C), dual-char (B/S), folder prefixes (📁A)
- Dialog patterns: When modal vs inline, QuickPick step indicators
- Terminology conventions: SVN jargon → user-friendly mappings
- Auth errors: "Clear Credentials" button for E170001, E215004
- Network errors: "Retry" button for E170013, E175002 (auto-retries operation)
- Lock conflicts: "Steal Lock" button for E200035 (file locked by other)
- Lock missing/expired: "Lock File" button for E200036, E200041
- Permission errors: "Show Output" button for E261001, E261002, E250006
- Error priority: Auth > Cleanup > Update > Conflict > Lock > Network > Output
- Commit message: Inline validation warning (yellow box) when empty, non-modal confirmation
- Resolve conflict: Non-modal confirmation instead of blocking modal
- Pre-commit conflicts: Non-modal warning instead of blocking modal
- First repo open: Shows "Quick Tour" / "Dismiss" prompt when user opens first SVN repository
- Walkthrough: Opens "Getting Started with SVN" walkthrough if user clicks "Quick Tour"
- Once per install: Uses globalState to show only once, not per session
- Set EOL Style: Set svn:eol-style (native/LF/CRLF/CR) on files/folders with recursive option
- Remove EOL Style: Remove svn:eol-style from files/folders
- Manage EOL Styles: View all files with eol-style, bulk change or clear
- Set MIME Type: Set svn:mime-type with auto-detection from file extension
- Remove MIME Type: Remove svn:mime-type from files
- Manage Auto-Props: Edit/view/remove svn:auto-props on repository root with default template
- Context menu: "Properties" submenu in Explorer and SCM views
- Explorer tooltips: Hover files to see eol-style and mime-type properties (e.g., "eol: native, mime: text/plain")
- Status bar: Shows
$(unlock) Nwhen N files have svn:needs-lock property - Click: Opens "Manage Needs-Lock" QuickPick to view/remove needs-lock files
- Removed: "L" badge from file decorations (moved to status bar for cleaner UI)
- New badge: "PM" for files with both content and property changes (was just "M")
- Consistent naming: Removed "with SVN" / "from SVN" suffixes (context is clear)
- Reorganized groups: Explorer menu items now align with SCM menu structure
- Removed: "Revert" from Explorer context (use SCM view - can't detect modified files in Explorer)
- Badge: "U" for untracked (file kept), "D" for deleted (file removed)
- Strikethrough: Only for truly deleted files
- Tooltip: "Untracked: Removed from SVN (file kept locally)" vs "Deleted: File will be removed"
- Renamed: "Remove" → "Untrack" for clearer intent (always keeps local files)
- Explorer: Right-click → "Untrack from SVN" in Explorer context menu
- Folders: Confirmation prompt before untracking folders recursively
- Ignore prompt: Offer to add to svn:ignore after untracking
- New: Watch files/folders for remote change notifications
- Commands: "Toggle Watch" and "Manage Watches" in Command Palette and context menu
- Status bar: Shows
$(eye) Nwhen watching N items - Notifications: Modal alert when watched files have remote changes
- Folder watch: Watching a folder includes all descendants
- Persistence: Watches stored in workspace state across restarts
- Auto-clear: Pending state cleared after running Update command
- Issue: Repeated
svn listcalls when viewing file history (5-6x for same file) - Fix: Cache stat() results for 1 minute with request deduplication
- Invalidation: Cache cleared on repository changes (commit/update)
- Impact: Significantly reduces redundant SVN commands
- New: Set
sven.diff.toolto"beyondcompare"for automatic CSV Table Compare - How: Extension auto-detects BC installation and generates wrapper script
- CSV: CSV files open in Table Compare view automatically
- Location: Script generated in extension's globalStorageUri
- Bug: Opening files outside workspace (e.g., Beyond Compare configs) caused SVN repo to disappear
- Root cause: BlameProvider ran SVN commands on external files → NotASvnRepository error → repo disposed
- Fix: Add
isDescendantchecks in BlameProvider before any SVN operations - Bonus: Re-assert context on editor switch (keeps SCM view visible)
- Root cause: Having old extension (svn-scm) installed alongside new one (sven) causes duplicate registrations
- Solution: Uninstall old extension
- Warnings: Downgrade SvnFileSystemProvider registration errors to warnings (graceful handling)
- New command:
SVN: Clear SVN Path Cache- clears cached SVN executable location
- New identity: Extension rebranded from "sven" to "Sven"
- New icon: Updated extension icon
- Command prefix: Changed from
svn.*tosven.* - Settings prefix: Changed from
svn.*tosven.*
For changes prior to v0.1.0 (the rebrand from svn-scm to Sven), see CHANGELOG_LEGACY.md.