投票结束前,了解"回答"上面的问题是使用另一个模块,而不是自己如何实现它。
我有一组powershell模块,用于帮助我完成我的git工作流程(想想gitflow)。
以下是一个例子。
Function Merge-FromBranch([string] $branch){
# ...
}
Set-Alias mfb Merge-FromBranch
我希望能够使用回购中存在的分支对分支名称进行制表完成。
现在获取本地分支名称很简单
> git branch
但我需要做的是
> mfb fea<tab>
以便通过功能分支进行制表。
如何连接它以便我可以在我的模块上填写$branch
参数?
我知道我可以将git branch
输出传递给另一个方法(git branch | do-stuff
),但我不知道如何将其集成到模块的制表符完成中。
答案 0 :(得分:3)
为了与posh-git的完成方式保持一致,并制作我自己的TabExpansion
方法,我现在可以为我的自定义命令完成正确的标签。
# Backup the existing TabExpansion, this will allow us to extend it rather than replace it.
Copy Function:\TabExpansion Function:\OriginalTabExpansion
# Create our own custom TabExpansion method
function TabExpansion($line, $lastWord) {
$LineBlocks = [regex]::Split($line, '[|;]')
$lastBlock = $LineBlocks[-1]
switch -regex ($lastBlock) {
#Depends on Posh-Git
"^$(Get-AliasPattern "mfb|mtb|rb|db|ub|urb|co|pull") (.*)" { gitTabExpansion $lastBlock }
default { if (Test-Path Function:\OriginalTabExpansion) { OriginalTabExpansion $line $lastWord } }
}
}
function gitTabExpansion($lastBlock) {
switch -regex ($lastBlock) {
"(?<cmd>\S*)$" { gitBranches $matches['cmd'] $true }
}
}
function script:gitBranches($filter, $includeHEAD = $false) {
$prefix = $null
if ($filter -match "^(?<from>\S*\.{2,3})(?<to>.*)") {
$prefix = $matches['from']
$filter = $matches['to']
}
$branches = @(git branch --no-color | foreach { if($_ -match "^\*?\s*(?<ref>.*)") { $matches['ref'] } }) +
@(git branch --no-color -r | foreach { if($_ -match "^ (?<ref>\S+)(?: -> .+)?") { $matches['ref'] } }) +
@(if ($includeHEAD) { 'HEAD','FETCH_HEAD','ORIG_HEAD','MERGE_HEAD' })
$branches |
where { $_ -ne '(no branch)' -and $_ -like "$filter*" } |
foreach { $prefix + $_ }
}
答案 1 :(得分:0)
我不熟悉git branch
及其输出的内容。我希望它只是分支名称,每行一个没有任何标题的值等。如果没有,那么你需要修改样本以便先清理它。
如果我相信,这应该适用于PS3 +:
function Merge-FromBranch {
[CmdletBinding()]
Param()
DynamicParam {
# Set the dynamic parameters' name
$ParameterName = 'Branch'
# Create the dictionary
$RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
# Create the collection of attributes
$AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
# Create and set the parameters' attributes
$ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
$ParameterAttribute.Mandatory = $true
$ParameterAttribute.Position = 1
# Add the attributes to the attributes collection
$AttributeCollection.Add($ParameterAttribute)
# Generate and set the ValidateSet
$arrSet = & git branch
$ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)
# Add the ValidateSet to the attributes collection
$AttributeCollection.Add($ValidateSetAttribute)
# Create and return the dynamic parameter
$RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
$RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
return $RuntimeParameterDictionary
}
begin {
# Bind the parameter to a friendly variable
$Branch = $PsBoundParameters[$ParameterName]
}
process { Write-Host "Chosen Branch is: $Branch" }
}
示例修改自:Dynamic ValidateSet in a Dynamic Parameter @ blogs.technet.com