Commit 33517d54 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'gitlab-git-spawn-env' into 'master'

Set alternate object directories in run_git

See merge request gitlab-org/gitlab-ce!16715
parents 726c7105 3f79376c
...@@ -42,9 +42,7 @@ module Gitlab ...@@ -42,9 +42,7 @@ module Gitlab
end end
def load_blame_by_shelling_out def load_blame_by_shelling_out
cmd = %W(#{Gitlab.config.git.bin_path} --git-dir=#{@repo.path} blame -p #{@sha} -- #{@path}) @repo.shell_blame(@sha, @path)
# Read in binary mode to ensure ASCII-8BIT
IO.popen(cmd, 'rb') {|io| io.read }
end end
def process_raw_blame(output) def process_raw_blame(output)
......
...@@ -19,6 +19,8 @@ module Gitlab ...@@ -19,6 +19,8 @@ module Gitlab
cmd_output = "" cmd_output = ""
cmd_status = 0 cmd_status = 0
Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr| Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|
stdout.set_encoding(Encoding::ASCII_8BIT)
yield(stdin) if block_given? yield(stdin) if block_given?
stdin.close stdin.close
......
...@@ -614,11 +614,11 @@ module Gitlab ...@@ -614,11 +614,11 @@ module Gitlab
if is_enabled if is_enabled
gitaly_ref_client.find_ref_name(sha, ref_path) gitaly_ref_client.find_ref_name(sha, ref_path)
else else
args = %W(#{Gitlab.config.git.bin_path} for-each-ref --count=1 #{ref_path} --contains #{sha}) args = %W(for-each-ref --count=1 #{ref_path} --contains #{sha})
# Not found -> ["", 0] # Not found -> ["", 0]
# Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0] # Found -> ["b8d95eb4969eefacb0a58f6a28f6803f8070e7b9 commit\trefs/environments/production/77\n", 0]
popen(args, @path).first.split.last run_git(args).first.split.last
end end
end end
end end
...@@ -887,8 +887,7 @@ module Gitlab ...@@ -887,8 +887,7 @@ module Gitlab
"delete #{ref}\x00\x00" "delete #{ref}\x00\x00"
end end
command = %W[#{Gitlab.config.git.bin_path} update-ref --stdin -z] message, status = run_git(%w[update-ref --stdin -z]) do |stdin|
message, status = popen(command, path) do |stdin|
stdin.write(instructions.join) stdin.write(instructions.join)
end end
...@@ -1409,6 +1408,11 @@ module Gitlab ...@@ -1409,6 +1408,11 @@ module Gitlab
end end
end end
def shell_blame(sha, path)
output, _status = run_git(%W(blame -p #{sha} -- #{path}))
output
end
private private
def shell_write_ref(ref_path, ref, old_ref) def shell_write_ref(ref_path, ref, old_ref)
...@@ -1433,6 +1437,12 @@ module Gitlab ...@@ -1433,6 +1437,12 @@ module Gitlab
def run_git(args, chdir: path, env: {}, nice: false, &block) def run_git(args, chdir: path, env: {}, nice: false, &block)
cmd = [Gitlab.config.git.bin_path, *args] cmd = [Gitlab.config.git.bin_path, *args]
cmd.unshift("nice") if nice cmd.unshift("nice") if nice
object_directories = alternate_object_directories
if object_directories.any?
env['GIT_ALTERNATE_OBJECT_DIRECTORIES'] = object_directories.join(File::PATH_SEPARATOR)
end
circuit_breaker.perform do circuit_breaker.perform do
popen(cmd, chdir, env, &block) popen(cmd, chdir, env, &block)
end end
...@@ -1624,7 +1634,7 @@ module Gitlab ...@@ -1624,7 +1634,7 @@ module Gitlab
offset_in_ruby = use_follow_flag && options[:offset].present? offset_in_ruby = use_follow_flag && options[:offset].present?
limit += offset if offset_in_ruby limit += offset if offset_in_ruby
cmd = %W[#{Gitlab.config.git.bin_path} --git-dir=#{path} log] cmd = %w[log]
cmd << "--max-count=#{limit}" cmd << "--max-count=#{limit}"
cmd << '--format=%H' cmd << '--format=%H'
cmd << "--skip=#{offset}" unless offset_in_ruby cmd << "--skip=#{offset}" unless offset_in_ruby
...@@ -1640,7 +1650,7 @@ module Gitlab ...@@ -1640,7 +1650,7 @@ module Gitlab
cmd += Array(options[:path]) cmd += Array(options[:path])
end end
raw_output = IO.popen(cmd) { |io| io.read } raw_output, _status = run_git(cmd)
lines = offset_in_ruby ? raw_output.lines.drop(offset) : raw_output.lines lines = offset_in_ruby ? raw_output.lines.drop(offset) : raw_output.lines
lines.map! { |c| Rugged::Commit.new(rugged, c.strip) } lines.map! { |c| Rugged::Commit.new(rugged, c.strip) }
...@@ -1678,18 +1688,23 @@ module Gitlab ...@@ -1678,18 +1688,23 @@ module Gitlab
end end
def alternate_object_directories def alternate_object_directories
relative_paths = Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact relative_paths = relative_object_directories
if relative_paths.any? if relative_paths.any?
relative_paths.map { |d| File.join(path, d) } relative_paths.map { |d| File.join(path, d) }
else else
Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_DIRECTORIES_VARIABLES) absolute_object_directories.flat_map { |d| d.split(File::PATH_SEPARATOR) }
.flatten
.compact
.flat_map { |d| d.split(File::PATH_SEPARATOR) }
end end
end end
def relative_object_directories
Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
end
def absolute_object_directories
Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_DIRECTORIES_VARIABLES).flatten.compact
end
# Get the content of a blob for a given commit. If the blob is a commit # Get the content of a blob for a given commit. If the blob is a commit
# (for submodules) then return the blob's OID. # (for submodules) then return the blob's OID.
def blob_content(commit, blob_name) def blob_content(commit, blob_name)
...@@ -1833,13 +1848,13 @@ module Gitlab ...@@ -1833,13 +1848,13 @@ module Gitlab
def count_commits_by_shelling_out(options) def count_commits_by_shelling_out(options)
cmd = count_commits_shelling_command(options) cmd = count_commits_shelling_command(options)
raw_output = IO.popen(cmd) { |io| io.read } raw_output, _status = run_git(cmd)
process_count_commits_raw_output(raw_output, options) process_count_commits_raw_output(raw_output, options)
end end
def count_commits_shelling_command(options) def count_commits_shelling_command(options)
cmd = %W[#{Gitlab.config.git.bin_path} --git-dir=#{path} rev-list] cmd = %w[rev-list]
cmd << "--after=#{options[:after].iso8601}" if options[:after] cmd << "--after=#{options[:after].iso8601}" if options[:after]
cmd << "--before=#{options[:before].iso8601}" if options[:before] cmd << "--before=#{options[:before].iso8601}" if options[:before]
cmd << "--max-count=#{options[:max_count]}" if options[:max_count] cmd << "--max-count=#{options[:max_count]}" if options[:max_count]
...@@ -1884,20 +1899,17 @@ module Gitlab ...@@ -1884,20 +1899,17 @@ module Gitlab
return [] return []
end end
cmd = %W(#{Gitlab.config.git.bin_path} --git-dir=#{path} ls-tree) cmd = %W(ls-tree -r --full-tree --full-name -- #{actual_ref})
cmd += %w(-r) raw_output, _status = run_git(cmd)
cmd += %w(--full-tree)
cmd += %w(--full-name)
cmd += %W(-- #{actual_ref})
raw_output = IO.popen(cmd, &:read).split("\n").map do |f| lines = raw_output.split("\n").map do |f|
stuff, path = f.split("\t") stuff, path = f.split("\t")
_mode, type, _sha = stuff.split(" ") _mode, type, _sha = stuff.split(" ")
path if type == "blob" path if type == "blob"
# Contain only blob type # Contain only blob type
end end
raw_output.compact lines.compact
end end
# Returns true if the given ref name exists # Returns true if the given ref name exists
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment