diff --git a/_support/vendor-gitlab-git b/_support/vendor-gitlab-git index 705de3239972dadb61b582c176fef5abba9ed938..38976655776d79ce047843878a4b35b47dda8ef8 100755 --- a/_support/vendor-gitlab-git +++ b/_support/vendor-gitlab-git @@ -5,7 +5,9 @@ FILE_LIST = %w[ lib/gitlab/git.rb lib/gitlab/git lib/gitlab/encoding_helper.rb - lib/gitlab/utils/strong_memoize.rb + lib/gitlab/utils/strong_memoize.rb + lib/gitlab/version_info.rb + lib/gitlab/popen.rb ].freeze REMOTE = 'https://gitlab.com/gitlab-org/gitlab-ce'.freeze diff --git a/changelogs/unreleased/fj-vendoring-ruby-dir.yml b/changelogs/unreleased/fj-vendoring-ruby-dir.yml new file mode 100644 index 0000000000000000000000000000000000000000..ad0ded60403a4d81b05ae73dd2d3decc66eb3cea --- /dev/null +++ b/changelogs/unreleased/fj-vendoring-ruby-dir.yml @@ -0,0 +1,5 @@ +--- +title: Vendoring ruby dir to 290ca339adc952bcd939d1782af95f90d3b88716 +merge_request: 753 +author: +type: other diff --git a/ruby/lib/gitlab/git.rb b/ruby/lib/gitlab/git.rb index fd984d3db09365f1e9e91f7d7a997ab1cc28a810..5dbd174e2767d26c89bfeb708c2d952d17c2cd9c 100644 --- a/ruby/lib/gitlab/git.rb +++ b/ruby/lib/gitlab/git.rb @@ -28,6 +28,8 @@ vendor_gitlab_git = '../../vendor/gitlab_git/' # Some later requires are order-sensitive. Manually require whatever we need. require_relative File.join(vendor_gitlab_git, 'lib/gitlab/encoding_helper.rb') require_relative File.join(vendor_gitlab_git, 'lib/gitlab/utils/strong_memoize.rb') +require_relative File.join(vendor_gitlab_git, 'lib/gitlab/version_info.rb') +require_relative File.join(vendor_gitlab_git, 'lib/gitlab/popen.rb') require_relative File.join(vendor_gitlab_git, 'lib/gitlab/git.rb') require_relative File.join(vendor_gitlab_git, 'lib/gitlab/git/popen.rb') require_relative File.join(vendor_gitlab_git, 'lib/gitlab/git/ref.rb') diff --git a/ruby/vendor/gitlab_git/REVISION b/ruby/vendor/gitlab_git/REVISION index a5f63575aa46eaadf8387ffe9dbfe057cc26c035..39e832ccbfc96223a42e70d4f772947af90cf787 100644 --- a/ruby/vendor/gitlab_git/REVISION +++ b/ruby/vendor/gitlab_git/REVISION @@ -1 +1 @@ -930ad88a87b0814173989aaccc6dc8af00d1bf65 +290ca339adc952bcd939d1782af95f90d3b88716 diff --git a/ruby/vendor/gitlab_git/lib/gitlab/git/commit.rb b/ruby/vendor/gitlab_git/lib/gitlab/git/commit.rb index 89f761dd515bc10a3fd87a37bc6e82fbc5112ac8..c9806cdb85f9aba52da7d39ba90f4ddddedd6564 100644 --- a/ruby/vendor/gitlab_git/lib/gitlab/git/commit.rb +++ b/ruby/vendor/gitlab_git/lib/gitlab/git/commit.rb @@ -60,6 +60,9 @@ module Gitlab # Some weird thing? return nil unless commit_id.is_a?(String) + # This saves us an RPC round trip. + return nil if commit_id.include?(':') + commit = repo.gitaly_migrate(:find_commit) do |is_enabled| if is_enabled repo.gitaly_commit_client.find_commit(commit_id) diff --git a/ruby/vendor/gitlab_git/lib/gitlab/git/lfs_changes.rb b/ruby/vendor/gitlab_git/lib/gitlab/git/lfs_changes.rb index b9e5cf258f4a55deb00b75bd90b6e05b2b1c2467..b230289e7bf6fca53079c7cc8c02a9da57a18ae4 100644 --- a/ruby/vendor/gitlab_git/lib/gitlab/git/lfs_changes.rb +++ b/ruby/vendor/gitlab_git/lib/gitlab/git/lfs_changes.rb @@ -39,7 +39,13 @@ module Gitlab end def git_all_pointers - rev_list.all_objects(require_path: true) do |object_ids| + params = { require_path: true } + + if Gitlab::Git.version >= Gitlab::VersionInfo.parse('2.16.0') + params[:options] = ["--filter=blob:limit=#{Gitlab::Git::Blob::LFS_POINTER_MAX_SIZE}"] + end + + rev_list.all_objects(params) do |object_ids| Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) end end diff --git a/ruby/vendor/gitlab_git/lib/gitlab/git/repository.rb b/ruby/vendor/gitlab_git/lib/gitlab/git/repository.rb index d1b13ca2342d6648884e69799e137049a1138f67..93f9adaf1f12c160513aea8b5c6f29c870512243 100644 --- a/ruby/vendor/gitlab_git/lib/gitlab/git/repository.rb +++ b/ruby/vendor/gitlab_git/lib/gitlab/git/repository.rb @@ -1543,7 +1543,7 @@ module Gitlab end end - def rev_list(including: [], excluding: [], objects: false, &block) + def rev_list(including: [], excluding: [], options: [], objects: false, &block) args = ['rev-list'] args.push(*rev_list_param(including)) @@ -1556,6 +1556,10 @@ module Gitlab args.push('--objects') if objects + if options.any? + args.push(*options) + end + run_git!(args, lazy_block: block) end diff --git a/ruby/vendor/gitlab_git/lib/gitlab/git/rev_list.rb b/ruby/vendor/gitlab_git/lib/gitlab/git/rev_list.rb index 38c3a55f96ff840b468db1a6920cf31d645ebd3e..33b641a090b892aae048eb462972caebcd0a7080 100644 --- a/ruby/vendor/gitlab_git/lib/gitlab/git/rev_list.rb +++ b/ruby/vendor/gitlab_git/lib/gitlab/git/rev_list.rb @@ -37,8 +37,11 @@ module Gitlab get_objects(opts, &lazy_block) end - def all_objects(require_path: nil, &lazy_block) - get_objects(including: :all, require_path: require_path, &lazy_block) + def all_objects(options: [], require_path: nil, &lazy_block) + get_objects(including: :all, + options: options, + require_path: require_path, + &lazy_block) end # This methods returns an array of missed references @@ -54,8 +57,8 @@ module Gitlab repository.rev_list(args).split("\n") end - def get_objects(including: [], excluding: [], require_path: nil) - opts = { including: including, excluding: excluding, objects: true } + def get_objects(including: [], excluding: [], options: [], require_path: nil) + opts = { including: including, excluding: excluding, options: options, objects: true } repository.rev_list(opts) do |lazy_output| objects = objects_from_output(lazy_output, require_path: require_path) diff --git a/ruby/vendor/gitlab_git/lib/gitlab/popen.rb b/ruby/vendor/gitlab_git/lib/gitlab/popen.rb new file mode 100644 index 0000000000000000000000000000000000000000..b9832a724c47bbc601458e6ca333d229b46d57f7 --- /dev/null +++ b/ruby/vendor/gitlab_git/lib/gitlab/popen.rb @@ -0,0 +1,48 @@ +require 'fileutils' +require 'open3' + +module Gitlab + module Popen + extend self + + Result = Struct.new(:cmd, :stdout, :stderr, :status, :duration) + + # Returns [stdout + stderr, status] + def popen(cmd, path = nil, vars = {}, &block) + result = popen_with_detail(cmd, path, vars, &block) + + [result.stdout << result.stderr, result.status&.exitstatus] + end + + # Returns Result + def popen_with_detail(cmd, path = nil, vars = {}) + unless cmd.is_a?(Array) + raise "System commands must be given as an array of strings" + end + + path ||= Dir.pwd + vars['PWD'] = path + options = { chdir: path } + + unless File.directory?(path) + FileUtils.mkdir_p(path) + end + + cmd_stdout = '' + cmd_stderr = '' + cmd_status = nil + start = Time.now + + Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr| + yield(stdin) if block_given? + stdin.close + + cmd_stdout = stdout.read + cmd_stderr = stderr.read + cmd_status = wait_thr.value + end + + Result.new(cmd, cmd_stdout, cmd_stderr, cmd_status, Time.now - start) + end + end +end diff --git a/ruby/vendor/gitlab_git/lib/gitlab/version_info.rb b/ruby/vendor/gitlab_git/lib/gitlab/version_info.rb new file mode 100644 index 0000000000000000000000000000000000000000..6ee41e85cc9bf33c10b690df09ca735b22f3790f --- /dev/null +++ b/ruby/vendor/gitlab_git/lib/gitlab/version_info.rb @@ -0,0 +1,54 @@ +module Gitlab + class VersionInfo + include Comparable + + attr_reader :major, :minor, :patch + + def self.parse(str) + if str && m = str.match(/(\d+)\.(\d+)\.(\d+)/) + VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i) + else + VersionInfo.new + end + end + + def initialize(major = 0, minor = 0, patch = 0) + @major = major + @minor = minor + @patch = patch + end + + def <=>(other) + return unless other.is_a? VersionInfo + return unless valid? && other.valid? + + if other.major < @major + 1 + elsif @major < other.major + -1 + elsif other.minor < @minor + 1 + elsif @minor < other.minor + -1 + elsif other.patch < @patch + 1 + elsif @patch < other.patch + -1 + else + 0 + end + end + + def to_s + if valid? + "%d.%d.%d" % [@major, @minor, @patch] + else + "Unknown" + end + end + + def valid? + @major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0 + end + end +end