-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathdepends.ps1
101 lines (87 loc) · 3.22 KB
/
depends.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
# resolve dependencies for the supplied apps, and sort into the correct order
function install_order($apps, $arch) {
$res = @()
foreach ($app in $apps) {
foreach ($dep in deps $app $arch) {
if ($res -notcontains $dep) { $res += $dep}
}
if ($res -notcontains $app) { $res += $app }
}
return $res
}
# http://www.electricmonk.nl/docs/dependency_resolving_algorithm/dependency_resolving_algorithm.html
function deps($app, $arch) {
$resolved = new-object collections.arraylist
dep_resolve $app $arch $resolved @()
if ($resolved.count -eq 1) { return @() } # no dependencies
return $resolved[0..($resolved.count - 2)]
}
function dep_resolve($app, $arch, $resolved, $unresolved) {
$app, $bucket, $null = parse_app $app
$unresolved += $app
$null, $manifest, $null, $null = Find-Manifest $app $bucket
if(!$manifest) {
if(((Get-LocalBucket) -notcontains $bucket) -and $bucket) {
warn "Bucket '$bucket' not installed. Add it with 'scoop bucket add $bucket' or 'scoop bucket add $bucket <repo>'."
}
abort "Couldn't find manifest for '$app'$(if(!$bucket) { '.' } else { " from '$bucket' bucket." })"
}
$deps = @(install_deps $manifest $arch) + @(runtime_deps $manifest) | Select-Object -Unique
foreach ($dep in $deps) {
if ($resolved -notcontains $dep) {
if ($unresolved -contains $dep) {
abort "Circular dependency detected: '$app' -> '$dep'."
}
dep_resolve $dep $arch $resolved $unresolved
}
}
$resolved.add($app) | Out-Null
$unresolved = $unresolved -ne $app # remove from unresolved
}
function runtime_deps($manifest) {
if ($manifest.depends) { return $manifest.depends }
}
function script_deps($script) {
$deps = @()
if($script -is [Array]) {
$script = $script -join "`n"
}
if([String]::IsNullOrEmpty($script)) {
return $deps
}
if($script -like '*Expand-7zipArchive *' -or $script -like '*extract_7zip *') {
$deps += '7zip'
}
if($script -like '*Expand-MsiArchive *' -or $script -like '*extract_msi *') {
$deps += 'lessmsi'
}
if($script -like '*Expand-InnoArchive *' -or $script -like '*unpack_inno *') {
$deps += 'innounp'
}
if($script -like '*Expand-DarkArchive *') {
$deps += 'dark'
}
return $deps
}
function install_deps($manifest, $arch) {
$deps = @()
if (!(Test-HelperInstalled -Helper 7zip) -and (Test-7zipRequirement -URL (url $manifest $arch))) {
$deps += '7zip'
}
if (!(Test-HelperInstalled -Helper Lessmsi) -and (Test-LessmsiRequirement -URL (url $manifest $arch))) {
$deps += 'lessmsi'
}
if (!(Test-HelperInstalled -Helper Innounp) -and $manifest.innosetup) {
$deps += 'innounp'
}
if (!(Test-HelperInstalled -Helper Dark)) {
$deps += 'dark'
}
$pre_install = arch_specific 'pre_install' $manifest $arch
$installer = arch_specific 'installer' $manifest $arch
$post_install = arch_specific 'post_install' $manifest $arch
$deps += script_deps $pre_install
$deps += script_deps $installer.script
$deps += script_deps $post_install
return $deps | Select-Object -Unique
}