Skip to content

Commit

Permalink
Add the Remove-PoshGitFromProfile function
Browse files Browse the repository at this point in the history
This is needed to be able to install/uninstall Posh-Git via Git for
Windows' installer/uninstaller.

See git-for-windows/build-extra#401 for details.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
dscho committed Dec 9, 2021
1 parent 72a32f2 commit 57f1ae2
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 0 deletions.
117 changes: 117 additions & 0 deletions src/Utils.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,123 @@ function Add-PoshGitToProfile {
}
}

<#
.SYNOPSIS
Modifies your PowerShell profile (startup) script so that it does not import
the posh-git module when PowerShell starts.
.DESCRIPTION
Checks if your PowerShell profile script is importing posh-git and if it does,
removes the command to import the posh-git module. This will cause PowerShell
to no longer load posh-git whenever PowerShell starts.
.PARAMETER AllHosts
By default, this command modifies the CurrentUserCurrentHost profile
script. By specifying the AllHosts switch, the command updates the
CurrentUserAllHosts profile (or AllUsersAllHosts, given -AllUsers).
.PARAMETER AllUsers
By default, this command modifies the CurrentUserCurrentHost profile
script. By specifying the AllUsers switch, the command updates the
AllUsersCurrentHost profile (or AllUsersAllHosts, given -AllHosts).
Requires elevated permissions.
.EXAMPLE
PS C:\> Remove-PoshGitFromProfile
Updates your profile script for the current PowerShell host to stop importing
the posh-git module when the current PowerShell host starts.
.EXAMPLE
PS C:\> Remove-PoshGitFromProfile -AllHosts
Updates your profile script for all PowerShell hosts to no longer import the
posh-git module whenever any PowerShell host starts.
.INPUTS
None.
.OUTPUTS
None.
#>
function Remove-PoshGitFromProfile {
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter()]
[switch]
$AllHosts,

[Parameter()]
[switch]
$AllUsers,

[Parameter(ValueFromRemainingArguments)]
[psobject[]]
$TestParams
)

if ($AllUsers -and !(Test-Administrator)) {
throw 'Removing posh-git from an AllUsers profile requires an elevated host.'
}

$underTest = $false

$profileName = $(if ($AllUsers) { 'AllUsers' } else { 'CurrentUser' }) `
+ $(if ($AllHosts) { 'AllHosts' } else { 'CurrentHost' })
Write-Verbose "`$profileName = '$profileName'"

$profilePath = $PROFILE.$profileName
Write-Verbose "`$profilePath = '$profilePath'"

# Under test, we override some variables using $args as a backdoor.
if (($TestParams.Count -gt 0) -and ($TestParams[0] -is [string])) {
$profilePath = [string]$TestParams[0]
$underTest = $true
if ($TestParams.Count -gt 1) {
$ModuleBasePath = [string]$TestParams[1]
}
}

if (!$profilePath) { $profilePath = $PROFILE }

if (!$profilePath) {
Write-Warning "Skipping add of posh-git import to profile; no profile found."
Write-Verbose "`$PROFILE = '$PROFILE'"
Write-Verbose "CurrentUserCurrentHost = '$($PROFILE.CurrentUserCurrentHost)'"
Write-Verbose "CurrentUserAllHosts = '$($PROFILE.CurrentUserAllHosts)'"
Write-Verbose "AllUsersCurrentHost = '$($PROFILE.AllUsersCurrentHost)'"
Write-Verbose "AllUsersAllHosts = '$($PROFILE.AllUsersAllHosts)'"
return
}

if (Test-Path -LiteralPath $profilePath) {
# If the profile script exists and is signed, then we should not modify it
if (!(Get-Command Get-AuthenticodeSignature -ErrorAction SilentlyContinue))
{
Write-Verbose "Platform doesn't support script signing, skipping test for signed profile."
}
else {
$sig = Get-AuthenticodeSignature $profilePath
if ($null -ne $sig.SignerCertificate) {
Write-Warning "Skipping add of posh-git import to profile; '$profilePath' appears to be signed."
Write-Warning "Add the command 'Import-Module posh-git' to your profile and resign it."
return
}
}

$oldProfile = @(Get-Content $profilePath)

. $currentVersionPath\src\Utils.ps1
$oldProfileEncoding = Get-FileEncoding $profilePath

$newProfile = @()
foreach($line in $oldProfile) {
if ($line -like '*PoshGitPrompt*') { continue; }
if ($line -like '*Load posh-git example profile*') { continue; }

if($line -like '. *posh-git*profile.example.ps1*') {
continue;
}
if($line -like 'Import-Module *\src\posh-git.psd1*') {
continue;
}
$newProfile += $line
}
Set-Content -path $profilePath -value $newProfile -Force -Encoding $oldProfileEncoding
}
}

<#
.SYNOPSIS
Gets the file encoding of the specified file.
Expand Down
1 change: 1 addition & 0 deletions src/posh-git.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ FunctionsToExport = @(
'Get-PromptPath',
'New-GitPromptSettings',
'Remove-GitBranch',
'Remove-PoshGitFromProfile',
'Update-AllBranches',
'Write-GitStatus',
'Write-GitBranchName',
Expand Down
1 change: 1 addition & 0 deletions src/posh-git.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ $exportModuleMemberParams = @{
'Get-PromptPath',
'New-GitPromptSettings',
'Remove-GitBranch',
'Remove-PoshGitFromProfile',
'Update-AllBranches',
'Write-GitStatus',
'Write-GitBranchName',
Expand Down
20 changes: 20 additions & 0 deletions test/Utils.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,26 @@ New-Alias pscore C:\Users\Keith\GitHub\rkeithhill\PowerShell\src\powershell-win-
$expectedContent += "${newLine}${newLine}Import-Module '$(Join-Path $moduleBasePath posh-git).psd1'"
$content -join $newLine | Should -BeExactly $expectedContent
}
It 'Removes import from the profile correctly' {
$profileContentPSCX = @'
Import-Module PSCX
'@
$profileContentPoshGit = @'
Import-Module posh-git
'@
$profileContent = $profileContentPSCX + $profileContentPoshGit
Set-Content $profilePath -Value $profileContent -Encoding Ascii

$output = Remove-PoshGitFromProfile $profilePath 3>&1

Write-Host "output: $output"
$output[1] | Should -Match 'posh-git appears'
Get-FileEncoding $profilePath | Should -Be 'ascii'
$content = Get-Content $profilePath
$content.Count | Should -Be 1
$expectedContent = Convert-NativeLineEnding $profileContentPSCX
$content -join $newline | Should -BeExactly $expectedContent
}
}

Context 'Get-PromptConnectionInfo' {
Expand Down

0 comments on commit 57f1ae2

Please sign in to comment.