Module: PathFixer

Defined in:
lib/rubygems_plugin.rb

Class Method Summary collapse

Class Method Details



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
# File 'lib/rubygems_plugin.rb', line 5

def sync_bin_symlinks(*args)
  return if Gem.win_platform?

  global_bindir = '/usr/local/bin'
  bindir = File.expand_path(Gem.bindir)

  return if bindir == global_bindir
  return if ENV['PATH'].split(':').include?(bindir)

  if !File.directory?(global_bindir) || !File.writable?('/usr/local/bin')
    Gem.ui.say "PathFixer: skipping #{global_bindir} synchronization because this directory doesn't exist or is not writable"
    return
  end

  installed_binaries = Dir.entries(bindir)
  installed_binaries.reject! do |entry|
    !File.file?(File.join(bindir, entry))
  end

  target_binaries = Dir.entries(global_bindir).select do |entry|
    full_path = File.join(global_bindir, entry)
    File.symlink?(full_path) && begin
                                  target = File.expand_path(File.readlink(full_path), File.dirname(full_path))
                                  File.dirname(target) == bindir
                                end
  end

  (installed_binaries - target_binaries).each do |missing|
    Gem.ui.say "PathFixer: installing symlink on new gem binary '#{missing}' into #{global_bindir}"
    FileUtils.ln_s(File.join(bindir, missing), File.join(global_bindir, missing))
  end

  (target_binaries - installed_binaries).each do |obsolete|
    Gem.ui.say "PathFixer: removing symlink on uninstalled gem binary '#{obsolete}' from #{global_bindir}"
    FileUtils.rm_r(File.join(global_bindir, obsolete))
  end
end