[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