diff --git a/bin/lein.cmd b/bin/lein.cmd index 67947afd..9d07ff24 100644 --- a/bin/lein.cmd +++ b/bin/lein.cmd @@ -1,5 +1,5 @@ -@echo off -setlocal -set ps1=%~dpn0.ps1 -shift -powershell -NoProfile -ExecutionPolicy Bypass -File "%ps1%" %* +@echo off +setlocal +set ps1=%~dpn0.ps1 +shift +powershell -NoProfile -ExecutionPolicy Bypass -File "%ps1%" %* diff --git a/bin/lein.ps1 b/bin/lein.ps1 index 91d88f8f..74328732 100644 --- a/bin/lein.ps1 +++ b/bin/lein.ps1 @@ -1,155 +1,155 @@ -<# -.Synopsis - Leinengen bootstrap. - -.Parameter Command - The command to pass to leiningen. - -.Notes - This is a very literal port of lein.bat to PowerShell. - - TODO: - - Determine which (if any) environment variables are used from within Leiningen/Clojure - and convert the rest to local- or script-scoped variables. - - Probably should parse the version from the newest .jar filename, rather than hard-code - it and search for the .jar file from it. - - Further reduce/simplify/refactor away from batch-file idioms toward idiomatic PowerShell. - -.Link - http://leiningen.org/ -#> - -#require -version 3 -[CmdletBinding(SupportsShouldProcess=$true)] Param( -[Parameter(Position=0,ValueFromRemainingArguments=$true)][string[]]$Command = 'help' -) - -function Set-ParentLocation([string]$file) -{ - for($dir = [IO.DirectoryInfo]"$PWD"; $dir.Parent; $dir = $dir.Parent) - { - if(Test-Path (Join-Path $dir.FullName $file) -PathType Leaf) { cd $dir } - } -} - -function Initialize-Environment -{ - $env:LEIN_VERSION = '2.6.2-SNAPSHOT' - $env:SNAPSHOT = if($env:LEIN_VERSION -like '*-SNAPSHOT'){'YES'}else{'NO'} #TODO: Still needed? - $env:ORIGINAL_PWD = $PWD -replace '\\$','\\' - Set-ParentLocation project.clj - if(!$env:LEIN_HOME) {$env:LEIN_HOME = "$env:USERPROFILE\.lein"} - if(!$env:LEIN_JAR) {$env:LEIN_JAR = "$env:LEIN_HOME\self-installs\leiningen-$env:LEIN_VERSION-standalone.jar"} - if(!([Net.WebRequest]::DefaultWebProxy.IsBypassed('https://github.com/'))) - { - $proxy = [Net.WebRequest]::DefaultWebProxy.GetProxy('https://github.com/') - Write-Verbose "Using proxy: $proxy" - $Script:PSBoundParameters = @{ - 'Invoke-WebRequest:Proxy' = $proxy - 'Invoke-WebRequest:ProxyUseDefaultCredentials' = $true - } - } -} - -function Use-ClassPath([string]$Value) -{ - $env:CLASSPATH = - if(!(Test-Path .lein-classpath -PathType Leaf)) {$Value} - else {"$(gc .lein-classpath |? {$_} |select -Last 1);$Value"} -} - -function Initialize-Binary -{ - if(!(Test-Path $env:LEIN_JAR -PathType Leaf)) - {throw "$env:LEIN_JAR cannot be found. Try running 'lein self-install' or change the LEIN_JAR environment variable."} - Use-ClassPath $env:LEIN_JAR -} - -function Initialize-Source -{ - $env:LEIN_ROOT = $PSScriptRoot - $env:bootstrapfile = "$env:LEIN_ROOT\leiningen-core\.lein-bootstrap" - Write-Verbose "LEIN_ROOT=$env:LEIN_ROOT" - if($env:bootstrapfile -like '*;*') #TODO: Still important? - {throw "bootstrap file ($env:bootstrapfile) should not contain semicolons!"} - if(!(Test-Path $env:bootstrapfile -PathType Leaf)) - {throw @' -Leiningen is missing its dependencies. Run 'lein bootstrap' in the leiningen-core/ directory with a stable release. -See CONTRIBUTING.md for details. -'@} - if((Get-Content $env:bootstrapfile -raw) -like '*"*') - {throw "Double quotes detected inside bootstrap file $env:bootstrapfile!?"} - $env:LEIN_LIBS = (Get-Content $env:bootstrapfile |% {$_ -split ';'} |% {"$_"}) -join ';' - Write-Verbose "LEIN_LIBS=$env:LEIN_LIBS" - Use-ClassPath "$env:LEIN_LIBS;$env:LEIN_ROOT\src;$env:LEIN_ROOT\resources" -} - -function Install-Self -{ - if(Test-Path $env:LEIN_JAR -PathType Leaf) {throw "$env:LEIN_JAR already exists. Delete and retry."} - $jardir = ([IO.FileInfo]$env:LEIN_JAR).Directory.FullName - if(!(Test-Path $jardir -PathType Container)) {mkdir $jardir |Out-Null} - @{ # splatting Invoke-WebRequest due to long URI - Uri = "https://github.com/technomancy/leiningen/releases/download/$env:LEIN_VERSION/leiningen-$env:LEIN_VERSION-standalone.zip" - OutFile = $env:LEIN_JAR - } |% {Write-Progress 'Install-Self' $_.Uri -CurrentOperation "Downloading to $env:LEIN_JAR" ; Invoke-WebRequest @_} - Write-Progress 'Install-Self' -Completed -} - -function Update-Self -{ - $targetVersion = if($Command.Length -gt 1) {$Command[1]} else {'stable'} - if(!$PSCmdlet.ShouldProcess($PSCommandPath,"upgrade to $targetVersion")) {throw 'Cancelled'} - @{ # splatting Invoke-WebRequest due to long URI - Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.cmd" - OutFile = "$PSScriptRoot\lein.cmd.pending" - } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSScriptRoot\lein.cmd.pending" ; Invoke-WebRequest @_} - @{ # splatting Invoke-WebRequest due to long URI - Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.ps1" - OutFile = "$PSCommandPath.pending" - } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSCommandPath.pending" -PercentComplete 50 ; Invoke-WebRequest @_} - Write-Progress 'Update-Self' -Completed - Install-Self - Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action { - rm "$PSScriptRoot\lein.cmd" - mv "$PSScriptRoot\lein.cmd.pending" "$PSScriptRoot\lein.cmd" - rm "$PSCommandPath.pending" - mv "$PSCommandPath" "$PSCommandPath.pending" - } -} - -function Invoke-Java -{ - Write-Verbose "CLASSPATH=$env:CLASSPATH" - $env:JAVA_CMD = if($env:JAVA_CMD){$env:JAVA_CMD -replace '\A"|"\Z',''}else{'java'} - $env:LEIN_JAVA_CMD = if($env:LEIN_JAVA_CMD){$env:LEIN_JAVA_CMD -replace '\A"|"\Z',''}else{$env:JAVA_CMD} - if(!$env:JVM_OPTS){$env:JVM_OPTS = $env:JAVA_OPTS} - $JavaArgs = @( - '-client',$env:LEIN_JVM_OPTS, - "-Dclojure.compile.path=$PWD/target/classes", #TODO: is this what lein.bat was going for? - "-Dleiningen.original.pwd=`"$env:ORIGINAL_PWD`"", - '-cp',$env:CLASSPATH, - 'clojure.main', - '-m','leiningen.core.main' - ) - &$env:LEIN_JAVA_CMD @JavaArgs @Command -} - -function Invoke-Leiningen -{ - Initialize-Environment - switch($Command[0]) - { - self-install {Install-Self} - upgrade {Update-Self } - downgrade {Update-Self } - default - { - if(Test-Path "$PSCommandPath\..\src\leiningen\version.clj" -PathType Leaf) {Initialize-Source} - else {Initialize-Binary} - Invoke-Java - } - } -} - -Invoke-Leiningen +<# +.Synopsis + Leiningen bootstrap. + +.Parameter Command + The command to pass to leiningen. + +.Notes + This is a very literal port of lein.bat to PowerShell. + + TODO: + - Determine which (if any) environment variables are used from within Leiningen/Clojure + and convert the rest to local- or script-scoped variables. + - Probably should parse the version from the newest .jar filename, rather than hard-code + it and search for the .jar file from it. + - Further reduce/simplify/refactor away from batch-file idioms toward idiomatic PowerShell. + +.Link + http://leiningen.org/ +#> + +#require -version 3 +[CmdletBinding(SupportsShouldProcess=$true)] Param( +[Parameter(Position=0,ValueFromRemainingArguments=$true)][string[]]$Command = 'help' +) + +function Set-ParentLocation([string]$file) +{ + for($dir = [IO.DirectoryInfo]"$PWD"; $dir.Parent; $dir = $dir.Parent) + { + if(Test-Path (Join-Path $dir.FullName $file) -PathType Leaf) { cd $dir } + } +} + +function Initialize-Environment +{ + $env:LEIN_VERSION = '2.6.2-SNAPSHOT' + $env:SNAPSHOT = if($env:LEIN_VERSION -like '*-SNAPSHOT'){'YES'}else{'NO'} #TODO: Still needed? + $env:ORIGINAL_PWD = $PWD -replace '\\$','\\' + Set-ParentLocation project.clj + if(!$env:LEIN_HOME) {$env:LEIN_HOME = "$env:USERPROFILE\.lein"} + if(!$env:LEIN_JAR) {$env:LEIN_JAR = "$env:LEIN_HOME\self-installs\leiningen-$env:LEIN_VERSION-standalone.jar"} + if(!([Net.WebRequest]::DefaultWebProxy.IsBypassed('https://github.com/'))) + { + $proxy = [Net.WebRequest]::DefaultWebProxy.GetProxy('https://github.com/') + Write-Verbose "Using proxy: $proxy" + $Script:PSBoundParameters = @{ + 'Invoke-WebRequest:Proxy' = $proxy + 'Invoke-WebRequest:ProxyUseDefaultCredentials' = $true + } + } +} + +function Use-ClassPath([string]$Value) +{ + $env:CLASSPATH = + if(!(Test-Path .lein-classpath -PathType Leaf)) {$Value} + else {"$(gc .lein-classpath |? {$_} |select -Last 1);$Value"} +} + +function Initialize-Binary +{ + if(!(Test-Path $env:LEIN_JAR -PathType Leaf)) + {throw "$env:LEIN_JAR cannot be found. Try running 'lein self-install' or change the LEIN_JAR environment variable."} + Use-ClassPath $env:LEIN_JAR +} + +function Initialize-Source +{ + $env:LEIN_ROOT = $PSScriptRoot + $env:bootstrapfile = "$env:LEIN_ROOT\leiningen-core\.lein-bootstrap" + Write-Verbose "LEIN_ROOT=$env:LEIN_ROOT" + if($env:bootstrapfile -like '*;*') #TODO: Still important? + {throw "bootstrap file ($env:bootstrapfile) should not contain semicolons!"} + if(!(Test-Path $env:bootstrapfile -PathType Leaf)) + {throw @' +Leiningen is missing its dependencies. Run 'lein bootstrap' in the leiningen-core/ directory with a stable release. +See CONTRIBUTING.md for details. +'@} + if((Get-Content $env:bootstrapfile -raw) -like '*"*') + {throw "Double quotes detected inside bootstrap file $env:bootstrapfile!?"} + $env:LEIN_LIBS = (Get-Content $env:bootstrapfile |% {$_ -split ';'} |% {"$_"}) -join ';' + Write-Verbose "LEIN_LIBS=$env:LEIN_LIBS" + Use-ClassPath "$env:LEIN_LIBS;$env:LEIN_ROOT\src;$env:LEIN_ROOT\resources" +} + +function Install-Self +{ + if(Test-Path $env:LEIN_JAR -PathType Leaf) {throw "$env:LEIN_JAR already exists. Delete and retry."} + $jardir = ([IO.FileInfo]$env:LEIN_JAR).Directory.FullName + if(!(Test-Path $jardir -PathType Container)) {mkdir $jardir |Out-Null} + @{ # splatting Invoke-WebRequest due to long URI + Uri = "https://github.com/technomancy/leiningen/releases/download/$env:LEIN_VERSION/leiningen-$env:LEIN_VERSION-standalone.zip" + OutFile = $env:LEIN_JAR + } |% {Write-Progress 'Install-Self' $_.Uri -CurrentOperation "Downloading to $env:LEIN_JAR" ; Invoke-WebRequest @_} + Write-Progress 'Install-Self' -Completed +} + +function Update-Self +{ + $targetVersion = if($Command.Length -gt 1) {$Command[1]} else {'stable'} + if(!$PSCmdlet.ShouldProcess($PSCommandPath,"upgrade to $targetVersion")) {throw 'Cancelled'} + @{ # splatting Invoke-WebRequest due to long URI + Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.cmd" + OutFile = "$PSScriptRoot\lein.cmd.pending" + } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSScriptRoot\lein.cmd.pending" ; Invoke-WebRequest @_} + @{ # splatting Invoke-WebRequest due to long URI + Uri = "https://github.com/technomancy/leiningen/raw/$targetVersion/bin/lein.ps1" + OutFile = "$PSCommandPath.pending" + } |% {Write-Progress 'Update-Self' $_.Uri -CurrentOperation "Downloading to $PSCommandPath.pending" -PercentComplete 50 ; Invoke-WebRequest @_} + Write-Progress 'Update-Self' -Completed + Install-Self + Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action { + rm "$PSScriptRoot\lein.cmd" + mv "$PSScriptRoot\lein.cmd.pending" "$PSScriptRoot\lein.cmd" + rm "$PSCommandPath.pending" + mv "$PSCommandPath" "$PSCommandPath.pending" + } +} + +function Invoke-Java +{ + Write-Verbose "CLASSPATH=$env:CLASSPATH" + $env:JAVA_CMD = if($env:JAVA_CMD){$env:JAVA_CMD -replace '\A"|"\Z',''}else{'java'} + $env:LEIN_JAVA_CMD = if($env:LEIN_JAVA_CMD){$env:LEIN_JAVA_CMD -replace '\A"|"\Z',''}else{$env:JAVA_CMD} + if(!$env:JVM_OPTS){$env:JVM_OPTS = $env:JAVA_OPTS} + $JavaArgs = @( + '-client',$env:LEIN_JVM_OPTS, + "`"-Dclojure.compile.path=$PWD/target/classes`"", #TODO: Add this line only when we're initializing from source + "`"-Dleiningen.original.pwd=$env:ORIGINAL_PWD`"", + '-cp',$env:CLASSPATH, + 'clojure.main', + '-m','leiningen.core.main' + ) + &$env:LEIN_JAVA_CMD @JavaArgs @Command +} + +function Invoke-Leiningen +{ + Initialize-Environment + switch($Command[0]) + { + self-install {Install-Self} + upgrade {Update-Self } + downgrade {Update-Self } + default + { + if(Test-Path "$PSCommandPath\..\src\leiningen\version.clj" -PathType Leaf) {Initialize-Source} + else {Initialize-Binary} + Invoke-Java + } + } +} + +Invoke-Leiningen