From d5fa7416ff1cf57d663b6fbcebacdfbb1f9f67f0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 21 Nov 2015 11:17:16 -0800 Subject: [PATCH] core: more heuristics for determining Cygwin --- lib/vagrant/util/platform.rb | 9 +++++- test/unit/support/shared/base_context.rb | 1 + test/unit/vagrant/util/platform_test.rb | 35 ++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/vagrant/util/platform.rb b/lib/vagrant/util/platform.rb index a63866428..e2762bca6 100644 --- a/lib/vagrant/util/platform.rb +++ b/lib/vagrant/util/platform.rb @@ -10,10 +10,17 @@ module Vagrant class Platform class << self def cygwin? + # Installer detects Cygwin return true if ENV["VAGRANT_DETECTED_OS"] && ENV["VAGRANT_DETECTED_OS"].downcase.include?("cygwin") - platform.include?("cygwin") + # Ruby running in Cygwin + return true if platform.include?("cygwin") + + # Heuristic. If the path contains Cygwin, we just assume we're + # in Cygwin. It is generally a safe bet. + path = ENV["PATH"] || "" + return path.include?("cygwin") end [:darwin, :bsd, :freebsd, :linux, :solaris].each do |type| diff --git a/test/unit/support/shared/base_context.rb b/test/unit/support/shared/base_context.rb index f0fc4efb0..c84b6ae1d 100644 --- a/test/unit/support/shared/base_context.rb +++ b/test/unit/support/shared/base_context.rb @@ -107,6 +107,7 @@ shared_context "unit" do # can replace them back in later. old_env = {} environment.each do |key, value| + key = key.to_s old_env[key] = ENV[key] ENV[key] = value end diff --git a/test/unit/vagrant/util/platform_test.rb b/test/unit/vagrant/util/platform_test.rb index ae51076ec..267886712 100644 --- a/test/unit/vagrant/util/platform_test.rb +++ b/test/unit/vagrant/util/platform_test.rb @@ -3,8 +3,43 @@ require File.expand_path("../../../base", __FILE__) require "vagrant/util/platform" describe Vagrant::Util::Platform do + include_context "unit" + subject { described_class } + describe "#cygwin?" do + before do + allow(subject).to receive(:platform).and_return("test") + end + + around do |example| + with_temp_env(VAGRANT_DETECTED_OS: "nope", PATH: "") do + example.run + end + end + + it "returns true if VAGRANT_DETECTED_OS includes cygwin" do + with_temp_env(VAGRANT_DETECTED_OS: "cygwin") do + expect(subject).to be_cygwin + end + end + + it "returns true if platform has cygwin" do + allow(subject).to receive(:platform).and_return("cygwin") + expect(subject).to be_cygwin + end + + it "returns true if the PATH contains cygwin" do + with_temp_env(PATH: "C:/cygwin") do + expect(subject).to be_cygwin + end + end + + it "returns false if nothing is available" do + expect(subject).to_not be_cygwin + end + end + describe "#fs_real_path" do it "fixes drive letters on Windows", :windows do expect(described_class.fs_real_path("c:/foo").to_s).to eql("C:/foo")