From 9f707bc02ffba4e3b792aa7da325f9e550ea27c2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 31 Oct 2009 21:14:52 +0000 Subject: more portable symlink awareness for START_CTX[:cwd] `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. --- lib/unicorn.rb | 14 +++++++++++--- 1 file 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, } -- cgit v1.2.3-24-ge0c7