diff --git a/base.linux/ls.ps1 b/base.linux/ls.unix.ps1 similarity index 100% rename from base.linux/ls.ps1 rename to base.linux/ls.unix.ps1 diff --git a/base/Aliases/edit b/base/Aliases/edit.ps1 similarity index 100% rename from base/Aliases/edit rename to base/Aliases/edit.ps1 diff --git a/base/Aliases/vi b/base/Aliases/vi.ps1 similarity index 100% rename from base/Aliases/vi rename to base/Aliases/vi.ps1 diff --git a/base/Aliases/vim b/base/Aliases/vim.ps1 similarity index 100% rename from base/Aliases/vim rename to base/Aliases/vim.ps1 diff --git a/base/Get-Path.ps1 b/base/Get-Path.ps1 index 8c2536a..c07385e 100644 --- a/base/Get-Path.ps1 +++ b/base/Get-Path.ps1 @@ -35,14 +35,10 @@ process { } $p = $p -replace '#C-A#','*' -replace '#C-Q#','?' -replace '#C-#','#C-' - if( $Expand ) { - $p = $p | ForEach-Object { - if( Test-Path $p ) { - $p | Get-Item -Force | Select-Object -ExpandProperty FullName - } elseif( -not $Expand ) { - $p - } - } + if( $p -match '\*|\?' -and $Expand ) { + $p = $p | Where-Object { Test-Path $_ } | + Get-Item -Force | + Select-Object -ExpandProperty FullName } $p diff --git a/base/_ls.ps1 b/base/_ls.ps1 new file mode 100644 index 0000000..619c7f9 --- /dev/null +++ b/base/_ls.ps1 @@ -0,0 +1 @@ +env ls $args diff --git a/base/ls.ps1 b/base/ls.ps1 new file mode 100644 index 0000000..ef58811 --- /dev/null +++ b/base/ls.ps1 @@ -0,0 +1 @@ +Get-ChildItem -Force $args diff --git a/base/profile.d/Docker.class.ps1 b/base/profile.d/Docker.class.ps1 deleted file mode 100644 index 4b00cdb..0000000 --- a/base/profile.d/Docker.class.ps1 +++ /dev/null @@ -1,36 +0,0 @@ -class DockerContainer { #: System.Management.Automation.IValidateSetValuesGenerator { - static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { - $local:possibleValues = $( - docker ps -a --no-trunc --format "{{.Names}}" - ) - return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); - } - - [String[]] GetValidValues() { - return [DockerContainer]::_GetValidValues('',$true) - } -} - -class DockerComposeDirs { #: System.Management.Automation.IValidateSetValuesGenerator { - static [string[]] _GetValidValues([string]$wordToComplete,[string]$Path,[bool]$Strict) { - $local:possibleValues = $( - Get-ChildItem -LiteralPath $Path -Directory -Depth 3 | - Where-Object { $_ | - Get-ChildItem -Include 'docker-compose.y*l' | - Where-Object Extension -in '.yml','.yaml' - } | ForEach-Object { - $_.FullName.Replace($(Join-Path $PWD ""),'') - } - ) - return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); - } - - static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { - return [DockerComposeDirs]::_GetValidValues($wordToComplete,'.',$true) - } - - [String[]] GetValidValues() { - return [DockerComposeDirs]::_GetValidValues('',$true) - } -} - diff --git a/base/profile.d/cd-shortcuts.ps1 b/base/profile.d/cd-shortcuts.ps1 new file mode 100644 index 0000000..68dd583 --- /dev/null +++ b/base/profile.d/cd-shortcuts.ps1 @@ -0,0 +1,6 @@ +function cd-{cd -} +function cd..{cd ..} +function cd...{cd ../..} + +Set-Alias '..' 'cd..' +Set-Alias '...' 'cd...' diff --git a/docker/Aliases/cp.ps1 b/docker/Aliases/cp.ps1 new file mode 100644 index 0000000..2b3bca3 --- /dev/null +++ b/docker/Aliases/cp.ps1 @@ -0,0 +1 @@ +Copy-Item diff --git a/docker/Aliases/mv.ps1 b/docker/Aliases/mv.ps1 new file mode 100644 index 0000000..baf8cb0 --- /dev/null +++ b/docker/Aliases/mv.ps1 @@ -0,0 +1 @@ +Move-Item diff --git a/docker/Aliases/rm.ps1 b/docker/Aliases/rm.ps1 new file mode 100644 index 0000000..290482c --- /dev/null +++ b/docker/Aliases/rm.ps1 @@ -0,0 +1 @@ +Remove-Item diff --git a/docker/Edit-DockerCompose.ps1 b/docker/Edit-DockerCompose.ps1 index d69657e..3bd9ef4 100644 --- a/docker/Edit-DockerCompose.ps1 +++ b/docker/Edit-DockerCompose.ps1 @@ -1,13 +1,5 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [switch]$Force, [string[]]$AdditionalFiles diff --git a/docker/Invoke-DockerCompose.ps1 b/docker/Invoke-DockerCompose.ps1 index 603a984..57e38c0 100644 --- a/docker/Invoke-DockerCompose.ps1 +++ b/docker/Invoke-DockerCompose.ps1 @@ -1,19 +1,12 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath, [switch]$Recurse, [int]$Depth=1, [switch]$Force, [switch]$OneLine, - [Parameter(Position = 0, ValueFromRemainingArguments = $true, mandatory)] + [Parameter(Position = 0, mandatory, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList $args})] [array]$CliParams ) @@ -110,7 +103,7 @@ foreach( $local:p in $CliParams ) { } $local:dcParams=@() - $local:dcParams = $p | Where-Object { $_ } | ForEach-Object { + $local:dcParams += $p | Where-Object { $_ } | ForEach-Object { if( $_ -match "(?:^'[^']+'$)|(?:^`"[^`"]+`"$)|(?:^[^\s]+$)" ) { $_ } else { "'$($_.Replace( "'", "''" ))'" } } diff --git a/docker/dcc.ps1 b/docker/dcc.ps1 index 58f2839..9c9e537 100644 --- a/docker/dcc.ps1 +++ b/docker/dcc.ps1 @@ -1,13 +1,5 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [switch]$TestOnly ) diff --git a/docker/dcdown.ps1 b/docker/dcdown.ps1 index fe38cc3..87ebf57 100644 --- a/docker/dcdown.ps1 +++ b/docker/dcdown.ps1 @@ -1,22 +1,15 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath, [switch]$Recurse, [int]$Depth=1, [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('down'))})] [array]$CliParams=@('--timeout=3','--volumes','--remove-orphans') ) if( -not $CliParams -or $CliParams[0] -is [string] ) { $CliParams = @($CliParams,@($null)) } -$CliParams[0] = @('&','down') + $CliParams[0] +$CliParams[0] = @('&') + $CliParams[0] -Invoke-DockerCompose -ProjectPath $ProjectPath -CliParams $CliParams -Recurse:$Recurse -Depth $Depth +Invoke-DockerCompose -ProjectPath $ProjectPath -dcCommand 'down' -CliParams $CliParams -Recurse:$Recurse -Depth $Depth diff --git a/docker/dcl.ps1 b/docker/dcl.ps1 index 96a9f23..c7f2947 100644 --- a/docker/dcl.ps1 +++ b/docker/dcl.ps1 @@ -1,15 +1,8 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@("logs"))})] [array]$CliParams ) diff --git a/docker/dcll.ps1 b/docker/dcll.ps1 index 5b7c1fe..800483a 100644 --- a/docker/dcll.ps1 +++ b/docker/dcll.ps1 @@ -1,15 +1,8 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('logs'))})] [array]$CliParams ) diff --git a/docker/dcr.ps1 b/docker/dcr.ps1 index 561f697..fe4e904 100644 --- a/docker/dcr.ps1 +++ b/docker/dcr.ps1 @@ -1,15 +1,8 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('run'))})] [array]$CliParams=@('--rm') ) diff --git a/docker/dcre.ps1 b/docker/dcre.ps1 index 2d17120..197ab3d 100644 --- a/docker/dcre.ps1 +++ b/docker/dcre.ps1 @@ -1,15 +1,8 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('restart'))})] [array]$CliParams ) diff --git a/docker/dcreup.ps1 b/docker/dcreup.ps1 index e4ec161..9def132 100644 --- a/docker/dcreup.ps1 +++ b/docker/dcreup.ps1 @@ -1,22 +1,18 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath, [switch]$Recurse, [int]$Depth=1, [switch]$NoLogs, [switch]$NoPull, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('pull'))})] [array]$PullParams, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('logs'))})] [array]$LogsParams, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('up'))})] [array]$UpParams=@('-d','--remove-orphans'), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('up'))})] [array]$Containers ) diff --git a/docker/dcup.ps1 b/docker/dcup.ps1 index 29e9963..b0e2248 100644 --- a/docker/dcup.ps1 +++ b/docker/dcup.ps1 @@ -1,22 +1,18 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath, [switch]$Recurse, [int]$Depth=1, [switch]$NoLogs, [switch]$NoPull, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('pull'))})] [array]$PullParams, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('logs'))})] [array]$LogsParams, + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('up'))})] [array]$UpParams=@('--detach','--remove-orphans'), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('up'))})] [array]$Containers ) diff --git a/docker/dcx.ps1 b/docker/dcx.ps1 index 9551030..4c75ef4 100644 --- a/docker/dcx.ps1 +++ b/docker/dcx.ps1 @@ -1,15 +1,8 @@ [CmdletBinding(SupportsShouldProcess)]param( - [ArgumentCompleter({ param ( - $commandName, - $parameterName, - $wordToComplete, - $commandAst, - $fakeBoundParameters - ) - [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) - })] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeDirsCompleter -ArgumentList $args})] [string[]]$ProjectPath=@($PWD), [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [ArgumentCompleter({Invoke-Command -ScriptBlock $_DockerComposeCompleter -ArgumentList ($args+@('exec'))})] [array]$CliParams ) diff --git a/docker/profile.d/Docker.class.ps1 b/docker/profile.d/Docker.class.ps1 new file mode 100644 index 0000000..79444d9 --- /dev/null +++ b/docker/profile.d/Docker.class.ps1 @@ -0,0 +1,162 @@ +class DockerContainers { #: System.Management.Automation.IValidateSetValuesGenerator { + static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { + $local:possibleValues = $( + docker container ls -a --no-trunc --format "{{.Names}}" + ) + return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + } + + [String[]] GetValidValues() { + return [DockerContainers]::_GetValidValues('',$true) + } +} + +class DockerImages { #: System.Management.Automation.IValidateSetValuesGenerator { + static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { + $local:possibleValues = $( + docker image ls --format "{{.Repository}}" + ) + return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + } + + [String[]] GetValidValues() { + return [DockerImages]::_GetValidValues('',$true) + } +} + +class DockerNetworks { + static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { + $local:possibleValues = $( + docker network ls --no-trunc --format "{{.Name}}" + ) + return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + } + + [String[]] GetValidValues() { + return [DockerNetworks]::_GetValidValues('',$true) + } +} + +class DockerComposeCommands { #: System.Management.Automation.IValidateSetValuesGenerator { + static [string[]] $cachedCommands = @() + static [string[]] _GetValidValues([string]$wordToComplete,[string]$subcommand,[bool]$Strict) { + $local:gate = $false + + $local:possibleValues = $( + docker-compose $subcommand --help | Out-String -Stream | + ForEach-Object { + if( $wordToComplete -match '^-' ) { + if( $_ -match "^ *(-.*) (\w.*)$" ) { + $matches[1] -split ', ' | ForEach-Object { $_ -split ' ' | Select-Object -First 1 } + } + } elseif( -not $gate ) { + if ( $_.trim() -eq 'Commands:' ) { $gate = $true } + } else { + $null = $_ -match '^\W+(\w+)\W+(.+)$'; + $Matches[1]; + } + } + ) + [DockerComposeCommands]::cachedCommands = $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + return [DockerComposeCommands]::cachedCommands; + } + + [String[]] GetValidValues() { + return [DockerComposeCommands]::_GetValidValues('',$true) + } +} + +$global:_DockerComposeCommandCompleter = [ScriptBlock]{ + param( + $commandName, + $parameterName, + $wordToComplete, + $commandAst, + $fakeBoundParameters + ) + [DockerComposeCommands]::_GetValidValues($wordToComplete,"",$true) + } + +class DockerComposeServices { #: System.Management.Automation.IValidateSetValuesGenerator { + static [string[]] _GetValidValues([string]$wordToComplete,[string]$Path,[bool]$Strict) { + $local:possibleValues = $( + dco -ProjectPath $Path config --services + ) + return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + } + + static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { + return [DockerComposeServices]::_GetValidValues($wordToComplete,'.',$true) + } + + [String[]] GetValidValues() { + return [DockerComposeServices]::_GetValidValues('',$true) + } +} + +$null = [DockerComposeCommands]::_GetValidValues("","",$true) +$global:_DockerComposeCompleter = [ScriptBlock]{ + param( + $commandName, + $parameterName, + $wordToComplete, + $commandAst, + $fakeBoundParameters, + $subCommand + ) + $local:cmd = $subCommand + if( -not $cmd ) { + $cmd = $commandAst.CommandElements | + Where-Object Value -in ([DockerComposeCommands]::cachedCommands) | + Select-Object -First 1 + } + $local:ProjectPath = $fakeBoundParameters.ProjectPath + if( -not $ProjectPath ) { $ProjectPath=@($PWD) } + if( -not $cmd -or $wordToComplete -match '^-' ) { + [DockerComposeCommands]::_GetValidValues($wordToComplete,$cmd,$true) + } else { + switch($cmd){ + 'down' {} + 'images' {} + 'config' {} + default { + [DockerComposeServices]::_GetValidValues($wordToComplete,$ProjectPath,$true) + } + } + } + } + +class DockerComposeDirs { #: System.Management.Automation.IValidateSetValuesGenerator { + static [string[]] _GetValidValues([string]$wordToComplete,[string]$Path,[bool]$Strict) { + $local:possibleValues = $( + Get-ChildItem -LiteralPath $Path -Directory -Depth 3 | + Where-Object { $_ | + Get-ChildItem -Include 'docker-compose.y*l' | + Where-Object Extension -in '.yml','.yaml' + } | ForEach-Object { + $_.FullName.Replace($(Join-Path $PWD ""),'') + } + ) + return $(Get-PossibleArguments -WordToComplete $wordToComplete -FullValueSet $possibleValues -Strict:$Strict ); + } + + static [string[]] _GetValidValues([string]$wordToComplete,[bool]$Strict) { + return [DockerComposeDirs]::_GetValidValues($wordToComplete,'.',$true) + } + + [String[]] GetValidValues() { + return [DockerComposeDirs]::_GetValidValues('',$true) + } +} + +$global:_DockerComposeDirsCompleter = [ScriptBlock]{ + param( + $commandName, + $parameterName, + $wordToComplete, + $commandAst, + $fakeBoundParameters + ) + [DockerComposeDirs]::_GetValidValues($wordToComplete,$true) + } +