-
-
Notifications
You must be signed in to change notification settings - Fork 60
/
Show-BuildTree.ps1
134 lines (112 loc) · 2.7 KB
/
Show-BuildTree.ps1
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<#
.Synopsis
Shows Invoke-Build task trees with brief information.
Copyright (c) Roman Kuzmin
.Description
This script analyses task references and shows parent tasks and child trees
for the specified tasks. Tasks are not invoked.
.Parameter Task
Task names.
If it is "*" then all root tasks are used.
If it is omitted or "." then the default task is used.
.Parameter File
The build script.
If it is omitted then the default script is used.
.Parameter Parameters
Build script parameters needed in special cases when they alter tasks.
.Parameter Upstream
Tells to show upstream tasks for each task.
.Outputs
Specified task trees.
.Link
https://github.com/nightroman/Invoke-Build
#>
param(
[Parameter(Position=0)]
[string[]]$Task
,
[Parameter(Position=1)]
[string]$File
,
[Parameter(Position=2)]
[hashtable]$Parameters
,
[switch]$Upstream
)
$ErrorActionPreference = 1
$private:_Task = $Task
$private:_File = $File
$private:_Parameters = if ($Parameters) {$Parameters} else {@{}}
$private:_Upstream = $Upstream
Remove-Variable Task, File, Parameters, Upstream
# Shows the task tree.
function ShowTaskTree($Task, $Docs, $Step = 0) {
if ($Step -eq 0) {''}
$tab = ' ' * $Step
++$Step
# synopsis
$synopsis = Get-BuildSynopsis $Task $docs
# name
$info = $tab + $Task.Name
# upstream
if ($references.get_Count()) {
$reference = $references[$Task]
if ($reference.get_Count()) {
$info += ' (' + (($reference.get_Keys() | Sort-Object) -join ', ') + ')'
}
}
# synopsis, output
if ($synopsis) {"$info # $synopsis"} else {$info}
# task jobs
foreach($_ in $Task.Jobs) {
if ($_ -is [string]) {
$r, $s = *Job $_
ShowTaskTree $tasks[$r] $Docs $Step
}
else {
$tab + ' {}'
}
}
}
try {
. Invoke-Build
# get tasks
$tasks = Invoke-Build ?? $_File @_Parameters
# references
$references = @{}
if ($_Upstream) {
foreach($it in $tasks.get_Values()) {
$references[$it] = @{}
}
foreach($it in $tasks.get_Values()) {foreach($job in $it.Jobs) {if ($job -is [string]) {
$references[$tasks[$job]][$it.Name] = 0
}}}
}
# resolve task
if ($_Task -eq '*') {
$_Task = :task foreach($_ in $tasks.get_Keys()) {
foreach($task in $tasks.get_Values()) {
if ($task.Jobs -contains $_ -or $task.Jobs -contains "?$_") {
continue task
}
}
$_
}
}
elseif (!$_Task -or '.' -eq $_Task) {
$_Task = if ($tasks['.']) {'.'} else {$tasks.Item(0).Name}
}
# test tasks
foreach($name in $_Task) {
if (!$tasks[$name]) {throw "Missing task '$name'."}
}
# show trees
$docs = @{}
foreach($name in $_Task) {
ShowTaskTree $tasks[$name] $docs
}
}
catch {
if ($_.InvocationInfo.ScriptName -ne $MyInvocation.MyCommand.Path) {throw}
$PSCmdlet.ThrowTerminatingError($_)
}