diff --git a/configure.d/40-languages.sh b/configure.d/40-languages.sh new file mode 100644 index 0000000..797bc47 --- /dev/null +++ b/configure.d/40-languages.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# configure reads TITLE and DESCRIPTION +# shellcheck disable=SC2034 +TITLE="Languages" +# shellcheck disable=SC2034 +DESCRIPTION="Install more languages with mise, e.g. Ruby on Rails" + +# Records that you've chosen, even if you chose nothing, so this isn't "to do" +LANGUAGES_CONF="$HOME/.config/coredesktop/languages" + +# mise installs these gems into each Ruby it installs, so Rails is still there +# after update moves to a new Ruby +DEFAULT_GEMS="$HOME/.default-gems" + +is_installed() { + command -v mise > /dev/null +} + +is_configured() { + [ -f "$LANGUAGES_CONF" ] +} + +# Add a gem to ~/.default-gems unless it's there +add_default_gem() { + grep -qsx "$1" "$DEFAULT_GEMS" || echo "$1" >> "$DEFAULT_GEMS" +} + +install_rails() { + echo "Installing Ruby and Rails..." + add_default_gem bundler || return 1 + add_default_gem rails || return 1 + mise use -g ruby@latest || return 1 + # Ruby may already have been installed before ~/.default-gems listed these + mise exec -- gem install --conservative bundler rails || return 1 + grep -qsx rails "$LANGUAGES_CONF" || echo rails >> "$LANGUAGES_CONF" +} + +run_configure() { + local tools tool + export MISE_YES=1 + # From home, so a project's mise.toml in the current directory doesn't count + cd "$HOME" || return 1 + + echo "Go, Rust, Node.js, Python, Bun and Zig are already installed. mise installs other" + echo "languages for you, and the version a project asks for in its mise.toml." + mkdir -p "$(dirname "$LANGUAGES_CONF")" + touch "$LANGUAGES_CONF" || return 1 + + if confirm "Install Ruby on Rails?"; then + install_rails || return 1 + fi + + echo "Anything else? Name tools mise knows (mise registry lists them), with a version," + read -rp "e.g. java@21 deno@latest, or press Enter for none: " tools + for tool in $tools; do + echo "Installing $tool..." + mise use -g "$tool" || return 1 + done + + echo "update keeps them up to date. To remove one later: mise unuse -g " +} diff --git a/install-mise-ruby-rails.sh b/install-mise-ruby-rails.sh deleted file mode 100755 index 3a0fafe..0000000 --- a/install-mise-ruby-rails.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -# set -e - -#==================================================================================== -# Install Mise -#==================================================================================== - -# Check if Mise is already installed -if ! command -v mise &> /dev/null; then - echo "Installing Mises" - curl https://mise.run/bash | sh -else - echo "Mises is installed" -fi - -eval "$($HOME/.local/bin/mise activate bash)" - -source ~/.bashrc - -#==================================================================================== -# Install Ruby -#==================================================================================== - -# Check if Ruby is already installed -if ! command -v ruby &> /dev/null; then - echo "Installing Ruby" - mise install ruby@latest - mise use -g ruby@latest - -# Explicitly add shims to PATH - export PATH="$HOME/.local/share/mise/shims:$PATH" - -# Force reshim - $HOME/.local/bin/mise reshim - - source "$HOME/.bashrc" - - gem install bundler -else - echo "Ruby is installed" -fi - -#==================================================================================== -# Install Rails -#==================================================================================== - -# Check if Rails is already installed -if ! command -v rails &> /dev/null; then - echo "Installing Rails" - gem install rails -else - echo "Rails is installed" -fi diff --git a/migrations/1793453501.sh b/migrations/1793453501.sh new file mode 100644 index 0000000..08bcd4a --- /dev/null +++ b/migrations/1793453501.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# mise now comes from pacman, and shell/bashrc activates it, so remove the copy +# mise.run installed in ~/.local/bin and the line it added to ~/.bashrc. Ruby and +# Rails are no longer installed for everyone, only with configure languages: +# machines that have them keep them, and update keeps Rails on new Rubies. +LANGUAGES_CONF="$HOME/.config/coredesktop/languages" +DEFAULT_GEMS="$HOME/.default-gems" + +# 10-pacman.sh installs mise from packages.conf before migrations run +[ -x /usr/bin/mise ] || { echo "mise isn't installed from pacman yet."; exit 1; } + +if [ -f ~/.bashrc ] && grep -qE '\.local/bin/mise activate' ~/.bashrc; then + tmp="$(mktemp ~/.bashrc.XXXXXX)" || exit 1 + # grep -v exits 1 when that line was all there was, which is fine + grep -vE '\.local/bin/mise activate' ~/.bashrc > "$tmp" + (( $? <= 1 )) && cat "$tmp" > ~/.bashrc + status=$? + rm -f "$tmp" + [ $status -eq 0 ] || exit 1 +fi +rm -f ~/.local/bin/mise + +# Ruby that CoreDesktop installed: count it as chosen with configure languages. +# From home, so a project's mise.toml in the current directory doesn't count. +cd "$HOME" || exit 1 +if /usr/bin/mise ls --global --quiet 2> /dev/null | grep -q '^ruby '; then + mkdir -p "$(dirname "$LANGUAGES_CONF")" || exit 1 + grep -qsx rails "$LANGUAGES_CONF" || echo rails >> "$LANGUAGES_CONF" + for gem in bundler rails; do + grep -qsx "$gem" "$DEFAULT_GEMS" || echo "$gem" >> "$DEFAULT_GEMS" + done + # update used to move to a new Ruby without Rails + echo "Making sure Rails is installed..." + MISE_YES=1 /usr/bin/mise exec -- gem install --conservative bundler rails || exit 1 +fi +exit 0 diff --git a/updates.d/40-ruby.sh b/updates.d/40-mise.sh similarity index 100% rename from updates.d/40-ruby.sh rename to updates.d/40-mise.sh