From 3c2afbe58646f9014e829b9d55fa662d41d5d399 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 10 Oct 2026 18:50:57 +0200 Subject: [PATCH 1/3] Add CI and release workflows, Marketplace publish manifest and listing assets - CI: build and test on every push to master and every pull request; the VSIX is kept as an artifact. - Release: on a vX.Y.Z tag, check that the tag matches the manifest, AssemblyInfo and package registration versions and that the CHANGELOG has a section for it, build, test, publish to the Visual Studio Marketplace with VsixPublisher (secret VS_MARKETPLACE_PAT) and create the GitHub release with the VSIX and the CHANGELOG section. Optional secret SNK_BASE64 restores Key.snk. Manual runs are dry runs. - publishManifest.json for the Marketplace (categories, overview from README). - 200x200 preview image and GettingStartedGuide link in the VSIX manifest. --- .github/workflows/ci.yml | 36 ++++++ .github/workflows/release.yml | 116 ++++++++++++++++++ CHANGELOG.txt | 2 + README.md | 2 +- .../Manifest/publishManifest.json | 13 ++ .../Manifest/source.extension.vsixmanifest | 1 + SourceControlSwitcher/Resources/Preview.png | Bin 3822 -> 14695 bytes 7 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 SourceControlSwitcher/Manifest/publishManifest.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..dc4eefb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build and test + runs-on: windows-latest + steps: + - uses: actions/checkout@v7 + + - uses: microsoft/setup-msbuild@v3 + + - name: Build + run: msbuild SourceControlSwitcher.slnx -restore -p:Configuration=Release -p:DeployExtension=false -v:minimal + + - name: Test + run: dotnet test SourceControlSwitcher.Tests/SourceControlSwitcher.Tests.csproj -c Release --no-build --logger "console;verbosity=normal" + + - name: Upload VSIX + uses: actions/upload-artifact@v7 + with: + name: SourceControlSwitcher-vsix + path: target/Release/SourceControlSwitcher.vsix + if-no-files-found: error diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..4f18d02 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,116 @@ +name: Release + +# Publishes a new version when a tag vX.Y.Z is pushed: +# 1. checks that the tag matches the version in the manifest, AssemblyInfo and package registration; +# 2. builds and tests; +# 3. publishes the VSIX to the Visual Studio Marketplace; +# 4. creates the GitHub release with the VSIX and the CHANGELOG section as notes. +# Run it manually (workflow_dispatch) for a dry run: steps 1-2 only, VSIX uploaded as an artifact. +# +# Secrets: +# VS_MARKETPLACE_PAT Azure DevOps personal access token, scope "Marketplace (Manage)", owned by an account +# that is a member of the "Ryadel" Marketplace publisher. Required to publish. +# SNK_BASE64 Optional: the strong-name key (Key.snk) encoded in base64. Without it the build +# generates a new key on every run. + +on: + push: + tags: ['v*.*.*'] + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: release + cancel-in-progress: false + +jobs: + release: + name: Build and publish + runs-on: windows-latest + # Protect the environment in Settings > Environments to require an approval before publishing. + environment: marketplace + env: + SNK_BASE64: ${{ secrets.SNK_BASE64 }} + PUBLISH: ${{ github.event_name == 'push' && github.ref_type == 'tag' }} + steps: + - uses: actions/checkout@v7 + + - uses: microsoft/setup-msbuild@v3 + + - name: Check version + id: version + shell: pwsh + run: | + [xml]$manifest = Get-Content 'SourceControlSwitcher/Manifest/source.extension.vsixmanifest' + $version = $manifest.PackageManifest.Metadata.Identity.Version + $assembly = (Select-String -Path 'SourceControlSwitcher/Properties/AssemblyInfo.cs' -Pattern 'AssemblyVersion\("([^"]+)"\)').Matches[0].Groups[1].Value + $registration = (Select-String -Path 'SourceControlSwitcher/SourceControlSwitcherPackage.cs' -Pattern 'InstalledProductRegistration\("#110", "#112", "([^"]+)"\)').Matches[0].Groups[1].Value + Write-Host "Manifest: $version AssemblyVersion: $assembly InstalledProductRegistration: $registration" + if ($assembly -ne "$version.0") { throw "AssemblyVersion $assembly does not match manifest version $version" } + if ($registration -ne $version) { throw "InstalledProductRegistration $registration does not match manifest version $version" } + if ($env:PUBLISH -eq 'true' -and $env:GITHUB_REF_NAME -ne "v$version") { throw "Tag $env:GITHUB_REF_NAME does not match manifest version v$version" } + if (-not (Select-String -Path 'CHANGELOG.txt' -SimpleMatch "SourceControlSwitcher - v$version" -Quiet)) { throw "CHANGELOG.txt has no section for v$version" } + "version=$version" >> $env:GITHUB_OUTPUT + + - name: Restore strong-name key + if: env.SNK_BASE64 != '' + shell: pwsh + run: '[IO.File]::WriteAllBytes("$PWD/Key.snk", [Convert]::FromBase64String($env:SNK_BASE64))' + + - name: Build + run: msbuild SourceControlSwitcher.slnx -restore -p:Configuration=Release -p:DeployExtension=false -v:minimal + + - name: Test + run: dotnet test SourceControlSwitcher.Tests/SourceControlSwitcher.Tests.csproj -c Release --no-build + + - name: Release notes from CHANGELOG + shell: pwsh + run: | + $lines = Get-Content 'CHANGELOG.txt' + $start = [Array]::FindIndex($lines, [Predicate[string]]{ param($l) $l -eq "SourceControlSwitcher - v${{ steps.version.outputs.version }}" }) + $end = [Array]::FindIndex($lines, $start + 1, [Predicate[string]]{ param($l) $l -like 'SourceControlSwitcher - v*' }) + if ($end -lt 0) { $end = $lines.Length } + $lines[($start + 2)..($end - 1)] | Set-Content -Encoding utf8 'release-notes.md' + Get-Content 'release-notes.md' + + - name: Upload VSIX + uses: actions/upload-artifact@v7 + with: + name: SourceControlSwitcher-${{ steps.version.outputs.version }}-vsix + path: target/Release/SourceControlSwitcher.vsix + if-no-files-found: error + + - name: Publish to the Visual Studio Marketplace + if: env.PUBLISH == 'true' + shell: pwsh + env: + VS_MARKETPLACE_PAT: ${{ secrets.VS_MARKETPLACE_PAT }} + run: | + if (-not $env:VS_MARKETPLACE_PAT) { throw 'Secret VS_MARKETPLACE_PAT is not set' } + # VsixPublisher ships with the Microsoft.VSSDK.BuildTools package restored by the build. + $publisher = Get-ChildItem "$env:USERPROFILE\.nuget\packages\microsoft.vssdk.buildtools" -Recurse -Filter VsixPublisher.exe | + Where-Object { $_.Directory.Name -eq 'bin' } | Sort-Object FullName -Descending | Select-Object -First 1 + if (-not $publisher) { throw 'VsixPublisher.exe not found' } + & $publisher.FullName publish ` + -payload 'target/Release/SourceControlSwitcher.vsix' ` + -publishManifest 'SourceControlSwitcher/Manifest/publishManifest.json' ` + -personalAccessToken $env:VS_MARKETPLACE_PAT + if ($LASTEXITCODE -ne 0) { throw "VsixPublisher failed with exit code $LASTEXITCODE" } + + - name: Create GitHub release + if: env.PUBLISH == 'true' + shell: pwsh + env: + GH_TOKEN: ${{ github.token }} + run: | + $tag = $env:GITHUB_REF_NAME + gh release view $tag *> $null + if ($LASTEXITCODE -eq 0) { + gh release upload $tag 'target/Release/SourceControlSwitcher.vsix' --clobber + } else { + gh release create $tag 'target/Release/SourceControlSwitcher.vsix' --verify-tag ` + --title "Source Control Switcher ${{ steps.version.outputs.version }}" --notes-file 'release-notes.md' + } + if ($LASTEXITCODE -ne 0) { throw "gh release failed with exit code $LASTEXITCODE" } diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 897963a..f212462 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -16,6 +16,8 @@ SourceControlSwitcher - v1.2.0 * Removed clients that are no longer maintained: Easy Git Integration Tools / Git Source Control Provider, VisualHG, VSHG, HgSccPackage (Mercurial support). * Solution migrated to .slnx; unit tests added. + * Marketplace listing: 200x200 preview image and Getting Started link. Builds, tests and releases now run + on GitHub Actions (CI on every push and pull request; tag vX.Y.Z publishes to the Marketplace). SourceControlSwitcher - v1.1.2 ------------------------------------------ diff --git a/README.md b/README.md index 592ca62..2582fc5 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Arm64). Users of Visual Studio 2015–2019 can keep using version 1.1.2. ## Building -See [BUILD.txt](BUILD.txt). +See [BUILD.txt](https://github.com/Ryadel/SourceControlSwitcher/blob/master/BUILD.txt). ## Credits diff --git a/SourceControlSwitcher/Manifest/publishManifest.json b/SourceControlSwitcher/Manifest/publishManifest.json new file mode 100644 index 0000000..bc67d78 --- /dev/null +++ b/SourceControlSwitcher/Manifest/publishManifest.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json.schemastore.org/vsix-publish", + "categories": [ "source control", "team development" ], + "identity": { + "internalName": "SourceControlSwitcher" + }, + "overview": "../../README.md", + "priceCategory": "free", + "publisher": "Ryadel", + "private": false, + "qna": true, + "repo": "https://github.com/Ryadel/SourceControlSwitcher" +} diff --git a/SourceControlSwitcher/Manifest/source.extension.vsixmanifest b/SourceControlSwitcher/Manifest/source.extension.vsixmanifest index 8454df5..4ff019d 100644 --- a/SourceControlSwitcher/Manifest/source.extension.vsixmanifest +++ b/SourceControlSwitcher/Manifest/source.extension.vsixmanifest @@ -6,6 +6,7 @@ Automatically sets the Source Control Provider according to the one used by the current Visual Studio solution: Git, Subversion, TFVC or Perforce. https://github.com/Ryadel/SourceControlSwitcher Resources\LICENSE.txt + https://github.com/Ryadel/SourceControlSwitcher#readme Resources\CHANGELOG.txt Resources\Icon.png Resources\Preview.png diff --git a/SourceControlSwitcher/Resources/Preview.png b/SourceControlSwitcher/Resources/Preview.png index d97944cf10ac5af67005d06264d600fe0f10e6b1..6b201c0ffc6e5dd55c68afe2df68d560ea35e65a 100644 GIT binary patch literal 14695 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 literal 3822 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 From 4fbaed03e5cb092633c0f04595ddb4d8951cc2df Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 10 Oct 2026 18:51:58 +0200 Subject: [PATCH 2/3] Render the icon and preview image from the vector logo --- SourceControlSwitcher/Resources/Icon.png | Bin 3822 -> 2795 bytes SourceControlSwitcher/Resources/Preview.png | Bin 14695 -> 4439 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/SourceControlSwitcher/Resources/Icon.png b/SourceControlSwitcher/Resources/Icon.png index d97944cf10ac5af67005d06264d600fe0f10e6b1..619eb474356cc8ca7e6bc4972b43a3e553619f6a 100644 GIT binary patch delta 2788 zcmVU5r!5703T`uPZ(k96s5E7K2ShvLZ1po>PsV4fCvwjO5%h^TCwz@eL-4p^VC#ofb<~^5SD$Y8dMdVWYdB~ zumwdzWhF0x4Jdm(nKRek53jwx_MI{QI6vv)uj^g3=Rar8oPRkp6M-!*jK|>>`yfON z5^?oTR9$f}LCC19p#FBFki`Pr$Z7OHmxBcaO!DFQP88)XfG!aQW0IV@lpy2?2DgmD z5a9)I;YJk2sr~9dmQ=4|U|K;=d51Kd4P2)`hzOi|H{kquQnmccZ2V3_*@_x0HQai4F8ZnO z_Ai6!Q0jYv+8$uW?K7QAeNRwb06N;IfREjN=R+cp!++YQRj4iiJ=Ei9zl%`bd@5D# zgM~4GpX7NLO!pyWe`T_0z6a25LTC7xZbXRT%D3hVVEVqw>$B_cVq!S^acb@xvt59n z=DlG$@QX$q{ABe?>`)gy?~5+i?-!;$WbZ%H*VyC~&P+T2(+bqkaA3=m`1W*jMSYt;EqV*kX{3H@%7$KAZgb3AqceH4@*0*Xo7{f>zrDhe% z1AnxtWqxnv5-{coJ;vG=<(Ap82yE?`K{m$#HW1O!f7MAfiPH)S(?u}G$%hsIP3JNl zij+Au43rlUg8ZW|(F)Goy${AbGz<*2y!gyr`-L2NHAT$R!xj)uhCD!^HDt9oJ#pW9 z96%LAj0I$|pge#ZN&o~^^4MasR4K$*VSm(tyKEF8`O}?y+D+Tw_x~&K2*4JDTa*C& zwd7fZ}YEt9M|ED{6T8@~5}KSi%w7=Dq+T zku(fI0pVcwW@t}9Eq~z3O?Le@aaN@DgMLAK(1pwgl({(h1-}39yf$K^kZ{Q54}V;_ z#m2YG>GC!*vzb80Ny8Aihtt}K_8q4LxDi$l+Sl2iX~ zfMN8CAT^&~p3fy#Fm3V(n`1j0E0rps`X)i#iq6=D(LNv9~hytgm+eKIQ$de{35t0ERC4y?1RN)Z zVlg)7-2|BV&;p&gYc!}_Uw?W9lZQlB{k33v8s3Ag$6*2VI4po3hXv5%umE}-7C?`~ z0_bsA06h*1pvSQ)fMn`;On7pG6to|)j6#AAqzbh&X%CQ5`PqU>(iVhtGSU_Kbn0LZ zmN1?Q-uL=%_e!aA{pyl2Fa{7g_0Omf^3?EKhfl*GMg)*d9ZSFydw)yQ!F=AZT?+nm zu=}P7&k#xgzTrVf%_YD*21FXJ97(4RkD^JM5`gO4qwu`rs>LV4v;#wMBjgbp-t)0x z0VI$7E?GKXm|cB)QGhG3eE4<8JAb07g|;}@qds9_ur;W`1K zhLTRCKS-BQw=A5-@_%gn4ufo^Y^ED-9TxQf-10k|0G^Pujb(S#GmZ&^I6zzk89p^!&{nD(V5`8(>;Se1Fq3SikluEL*xnKTb^E z!$jd8?y4($?K4b0w6KM)KY2G=emN5ZlydyTV63t_`UG|lZo>=T`BvR~FaP&CKD?B{ z)%-0O#YKO4265H{h~j=VWMC|@T($DuFKxq%Tb~d79TEv$S97=U&Ie<-dB@P%NuD0z zjnY%?0d%_8n}5Cm#tP)#lRE~ne%(`O7U~ZE_|D(Vc>_1Hkwyf55Lonh%x?*D`G@xW zG?eiP@*wnc;+yJs9f9zssd}qC3XpwZj6+6y^_A`V(G=Q~tPLlo621Vm`{$Ie6{yb- z+wvhSt;yH zpE+yd=Vocmpq~feIKT=tPNy<1le{g`siU@1vaxdG@f{gmJlbvSmEA- zDHXYARF?2_EruXb7!6N8r%En)G+OTd> zD2t#Y31oaCP*w085pZDG{$!P{VnK{gG<04-Y5UkAl`Y&0rv0FyUX5tK=2y@JrK4if z;Mv1=AxlY~W{!>tcV>`3cR-5c38cq^O4~cB%Jgm{gg!OQpG7S00*WcHM`#r)7F~0O z!Wh1c(Q^a!KEp*X38{~dV=LO|O9 literal 3822 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 diff --git a/SourceControlSwitcher/Resources/Preview.png b/SourceControlSwitcher/Resources/Preview.png index 6b201c0ffc6e5dd55c68afe2df68d560ea35e65a..a231e5a3cdef70c19901c83f63c436236e72d85f 100644 GIT binary patch literal 4439 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 From e350e7485347e049e33adc7347a40d51e89b090d Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 10 Oct 2026 18:54:49 +0200 Subject: [PATCH 3/3] Rewrite the README and keep a single icon - README: centered logo served from the repository, badges, sections on why, supported repositories, requirements, installation, how detection works, options, command, custom providers, troubleshooting, building and credits; absolute links so the Marketplace page works. - Remove Preview.png and the optional PreviewImage element: Icon.png is the only image (Visual Studio falls back to it in the extension details). --- CHANGELOG.txt | 2 +- README.md | 152 +++++++++++++----- .../Manifest/source.extension.vsixmanifest | 1 - SourceControlSwitcher/Resources/Preview.png | Bin 4439 -> 0 bytes .../SourceControlSwitcher.csproj | 4 - 5 files changed, 112 insertions(+), 47 deletions(-) delete mode 100644 SourceControlSwitcher/Resources/Preview.png diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f212462..ce31207 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -16,7 +16,7 @@ SourceControlSwitcher - v1.2.0 * Removed clients that are no longer maintained: Easy Git Integration Tools / Git Source Control Provider, VisualHG, VSHG, HgSccPackage (Mercurial support). * Solution migrated to .slnx; unit tests added. - * Marketplace listing: 200x200 preview image and Getting Started link. Builds, tests and releases now run + * Icon redrawn from the vector logo; Getting Started link in the extension details. Builds, tests and releases now run on GitHub Actions (CI on every push and pull request; tag vX.Y.Z publishes to the Marketplace). SourceControlSwitcher - v1.1.2 diff --git a/README.md b/README.md index 2582fc5..d9a0cb5 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,129 @@ -# Source Control Switcher +

