diff options
Diffstat (limited to 'lib/chef/provider/git.rb')
-rw-r--r-- | lib/chef/provider/git.rb | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/chef/provider/git.rb b/lib/chef/provider/git.rb index b22004eda0..9eebced5e6 100644 --- a/lib/chef/provider/git.rb +++ b/lib/chef/provider/git.rb @@ -269,12 +269,26 @@ class Chef private def run_options(run_opts={}) - run_opts[:user] = @new_resource.user if @new_resource.user + env = {} + if @new_resource.user + run_opts[:user] = @new_resource.user + # Certain versions of `git` misbehave if git configuration is + # inaccessible in $HOME. We need to ensure $HOME matches the + # user who is executing `git` not the user running Chef. + env['HOME'] = begin + require 'etc' + Etc.getpwnam(@new_resource.user).dir + rescue ArgumentError # user not found + "/home/#{@new_resource.user}" + end + end run_opts[:group] = @new_resource.group if @new_resource.group - run_opts[:environment] = {"GIT_SSH" => @new_resource.ssh_wrapper} if @new_resource.ssh_wrapper + env['GIT_SSH'] = @new_resource.ssh_wrapper if @new_resource.ssh_wrapper run_opts[:log_tag] = @new_resource.to_s run_opts[:timeout] = @new_resource.timeout if @new_resource.timeout + run_opts[:environment] = env unless env.empty? run_opts + end def cwd |