TxdDocker.psm1
if (-not (Test-Path $env:TXD_DOCKER_ROOT)) { if($isLinux){ $env:TXD_DOCKER_ROOT = '/docker/laravel_docker' }else{ $env:TXD_DOCKER_ROOT = 'C:\docker\laravel_docker' } } function Get-DockerEnv{ $env = ($env:TXD_DOCKER_ROOT+'\.env') $envExists = Test-Path ($env) -PathType Leaf if(!$envExists){ Write-Error ".env file not found!"; } $ini = [PSCustomObject]@{}; foreach($line in Get-Content $env) { $withoutComments = $line.Split("#") $parts = $withoutComments[0].Split("=") if($parts.Count -gt 1){ Add-member -InputObject $ini -NotePropertyName $parts[0] -NotePropertyValue ($parts[1] -replace "\\", "/") } } if(-not (Get-Member -Name 'WEBSITE_DOMAIN' -InputObject $ini)){ Add-member -InputObject $ini -NotePropertyName "WEBSITE_DOMAIN" -NotePropertyValue "dev.jsmservice.eu" } return $ini } $projectName = (Get-DockerEnv).COMPOSE_PROJECT_NAME if ($null -eq $env:TXD_CONTAINER_NAME -or -not (Test-Path $env:TXD_CONTAINER_NAME)) { $env:TXD_CONTAINER_NAME = 'php-dev' } if ($null -eq $env:TXD_HOST_FOLDER_PATH -or -not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { $env:TXD_HOST_FOLDER_PATH = "\\wsl.localhost\txd-docker-dev\var\www" } if ($null -eq $env:TXD_HOST_FOLDER_PATH -or -not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { $env:TXD_HOST_FOLDER_PATH = "\\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes\${projectName}_sites\_data" } if (-not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { $env:TXD_HOST_FOLDER_PATH = "\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\${projectName}_sites\_data" } if (-not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { $env:TXD_HOST_FOLDER_PATH = "\\wsl.localhost\docker-desktop-data\data\docker\volumes\${projectName}_sites\_data" } if (-not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { $env:TXD_HOST_FOLDER_PATH = "\\wsl$\docker-desktop-data\data\docker\volumes\${projectName}_sites\_data" } function Read-YesNo{ param($question, [switch]$defaultToYes) $sample = " (y/N)" if($defaultToYes){ $sample =" (Y/n)" } do { $answer = Read-Host ($question+$sample) } until ("y","n","Y","N","" -ccontains $answer) if("y","Y" -ccontains $answer){ return $true } if($defaultToYes -and ($answer -eq "")){ return $true } return $false } function Set-CodeRemoteURLHandler { param( [switch] $clear ) $rootNode = "HKCU:\Software\Classes\txmt" if($clear){ Remove-Item -Path $rootNode -Force -Verbose }else{ new-item -Path $rootNode -Value "URL:txmt" -force new-itemProperty -Path $rootNode -Name "URL Protocol" -PropertyType String -force new-item -Path "$rootNode\shell" -force new-item -Path "$rootNode\shell\open" -force new-item -Path "$rootNode\shell\open\command" -Value "pwsh -WindowStyle hidden -Command `"open-dockerdev '%1' -Link`"" -force } } function Set-CodeRemoteContextMenu { param( [switch] $clear ) $rootNode = "HKCU:\Software\Classes\Directory\Background\shell\TxdDocker" if($clear){ Remove-Item -Path $rootNode -Force -Verbose }else{ new-item -Path $rootNode -Value "Open in TxdDocker" -force new-itemProperty -Path $rootNode -Name "Icon" -Value "$env:TXD_DOCKER_ROOT\assets\TxdDocker.ico" -PropertyType String -force new-item -Path "$rootNode\command" -Value "pwsh -WindowStyle hidden -Command `"open-dockerdev '%V' -External`"" -force } } function Open-DockerDev{ param( $path, [switch]$link = $false, [switch]$external = $false ) $dockerEnv = Get-DockerEnv $g = "" if($link){ $g = "-g" $path = ([uri]::UnescapeDataString($path) -split "file://")[1] -replace "&line=",":" if($path.StartsWith($dockerEnv.WEBSITE_LOCAL_PATH)){ $path = $path -replace $dockerEnv.WEBSITE_LOCAL_PATH, "" } } if($external){ if($path.StartsWith($env:TXD_HOST_FOLDER_PATH)){ $path = $path.replace($env:TXD_HOST_FOLDER_PATH,"") -replace "\\", "/" }else{ return } } if(("" -eq ("{0}" -f $path).Trim())){ $devPath = "/root" }else{ $devPath = (Join-Path $dockerEnv.WEBSITE_LOCAL_PATH $path) -replace "\\", "/" } $containerStructure = '{"containerName":"/php-dev","cwd":"\\\\wsl.localhost\\txd-docker-dev\\docker\\txd_docker"}' $containerName = ((Format-Hex -InputObject $containerStructure).Bytes |ForEach-Object ToString X2) -join "" $command = "wsl -d txd-docker-dev code --folder-uri 'vscode-remote://attached-container+$containerName$devPath'" #$command = "wsl -d txd-docker-dev code" write-host $env:TXD_CONTAINER_NAME write-host $link write-host $external write-host $devPath write-host $command invoke-expression $command } function Open-DockerDevShell{ param( $path ) $dockerEnv = Get-DockerEnv $devPath = (Join-Path $dockerEnv.WEBSITE_LOCAL_PATH $path) -replace "\\", "/" $shell = $dockerEnv.DEFAULT_SHELL invoke-expression "docker exec -it -w $devPath php-dev $shell" } function Open-DockerHostFolder{ param( $path ) $fullPath = join-path $env:TXD_HOST_FOLDER_PATH $path invoke-expression "start $fullPath" } function Get-Docker { wsl -d txd-docker-dev docker $args } Set-Alias -Name docker -Value Get-Docker $dockerdev_block = { param($commandName,$parameterName, $wordToComplete) $subfolder = "" $matchingWord = $wordToComplete if($wordToComplete.Length -eq 0){ $subfolder = "" }else{ if($wordToComplete -match '(.*)\/(.*)'){ $subfolder = $Matches.1 $matchingWord = $Matches.2 } } $fullpath = (join-path $env:TXD_HOST_FOLDER_PATH $subfolder) $list = Get-ChildItem -directory $fullpath | ForEach-Object {$_.Name} if($matchingWord.Length -gt 0 ){ $list = $list | Select-String -Pattern $matchingWord } $list | Sort-Object | ForEach-Object { if($subfolder.Length -eq 0){ $fullParam = (Join-path $_ "/") -replace "\\", "/" }else{ $fullParam = (Join-path $subfolder $_ "/") -replace "\\", "/" } New-Object -Type System.Management.Automation.CompletionResult -ArgumentList $fullParam, $_, "ParameterValue", $fullParam } } Register-ArgumentCompleter -CommandName Open-DockerDev -ParameterName "path" -ScriptBlock $dockerdev_block Register-ArgumentCompleter -CommandName Open-DockerDevShell -ParameterName "path" -ScriptBlock $dockerdev_block Register-ArgumentCompleter -CommandName Open-DockerHostFolder -ParameterName "path" -ScriptBlock $dockerdev_block Set-Alias -Name giteye -Value Open-DockerGitEye Export-ModuleMember -Function Get-DockerEnv, Open-DockerDev, Open-DockerDevShell, Get-Docker, Open-DockerHostFolder, Open-DockerGitEye, Set-CodeRemoteURLHandler, Set-CodeRemoteContextMenu -Alias * |