Here are some functions for setting Visual Studio Merge tools via the registry.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Windows Registry Editor Version 5.00 | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl] | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl\Checkin Policies] | |
"Microsoft.TeamFoundation.Build.Controls"="C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\\\Common7\\IDE\\PrivateAssemblies\\Microsoft.TeamFoundation.Build.Controls.dll" | |
"Microsoft.TeamFoundation.VersionControl.Controls"="C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\\\Common7\\IDE\\PrivateAssemblies\\Microsoft.TeamFoundation.VersionControl.Controls.dll" | |
"StanPolicy"="C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Team Tools\\Static Analysis Tools\\StanPolicy.dll" | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl\DiffTools] | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl\DiffTools\.*] | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl\DiffTools\.*\Compare] | |
"Arguments"="" | |
"Command"="Microsoft.VisualStudio.TeamFoundation.VersionControl, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" | |
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\TeamFoundation\SourceControl\DiffTools\.*\Merge] | |
"Arguments"="" | |
"Command"="Microsoft.VisualStudio.TeamFoundation.VersionControl, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add-Type -TypeDefinition @" | |
namespace JustAProgrammer.DevEnv { | |
[System.Flags] | |
public enum VisualStudioVersion : short { | |
//VisualStudio2005 = 0x01, | |
VisualStudio2008 = 0x02, | |
VisualStudio2010 = 0x04, | |
VisualStudio2012 = 0x08, | |
All = VisualStudio2008 | VisualStudio2010 | VisualStudio2012 | |
} | |
public enum MergeTools : short { | |
BuiltIn, | |
WinMerge, | |
KDiff3, | |
SemanticMerge, | |
BeyondCompare, | |
BeyondComparePro | |
} | |
public class MergeToolInfo { | |
public string Command { get; set; } | |
public string CompareArgs { get; set; } | |
public string MergeArgs { get; set; } | |
} | |
} | |
"@ | |
$visualStudioRootNode = 'HKCU:\SOFTWARE\Microsoft\VisualStudio' | |
$diffToolsSubNode = 'TeamFoundation\SourceControl\DiffTools\.*' | |
$compareSubNode = "$($diffToolsSubNode)\Compare" | |
$mergeSubNode = "$($diffToolsSubNode)\Merge" | |
$mergeToolTestPaths = New-Object 'System.Collections.Generic.Dictionary[JustAProgrammer.DevEnv.MergeTools,string]' | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::KDiff3] = 'HKLM:\SOFTWARE\KDiff3\diff-ext' | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::WinMerge] = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\WinMerge_is1' | |
if ([System.IntPtr]::Size -eq 4) { | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::WinMerge] = ` | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::WinMerge].Replace('\Wow6432Node', '') | |
} | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::SemanticMerge] = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\SemanticMerge' | |
$mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::BeyondCompare] = 'HKLM:\SOFTWARE\Wow6432Node\Scooter Software\Beyond Compare' | |
# Thanks to Naeem Khedaron for these settings http://blog.khedan.com/2009/12/setting-up-and-using-kdiff-in-visual.html | |
$mergeTools = New-Object 'System.Collections.Generic.Dictionary[JustAProgrammer.DevEnv.MergeTools, JustAProgrammer.DevEnv.MergeToolInfo]' | |
if (Test-Path $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::WinMerge]) { | |
$mergeTools[[JustAProgrammer.DevEnv.MergeTools]::WinMerge] = New-Object JustAProgrammer.DevEnv.MergeToolInfo -Property @{ | |
Command = Join-Path (Get-ItemProperty $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::WinMerge] 'InstallLocation').InstallLocation 'WinMergeU.exe'; | |
CompareArgs = '/x /e /ub /wl /dl %6 /dr %7 %1 %2'; | |
MergeArgs = '/x /e /ub /wl /dl %6 /dr %7 %1 %2 %4'; | |
} | |
} | |
# Thanks to Rory Primrose for these settings http://www.neovolve.com/post/2007/06/19/using-winmerge-with-tfs.aspx | |
if (Test-Path $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::KDiff3]) { | |
$mergeTools[[JustAProgrammer.DevEnv.MergeTools]::KDiff3] = New-Object JustAProgrammer.DevEnv.MergeToolInfo -Property @{ | |
Command = (Get-ItemProperty $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::KDiff3] 'diffcommand').diffcommand; | |
CompareArgs = '%1 --fname %6 %2 --fname %7'; | |
MergeArgs = '%3 --fname %8 %2 --fname %7 %1 --fname %6 -o %4'; | |
} | |
} | |
# Settings from here: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDIQFjAA&url=http%3A%2F%2Fwww.semanticmerge.com%2Fdocuments%2FSemanticMerge-TFS.pdf&ei=xeJ_UaSnEerI0gGVyoHoDg&usg=AFQjCNGehcC4jVaM4d5IYoqkvTMRcU_rEA&sig2=2-9S5BF7cnYKkSLCwRMNcQ&bvm=bv.45645796,d.dmQ | |
if (Test-Path $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::SemanticMerge]) { | |
$mergeTools[[JustAProgrammer.DevEnv.MergeTools]::SemanticMerge] = New-Object JustAProgrammer.DevEnv.MergeToolInfo -Property @{ | |
Command = Join-Path (Get-ItemProperty $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::SemanticMerge] 'InstallLocation').InstallLocation 'semanticmergetool.exe'; | |
CompareArgs = '-s=%1 -d=%2'; | |
MergeArgs = '-s=%1 -d=%2 -b=%3 -r=%4 -sn=%6 -dn=%7 -bn=%8 -emt=default -edt=default'; | |
} | |
} | |
# Settings from here: http://www.scootersoftware.com/support.php?zz=kb_vcs#tfs | |
if (Test-Path $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::BeyondCompare]) { | |
$mergeTools[[JustAProgrammer.DevEnv.MergeTools]::BeyondCompare] = New-Object JustAProgrammer.DevEnv.MergeToolInfo -Property @{ | |
Command = (Get-ItemProperty $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::BeyondCompare] 'ExePath').ExePath; | |
CompareArgs = '%1 %2 /title1=%6 /title2=%7'; | |
MergeArgs = '%1 %2 /savetarget=%4 /title1=%6 /title2=%7'; | |
} | |
#BeyondCompare Pro supports 3 way merge | |
#TODO: Figure out a way to detect Pro Support | |
$mergeTools[[JustAProgrammer.DevEnv.MergeTools]::BeyondComparePro] = New-Object JustAProgrammer.DevEnv.MergeToolInfo -Property @{ | |
Command = (Get-ItemProperty $mergeToolTestPaths[[JustAProgrammer.DevEnv.MergeTools]::BeyondCompare] 'ExePath').ExePath; | |
CompareArgs = '%1 %2 /title1=%6 /title2=%7'; | |
MergeArgs = '%1 %2 %3 %4 /title1=%6 /title2=%7 /title3=%8 /title4=%9'; | |
} | |
} | |
function Get-VisualStudioInternalVersions { | |
<# | |
.SYNOPSIS | |
Gets the internal Visual Studio version numbers (e.g. 2010 = 10.0) | |
.PARAMETER VisualStudioVersion | |
The version(s) of Visual Studio get the internal versions for | |
#> | |
[CmdletBinding()] | |
param( | |
[JustAProgrammer.DevEnv.VisualStudioVersion] $VisualStudioVersion = [JustAProgrammer.DevEnv.VisualStudioVersion]::All | |
) | |
if (($VisualStudioVersion -band [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2008) -eq [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2008) { | |
Write-Output '9.0' | |
} | |
if (($VisualStudioVersion -band [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2010) -eq [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2010) { | |
Write-Output '10.0' | |
} | |
if (($VisualStudioVersion -band [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2012) -eq [JustAProgrammer.DevEnv.VisualStudioVersion]::VisualStudio2012) { | |
Write-Output '11.0' | |
} | |
} | |
function Remove-VisualStudioMergeTool { | |
<# | |
.SYNOPSIS | |
Sets the merge tool for all Visual Studio Versions | |
.PARAMETER MergeTool | |
The merge tool to use. | |
.PARAMETER VisualStudioVersion | |
The version(s) of Visual Studio to set the merge tool for | |
.EXAMPLE | |
#> | |
[CmdletBinding()] | |
param( | |
[JustAProgrammer.DevEnv.VisualStudioVersion] $VisualStudioVersion = [JustAProgrammer.DevEnv.VisualStudioVersion]::All | |
) | |
Get-VisualStudioInternalVersions $VisualStudioVersion | % { | |
$versionDiffNode = "$($visualStudioRootNode)\$($_)\$($diffToolsSubNode)"; | |
Write-Debug "Deleting Registry key $($versionDiffNode)" | |
Remove-Item $versionDiffNode -Force -Recurse | Out-Null | |
} | |
} | |
function Set-VisualStudioMergeTool { | |
<# | |
.SYNOPSIS | |
Sets the merge tool for all Visual Studio Versions | |
.PARAMETER MergeT | |
ool | |
The merge tool to use. | |
.PARAMETER VisualStudioVersion | |
The version(s) of Visual Studio to set the merge tool for | |
.EXAMPLE | |
#> | |
[CmdletBinding()] | |
param( | |
[Parameter (Position = 0, Mandatory=$true, HelpMessage = 'The name of the merge tool')][JustAProgrammer.DevEnv.MergeTools] $MergeTool, | |
[JustAProgrammer.DevEnv.VisualStudioVersion] $VisualStudioVersion = [JustAProgrammer.DevEnv.VisualStudioVersion]::All | |
) | |
if ($MergeTool -eq [JustAProgrammer.DevEnv.MergeTools]::BuiltIn ) { return Remove-VisualStudioMergeTool $VisualStudioVersion } | |
if ( -not $mergeTools.Keys.Contains($MergeTool)) { Write-Error "MergeTool `"$($MergeTool)`" not found"; return; } | |
Write-Debug "MergeTool $($MergeTool) found at $($mergeTools[$MergeTool].Command)" | |
Get-VisualStudioInternalVersions $VisualStudioVersion | % { | |
$versionCompareNode = "$($visualStudioRootNode)\$($_)\$($compareSubNode)"; | |
$versionMergeNode = "$($visualStudioRootNode)\$($_)\$($mergeSubNode)"; | |
New-Item $versionCompareNode -Force | Out-Null | |
Set-ItemProperty $versionCompareNode -Name Command -Value $mergeTools[$mergeTool].Command | |
Set-ItemProperty $versionCompareNode -Name Arguments -Value $mergeTools[$mergeTool].CompareArgs | |
New-Item $versionMergeNode -Force | Out-Null | |
Set-ItemProperty $versionMergeNode -Name Command -Value $mergeTools[$mergeTool].Command | |
Set-ItemProperty $versionMergeNode -Name Arguments -Value $mergeTools[$mergeTool].MergeArgs | |
} | |
} | |
$DebugPreference = "Continue" | |
help Set-VisualStudioMergeTool | |
<# | |
Get-VisualStudioInternalVersions|fl | |
Set-VisualStudioMergeTool WinMerge | |
Pause | |
Remove-VisualStudioMergeTool | |
Pause | |
Set-VisualStudioMergeTool KDiff3 | |
Pause | |
#> | |
Set-VisualStudioMergeTool BeyondCompare | |
#$mergeToolTestPaths | |
<# | |
TODO: Add Anhk support. Its in the regustry key: | |
HKCU:\Software\AnkhSVN\AnkhSVN\VisualStudio\11.0\Configuration | |
In the following properties: | |
DiffExePath | |
MergeExePath | |
PatchExePath | |
#> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment