diff --git a/GitHub/_.package.json b/GitHub/_.package.json deleted file mode 100644 index 5d501ae..0000000 --- a/GitHub/_.package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "package": { - "Condition": [], - "Name": "GitHub" - } -} diff --git a/base/Aliases/cat.ps1 b/base/Aliases/cat.ps1 new file mode 100644 index 0000000..630f589 --- /dev/null +++ b/base/Aliases/cat.ps1 @@ -0,0 +1 @@ +Get-Content diff --git a/base/Edit-MyProfiles.ps1 b/base/Edit-MyProfiles.ps1 index f64f1c8..e9ac67f 100644 --- a/base/Edit-MyProfiles.ps1 +++ b/base/Edit-MyProfiles.ps1 @@ -14,10 +14,10 @@ [string[]]$AlsoEditTheseScripts ) -$local:FilePaths = @() + $( Get-Profiles | Where-Object { $_.Exists -or $Force } | Select-Object -ExpandProperty Path ) +[string[]]$local:FilePaths = @() + $( Get-Profiles | Where-Object { $_.Exists -or $Force } | Select-Object -ExpandProperty Path ) foreach( $local:p in $AlsoEditTheseScripts ) { $local:sp = Join-Path $MyPSScriptRoot "$p`.ps1" $FilePaths += $sp } -Edit-TextFile -sudo:$sudo $FilePaths +Edit-TextFile -sudo:$sudo -Path $FilePaths diff --git a/base/Edit-TextFile.ps1 b/base/Edit-TextFile.ps1 index 1d4ca76..b9a8c0c 100644 --- a/base/Edit-TextFile.ps1 +++ b/base/Edit-TextFile.ps1 @@ -1,31 +1,44 @@ [CmdletBinding(SupportsShouldProcess)]param( [switch]$sudo, - [Parameter(Position = 0, ValueFromRemainingArguments = $true)] + [Parameter(Position = 0, ValueFromPipeline, ValueFromRemainingArguments = $true)] [string[]]$Path ) -$local:editors = $env:EDITOR,'nvim','code' -$local:editor = $null -foreach( $local:testEditor in $editors ) { - if( $(try{Get-Command -Type Application $testEditor -ErrorAction SilentlyContinue}catch{}) ) { - $editor = $testEditor - break; +begin { + $PathForEditor = @() +} +process { + foreach( $local:P in $Path ) { + $PathForEditor += $P | Get-Path -Expand } } -if( $editor -match 'vim?$' ) { - $editor += ' -p' -} - -if( $editor -match 'code(\.exe)?$' ) { - if( -not (Get-Process -Name 'code' -ErrorAction SilentlyContinue) ) { - Invoke-ExpressionEx -sudo:$sudo $editor +end { + $local:editors = $env:EDITOR,'nvim','code' + $local:editor = $null + foreach( $local:testEditor in $editors ) { + if( $(try{Get-Command -Type Application $testEditor -ErrorAction SilentlyContinue}catch{}) ) { + $editor = $testEditor + break; + } } -} - -$local:arguments = $Path | Get-Path -Expand | Join-String -Separator "' '" -if( $Path ) { $arguments = "'$arguments'" } - -if( $PSCmdlet.ShouldProcess( "Edit ($editor): $arguments" ) ) { - Invoke-ExpressionEx -sudo:$sudo $editor "$arguments" -} + + if( $editor -match 'vim?$' ) { + $editor += ' -p' + } + + if( $editor -match 'code(\.exe)?$' ) { + if( -not (Get-Process -Name 'code' -ErrorAction SilentlyContinue) ) { + Invoke-ExpressionEx -sudo:$sudo $editor + } + } + + Write-Verbose $($Path | Out-String) + + $local:arguments = $PathForEditor | Foreach-Object { "'$_'" } + if( $Path ) { $arguments = "$arguments" } + + if( $PSCmdlet.ShouldProcess( "Edit ($editor): $arguments" ) ) { + Invoke-ExpressionEx -sudo:$sudo $editor "$arguments" + } +} \ No newline at end of file diff --git a/base/Get-PossibleArguments.ps1 b/base/Get-PossibleArguments.ps1 index 0a1ade0..0de87a6 100644 --- a/base/Get-PossibleArguments.ps1 +++ b/base/Get-PossibleArguments.ps1 @@ -5,7 +5,15 @@ ) $local:possibleValues = $fullValueSet if( $wordToComplete ) { - $possibleValues = $possibleValues | Where-Object { $_ -match $wordToComplete } + $possibleValues = $possibleValues | + Where-Object { $_ -match $wordToComplete } | + ForEach-Object { + if( $_ -match ' ' ) { + "'$_'" + } else { + $_ + } + } if( -not $strict -and ($wordToComplete -notin $possibleValues) ) { $possibleValues = $( $wordToComplete; $possibleValues ) } diff --git a/base/Invoke-WebDownload.ps1 b/base/Invoke-WebDownload.ps1 index 35da14d..42033a3 100644 --- a/base/Invoke-WebDownload.ps1 +++ b/base/Invoke-WebDownload.ps1 @@ -33,7 +33,7 @@ process { $outputFileName = Join-Path $OutputPath $outputFileName if( (Test-Path $outputFileName) -and -not $Force) { - throw "$OutputPath already exists" + throw "$OutputFileName file already exists" } Write-Verbose "About to start download from:`n`t$Url`n`tto`n`t$outputFileName`n" diff --git a/base/Reload-MyScripts.ps1 b/base/Reload-MyScripts.ps1 index 162cf65..9c6b868 100644 --- a/base/Reload-MyScripts.ps1 +++ b/base/Reload-MyScripts.ps1 @@ -1,8 +1,31 @@ [CmdletBinding(SupportsShouldProcess)]param() -try { Get-Alias Get-MyAliases -ErrorAction Stop | ForEach-Object { Remove-Item "Alias:$($_.Name)" } } catch {} +function RemoveAlias { + param([string]$Name) + $local:a = $Name | Where-Object { $_ } | Get-Alias -ErrorAction SilentlyContinue + if ( -not $a ) { return } + if ( Get-Command Remove-Alias -ErrorAction SilentlyContinue ) { + $a | Remove-Alias -Scope $MyAliasScope -ErrorAction SilentlyContinue + } + else { + Remove-Item "Alias:$a" + } +} +function SafeSetAlias { + param([string]$Name, [string]$Value, [string]$Description) + + . RemoveAlias $Name + try { + Set-Alias $Name $Value -Scope $MyAliasScope -Description:$Description -ErrorAction Stop + } + catch { + Set-Alias $Name $Value -Scope $MyAliasScope -Description:$Description -Option AllScope + } +} + +try { Get-Alias Get-MyAliases -ErrorAction Stop | ForEach-Object { . RemoveAlias $($_.Name) } } catch {} function Get-MyAliases { -[CmdletBinding(SupportsShouldProcess)]param([switch]$ScriptsOnly) + [CmdletBinding()]param([switch]$ScriptsOnly) $local:allAliases = @() @@ -13,16 +36,17 @@ function Get-MyAliases { try { $local:newAliases += Get-Alias -Scope $_scope | Where-Object { - ($_.Definition -match "^$MyPSScriptRoot") -or (-not $ScriptsOnly -and ($_.Description -match '#MyAlias')) + ($_.Definition -like "$MyPSScriptRoot*") -or (-not $ScriptsOnly -and ($_.Description -match '#MyAlias')) } - if( $newAliases ) { + if ( $newAliases ) { $allAliases += $newAliases - $MyAliasScope = $_scope; + $MyAliasScope = $_scope; Write-Verbose "`$MyAliasScope is now set to $MyAliasScope" } - } catch { + } + catch { Write-Verbose "catch: $($_.Exception.Message)" - $_done = $_.Exception.Message -match 'The scope .* exceeds' + $_done = $_.Exception.Message -match 'The scope .* exceeds' } $_scope += 1 } until ( $_done ) @@ -30,8 +54,9 @@ function Get-MyAliases { $allAliases } -function getScriptName{param([string]$FullPath) - $FullPath -replace '\.ps1$','' -replace "^$([regex]::Escape($MyPSScriptRoot)).",'' +function getScriptName { + param([string]$FullPath) + $FullPath -replace '\.ps1$', '' -replace "^$([regex]::Escape($MyPSScriptRoot)).", '' } $local:IsVerbose = [bool]($PSBoundParameters['Verbose']) @@ -39,7 +64,8 @@ $local:IsVerbose = [bool]($PSBoundParameters['Verbose']) # Loads mandatory Package code try { $null = [Packagesz] -} catch { +} +catch { $local:PackagePath = $(Join-Path $MyPSScriptRoot 'base') Join-Path $(Join-Path $PackagePath profile.d) 'classes.ps1' | Where-Object { Test-Path $_ } | ForEach-Object { . $_ } @@ -62,21 +88,17 @@ $local:oldAliases = Get-MyAliases $oldAliases = Get-Alias -Scope $MyAliasScope | Where-Object Name -in $($oldAliases.Name + $myAliases.Keys) -if( $oldAliases -and $IsVerbose ) { +if ( $oldAliases -and $IsVerbose ) { Write-Verbose "Removing: $($oldAliases.Name -join ', ')" } -if( Get-Command Remove-Alias -ErrorAction SilentlyContinue ) { - $oldAliases | Remove-Alias -Scope $MyAliasScope -} else { - $oldAliases | ForEach-Object { Remove-Item "Alias:$($_.Name)" } -} +$oldAliases | ForEach-Object { . RemoveAlias $($_.Name) } -if( $(. Get-ScopeDepth) -gt 0 ) { +if ( $(. Get-ScopeDepth) -gt 0 ) { Write-Host -ForegroundColor Red "Try sourcing Reload-MyScripts instead of just running it" } -foreach( $local:PackagePath in $myPackages ) { - $local:PackageName = $PackagePath.Name +foreach ( $local:PackagePath in $myPackages ) { + #$local:PackageName = $PackagePath.Name Join-Path $PackagePath 'profile.d' | Where-Object { Test-Path $_ } | Get-ChildItem -Filter '*.ps1' | @@ -88,24 +110,25 @@ foreach( $local:PackagePath in $myPackages ) { $local:CommandsToAlias = ( @( $PackagePath ) + $( - [SystemName]::_GetValidValues("",$true,$true) | + [SystemName]::_GetValidValues("", $true, $true) | ForEach-Object { Join-Path $PackagePath "sys.$_" } - )) | - Where-Object { Test-Path $_ } | - ForEach-Object { - Get-ChildItem (Join-Path $_ '*.ps1') | Where-Object Name -notmatch '\.inc\.ps1$' - } + )) | + Where-Object { Test-Path $_ } | + ForEach-Object { + Get-ChildItem (Join-Path $_ '*.ps1') | Where-Object Name -notmatch '\.inc\.ps1$' + } - $CommandsToAlias | ForEach-Object { - Write-Verbose "Creating alias for $(getScriptName $_.FullName) Script..." - Set-Alias $($_.BaseName) $_.FullName -Scope $MyAliasScope - } + foreach ( $local:newAlias in $CommandsToAlias ) { + Write-Verbose "Creating alias for $(getScriptName $newAlias.FullName) Script..." + . SafeSetAlias $($newAlias.BaseName) $($newAlias.FullName) + } } -foreach( $local:alias in $myAliases.Keys ) { +foreach ( $local:alias in $myAliases.Keys ) { Write-Verbose "Adding $($alias) alias..." - Set-Alias -Name $alias -Value $myAliases[$alias] -Description '#MyAlias' -Scope $MyAliasScope + . SafeSetAlias $alias $myAliases[$alias] '#MyAlias' } +Remove-Item Function:\RemoveAlias, Function:\SafeSetAlias -ErrorAction SilentlyContinue \ No newline at end of file diff --git a/docker/Edit-DockerCompose.ps1 b/docker/Edit-DockerCompose.ps1 index 3bd9ef4..ebda20c 100644 --- a/docker/Edit-DockerCompose.ps1 +++ b/docker/Edit-DockerCompose.ps1 @@ -6,7 +6,7 @@ ) -$local:EditCandidates = @('docker-compose.###','.base.docker-compose.###') +$local:EditCandidates = @('docker-compose.###','.base.docker-compose.###','secrets.env') $local:EditBonus = @('Dockerfile', '.env', '*.env') $local:editFiles = @() foreach( $local:ext in @('.yml', '.yaml') ) { @@ -15,7 +15,7 @@ foreach( $local:ext in @('.yml', '.yaml') ) { foreach( $local:path in $ProjectPath ) { $local:testPath = Join-Path $path $fileName if( $Force -or $(Test-Path $testPath) ) { - $editFiles += $testPath + $editFiles += $testPath | Get-Path $editFiles += Get-ChildItem $(Join-Path $path '*') -Include $EditBonus -Depth 1 | Select-Object -ExpandProperty FullName } @@ -37,9 +37,17 @@ $AdditionalFiles = $AdditionalFiles | Where-Object { $_ } | ForEach-Object { $local:FinalEditList = $editFiles | Where-Object {$_} | Sort-Object { $local:n = [System.IO.Path]::GetFileName($_) - Join-Path [PSystem.IO.ath]::GetDirectoryName($_) "$(if( $n[0] -eq '.' ) { "9" } else { "1" })$n" + $local:sorder = "$( + if( $n[0] -eq '.' ) { "2" } + elseif( $n -match 'docker-compose\.y' ) { "1" } + else { "9" } + )$n" + Write-Verbose "sorder($n)=$sorder" + $local:sorder = Join-Path $([System.IO.Path]::GetDirectoryName($_)) $sorder + $sorder } $FinalEditList = (@() + $FinalEditList + @() + $AdditionalFiles) | Select-Object -Unique +Write-Verbose "`$FinalEditList = `n$($FinalEditList | Out-String)" Edit-TextFile $FinalEditList diff --git a/git/Edit-GitIgnore.ps1 b/git/Edit-GitIgnore.ps1 new file mode 100644 index 0000000..9ffbc21 --- /dev/null +++ b/git/Edit-GitIgnore.ps1 @@ -0,0 +1,2 @@ +$local:workTree = git worktree list --porcelain | Select-String worktree | ForEach-Object { $_ -split 'worktree ' } | Where-Object { $_ } +Edit-TextFile $(Join-Path $workTree .gitignore) diff --git a/GitHub/Get-GitHubReleaseAssets.ps1 b/git/Get-GitHubReleaseAssets.ps1 similarity index 100% rename from GitHub/Get-GitHubReleaseAssets.ps1 rename to git/Get-GitHubReleaseAssets.ps1 diff --git a/git/Get-GitHubReleaseTag.ps1 b/git/Get-GitHubReleaseTag.ps1 new file mode 100644 index 0000000..ef496de --- /dev/null +++ b/git/Get-GitHubReleaseTag.ps1 @@ -0,0 +1,11 @@ +[CmdletBinding()]param( + [Parameter(Mandatory)] + [string]$GitHubProject, + [string]$tag='latest' +) + +Invoke-WebRequest https://github.com/$GitHubProject/releases/$tag -ErrorAction Stop | + Select-Object -ExpandProperty Links | + Where-Object title | + Where-Object href -match 'tree/[^/]+$' | + Select-Object -ExpandProperty title -First 1 diff --git a/git/Get-GitRepo.ps1 b/git/Get-GitRepo.ps1 new file mode 100644 index 0000000..342c77a --- /dev/null +++ b/git/Get-GitRepo.ps1 @@ -0,0 +1,29 @@ +[CmdletBinding(SupportsShouldProcess)]param( + [Parameter(Mandatory)] + [string]$LocalPath, + [Parameter(Mandatory)] + [string]$GitOrigin, + [string]$Branch='HEAD' +) +$local:gitPath = Join-Path 'themes' 'plextheme' | Get-Path +function doGit { git "--git-dir=`"$(Join-Path $LocalPath '.git')`"" "--work-tree=`"$LocalPath`"" $args } +$local:savedErrorActionPreference = $ErrorActionPreference +$ErrorActionPreference = 'Stop' +$local:exists = Test-Path $LocalPath +try { + if( $exists ) { + # Update code from git repo + Write-Verbose "Pulling from [$GitOrigin] into [$LocalPath] on branch/tag '$Branch'..." + doGit fetch --quiet + } else { + git clone $GitOrigin $LocalPath + } + doGit checkout $Branch --quiet + if( $exists ) { + doGit status + } +} catch { + throw $_ +} finally { + $ErrorActionPreference = $savedErrorActionPreference +} diff --git a/git/Refresh-GitRepo.ps1 b/git/Refresh-GitRepo.ps1 new file mode 100644 index 0000000..dab380d --- /dev/null +++ b/git/Refresh-GitRepo.ps1 @@ -0,0 +1,7 @@ +$local:workTree = git worktree list --porcelain | Select-String worktree | ForEach-Object { $_ -split 'worktree ' } | Where-Object { $_ } +Push-Location $workTree +$null = git reset HEAD +$null = git rm --cached -r . +$null = git add . +git status +Pop-Location diff --git a/git/_.package.json b/git/_.package.json new file mode 100644 index 0000000..fa2c07c --- /dev/null +++ b/git/_.package.json @@ -0,0 +1,14 @@ +{ + "package": { + "Condition": [ + { + "custom": "Get-Command git -Type Application", + "System": null, + "Hostname": null, + "Username": null, + "Logic": 0 + } + ], + "Name": "git" + } +}