-
-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathInvoke-TaskFromVSCode.ps1
More file actions
111 lines (89 loc) · 2.64 KB
/
Copy pathInvoke-TaskFromVSCode.ps1
File metadata and controls
111 lines (89 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<#PSScriptInfo
.VERSION 1.1.0
.AUTHOR Roman Kuzmin
.COPYRIGHT (c) Roman Kuzmin
.TAGS Invoke-Build, Task, VSCode
.GUID 1dcf7c94-b68d-4fb7-9e2b-886889b6c42e
.LICENSEURI http://www.apache.org/licenses/LICENSE-2.0
.PROJECTURI https://github.com/nightroman/Invoke-Build
#>
<#
.Synopsis
Invokes the current Invoke-Build task from VSCode.
.Description
It invokes the current task from the current build script opened in VSCode.
Requires:
- Invoke-Build
- VSCode PowerShell
How to use:
https://github.com/nightroman/Invoke-Build/blob/main/Docs/Invoke-Task-from-VSCode.md
.Parameter Console
Tells to invoke the task in an external console.
.Link
https://github.com/nightroman/Invoke-Build/blob/main/Docs/Invoke-Task-from-VSCode.md
#>
[CmdletBinding()]
param(
[switch]$Console
)
$ErrorActionPreference=1; trap {throw $_}
$private:file = $null
try {
$private:context = $psEditor.GetEditorContext()
$file = $context.CurrentFile
}
catch {}
if (!$file) {
return Write-Warning "No current file."
}
# save if modified, #118
$file.Save()
$private:path = $file.Path
if ($path -notlike '*.ps1') {
return Write-Warning "No current .ps1 file."
}
$private:_Console = $Console
Remove-Variable Console
$goodTasksDic = Invoke-Build ?? $path -Result:Result
$goodTasks = $goodTasksDic.get_Values()
$dupeTasks = $Result.Redefined
$line = $context.CursorPosition.Line
function __find_caret_task($Tasks, $Path, $Line) {
$bestTaskName = ''
$bestLineNumber = -1
foreach($task in $Tasks) {
$ii = $task.InvocationInfo
# skip different file
if ($ii.ScriptName -ne $Path) {
continue
}
# stop on any task below the caret
if ($ii.ScriptLineNumber -gt $Line) {
break
}
# keep the best
$bestTaskName = $task.Name
$bestLineNumber = $ii.ScriptLineNumber
}
[pscustomobject]@{Name = $bestTaskName; LineNumber = $bestLineNumber}
}
$goodTask = __find_caret_task $goodTasks $path $line
$dupeTask = __find_caret_task $dupeTasks $path $line
# no dupe or good task?
if (!$dupeTask.Name -and !$goodTask.Name) {
return Write-Warning "No current task."
}
# dupe task and no good task better than dupe?
if ($dupeTask.Name -and $goodTask.LineNumber -lt $dupeTask.LineNumber) {
$ii = $goodTasksDic[$dupeTask.Name].InvocationInfo
Write-Warning "Invoking redefined task at $($ii.ScriptName):$($ii.scriptLineNumber)"
$goodTask = $dupeTask
}
if ($_Console) {
$command = "Invoke-Build '$($goodTask.Name.Replace("'", "''"))' '$($path.Replace("'", "''"))'"
$encoded = [Convert]::ToBase64String(([System.Text.Encoding]::Unicode.GetBytes($command)))
Start-Process powershell.exe "-NoExit -NoProfile -ExecutionPolicy Bypass -EncodedCommand $encoded"
}
else {
Invoke-Build $goodTask.Name $path
}