forked from analogrelay/dotfiles
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bootstrap.ps1
121 lines (101 loc) · 4.21 KB
/
bootstrap.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
# This script should work on Windows PowerShell to facilitate bootstrapping.
# Bootstraps the installation of the dotfiles scripts from scratch
$ErrorPreference = "Stop"
if (($PSVersionTable.PSEdition -eq "Core") -and ($PSVersionTable.Platform -ne "Win32NT")) {
throw "The bootstrap.ps1 script is for Windows only. Use bootstrap.sh on macOS/Linux. It will still configure PowerShell for you!"
}
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
# Check for admin
$principal = [System.Security.Principal.WindowsPrincipal]([System.Security.Principal.WindowsIdentity]::GetCurrent())
if (!$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw "Bootstrapping must be done from an admin PowerShell instance..."
}
# Utility functions copied from other places to keep this script self-contained.
function Doing($action) {
Write-Host -ForegroundColor Green $action
}
function AlreadyDone($action) {
Write-Host -ForegroundColor Magenta $action
}
function Test-Command($CommandName) {
# Calling Get-Command, even with ErrorAction SilentlyContinue, spams
# $error with errors. This avoids that.
!!(Get-Command "$CommandName*" |
Where-Object {
[System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq $CommandName
})
}
# Enable Developer Mode if necessary
$RegKeyPath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\AppModelUnlock"
if (!(Test-Path $RegKeyPath)) {
New-Item -Path $RegKeyPath -ItemType Directory -Force
}
if ((Get-ItemProperty $RegKeyPath).AllowDevelopmentWithoutDevLicense -ne 1) {
Doing "Enabling Developer Mode..."
New-ItemProperty -Path $RegKeyPath -Name AllowDevelopmentWithoutDevLicense -PropertyType DWORD -Value 1
}
# Configure scoop
if (!(Test-Command scoop)) {
Doing "Installing Scoop..."
# We check the install script against a known hash to make sure it's what we think it is.
$ScoopInstallerHash = "M3y+81KJQhr+CMw1cTL7TG8kbXYp4yLg9jiwZVgWSisKGuKFb6EMPwfgRIbiQQ1t+L0LVFHmi4Ua9YoKq/RIbA==";
$client = New-Object System.Net.WebClient
$content = $client.DownloadString("https://get.scoop.sh");
$sha = [System.Security.Cryptography.SHA512]::Create()
$actualHash = [Convert]::ToBase64String($sha.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($content)))
if ($actualHash -ne $ScoopInstallerHash) {
throw "Scoop installed did not match hash! Expected '$ScoopInstallerHash' but got '$actualHash'. Go to https://get.scoop.sh and check the script for changes and update the hash"
}
Invoke-Expression $content
}
else {
AlreadyDone "Using already-installed Scoop..."
}
# Install git so we can get the dotfiles repo down
if (!(Test-Command git)) {
Doing -ForegroundColor Green "Installing Git."
scoop install git
}
else {
AlreadyDone "Using already-installed Git..."
}
# Git won't be in the PATH yet
if (Test-Command git) {
$gitExe = "git"
}
else {
$gitExe = scoop which git
if (!(Test-Path $gitExe)) {
throw "Could not find 'git.exe' despite it being installed!"
}
}
$DotfilesPath = Join-Path $env:USERPROFILE ".dotfiles"
if (Test-Path $DotfilesPath) {
Doing "Updating the dotfiles."
Set-Location $DotfilesPath
& "$gitExe" pull --rebase --autostash
}
else {
Doing "Cloning the dotfiles."
& "$gitExe" clone https://github.com/anurse/dotfiles.git $DotfilesPath
}
# Install pwsh if necessary
if (!(Test-Command pwsh)) {
Doing "Installing PowerShell Core..."
# Don't use scoop to install pwsh. Use the msix
$release = (Invoke-WebRequest "https://api.github.com/repos/powershell/powershell/releases/latest").Content | ConvertFrom-Json
$msixAsset = $release.assets | Where-Object { $_.name.EndsWith("-win-x64.msix") }
# Download the MSIX
$downloadedMsix = Join-Path ([System.IO.Path]::GetTempPath()) "powershell-installer.msix"
if (Test-Path $downloadedMsix) {
Remove-Item $downloadedMsix
}
Invoke-WebRequest $msixAsset.browser_download_url -OutFile $downloadedMsix
Add-AppxPackage -Path $downloadedMsix
}
else {
AlreadyDone "Using already-installed PowerShell Core..."
}
Doing "Launching setup script!"
$setupScriptPath = Join-Path $DotfilesPath "/script/setup.ps1"
& pwsh.exe "$setupScriptPath"