+ Source Control Switcher +

-![Source Control Switcher Logo](https://www.ryadel.com/wp-content/uploads/2019/10/Source-Control-Switcher-logo-368x200.png) +

Source Control Switcher

-Visual Studio can only have one source control provider active at a time, and it does not pick one per -repository. **Source Control Switcher** does: when you open a solution or a folder, it detects which kind of -repository it belongs to and activates the matching source control provider. +

+ Automatically activates the right source control provider in Visual Studio for every solution you open. +

-| Repository | Detected by | Providers | +

+ Visual Studio Marketplace version + Installs + CI + License: MIT +

+ +--- + +## Why + +Visual Studio can have only **one** source control provider active at a time, and it does not choose one per +repository. If you work with Git in one solution and Subversion, TFVC or Perforce in another, you end up changing +*Tools > Options > Source Control > Plug-in Selection* by hand every time. + +**Source Control Switcher does it for you**: when a solution or folder opens, it detects which kind of repository +it belongs to and activates the matching provider. + +## Supported repositories + +| Repository | Detected by | Provider activated | |---|---|---| -| Git | a `.git` folder (or file, for worktrees and submodules) in the solution folder or a parent | Git (Microsoft Git provider, built into Visual Studio) | -| Subversion | a `.svn` folder in the solution folder or a parent | VisualSVN, AnkhSVN | -| Team Foundation Version Control | TFVC bindings in the `.sln` file, or a TFVC local workspace (`$tf`) | Visual Studio Team Foundation Server (built in) | -| Perforce | `p4 where` succeeds in the solution folder (only when `p4.exe` is on PATH) | P4VS | -| Anything else | a file or folder name you choose | any source control provider, by GUID | +| **Git** | a `.git` folder, or a `.git` file (worktrees, submodules), in the solution folder or a parent | Git (Microsoft Git provider, built into Visual Studio) | +| **Subversion** | a `.svn` folder in the solution folder or a parent | VisualSVN or AnkhSVN | +| **Team Foundation (TFVC)** | TFVC bindings in the `.sln`/`.slnx`, or a TFVC local workspace (`$tf`) | Visual Studio Team Foundation Server (built in) | +| **Perforce** | `p4 where` succeeds in the solution folder (only when `p4.exe` is on PATH) | P4VS | +| **Anything else** | a file or folder name you choose | any source control provider, by GUID | + +Works with solutions (`.sln`, `.slnx`) and with **Open Folder**. + +## Requirements + +- **Visual Studio 2022 or Visual Studio 2026**: Community, Professional or Enterprise, on x64 or Arm64. +- The source control client(s) you use: Git and TFVC are built into Visual Studio; for Subversion install + VisualSVN or AnkhSVN; for Perforce install P4VS. + +Still on Visual Studio 2015–2019? Use version 1.1.2. + +## Installation + +In Visual Studio: **Extensions > Manage Extensions**, search for *Source Control Switcher*, install and restart. +Alternatively, download it from the +[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Ryadel.SourceControlSwitcher) or +from the [GitHub releases](https://github.com/Ryadel/SourceControlSwitcher/releases). -The extension supports **Visual Studio 2022 and Visual Studio 2026** (Community, Professional, Enterprise; x64 and -Arm64). Users of Visual Studio 2015–2019 can keep using version 1.1.2. +That's it: there is nothing to configure for the common cases. + +## How it works + +When a solution or folder opens, the extension looks for repository markers starting from the solution folder and +moving up to the drive root. The nearest marker wins; at each folder level the order is: + +1. your custom markers (see [Custom providers](#custom-providers)); +2. TFVC bindings in the solution file (solution folder only); +3. `.git`, then `.svn`, then `$tf`. + +If nothing is found and Perforce detection is enabled, it asks the Perforce client in the background. When a +repository is found, the provider configured for it is activated; when nothing is found, the current provider is +left unchanged. ## Options -*Tools* > *Options* > *Source Control Switcher* > *General*: +**Tools > Options > Source Control Switcher > General** -- **General** - - *Switch automatically* — switch when a solution or folder opens. When off, switch on demand with - *Tools* > *Detect Source Control Provider*. - - *Show status bar notifications* — a status bar message whenever the provider changes. - - *Logging* — detail written to the *Source Control Switcher* pane of the Output window (Off, Normal, Verbose). -- **Providers** — for Git, Subversion, TFVC and Perforce: *Automatic* (first supported provider installed), a - specific provider, or *Disabled* (leave the provider alone for that repository type). -- **Detection** - - *Search parent folders* — look for markers in the solution folder and all its parents. - - *Detect TFVC bindings in .sln files*. - - *Detect Perforce* and *Perforce timeout (seconds)* — the Perforce check runs in the background. -- **Custom providers** — `marker=providerGuid` rules separated by `;`. When the marker (a file or folder name) - is found, the provider with that GUID is activated. Custom rules are checked before the built-in ones. +| Category | Option | Default | Description | +|---|---|---|---| +| General | Switch automatically | On | Switch when a solution or folder opens. When off, use the *Detect Source Control Provider* command. | +| General | Show status bar notifications | On | Show a message in the status bar when the provider changes. | +| General | Logging | Normal | Detail written to the *Source Control Switcher* pane of the Output window: Off, Normal, Verbose. | +| Providers | Git / Subversion / Team Foundation / Perforce | Automatic | *Automatic* picks the first supported provider installed; you can force a specific one, or choose *Disabled* to leave the provider alone for that repository type. | +| Detection | Search parent folders | On | Look for markers in the solution folder and all its parents. | +| Detection | Detect TFVC bindings in .sln files | On | Turn off for repositories migrated from TFVC that still carry old bindings. | +| Detection | Detect Perforce | On | Ask `p4 where` when no other marker is found (background, only if `p4.exe` is on PATH). | +| Detection | Perforce timeout (seconds) | 5 | Maximum wait for the Perforce client (1–60). | +| Custom providers | Custom providers | *(empty)* | `marker=providerGuid` rules, separated by `;`. | -## Commands +## Command -- *Tools* > *Detect Source Control Provider* — re-runs detection for the open solution or folder and activates the - matching provider, for example after changing the provider by hand. +**Tools > Detect Source Control Provider** runs the detection again for the open solution or folder and activates +the matching provider. Use it after changing the provider by hand, or to switch on demand with automatic switching +turned off. -## Building +## Custom providers -See [BUILD.txt](https://github.com/Ryadel/SourceControlSwitcher/blob/master/BUILD.txt). +For a source control client the extension does not know, add a rule mapping a marker to the client's +**provider GUID**, for example: -## Credits +```text +.vault=01234567-89ab-cdef-0123-456789abcdef +``` + +When `.vault` (a file or a folder) is found, that provider is activated. To find a provider's GUID, look for +`SourceControlProviders\{GUID}` in the `.pkgdef` files of the client's extension folder. -This extension is based on [SccAutoSwitcher](https://github.com/ceztko/SccAutoSwitcher) by *Francesco Pretto*. -Thanks to everyone who contributed fixes and ideas, including *QianMoXi* (start-up with a solution), -*joe-kr* (Visual Studio 2022 support, AnkhSVN 2019) and *davideciarmiello* (TFVC support). +## Troubleshooting + +Set **Logging** to *Verbose* and open **View > Output**, then pick *Source Control Switcher* in the +*Show output from* list: every detection step and its outcome is logged there. Messages are also written to the +Visual Studio activity log when Visual Studio is started with `/log`. + +Found a bug or have an idea? [Open an issue](https://github.com/Ryadel/SourceControlSwitcher/issues). + +## Building from source + +Open `SourceControlSwitcher.slnx` in Visual Studio 2022 (17.14+) or 2026 and build; press F5 to debug in the +experimental instance. Details in +[BUILD.txt](https://github.com/Ryadel/SourceControlSwitcher/blob/master/BUILD.txt). Release notes are in the +[CHANGELOG](https://github.com/Ryadel/SourceControlSwitcher/blob/master/CHANGELOG.txt). + +## Credits -License is MIT. +Based on [SccAutoSwitcher](https://github.com/ceztko/SccAutoSwitcher) by **Francesco Pretto**. +Thanks to everyone who contributed fixes and ideas, including **@QianMoXi** (start-up with a solution), +**@joe-kr** (Visual Studio 2022 support, AnkhSVN 2019) and **@davideciarmiello** (TFVC support). -## Useful References +## License - * [**Source Control Switcher** on GitHub](https://github.com/Ryadel/SourceControlSwitcher/) - * [**Source Control Switcher** on Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Ryadel.SourceControlSwitcher) - * [**Source Control Switcher** official page](https://www.ryadel.com/en/portfolio/source-control-switcher/) +[MIT](https://github.com/Ryadel/SourceControlSwitcher/blob/master/LICENSE.txt) — see also the +[official page](https://www.ryadel.com/en/portfolio/source-control-switcher/) on ryadel.com. diff --git a/SourceControlSwitcher/Manifest/source.extension.vsixmanifest b/SourceControlSwitcher/Manifest/source.extension.vsixmanifest index 4ff019d..b532720 100644 --- a/SourceControlSwitcher/Manifest/source.extension.vsixmanifest +++ b/SourceControlSwitcher/Manifest/source.extension.vsixmanifest @@ -9,7 +9,6 @@ https://github.com/Ryadel/SourceControlSwitcher#readme Resources\CHANGELOG.txt Resources\Icon.png - Resources\Preview.png Source Control, Source Code Control, Source Control Provider, Source Control Client, Git, SVN, Subversion, TFVC, Team Foundation, Perforce, Helix diff --git a/SourceControlSwitcher/Resources/Preview.png b/SourceControlSwitcher/Resources/Preview.png deleted file mode 100644 index a231e5a3cdef70c19901c83f63c436236e72d85f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4439 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 - - Always - true - Designer