Commit 8c2b1f25 authored by Douwe Maan's avatar Douwe Maan Committed by Rémy Coutable

Merge branch '22271-drone-tag-pipeline-build' into 'master'

Fix lightweight tags not processed correctly by GitTagPushService

Closes #22271

See merge request !6532
Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent ac7854a5
...@@ -4,6 +4,7 @@ Please view this file on the master branch, on stable branches it's out of date. ...@@ -4,6 +4,7 @@ Please view this file on the master branch, on stable branches it's out of date.
- Honour issue and merge request visibility in their respective finders. - Honour issue and merge request visibility in their respective finders.
- Disable reference Markdown for unavailable features. - Disable reference Markdown for unavailable features.
- Fix lightweight tags not processed correctly by GitTagPushService. !6532
- Allow owners to fetch source code in CI builds. !6943 - Allow owners to fetch source code in CI builds. !6943
- Reduce the overhead to calculate number of open/closed issues and merge requests within the group or project. !7123 - Reduce the overhead to calculate number of open/closed issues and merge requests within the group or project. !7123
- Fix builds tab visibility. !7178 - Fix builds tab visibility. !7178
......
...@@ -51,7 +51,7 @@ gem 'browser', '~> 2.2' ...@@ -51,7 +51,7 @@ gem 'browser', '~> 2.2'
# Extracting information from a git repository # Extracting information from a git repository
# Provide access to Gitlab::Git library # Provide access to Gitlab::Git library
gem 'gitlab_git', '~> 10.6.8' gem 'gitlab_git', '~> 10.7.0'
# LDAP Auth # LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes # GitLab fork with several improvements to original library. For full list of changes
......
...@@ -283,7 +283,7 @@ GEM ...@@ -283,7 +283,7 @@ GEM
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 3)
posix-spawn (~> 0.3) posix-spawn (~> 0.3)
gitlab-markup (1.5.0) gitlab-markup (1.5.0)
gitlab_git (10.6.8) gitlab_git (10.7.0)
activesupport (~> 4.0) activesupport (~> 4.0)
charlock_holmes (~> 0.7.3) charlock_holmes (~> 0.7.3)
github-linguist (~> 4.7.0) github-linguist (~> 4.7.0)
...@@ -867,7 +867,7 @@ DEPENDENCIES ...@@ -867,7 +867,7 @@ DEPENDENCIES
github-linguist (~> 4.7.0) github-linguist (~> 4.7.0)
gitlab-flowdock-git-hook (~> 1.0.1) gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-markup (~> 1.5.0) gitlab-markup (~> 1.5.0)
gitlab_git (~> 10.6.8) gitlab_git (~> 10.7.0)
gitlab_omniauth-ldap (~> 1.2.1) gitlab_omniauth-ldap (~> 1.2.1)
gollum-lib (~> 4.2) gollum-lib (~> 4.2)
gollum-rugged_adapter (~> 0.4.2) gollum-rugged_adapter (~> 0.4.2)
...@@ -994,4 +994,4 @@ DEPENDENCIES ...@@ -994,4 +994,4 @@ DEPENDENCIES
wikicloth (= 0.8.1) wikicloth (= 0.8.1)
BUNDLED WITH BUNDLED WITH
1.13.2 1.13.5
...@@ -23,7 +23,7 @@ class Projects::TagsController < Projects::ApplicationController ...@@ -23,7 +23,7 @@ class Projects::TagsController < Projects::ApplicationController
return render_404 unless @tag return render_404 unless @tag
@release = @project.releases.find_or_initialize_by(tag: @tag.name) @release = @project.releases.find_or_initialize_by(tag: @tag.name)
@commit = @repository.commit(@tag.target) @commit = @repository.commit(@tag.dereferenced_target)
end end
def create def create
......
...@@ -178,7 +178,7 @@ class Repository ...@@ -178,7 +178,7 @@ class Repository
before_remove_branch before_remove_branch
branch = find_branch(branch_name) branch = find_branch(branch_name)
oldrev = branch.try(:target).try(:id) oldrev = branch.try(:dereferenced_target).try(:id)
newrev = Gitlab::Git::BLANK_SHA newrev = Gitlab::Git::BLANK_SHA
ref = Gitlab::Git::BRANCH_REF_PREFIX + branch_name ref = Gitlab::Git::BRANCH_REF_PREFIX + branch_name
...@@ -294,10 +294,10 @@ class Repository ...@@ -294,10 +294,10 @@ class Repository
# Rugged seems to throw a `ReferenceError` when given branch_names rather # Rugged seems to throw a `ReferenceError` when given branch_names rather
# than SHA-1 hashes # than SHA-1 hashes
number_commits_behind = raw_repository. number_commits_behind = raw_repository.
count_commits_between(branch.target.sha, root_ref_hash) count_commits_between(branch.dereferenced_target.sha, root_ref_hash)
number_commits_ahead = raw_repository. number_commits_ahead = raw_repository.
count_commits_between(root_ref_hash, branch.target.sha) count_commits_between(root_ref_hash, branch.dereferenced_target.sha)
{ behind: number_commits_behind, ahead: number_commits_ahead } { behind: number_commits_behind, ahead: number_commits_ahead }
end end
...@@ -679,11 +679,11 @@ class Repository ...@@ -679,11 +679,11 @@ class Repository
branches.sort_by(&:name) branches.sort_by(&:name)
when 'updated_desc' when 'updated_desc'
branches.sort do |a, b| branches.sort do |a, b|
commit(b.target).committed_date <=> commit(a.target).committed_date commit(b.dereferenced_target).committed_date <=> commit(a.dereferenced_target).committed_date
end end
when 'updated_asc' when 'updated_asc'
branches.sort do |a, b| branches.sort do |a, b|
commit(a.target).committed_date <=> commit(b.target).committed_date commit(a.dereferenced_target).committed_date <=> commit(b.dereferenced_target).committed_date
end end
else else
branches branches
...@@ -858,7 +858,7 @@ class Repository ...@@ -858,7 +858,7 @@ class Repository
branch = find_branch(ref) branch = find_branch(ref)
if branch if branch
last_commit = branch.target last_commit = branch.dereferenced_target
index.read_tree(last_commit.raw_commit.tree) index.read_tree(last_commit.raw_commit.tree)
parents = [last_commit.sha] parents = [last_commit.sha]
end end
...@@ -945,7 +945,7 @@ class Repository ...@@ -945,7 +945,7 @@ class Repository
end end
def revert(user, commit, base_branch, revert_tree_id = nil) def revert(user, commit, base_branch, revert_tree_id = nil)
source_sha = find_branch(base_branch).target.sha source_sha = find_branch(base_branch).dereferenced_target.sha
revert_tree_id ||= check_revert_content(commit, base_branch) revert_tree_id ||= check_revert_content(commit, base_branch)
return false unless revert_tree_id return false unless revert_tree_id
...@@ -962,7 +962,7 @@ class Repository ...@@ -962,7 +962,7 @@ class Repository
end end
def cherry_pick(user, commit, base_branch, cherry_pick_tree_id = nil) def cherry_pick(user, commit, base_branch, cherry_pick_tree_id = nil)
source_sha = find_branch(base_branch).target.sha source_sha = find_branch(base_branch).dereferenced_target.sha
cherry_pick_tree_id ||= check_cherry_pick_content(commit, base_branch) cherry_pick_tree_id ||= check_cherry_pick_content(commit, base_branch)
return false unless cherry_pick_tree_id return false unless cherry_pick_tree_id
...@@ -991,7 +991,7 @@ class Repository ...@@ -991,7 +991,7 @@ class Repository
end end
def check_revert_content(commit, base_branch) def check_revert_content(commit, base_branch)
source_sha = find_branch(base_branch).target.sha source_sha = find_branch(base_branch).dereferenced_target.sha
args = [commit.id, source_sha] args = [commit.id, source_sha]
args << { mainline: 1 } if commit.merge_commit? args << { mainline: 1 } if commit.merge_commit?
...@@ -1005,7 +1005,7 @@ class Repository ...@@ -1005,7 +1005,7 @@ class Repository
end end
def check_cherry_pick_content(commit, base_branch) def check_cherry_pick_content(commit, base_branch)
source_sha = find_branch(base_branch).target.sha source_sha = find_branch(base_branch).dereferenced_target.sha
args = [commit.id, source_sha] args = [commit.id, source_sha]
args << 1 if commit.merge_commit? args << 1 if commit.merge_commit?
...@@ -1078,7 +1078,7 @@ class Repository ...@@ -1078,7 +1078,7 @@ class Repository
if rugged.lookup(newrev).parent_ids.empty? || target_branch.nil? if rugged.lookup(newrev).parent_ids.empty? || target_branch.nil?
oldrev = Gitlab::Git::BLANK_SHA oldrev = Gitlab::Git::BLANK_SHA
else else
oldrev = rugged.merge_base(newrev, target_branch.target.sha) oldrev = rugged.merge_base(newrev, target_branch.dereferenced_target.sha)
end end
GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do
...@@ -1138,7 +1138,7 @@ class Repository ...@@ -1138,7 +1138,7 @@ class Repository
end end
def tags_sorted_by_committed_date def tags_sorted_by_committed_date
tags.sort_by { |tag| tag.target.committed_date } tags.sort_by { |tag| tag.dereferenced_target.committed_date }
end end
def keep_around_ref_name(sha) def keep_around_ref_name(sha)
......
...@@ -42,7 +42,7 @@ class DeleteBranchService < BaseService ...@@ -42,7 +42,7 @@ class DeleteBranchService < BaseService
Gitlab::DataBuilder::Push.build( Gitlab::DataBuilder::Push.build(
project, project,
current_user, current_user,
branch.target.sha, branch.dereferenced_target.sha,
Gitlab::Git::BLANK_SHA, Gitlab::Git::BLANK_SHA,
"#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}", "#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}",
[]) [])
......
...@@ -36,7 +36,7 @@ class DeleteTagService < BaseService ...@@ -36,7 +36,7 @@ class DeleteTagService < BaseService
Gitlab::DataBuilder::Push.build( Gitlab::DataBuilder::Push.build(
project, project,
current_user, current_user,
tag.target.sha, tag.dereferenced_target.sha,
Gitlab::Git::BLANK_SHA, Gitlab::Git::BLANK_SHA,
"#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}",
[]) [])
......
...@@ -27,8 +27,8 @@ class GitTagPushService < BaseService ...@@ -27,8 +27,8 @@ class GitTagPushService < BaseService
tag_name = Gitlab::Git.ref_name(params[:ref]) tag_name = Gitlab::Git.ref_name(params[:ref])
tag = project.repository.find_tag(tag_name) tag = project.repository.find_tag(tag_name)
if tag && tag.object_sha == params[:newrev] if tag && tag.target == params[:newrev]
commit = project.commit(tag.target) commit = project.commit(tag.dereferenced_target)
commits = [commit].compact commits = [commit].compact
message = tag.message message = tag.message
end end
......
- commit = @repository.commit(branch.target) - commit = @repository.commit(branch.dereferenced_target)
- bar_graph_width_factor = @max_commits > 0 ? 100.0/@max_commits : 0 - bar_graph_width_factor = @max_commits > 0 ? 100.0/@max_commits : 0
- diverging_commit_counts = @repository.diverging_commit_counts(branch) - diverging_commit_counts = @repository.diverging_commit_counts(branch)
- number_commits_behind = diverging_commit_counts[:behind] - number_commits_behind = diverging_commit_counts[:behind]
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
%ul.unstyled-list.related-merge-requests %ul.unstyled-list.related-merge-requests
- @related_branches.each do |branch| - @related_branches.each do |branch|
%li %li
- target = @project.repository.find_branch(branch).target - target = @project.repository.find_branch(branch).dereferenced_target
- pipeline = @project.pipeline_for(branch, target.sha) if target - pipeline = @project.pipeline_for(branch, target.sha) if target
- if pipeline - if pipeline
%span.related-branch-ci-status %span.related-branch-ci-status
......
- commit = @repository.commit(tag.target) - commit = @repository.commit(tag.dereferenced_target)
- release = @releases.find { |release| release.tag == tag.name } - release = @releases.find { |release| release.tag == tag.name }
%li %li
%div %div
......
...@@ -138,7 +138,7 @@ module API ...@@ -138,7 +138,7 @@ module API
expose :name expose :name
expose :commit do |repo_branch, options| expose :commit do |repo_branch, options|
options[:project].repository.commit(repo_branch.target) options[:project].repository.commit(repo_branch.dereferenced_target)
end end
expose :protected do |repo_branch, options| expose :protected do |repo_branch, options|
...@@ -523,7 +523,7 @@ module API ...@@ -523,7 +523,7 @@ module API
expose :name, :message expose :name, :message
expose :commit do |repo_tag, options| expose :commit do |repo_tag, options|
options[:project].repository.commit(repo_tag.target) options[:project].repository.commit(repo_tag.dereferenced_target)
end end
expose :release, using: Entities::Release do |repo_tag, options| expose :release, using: Entities::Release do |repo_tag, options|
......
...@@ -83,7 +83,7 @@ module Gitlab ...@@ -83,7 +83,7 @@ module Gitlab
tag = repository.find_tag(tag_name) tag = repository.find_tag(tag_name)
if tag if tag
commit = repository.commit(tag.target) commit = repository.commit(tag.dereferenced_target)
commit.try(:sha) commit.try(:sha)
end end
else else
......
...@@ -21,7 +21,7 @@ describe BranchesFinder do ...@@ -21,7 +21,7 @@ describe BranchesFinder do
result = branches_finder.execute result = branches_finder.execute
recently_updated_branch = repository.branches.max do |a, b| recently_updated_branch = repository.branches.max do |a, b|
repository.commit(a.target).committed_date <=> repository.commit(b.target).committed_date repository.commit(a.dereferenced_target).committed_date <=> repository.commit(b.dereferenced_target).committed_date
end end
expect(result.first.name).to eq(recently_updated_branch.name) expect(result.first.name).to eq(recently_updated_branch.name)
......
...@@ -20,7 +20,7 @@ describe TagsFinder do ...@@ -20,7 +20,7 @@ describe TagsFinder do
result = tags_finder.execute result = tags_finder.execute
recently_updated_tag = repository.tags.max do |a, b| recently_updated_tag = repository.tags.max do |a, b|
repository.commit(a.target).committed_date <=> repository.commit(b.target).committed_date repository.commit(a.dereferenced_target).committed_date <=> repository.commit(b.dereferenced_target).committed_date
end end
expect(result.first.name).to eq(recently_updated_tag.name) expect(result.first.name).to eq(recently_updated_tag.name)
......
...@@ -68,8 +68,8 @@ describe Repository, models: true do ...@@ -68,8 +68,8 @@ describe Repository, models: true do
double_first = double(committed_date: Time.now) double_first = double(committed_date: Time.now)
double_last = double(committed_date: Time.now - 1.second) double_last = double(committed_date: Time.now - 1.second)
allow(tag_a).to receive(:target).and_return(double_first) allow(tag_a).to receive(:dereferenced_target).and_return(double_first)
allow(tag_b).to receive(:target).and_return(double_last) allow(tag_b).to receive(:dereferenced_target).and_return(double_last)
allow(repository).to receive(:tags).and_return([tag_a, tag_b]) allow(repository).to receive(:tags).and_return([tag_a, tag_b])
end end
...@@ -83,8 +83,8 @@ describe Repository, models: true do ...@@ -83,8 +83,8 @@ describe Repository, models: true do
double_first = double(committed_date: Time.now - 1.second) double_first = double(committed_date: Time.now - 1.second)
double_last = double(committed_date: Time.now) double_last = double(committed_date: Time.now)
allow(tag_a).to receive(:target).and_return(double_last) allow(tag_a).to receive(:dereferenced_target).and_return(double_last)
allow(tag_b).to receive(:target).and_return(double_first) allow(tag_b).to receive(:dereferenced_target).and_return(double_first)
allow(repository).to receive(:tags).and_return([tag_a, tag_b]) allow(repository).to receive(:tags).and_return([tag_a, tag_b])
end end
...@@ -632,9 +632,9 @@ describe Repository, models: true do ...@@ -632,9 +632,9 @@ describe Repository, models: true do
context "when the branch wasn't empty" do context "when the branch wasn't empty" do
it 'updates the head' do it 'updates the head' do
expect(repository.find_branch('feature').target.id).to eq(old_rev) expect(repository.find_branch('feature').dereferenced_target.id).to eq(old_rev)
repository.update_branch_with_hooks(user, 'feature') { new_rev } repository.update_branch_with_hooks(user, 'feature') { new_rev }
expect(repository.find_branch('feature').target.id).to eq(new_rev) expect(repository.find_branch('feature').dereferenced_target.id).to eq(new_rev)
end end
end end
end end
...@@ -659,7 +659,7 @@ describe Repository, models: true do ...@@ -659,7 +659,7 @@ describe Repository, models: true do
context 'when the update would remove commits from the target branch' do context 'when the update would remove commits from the target branch' do
it 'raises an exception' do it 'raises an exception' do
branch = 'master' branch = 'master'
old_rev = repository.find_branch(branch).target.sha old_rev = repository.find_branch(branch).dereferenced_target.sha
# The 'master' branch is NOT an ancestor of new_rev. # The 'master' branch is NOT an ancestor of new_rev.
expect(repository.rugged.merge_base(old_rev, new_rev)).not_to eq(old_rev) expect(repository.rugged.merge_base(old_rev, new_rev)).not_to eq(old_rev)
......
...@@ -37,65 +37,138 @@ describe GitTagPushService, services: true do ...@@ -37,65 +37,138 @@ describe GitTagPushService, services: true do
end end
describe "Git Tag Push Data" do describe "Git Tag Push Data" do
before do
service.execute
@push_data = service.push_data
@tag_name = Gitlab::Git.ref_name(ref)
@tag = project.repository.find_tag(@tag_name)
@commit = project.commit(@tag.target)
end
subject { @push_data } subject { @push_data }
let(:tag) { project.repository.find_tag(tag_name) }
let(:commit) { tag.dereferenced_target }
it { is_expected.to include(object_kind: 'tag_push') } context 'annotated tag' do
it { is_expected.to include(ref: ref) } let(:tag_name) { Gitlab::Git.ref_name(ref) }
it { is_expected.to include(before: oldrev) }
it { is_expected.to include(after: newrev) }
it { is_expected.to include(message: @tag.message) }
it { is_expected.to include(user_id: user.id) }
it { is_expected.to include(user_name: user.name) }
it { is_expected.to include(project_id: project.id) }
context "with repository data" do
subject { @push_data[:repository] }
it { is_expected.to include(name: project.name) }
it { is_expected.to include(url: project.url_to_repo) }
it { is_expected.to include(description: project.description) }
it { is_expected.to include(homepage: project.web_url) }
end
context "with commits" do before do
subject { @push_data[:commits] } service.execute
@push_data = service.push_data
end
it { is_expected.to be_an(Array) } it { is_expected.to include(object_kind: 'tag_push') }
it 'has 1 element' do it { is_expected.to include(ref: ref) }
expect(subject.size).to eq(1) it { is_expected.to include(before: oldrev) }
it { is_expected.to include(after: newrev) }
it { is_expected.to include(message: tag.message) }
it { is_expected.to include(user_id: user.id) }
it { is_expected.to include(user_name: user.name) }
it { is_expected.to include(project_id: project.id) }
context "with repository data" do
subject { @push_data[:repository] }
it { is_expected.to include(name: project.name) }
it { is_expected.to include(url: project.url_to_repo) }
it { is_expected.to include(description: project.description) }
it { is_expected.to include(homepage: project.web_url) }
end end
context "the commit" do context "with commits" do
subject { @push_data[:commits].first } subject { @push_data[:commits] }
it { is_expected.to include(id: @commit.id) } it { is_expected.to be_an(Array) }
it { is_expected.to include(message: @commit.safe_message) } it 'has 1 element' do
it { is_expected.to include(timestamp: @commit.date.xmlschema) } expect(subject.size).to eq(1)
it do end
is_expected.to include(
url: [ context "the commit" do
Gitlab.config.gitlab.url, subject { @push_data[:commits].first }
project.namespace.to_param,
project.to_param, it { is_expected.to include(id: commit.id) }
'commit', it { is_expected.to include(message: commit.safe_message) }
@commit.id it { is_expected.to include(timestamp: commit.date.xmlschema) }
].join('/') it do
) is_expected.to include(
url: [
Gitlab.config.gitlab.url,
project.namespace.to_param,
project.to_param,
'commit',
commit.id
].join('/')
)
end
context "with a author" do
subject { @push_data[:commits].first[:author] }
it { is_expected.to include(name: commit.author_name) }
it { is_expected.to include(email: commit.author_email) }
end
end end
end
end
context "with a author" do context 'lightweight tag' do
subject { @push_data[:commits].first[:author] } let(:tag_name) { 'light-tag' }
let(:newrev) { '5937ac0a7beb003549fc5fd26fc247adbce4a52e' }
let(:ref) { "refs/tags/light-tag" }
before do
# Create the lightweight tag
project.repository.raw_repository.rugged.tags.create(tag_name, newrev)
# Clear tag list cache
project.repository.expire_tags_cache
service.execute
@push_data = service.push_data
end
it { is_expected.to include(object_kind: 'tag_push') }
it { is_expected.to include(ref: ref) }
it { is_expected.to include(before: oldrev) }
it { is_expected.to include(after: newrev) }
it { is_expected.to include(message: tag.message) }
it { is_expected.to include(user_id: user.id) }
it { is_expected.to include(user_name: user.name) }
it { is_expected.to include(project_id: project.id) }
context "with repository data" do
subject { @push_data[:repository] }
it { is_expected.to include(name: project.name) }
it { is_expected.to include(url: project.url_to_repo) }
it { is_expected.to include(description: project.description) }
it { is_expected.to include(homepage: project.web_url) }
end
context "with commits" do
subject { @push_data[:commits] }
it { is_expected.to be_an(Array) }
it 'has 1 element' do
expect(subject.size).to eq(1)
end
it { is_expected.to include(name: @commit.author_name) } context "the commit" do
it { is_expected.to include(email: @commit.author_email) } subject { @push_data[:commits].first }
it { is_expected.to include(id: commit.id) }
it { is_expected.to include(message: commit.safe_message) }
it { is_expected.to include(timestamp: commit.date.xmlschema) }
it do
is_expected.to include(
url: [
Gitlab.config.gitlab.url,
project.namespace.to_param,
project.to_param,
'commit',
commit.id
].join('/')
)
end
context "with a author" do
subject { @push_data[:commits].first[:author] }
it { is_expected.to include(name: commit.author_name) }
it { is_expected.to include(email: commit.author_email) }
end
end end
end end
end end
......
...@@ -5,7 +5,7 @@ describe 'projects/issues/_related_branches' do ...@@ -5,7 +5,7 @@ describe 'projects/issues/_related_branches' do
let(:project) { create(:project) } let(:project) { create(:project) }
let(:branch) { project.repository.find_branch('feature') } let(:branch) { project.repository.find_branch('feature') }
let!(:pipeline) { create(:ci_pipeline, project: project, sha: branch.target.id, ref: 'feature') } let!(:pipeline) { create(:ci_pipeline, project: project, sha: branch.dereferenced_target.id, ref: 'feature') }
before do before do
assign(:project, project) assign(:project, project)
......
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