-
Notifications
You must be signed in to change notification settings - Fork 1
/
install.ps1
140 lines (124 loc) · 4.72 KB
/
install.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
135
136
137
138
139
140
Write-Host "Installing software for M269 24J..."
# This script works in one of two modes:
# - If no argument is given, this script must be in the M269 folder and
# the other installation files are downloaded from GitHub.
# - If an argument is given, it's the M269 folder, and this script and the other
# installation files are in the current folder.
# The first mode installs the latest software,
# for the current presentation or for testing the next presentation.
# The second mode is for installing the software for a past presentation,
# by first downloading the past installation files from GitHub.
$SITE = "https://dsa-ou.github.io/m269-installer"
$DOC = "See $SITE for details."
$FILES = "custom.css", "requirements.txt", "start.ps1"
$COURSE = "m269-24j"
$VENV = "$HOME\venvs\$COURSE"
# check that the given path is the M269 folder
function is-m269-folder {
param($path)
if (-not (Test-Path $path -PathType Container)) {
$folder = $path
$msg="doesn't exist or isn't a folder"
}
else {
$folder = Convert-Path $path
if (-not ((Get-Item $folder).Name -match "[Mm]269-24[Jj]")) {
$msg="must be named m269-24j or M269-24J"
}
else
{
return
}
}
Write-Host "$folder can't be your M269 folder: it $msg."; Write-Host $DOC
exit
}
if ($args.Length -gt 1) {
Write-Host "Usage: .\install.ps1 [path to M269 folder]"
Write-Host "If no argument is given, this script must be in your M269 folder."
Write-Host "If an argument is given, it must be the path to your M269 folder."
Write-Host $DOC
exit
} elseif ($args.Length -eq 0) {
$FOLDER = pwd
is-m269-folder $FOLDER
Write-Host "Downloading and installing M269 files..."
$GITHUB = "https://raw.githubusercontent.com/dsa-ou/m269-installer/main/"
foreach ($file in $FILES) {
Invoke-WebRequest -Uri ($GITHUB + $file) -OutFile $file
}
mkdir $HOME\.jupyter\custom -ErrorAction SilentlyContinue
if (Test-Path $HOME\.jupyter\custom\custom.css) {
Add-Content -Path $HOME\.jupyter\custom\custom.css -Value (Get-Content custom.css)
} else {
Copy-Item -Path custom.css -Destination $HOME\.jupyter\custom
}
} else {
is-m269-folder $args[0]
$FOLDER = Convert-Path $args[0]
foreach ($file in $FILES) {
if (-not (Test-Path $file)) {
Write-Host "File $file not found: please check that you're in the right folder."
Write-Host $DOC
exit
}
}
Write-Host "Installing M269 files..."
mkdir $HOME\.jupyter\custom -ErrorAction SilentlyContinue
if (Test-Path $HOME\.jupyter\custom\custom.css) {
Add-Content -Path $HOME\.jupyter\custom\custom.css -Value (Get-Content custom.css)
} else {
Copy-Item -Path custom.css -Destination $HOME\.jupyter\custom
}
}
Write-Host "Creating Python environment $VENV... (this will take a bit)"
py -3.11 -m venv --prompt $COURSE $VENV
if (-not $?) {
Write-Host "Error: failed to create the virtual environment."
Write-Host "Check permissions and prerequisites, then try again."
exit
}
Write-Host "Downloading and installing Python packages... (this will take long)"
. $VENV\Scripts\Activate.ps1
if (-not $?) {
Write-Host "Error: failed to activate the environment."
exit
}
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
deactivate
Write-Host "Adding shortcut commands to the PowerShell config file..."
$CONFIG_FILE = $Profile.CurrentUserCurrentHost
$ALIASES = @"
function m269-24j {
cd "$FOLDER"
& "$VENV\Scripts\Activate.ps1"
}
function nb {
& "$VENV\Scripts\Activate.ps1"
Start-process -NoNewWindow jupyter -ArgumentList "notebook"
}
function allowed {}
"@
# empty function 'disables' the function from 23J
# Create the config file if it doesn't exist and add the functions
if (-not (Test-Path -Path $CONFIG_FILE)) {
# File doesn't exist, create it
New-Item -Path $CONFIG_FILE -ItemType File -Force
}
Add-Content -Path $CONFIG_FILE -Value $ALIASES -NoNewline
Write-Host "Adding desktop shortcut..."
$Desktop = [System.Environment]::GetFolderPath('Desktop')
$ShortcutPath = Join-Path $Desktop "M269-start.lnk"
$TargetPath = "$FOLDER\start.ps1"
$WScriptShell = New-Object -ComObject WScript.Shell
$Shortcut = $WScriptShell.CreateShortcut($ShortcutPath)
$Shortcut.TargetPath = "powershell.exe"
$Shortcut.Arguments = "-ExecutionPolicy Bypass -File `"$TargetPath`""
$Shortcut.Description = "Start the M269 software"
# set the icon for the shortcut (using the powershell icon)
$PowerShellExe = (Get-Command powershell.exe).Source
$Shortcut.IconLocation = "$PowerShellExe, 0"
$Shortcut.Save()
Write-Host "Software has been installed."
Write-Host "All done. Go to $SITE for further instructions."