module VisualStudio::Environment

Constants

SEARCH_DIRECTORIES

Public Class Methods

merge(base, overlay) click to toggle source
# File lib/visual_studio/environment.rb, line 5
def self.merge(base, overlay)
  # We merge case insensitively, because Windows. We treat |base| case as canonical
  # unless the variable is only named by |overlay|.
  cased = (overlay.keys + base.keys).uniq.map{|key| [key.upcase, key]}.to_h

  # TODO(mtwilliams): Verify match-up between VCInstallDir and VisualStudioVersion?
  # TODO(mtwilliams): Rederive environment variables based on VCInstallDir and/or WindowsSdkDir.
  env = canonicalize(base).merge(canonicalize(overlay)) do |variable, base, overlay|
    if SEARCH_DIRECTORIES.include? variable.upcase
      # TODO(mtwilliams): Detect new Visual Studio or Windows SDK related
      # paths and replace the old ones based on that.
      base    = base.split(';')
      overlay = overlay.split(';')

      should_include_cwd = base.include?('.') || overlay.include?('.')

      # HACK(mtwilliams): We're using File.expand_path here to "normalize"
      # paths to prevent duplicates, but this could very likely have
      # disastrous effects.
      base = base.reject{|p| p=='.'}.map{|p| File.expand_path(p)}
      overlay = overlay.reject{|p| p=='.'}.map{|p| File.expand_path(p)}

      path = base | overlay
      path = ['.'] + path if should_include_cwd

      path.join(';')
    else
      # Right-hand side takes precedence.
      overlay
    end
  end

  env.map { |canonical, value|
    [cased[canonical], value]
  }.to_h
end

Private Class Methods

canonicalize(environment) click to toggle source
# File lib/visual_studio/environment.rb, line 43
def self.canonicalize(environment)
  environment.to_h.map{|key, value| [key.upcase, value]}.to_h
end