summaryrefslogtreecommitdiff
path: root/lib/chef/provider/git.rb
diff options
context:
space:
mode:
authorSeth Chisamore <schisamo@opscode.com>2013-11-02 11:14:37 -0400
committerBryan McLellan <btm@opscode.com>2013-11-26 07:46:39 -0800
commitad5bbfea38a1c8d2c4f0b6339ca825016f5fa4ac (patch)
treec41bb5ec81b64a8893905ba05efb6aa1b7199e0c /lib/chef/provider/git.rb
parentd156b4907efdd5641d662c8ad881244ed0c9edc2 (diff)
downloadchef-ad5bbfea38a1c8d2c4f0b6339ca825016f5fa4ac.tar.gz
[CHEF-3940] ensure $HOME matches user executing `git`
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.
Diffstat (limited to 'lib/chef/provider/git.rb')
-rw-r--r--lib/chef/provider/git.rb18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/chef/provider/git.rb b/lib/chef/provider/git.rb
index 8f0b5c1845..e9d42a5d01 100644
--- a/lib/chef/provider/git.rb
+++ b/lib/chef/provider/git.rb
@@ -272,12 +272,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