mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

If this variable is set, `brew *env-sync` will only sync the exact installed versions of formulae rather than all the patch (or, for node, minor and patch) versions.
82 lines
2.5 KiB
Ruby
82 lines
2.5 KiB
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
require "abstract_command"
|
|
require "formula"
|
|
|
|
module Homebrew
|
|
module Cmd
|
|
class NodenvSync < AbstractCommand
|
|
cmd_args do
|
|
description <<~EOS
|
|
Create symlinks for Homebrew's installed NodeJS versions in `~/.nodenv/versions`.
|
|
|
|
Note that older version symlinks will also be created so e.g. NodeJS 19.1.0 will
|
|
also be symlinked to 19.0.0.
|
|
EOS
|
|
|
|
named_args :none
|
|
end
|
|
|
|
sig { override.void }
|
|
def run
|
|
nodenv_root = Pathname(ENV.fetch("HOMEBREW_NODENV_ROOT", Pathname(Dir.home)/".nodenv"))
|
|
|
|
# Don't run multiple times at once.
|
|
nodenv_sync_running = nodenv_root/".nodenv_sync_running"
|
|
return if nodenv_sync_running.exist?
|
|
|
|
begin
|
|
nodenv_versions = nodenv_root/"versions"
|
|
nodenv_versions.mkpath
|
|
FileUtils.touch nodenv_sync_running
|
|
|
|
HOMEBREW_CELLAR.glob("node{,@*}")
|
|
.flat_map(&:children)
|
|
.each { |path| link_nodenv_versions(path, nodenv_versions) }
|
|
|
|
nodenv_versions.children
|
|
.select(&:symlink?)
|
|
.reject(&:exist?)
|
|
.each { |path| FileUtils.rm_f path }
|
|
ensure
|
|
nodenv_sync_running.unlink if nodenv_sync_running.exist?
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
sig { params(path: Pathname, nodenv_versions: Pathname).void }
|
|
def link_nodenv_versions(path, nodenv_versions)
|
|
nodenv_versions.mkpath
|
|
|
|
version = Keg.new(path).version
|
|
major_version = version.major.to_i
|
|
minor_version = version.minor.to_i || 0
|
|
patch_version = version.patch.to_i || 0
|
|
|
|
minor_version_range, patch_version_range = if Homebrew::EnvConfig.env_sync_strict?
|
|
# Only create symlinks for the exact installed patch version.
|
|
# e.g. 23.9.0 => 23.9.0
|
|
[[minor_version], [patch_version]]
|
|
else
|
|
# Create folder symlinks for all patch versions to the latest patch version
|
|
# e.g. 23.9.0 => 23.10.1
|
|
[0..minor_version, 0..patch_version]
|
|
end
|
|
|
|
minor_version_range.each do |minor|
|
|
patch_version_range.each do |patch|
|
|
link_path = nodenv_versions/"#{major_version}.#{minor}.#{patch}"
|
|
# Don't clobber existing user installations.
|
|
next if link_path.exist? && !link_path.symlink?
|
|
|
|
FileUtils.rm_f link_path
|
|
FileUtils.ln_s path, link_path
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|