[DRE-commits] [gitlab] 06/09: backport git 2.11 support
Praveen Arimbrathodiyil
praveen at moszumanska.debian.org
Wed Jan 18 15:09:44 UTC 2017
This is an automated email from the git hooks/post-receive script.
praveen pushed a commit to branch master
in repository gitlab.
commit 409cb7ff71739e5c9c0c2b0539f5287ab74a2f46
Author: Praveen Arimbrathodiyil <praveen at debian.org>
Date: Wed Jan 18 12:13:55 2017 +0530
backport git 2.11 support
---
debian/patches/0300-git-2-11-support.patch | 254 +++++++++++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 255 insertions(+)
diff --git a/debian/patches/0300-git-2-11-support.patch b/debian/patches/0300-git-2-11-support.patch
new file mode 100644
index 0000000..4874c75
--- /dev/null
+++ b/debian/patches/0300-git-2-11-support.patch
@@ -0,0 +1,254 @@
+From 8f3edeb7d50e8e8176627f668cda489935eccdf3 Mon Sep 17 00:00:00 2001
+From: Douglas Barbosa Alexandre <dbalexandre at gmail.com>
+Date: Mon, 19 Dec 2016 09:37:16 +0000
+Subject: [PATCH] Merge branch '25301-git-2.11-force-push-bug' into 'master' Accept environment variables from the `pre-receive` script ## Summary 1. Starting version 2.11, git changed the way the pre-receive flow works. - Previously, the new potential objects would be added to the main repo. If the pre-receive passes, the new objects stay in the repo but are linked up. If the pre-receive fails, the new objects stay orphaned in the repo, and are cleaned up during the next `git gc`. - In 2 [...]
+
+---
+ lib/api/helpers/internal_helpers.rb | 8 ++++++++
+ lib/api/internal.rb | 6 +++++-
+ lib/gitlab/checks/change_access.rb | 5 +++--
+ lib/gitlab/checks/force_push.rb | 11 ++++++++---
+ lib/gitlab/git/rev_list.rb | 42 ++++++++++++++++++++++++++++++++++++++++++
+ lib/gitlab/git_access.rb | 5 +++--
+ lib/gitlab/popen.rb | 4 ++--
+ spec/lib/gitlab/checks/force_push_spec.rb | 19 +++++++++++++++++++
+ spec/lib/gitlab/git/rev_list_spec.rb | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 10 files changed, 147 insertions(+), 10 deletions(-)
+ create mode 100644 changelogs/unreleased/25301-git-2-11-force-push-bug.yml
+ create mode 100644 lib/gitlab/git/rev_list.rb
+ create mode 100644 spec/lib/gitlab/checks/force_push_spec.rb
+ create mode 100644 spec/lib/gitlab/git/rev_list_spec.rb
+
+--- a/lib/api/internal.rb
++++ b/lib/api/internal.rb
+@@ -61,7 +61,11 @@
+ if wiki?
+ Gitlab::GitAccessWiki.new(actor, project, protocol, authentication_abilities: ssh_authentication_abilities)
+ else
+- Gitlab::GitAccess.new(actor, project, protocol, authentication_abilities: ssh_authentication_abilities)
++ Gitlab::GitAccess.new(actor,
++ project,
++ protocol,
++ authentication_abilities: ssh_authentication_abilities,
++ env: parse_allowed_environment_variables)
+ end
+
+ access_status = access.check(params[:action], params[:changes])
+--- a/lib/gitlab/checks/change_access.rb
++++ b/lib/gitlab/checks/change_access.rb
+@@ -3,11 +3,12 @@
+ class ChangeAccess
+ attr_reader :user_access, :project
+
+- def initialize(change, user_access:, project:)
++ def initialize(change, user_access:, project:, env: {})
+ @oldrev, @newrev, @ref = change.values_at(:oldrev, :newrev, :ref)
+ @branch_name = Gitlab::Git.branch_name(@ref)
+ @user_access = user_access
+ @project = project
++ @env = env
+ end
+
+ def exec
+@@ -68,7 +69,7 @@
+ end
+
+ def forced_push?
+- Gitlab::Checks::ForcePush.force_push?(@project, @oldrev, @newrev)
++ Gitlab::Checks::ForcePush.force_push?(@project, @oldrev, @newrev, env: @env)
+ end
+
+ def matching_merge_request?
+--- a/lib/gitlab/checks/force_push.rb
++++ b/lib/gitlab/checks/force_push.rb
+@@ -1,15 +1,20 @@
+ module Gitlab
+ module Checks
+ class ForcePush
+- def self.force_push?(project, oldrev, newrev)
++ def self.force_push?(project, oldrev, newrev, env: {})
+ return false if project.empty_repo?
+
+ # Created or deleted branch
+ if Gitlab::Git.blank_ref?(oldrev) || Gitlab::Git.blank_ref?(newrev)
+ false
+ else
+- missed_ref, _ = Gitlab::Popen.popen(%W(#{Gitlab.config.git.bin_path} --git-dir=#{project.repository.path_to_repo} rev-list --max-count=1 #{oldrev} ^#{newrev}))
+- missed_ref.present?
++ missed_ref, exit_status = Gitlab::Git::RevList.new(oldrev, newrev, project: project, env: env).execute
++
++ if exit_status == 0
++ missed_ref.present?
++ else
++ raise "Got a non-zero exit code while calling out to `git rev-list` in the force-push check."
++ end
+ end
+ end
+ end
+--- /dev/null
++++ b/lib/gitlab/git/rev_list.rb
+@@ -0,0 +1,42 @@
++module Gitlab
++ module Git
++ class RevList
++ attr_reader :project, :env
++
++ ALLOWED_VARIABLES = %w[GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES].freeze
++
++ def initialize(oldrev, newrev, project:, env: nil)
++ @project = project
++ @env = env.presence || {}
++ @args = [Gitlab.config.git.bin_path,
++ "--git-dir=#{project.repository.path_to_repo}",
++ "rev-list",
++ "--max-count=1",
++ oldrev,
++ "^#{newrev}"]
++ end
++
++ def execute
++ Gitlab::Popen.popen(@args, nil, parse_environment_variables)
++ end
++
++ def valid?
++ environment_variables.all? do |(name, value)|
++ value.start_with?(project.repository.path_to_repo)
++ end
++ end
++
++ private
++
++ def parse_environment_variables
++ return {} unless valid?
++
++ environment_variables
++ end
++
++ def environment_variables
++ @environment_variables ||= env.slice(*ALLOWED_VARIABLES)
++ end
++ end
++ end
++end
+--- a/lib/gitlab/git_access.rb
++++ b/lib/gitlab/git_access.rb
+@@ -17,12 +17,13 @@
+
+ attr_reader :actor, :project, :protocol, :user_access, :authentication_abilities
+
+- def initialize(actor, project, protocol, authentication_abilities:)
++ def initialize(actor, project, protocol, authentication_abilities:, env: {})
+ @actor = actor
+ @project = project
+ @protocol = protocol
+ @authentication_abilities = authentication_abilities
+ @user_access = UserAccess.new(user, project: project)
++ @env = env
+ end
+
+ def check(cmd, changes)
+@@ -99,7 +100,7 @@
+ end
+
+ def change_access_check(change)
+- Checks::ChangeAccess.new(change, user_access: user_access, project: project).exec
++ Checks::ChangeAccess.new(change, user_access: user_access, project: project, env: @env).exec
+ end
+
+ def protocol_allowed?
+--- a/lib/gitlab/popen.rb
++++ b/lib/gitlab/popen.rb
+@@ -5,13 +5,13 @@
+ module Popen
+ extend self
+
+- def popen(cmd, path = nil)
++ def popen(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 }
++ vars['PWD'] = path
+ options = { chdir: path }
+
+ unless File.directory?(path)
+--- /dev/null
++++ b/spec/lib/gitlab/checks/force_push_spec.rb
+@@ -0,0 +1,19 @@
++require 'spec_helper'
++
++describe Gitlab::Checks::ChangeAccess, lib: true do
++ let(:project) { create(:project) }
++
++ context "exit code checking" do
++ it "does not raise a runtime error if the `popen` call to git returns a zero exit code" do
++ allow(Gitlab::Popen).to receive(:popen).and_return(['normal output', 0])
++
++ expect { Gitlab::Checks::ForcePush.force_push?(project, 'oldrev', 'newrev') }.not_to raise_error
++ end
++
++ it "raises a runtime error if the `popen` call to git returns a non-zero exit code" do
++ allow(Gitlab::Popen).to receive(:popen).and_return(['error', 1])
++
++ expect { Gitlab::Checks::ForcePush.force_push?(project, 'oldrev', 'newrev') }.to raise_error(RuntimeError)
++ end
++ end
++end
+--- /dev/null
++++ b/spec/lib/gitlab/git/rev_list_spec.rb
+@@ -0,0 +1,53 @@
++require 'spec_helper'
++
++describe Gitlab::Git::RevList, lib: true do
++ let(:project) { create(:project) }
++
++ context "validations" do
++ described_class::ALLOWED_VARIABLES.each do |var|
++ context var do
++ it "accepts values starting with the project repo path" do
++ env = { var => "#{project.repository.path_to_repo}/objects" }
++ rev_list = described_class.new('oldrev', 'newrev', project: project, env: env)
++
++ expect(rev_list).to be_valid
++ end
++
++ it "rejects values starting not with the project repo path" do
++ env = { var => "/some/other/path" }
++ rev_list = described_class.new('oldrev', 'newrev', project: project, env: env)
++
++ expect(rev_list).not_to be_valid
++ end
++
++ it "rejects values containing the project repo path but not starting with it" do
++ env = { var => "/some/other/path/#{project.repository.path_to_repo}" }
++ rev_list = described_class.new('oldrev', 'newrev', project: project, env: env)
++
++ expect(rev_list).not_to be_valid
++ end
++ end
++ end
++ end
++
++ context "#execute" do
++ let(:env) { { "GIT_OBJECT_DIRECTORY" => project.repository.path_to_repo } }
++ let(:rev_list) { Gitlab::Git::RevList.new('oldrev', 'newrev', project: project, env: env) }
++
++ it "calls out to `popen` without environment variables if the record is invalid" do
++ allow(rev_list).to receive(:valid?).and_return(false)
++
++ expect(Open3).to receive(:popen3).with(hash_excluding(env), any_args)
++
++ rev_list.execute
++ end
++
++ it "calls out to `popen` with environment variables if the record is valid" do
++ allow(rev_list).to receive(:valid?).and_return(true)
++
++ expect(Open3).to receive(:popen3).with(hash_including(env), any_args)
++
++ rev_list.execute
++ end
++ end
++end
diff --git a/debian/patches/series b/debian/patches/series
index 61a5a97..070c46f 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -8,3 +8,4 @@ pid-log-paths.patch
052-relax-grape.patch
0200-remove-order-dependency-in-label-finder-spec.patch
0210-use-jquery-ui-rails6.patch
+0300-git-2-11-support.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/gitlab.git
More information about the Pkg-ruby-extras-commits
mailing list