From e8afacef18cd43ba05d83d18ccad74346f2c3d70 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 28 Apr 2022 17:30:55 -0500 Subject: [PATCH] Install scripts: - Windows: - install: Move repo URI into variable Remove -NoWinget check (was unused) - upgrade: Change -NoWinget to disable updating with winget (can take a while) Create function to check install of node packages which are put on Path. - Linux: - Install: Port install-windows to some linux distros Support for Apt (Ubuntu, possibly Debian/Mint) Support for Pacman (Arch/Manjaro/Garuda) - Upgrade: Port upgrade-windows to some linux distros --- setup-development/linux/install-linux.sh | 60 +++++++++++ .../linux/package-managers/apt.dependencies | 4 + .../package-managers/pacman.dependencies | 5 + setup-development/linux/upgrade-linux.sh | 100 ++++++++++++++++++ setup-development/windows/install-windows.ps1 | 12 ++- setup-development/windows/upgrade-windows.ps1 | 56 ++++++---- 6 files changed, 214 insertions(+), 23 deletions(-) create mode 100644 setup-development/linux/install-linux.sh create mode 100644 setup-development/linux/package-managers/apt.dependencies create mode 100644 setup-development/linux/package-managers/pacman.dependencies create mode 100644 setup-development/linux/upgrade-linux.sh diff --git a/setup-development/linux/install-linux.sh b/setup-development/linux/install-linux.sh new file mode 100644 index 0000000..ea6590d --- /dev/null +++ b/setup-development/linux/install-linux.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +#* linux-install.sh: First-run setup script +#* Ensures git is installed, clones the repo, and then runs + +export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' +ELEVATE='';if (( $UID != 0 )); then ELEVATE='sudo';fi + +help () { + echo "Usage: $0 [-g path/to/git/directory]" + exit 0 +} + + +GITDIR = "~/git" + +# Get option flags: +dry=false +while getopts ghd arg; do + case $arg in + g) GITDIR="$OPTARG";; + h) help;; + d) dry=true;; + esac +done + +function dryrun { + if $dry; then + echo "> $* [dry]"; + else + echo "> $*" + $@ +} + +SETUPDIR= "Mind_Reader/setup-development" +REPOURI = "https://github.com/We-Dont-Byte/Mind_Reader.git" + +# Install git +if which git; then + echo "Git already installed." +elif which pacman; then + # using pacman + dryrun $ELEVATE pacman -Sy git +elif which apt; then + # using apt + dryrun $ELEVATE apt-get update && \ + dryrun $ELEVATE apt-get install git -y +fi #? TODO: other package managers? + +echo Cloning repository into "$GITDIR" +dryrun mkdir "$GITDIR" +cd $GITDIR && git clone "$REPOURI" + +# TODO: remove this when merging! + cd Mind_Reader + dryrun git checkout origin/johnBreaux +# TODO: remove this when merging! + +cd "$GITDIR/$SETUPDIR" +bash ./linux-update.sh \ No newline at end of file diff --git a/setup-development/linux/package-managers/apt.dependencies b/setup-development/linux/package-managers/apt.dependencies new file mode 100644 index 0000000..05070de --- /dev/null +++ b/setup-development/linux/package-managers/apt.dependencies @@ -0,0 +1,4 @@ +apt-transport-https +build-essential +python3 +wget diff --git a/setup-development/linux/package-managers/pacman.dependencies b/setup-development/linux/package-managers/pacman.dependencies new file mode 100644 index 0000000..89859bb --- /dev/null +++ b/setup-development/linux/package-managers/pacman.dependencies @@ -0,0 +1,5 @@ +base-devel +code +git +nvm +python3 diff --git a/setup-development/linux/upgrade-linux.sh b/setup-development/linux/upgrade-linux.sh new file mode 100644 index 0000000..1246b6e --- /dev/null +++ b/setup-development/linux/upgrade-linux.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +#* linux-update.sh: Install and update dependencies of Mind_Reader, on linux. +#* Heads-up, this expects to be run from Mind_Reader/setup-development/linux. + + +# If run with bash -vx, print useful information instead of just a + sign +export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' +# If run as root, it could be because sudo isn't installed (some people disagree with sudo, especially on Arch) +ELEVATE='';if (( $UID != 0 )); then;ELEVATE='sudo';fi + +# Get option flags: +dry=false +while getopts d arg; do + case $arg in + d) dry=true;; + esac +done + +function dryrun { + if $dry; then + echo "> $* [dry]"; + else + echo "> $*" + $@ +} + +# Set these variables if you need to install for a different architecture +# Valid architectures are "x64", "arm64", "armhf" +arch="" +case (uname -i) in + "x86_64") arch="x64";; + "armv[6-8]*") arch="armhf";; + "aarch64") arch="arm64";; + *) echo "Architecture '$(uname -i)' unknown. Assuming x86_64..." + arch="x64";; +esac + +if which pacman; then + # Install dependencies with pacman + dryrun $ELEVATE pacman -S - < package-managers/pacman.dependencies +elif which apt-get; then + # Install dependencies using apt-get + dryrun xargs -a ./package-managers/apt.dependencies $ELEVATE apt-get install -y + + # Install Node Version Manager (nvm) + # TODO: Find a better way to install nvm on Ubuntu, the official NodeJS for <20.04 is so out of date it's unsupported. + dryrun curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash + + # Check if vscode exists, if not, install it. + # Microsoft doesn't put it in any Ubuntu repos, you have to get it straight from them. + # This does have the side effect, however, of installing the official repository + if !(which code); then + #* Install VSCode + vscodepackagename="code_amd64.deb" + dryrun wget "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-$arch" -O ./code.deb + dryrun $ELEVATE apt install ./code.deb + dryrun rm ./code.deb + fi +fi + +cdir=$(pwd) +# Go back to source tree root +cd ../.. + +# Check the VSCode version +nodeversion="node" +electronversion = "" +#* Note: +#* When adding support for new VSCode versions, update this case +#* By the time you're working on this project, things are likely going to differ! +case (code --version) in + #* Each version of VSCode has a corresponding Electron version and Node version + #* These are used when + 1.66.*) electronversion = "17.2.0"; nodeversion = "16.13.0";; + *) ;; +esac + +# Install NodeJS and npm +dryrun nvm install "$nodeversion" +dryrun nvm use "$nodeversion" + +# Use npm to install electron-rebuild and yo +dryrun npm install electron-rebuild yo generator-code + +# use npm to acquire dependencies for Mind-Reader +dryrun npm install + +# Use electron-rebuild to rebuild electron +if (( electronversion != "" )); then + dryrun electron-rebuild --version $electronversion +else + printf "%s/n%s/n%s/n%s/n" \ + "Open Visual Studio Code, select the 'Help' tab in the toolbar, and go to 'About'." \ + "Find the line that says 'Electron: [electron version]'" \ + "Run the command below, filling in the Electron version with the one from that menu:" \ + "electron-rebuild --version [electron version]" +fi + +cd $cdir \ No newline at end of file diff --git a/setup-development/windows/install-windows.ps1 b/setup-development/windows/install-windows.ps1 index 9d391f0..ac864db 100644 --- a/setup-development/windows/install-windows.ps1 +++ b/setup-development/windows/install-windows.ps1 @@ -56,6 +56,7 @@ param ( [switch]$DryRun # Run script without installing ) +$RepoURI = "https://github.com/We-Dont-Byte/Mind_Reader.git" $RepoPath = "$GitDir\Mind_Reader" $SetupPath = "$RepoPath\setup-development\windows" @@ -98,8 +99,8 @@ function Reload-Path { # Check if Winget is available -if ( $NoWinget -or -not (Command-Available winget) ) { - Write-Warning "[ Warning ]: It looks like winget isn't available.`n" +if ( -not (Command-Available winget) ) { + Write-Warning "It looks like winget isn't available.`n" Write-Host "Update 'App Installer' through the Microsoft Store, or grab the '.msixbundle' from the winget-cli repository:" Write-Host "( https://github.com/microsoft/winget-cli/releases/latest )`n" -ForegroundColor White exit @@ -148,12 +149,13 @@ if ( -not (Test-Path "$GitDir") ) { # Clone the repository in GitDir $dir = $pwd cd $GitDir -Dry-Run "git clone 'https://github.com/We-Dont-Byte/Mind_Reader.git'" -# TODO: Change this during merge onto main branch +Dry-Run "git clone '$RepoURI'" + +# TODO: Remove this when merging cd Mind_reader Dry-Run "git checkout johnBreaux" cd .. -# END TODO +# TODO: Remove this when merging # Run the install script if ( -not (Test-Path "$SetupPath")) { diff --git a/setup-development/windows/upgrade-windows.ps1 b/setup-development/windows/upgrade-windows.ps1 index e9cdd18..809a5fe 100644 --- a/setup-development/windows/upgrade-windows.ps1 +++ b/setup-development/windows/upgrade-windows.ps1 @@ -52,7 +52,7 @@ param ( [switch]$NoPrompt, # Disable the 3-second wait and press-any-key prompt [switch]$Install, # Perform all installations, even when commands are present [switch]$DryRun, # Run script without installing - [switch]$NoWinget # Pretend Winget doesn't exist + [switch]$NoWinget # Don't update dependdencies with winget ) # .description @@ -89,8 +89,8 @@ function Reload-Path { # Check if Winget is available -if ( $NoWinget -or -not (Command-Available winget) ) { - Write-Warning "[ Warning ]: It looks like winget isn't available.`n" +if ( -not (Command-Available winget) ) { + Write-Warning "It looks like winget isn't available.`n" Write-Host "Update 'App Installer' through the Microsoft Store, or grab the '.msixbundle' from the winget-cli repository:" Write-Host "( https://github.com/microsoft/winget-cli/releases/latest )`n" -ForegroundColor White exit @@ -121,11 +121,13 @@ if ( ([Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5 } # Import the packages from dependencies.json (autogenerated file, do not edit!) -Write-Host "`nInstalling packages with winget..." -Dry-Run 'winget install Microsoft.VisualStudio.2022.BuildTools --override "--wait --quiet --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"' -Dry-Run 'winget import winget/dependencies.json' -# Reload the PATH, so we can use some of those sweet new commands we just installed -Reload-Path +if ( -not $NoWinget) { + Write-Host "`nInstalling packages with winget..." + Dry-Run 'winget install Microsoft.VisualStudio.2022.BuildTools --override "--wait --quiet --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"' + Dry-Run "winget import winget/dependencies.json" + # Reload the PATH, so we can use some of those sweet new commands we just installed + Reload-Path +} # Check whether everything is available now: $error = 0 @@ -140,25 +142,43 @@ if ( -not (Command-Available npm ) ) { } if ( $error ) { exit } -# Check if electron-rebuild is installed, if not, install it -if ( ($Install) -or -not (Command-Available electron-rebuild) ) { - Write-Host "`nInstalling Electron-Rebuild..." - Dry-Run 'npm install -g electron-rebuild' - Reload-Path - if ( -not (Command-Available electron-rebuild)) { - Throw "electron-rebuild failed to install. Aborting." +# .description +# EnsureNodePackageInstalled: +# Checks for the presence of a cmdlet with a given name +# If it's not found, attempt to install it using npm +# If it's still not found, abort (this may not be good behavior?) +function EnsureNodePackageInstalled { + param ( + [string[]]$command + ) + if ( ($Install) -or -not (Command-Available $command[0]) ) { + Write-Host "`nInstalling $($command[0])..." + Dry-Run "npm install -g $([string]$command)" + Reload-Path + if ( -not (Command-Available $command[0])) { + Throw "$command failed to install. Aborting." + } + } else { + Write-Host "`n$($command[0]) already installed." -ForegroundColor green } -} else { - Write-Host "`nElectron-Rebuild already installed." -ForegroundColor green } +# Check if electron-rebuild is installed, if not, install it +EnsureNodePackageInstalled electron-rebuild + +# These are useful (but not necessary) packages to have installed when working on new VSCode extensions +EnsureNodePackageInstalled yo, generator-code + # We're about to do some path traversal, so save the current directory $prev_directory = $pwd # install NodeJS dependencies for this extension Write-Host "`nInstalling NodeJS Dependencies..." cd ..\.. -Dry-Run 'npm install' +Dry-Run "npm install" + +# Run npm audit fix to upgrade vulnerable dependencies, except breaking changes. +Dry-Run "npm audit fix" # if we're on a known VSCode version, go ahead and run electron-rebuild switch -Regex (code --version) {