Skip to content

Commit

Permalink
(#5) Migrate core extension to repository
Browse files Browse the repository at this point in the history
  • Loading branch information
AdmiringWorm committed Mar 21, 2022
1 parent 0a47a15 commit 6d71aaf
Show file tree
Hide file tree
Showing 13 changed files with 754 additions and 0 deletions.
71 changes: 71 additions & 0 deletions src/chocolatey-core.extension/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# CHANGELOG

## 1.3.5

- Bugfix `Remove-Process`: Fixed Powershell v2 compatibility issue

## 1.3.4

- Added `Remove-Process` function to ensure that process is stopped in reliable way

## 1.3.3

- Bugfix `Get-AppInstallLocation`: fix path is directory

## 1.3.2

- Bugfix `Get-AppInstallLocation`: now checks if path is directory

## 1.3.1
- Bugfix in `Get-AppInstallLocation`: Removed extra `$location` parameter from Split-Path when parsing the registry UninstallString.

## 1.3.0

- `Get-EffectiveProxy`: Get the current proxy using several methods

## 1.2.0

- Use `$IgnoredArguments` in all functions to allow for future expansion and splatting ([#621](https://github.com/chocolatey/chocolatey-coreteampackages/issues/621))
- Bugfix in `Get-PackageParameters` parsing of paths containing symbol chars.

## 1.1.0
- `Get-AvailableDriveLetter`: Get the next unused drive letter

## 1.0.7
- Bugfix in `Get-PackageParameters`: flags can now have numbers in their names, whereas before, everything past the number would be truncated and the flag would turn into a boolean.

## 1.0.6
- Bugfix in `Get-AppInstallLocation`: Powershell 2 can not replace on null value.

## 1.0.5

- Bugfix in `Get-UninstallRegistryKey`: Powershell 2 compatibility.
- Slightly improved documentation of `Get-UninstallRegistryKey`.

## 1.0.4

- Bugfix in `Get-PackageParameters`: Powershell 2 bug workaround ([#465](https://github.com/chocolatey/chocolatey-coreteampackages/issues/465)).

## 1.0.3

- Bugfix in `Get-PackageParameters`: error when parsing of path.

## 1.0.2

- Bugfix in `Get-PackageParameters`: PowerShell 2 compatibility.

## 1.0.1

- Bugfix in `Get-PackageParameters`: unaliased `sls` to work on PowerShell 2.

## 1.0

- Merged `mm-choco.extension`.
- Merged `chocolatey-uninstall.extension`.
- Added `Get-PackageCacheLocation`
- Added `CHANGELOG.md` and `README.md`.
- Refactoring and more documentation.

## 0.1.3

- `Get-WebContent`: Download file with choco internals.
50 changes: 50 additions & 0 deletions src/chocolatey-core.extension/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# chocolatey-core.extension

This is the Powershell module that extends Chocolatey with new functions.

## Installation

Install via chocolatey: `choco install chocolatey-core.extension`.

The module is usually automatically installed as a dependency.

## Usage

To create a package that uses an extension function add the following to the `nuspec` specification:

<dependencies>
<dependency id="chocolatey-core.extension" version="SPECIFY_LATEST_VERSION" />
</dependencies>

**NOTE**: Make sure you use adequate _minimum_ version.

To test the functions you can import the module directly or via the `chocolateyInstaller.psm1` module:

PS> import-module $Env:ChocolateyInstall\helpers\chocolateyInstaller.psm1
PS> import-module $Env:ChocolateyInstall\extensions\chocolatey-core\*.psm1

You can now test any of the functions:

PS> Get-AppInstallLocation choco -Verbose

VERBOSE: Trying local and machine (x32 & x64) Uninstall keys
VERBOSE: Trying Program Files with 2 levels depth
VERBOSE: Trying PATH
C:\ProgramData\chocolatey\bin

Keep in mind that function may work only in the context of the `chocolateyInstaller.ps1`.

To get the list of functions, load the module directly and invoke the following command:

Get-Command -Module chocolatey-core

To get the help for the specific function use `man`:

man Get-UninstallRegistryKey


## Notes

- There is [a known bug](https://github.com/chocolatey-community/chocolatey-coreteampackages/issues/784) in the function `Get-AppInstallLocation` with parameter `$AppNamePattern` which is internally used both as wildcard and regex patterns. This usually doesn't create any problems, but may do so if application contains regex symbols in the name, such as [notepad++](https://github.com/chocolatey-community/chocolatey-coreteampackages/issues/1198).


30 changes: 30 additions & 0 deletions src/chocolatey-core.extension/chocolatey-core.extension.nuspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Do not remove this test for UTF-8: if “Ω” doesn’t appear as greek uppercase omega letter enclosed in quotation marks, you should use an editor that supports UTF-8, not this one. -->
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
<metadata>
<id>chocolatey-core.extension</id>
<version>1.3.5.1</version>
<title>Chocolatey Core Extensions</title>
<summary>Helper functions extending core choco functionality</summary>
<authors>chocolatey</authors>
<owners>chocolatey-community</owners>
<description>
This package provides helper functions installed as a Chocolatey extension.
These functions may be used in Chocolatey install/uninstall scripts by declaring this package a dependency in your package's nuspec.
</description>
<tags>chocolatey core extension admin</tags>
<projectUrl>https://github.com/chocolatey/chocolatey-coreteampackages</projectUrl>
<!--<iconUrl>http://cdn.rawgit.com/chocolatey-coreteampackages/master/icons/chocolatey-common.extension.png</iconUrl>-->
<copyright>© 2016 Chocolatey Core Team Package Contributors</copyright>
<licenseUrl>https://github.com/chocolatey/chocolatey-coreteampackages/blob/master/LICENSE.md</licenseUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<projectSourceUrl>https://github.com/chocolatey/chocolatey-coreteampackages</projectSourceUrl>
<packageSourceUrl>https://github.com/chocolatey/chocolatey-coreteampackages/tree/master/extensions/chocolatey-core.extension</packageSourceUrl>
<docsUrl>https://github.com/chocolatey/chocolatey-coreteampackages/tree/master/extensions/chocolatey-core.extension/README.md</docsUrl>
<bugTrackerUrl>https://github.com/chocolatey/chocolatey-coreteampackages/issues</bugTrackerUrl>
<releaseNotes>https://github.com/chocolatey/chocolatey-coreteampackages/tree/master/extensions/chocolatey-core.extension/CHANGELOG.md</releaseNotes>
</metadata>
<files>
<file src="extensions\**" target="extensions" />
</files>
</package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
. "$PSScriptRoot\Get-UninstallRegistryKey.ps1"
<#
.SYNOPSIS
Get application install location
.DESCRIPTION
Function tries to find install location in multiple places. It returns $null if all fail. The following
locations are tried:
- local and machine (x32 & x64) various Uninstall keys
- x32 & x64 Program Files up to the 2nd level of depth
- native commands available via PATH
- locale and machine registry key SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
Use Verbose parameter to see which of the above locations was used for the result, if any.
.EXAMPLE
PS> Get-AppInstallLocation choco
Returns the install location of the application 'choco'.
.OUTPUTS
[String] or $null
#>
function Get-AppInstallLocation {
[CmdletBinding()]
param(
# Regular expression pattern
[ValidateNotNullOrEmpty()]
[string] $AppNamePattern,

# Allows splatting with arguments that do not apply and future expansion. Do not use directly.
[parameter(ValueFromRemainingArguments = $true)]
[Object[]] $IgnoredArguments
)

function strip($path) { if ($path.EndsWith('\')) { return $path -replace '.$' } else { $path } }

function is_dir( $path ) { $path -and (gi $path -ea 0).PsIsContainer -eq $true }

$ErrorActionPreference = "SilentlyContinue"

Write-Verbose "Trying local and machine (x32 & x64) Uninstall keys"
[array] $key = Get-UninstallRegistryKey $AppNamePattern
if ($key.Count -eq 1) {
Write-Verbose "Trying Uninstall key property 'InstallLocation'"
$location = $key.InstallLocation
if (is_dir $location) { return strip $location }

Write-Verbose "Trying Uninstall key property 'UninstallString'"
$location = $key.UninstallString
if ($location) { $location = $location.Replace('"', '') | Split-Path }
if (is_dir $location) { return strip $location }

Write-Verbose "Trying Uninstall key property 'DisplayIcon'"
$location = $key.DisplayIcon
if ($location) { $location = Split-Path $location }
if (is_dir $location) { return strip $location }
} else { Write-Verbose "Found $($key.Count) keys, aborting this method" }

$dirs = $Env:ProgramFiles, "$Env:ProgramFiles\*\*"
if (Get-ProcessorBits 64) { $dirs += ${ENV:ProgramFiles(x86)}, "${ENV:ProgramFiles(x86)}\*\*" }
Write-Verbose "Trying Program Files with 2 levels depth: $dirs"
$location = (ls $dirs | ? {$_.PsIsContainer}) -match $AppNamePattern | select -First 1 | % {$_.FullName}
if (is_dir $location) { return strip $location }

Write-Verbose "Trying native commands on PATH"
$location = (Get-Command -CommandType Application) -match $AppNamePattern | select -First 1 | % { Split-Path $_.Source }
if (is_dir $location) { return strip $location }

$appPaths = "\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"
Write-Verbose "Trying Registry: $appPaths"
$location = (ls "HKCU:\$appPaths", "HKLM:\$appPaths") -match $AppNamePattern | select -First 1
if ($location) { $location = Split-Path $location }
if (is_dir $location) { return strip $location }

Write-Verbose "No location found"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<#
.SYNOPSIS
Get a 'free' drive letter
.DESCRIPTION
Get a not yet in-use drive letter that can be used for mounting
.EXAMPLE
Get-AvailableDriveLetter
.EXAMPLE
Get-AvailableDriveLetter 'X'
(do not return X, even if it'd be the next choice)
.INPUTS
specific drive letter(s) that will be excluded as potential candidates
.OUTPUTS
System.String (single drive-letter character)
.LINK
http://stackoverflow.com/questions/12488030/getting-a-free-drive-letter/29373301#29373301
#>
function Get-AvailableDriveLetter {
param (
[char[]]$ExcludedLetters,

# Allows splatting with arguments that do not apply and future expansion. Do not use directly.
[parameter(ValueFromRemainingArguments = $true)]
[Object[]] $IgnoredArguments
)

$Letter = [int][char]'C'
$i = @()

#getting all the used Drive letters reported by the Operating System
$(Get-PSDrive -PSProvider filesystem) | %{$i += $_.name}

#Adding the excluded letter
$i+=$ExcludedLetters

while($i -contains $([char]$Letter)){$Letter++}

if ($Letter -gt [char]'Z') {
throw "error: no drive letter available!"
}
Write-Verbose "available drive letter: '$([char]$Letter)'"
Return $([char]$Letter)
}

66 changes: 66 additions & 0 deletions src/chocolatey-core.extension/extensions/Get-EffectiveProxy.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<#
.SYNOPSIS
Get the current proxy using several methods
.DESCRIPTION
Function tries to find the current proxy using several methods, in the given order:
- $env:chocolateyProxyLocation variable
- $env:http_proxy environment variable
- IE proxy
- Chocolatey config
- Winhttp proxy
- WebClient proxy
Use Verbose parameter to see which of the above locations was used for the result, if any.
The function currently doesn't handle the proxy username and password.
.OUTPUTS
[String] in the form of http://<proxy>:<port>
#>
function Get-EffectiveProxy(){

# Try chocolatey proxy environment vars
if ($env:chocolateyProxyLocation) {
Write-Verbose "Using `$Env:chocolateyProxyLocation"
return $env:chocolateyProxyLocation
}

# Try standard Linux variable
if ($env:http_proxy) {
Write-Verbose "Using `$Env:http_proxy"
return $env:http_proxy
}

# Try to get IE proxy
$key = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
$r = Get-ItemProperty $key
if ($r.ProxyEnable -and $r.ProxyServer) {
Write-Verbose "Using IE proxy settings"
return "http://" + $r.ProxyServer
}

# Try chocolatey config file
[xml] $cfg = gc $env:ChocolateyInstall\config\chocolatey.config
$p = $cfg.chocolatey.config | % { $_.add } | ? { $_.key -eq 'proxy' } | select -Expand value
if ($p) {
Write-Verbose "Using choco config proxy"
return $p
}

# Try winhttp proxy
(netsh.exe winhttp show proxy) -match 'Proxy Server\(s\)' | set proxy
$proxy = $proxy -split ' :' | select -Last 1
$proxy = $proxy.Trim()
if ($proxy) {
Write-Verbose "Using winhttp proxy server"
return "http://" + $proxy
}

# Try using WebClient
$url = "http://chocolatey.org"
$client = New-Object System.Net.WebClient
if ($client.Proxy.IsBypassed($url)) { return $null }

Write-Verbose "Using WebClient proxy"
return "http://" + $client.Proxy.GetProxy($url).Authority
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<#
.SYNOPSIS
Get temporary location for the package based on its name and version.
.DESCRIPTION
The function returns package cache directory within $Env:TEMP. It will not create the directory
if it doesn't exist.
This function is useful when you have to obtain the file using `Get-ChocolateyWebFile` in order
to perform certain installation steps that other helpers can't do.
.EXAMPLE
Get-PackageCacheLocation
.OUTPUTS
[String]
.LINKS
Get-ChocolateyWebFile
#>
function Get-PackageCacheLocation {
[CmdletBinding()]
param (
# Name of the package, by default $Env:ChocolateyPackageName
[string] $Name = $Env:ChocolateyPackageName,
# Version of the package, by default $Env:ChocolateyPackageVersion
[string] $Version = $Env:ChocolateyPackageVersion,
# Allows splatting with arguments that do not apply and future expansion. Do not use directly.
[parameter(ValueFromRemainingArguments = $true)]
[Object[]] $IgnoredArguments
)

if (!$Name) { Write-Warning 'Environment variable $Env:ChocolateyPackageName is not set' }
$res = Join-Path $Env:TEMP $Name

if (!$Version) { Write-Warning 'Environment variable $Env:ChocolateyPackageVersion is not set' }
$res = Join-Path $res $Version

$res
}
Loading

0 comments on commit 6d71aaf

Please sign in to comment.