diff options
author | Eric Wong <normalperson@yhbt.net> | 2009-10-31 21:14:52 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2009-10-31 14:22:14 -0700 |
commit | 9f707bc02ffba4e3b792aa7da325f9e550ea27c2 (patch) | |
tree | 7d394861887a067d72de9c1d80431e038c48cb58 /lib | |
parent | 2cb4226e52d5010eb4f92942e40499b6aa124262 (diff) | |
download | unicorn-9f707bc02ffba4e3b792aa7da325f9e550ea27c2.tar.gz |
`sh -c pwd` doesn't reliably read ENV["PWD"] on all platforms, this means that directories that are symlinks may be ignored and the real path is resolved. This can be problematic when doing upgrades for common deployment systems such as Capistrano which rely on the working directory being a symlink.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/unicorn.rb | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb index ae1de59..de46c9e 100644 --- a/lib/unicorn.rb +++ b/lib/unicorn.rb @@ -92,9 +92,17 @@ module Unicorn # Unicorn::HttpServer::START_CTX[0] = "/home/bofh/1.9.2/bin/unicorn" START_CTX = { :argv => ARGV.map { |arg| arg.dup }, - # don't rely on Dir.pwd here since it's not symlink-aware, and - # symlink dirs are the default with Capistrano... - :cwd => `/bin/sh -c pwd`.chomp("\n"), + :cwd => lambda { + # favor ENV['PWD'] since it is (usually) symlink aware for + # Capistrano and like systems + begin + a = File.stat(pwd = ENV['PWD']) + b = File.stat(Dir.pwd) + a.ino == b.ino && a.dev == b.dev ? pwd : Dir.pwd + rescue + Dir.pwd + end + }.call, 0 => $0.dup, } |