mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-17 16:46:06 +10:00
Merge branch 'master' of github.com:gitlabhq/gitlabhq
This commit is contained in:
@@ -11,7 +11,7 @@ v 7.8.0
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
- Allow more variations for commit messages closing issues (Julien Bianchi and Hannes Rosenögger)
|
||||
-
|
||||
-
|
||||
-
|
||||
|
||||
@@ -135,4 +135,19 @@ module DiffHelper
|
||||
'Side-by-side'
|
||||
end
|
||||
end
|
||||
|
||||
def submodule_link(blob, ref)
|
||||
tree, commit = submodule_links(blob, ref)
|
||||
commit_id = if commit.nil?
|
||||
blob.id[0..10]
|
||||
else
|
||||
link_to "#{blob.id[0..10]}", commit
|
||||
end
|
||||
|
||||
[
|
||||
content_tag(:span, link_to(truncate(blob.name, length: 40), tree)),
|
||||
'@',
|
||||
content_tag(:span, commit_id, class: 'monospace'),
|
||||
].join(' ').html_safe
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,8 +2,8 @@ module SubmoduleHelper
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
# links to files listing for submodule if submodule is a project on this server
|
||||
def submodule_links(submodule_item)
|
||||
url = @repository.submodule_url_for(@ref, submodule_item.path)
|
||||
def submodule_links(submodule_item, ref = nil)
|
||||
url = @repository.submodule_url_for(ref, submodule_item.path)
|
||||
|
||||
return url, nil unless url =~ /([^\/:]+\/[^\/]+\.git)\Z/
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
.diff-btn-group
|
||||
- if @commit.parent_ids.present?
|
||||
= view_file_btn(@commit.parent_id, diff_file, project)
|
||||
- elsif diff_file.diff.submodule?
|
||||
- submodule_item = project.repository.blob_at(@commit.id, diff_file.file_path)
|
||||
= submodule_link(submodule_item, @commit.id)
|
||||
- else
|
||||
- if diff_file.renamed_file
|
||||
%span= "#{diff_file.old_path} renamed to #{diff_file.new_path}"
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
- tree, commit = submodule_links(submodule_item)
|
||||
%tr{ class: "tree-item" }
|
||||
%td.tree-item-file-name
|
||||
%i.fa.fa-archive
|
||||
%span
|
||||
= link_to truncate(submodule_item.name, length: 40), tree
|
||||
@
|
||||
%span.monospace
|
||||
- if commit.nil?
|
||||
#{truncate_sha(submodule_item.id)}
|
||||
- else
|
||||
= link_to "#{truncate_sha(submodule_item.id)}", commit
|
||||
= submodule_link(submodule_item, @ref)
|
||||
%td
|
||||
%td.hidden-xs
|
||||
|
||||
@@ -77,7 +77,7 @@ production: &base
|
||||
# This happens when the commit is pushed or merged into the default branch of a project.
|
||||
# When not specified the default issue_closing_pattern as specified below will be used.
|
||||
# Tip: you can test your closing pattern at http://rubular.com
|
||||
# issue_closing_pattern: '([Cc]lose[sd]|[Ff]ixe[sd]) #(\d+)'
|
||||
# issue_closing_pattern: '((?:[Cc]los(?:e[sd]|ing)|[Ff]ix(?:e[sd]|ing)?) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+)'
|
||||
|
||||
## Default project features settings
|
||||
default_projects_features:
|
||||
|
||||
@@ -109,7 +109,7 @@ Settings.gitlab['signup_enabled'] ||= true if Settings.gitlab['signup_enabled'].
|
||||
Settings.gitlab['signin_enabled'] ||= true if Settings.gitlab['signin_enabled'].nil?
|
||||
Settings.gitlab['restricted_visibility_levels'] = Settings.send(:verify_constant_array, Gitlab::VisibilityLevel, Settings.gitlab['restricted_visibility_levels'], [])
|
||||
Settings.gitlab['username_changing_enabled'] = true if Settings.gitlab['username_changing_enabled'].nil?
|
||||
Settings.gitlab['issue_closing_pattern'] = '([Cc]lose[sd]|[Ff]ixe[sd]) #(\d+)' if Settings.gitlab['issue_closing_pattern'].nil?
|
||||
Settings.gitlab['issue_closing_pattern'] = '((?:[Cc]los(?:e[sd]|ing)|[Ff]ix(?:e[sd]|ing)?) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+)' if Settings.gitlab['issue_closing_pattern'].nil?
|
||||
Settings.gitlab['default_projects_features'] ||= {}
|
||||
Settings.gitlab['webhook_timeout'] ||= 10
|
||||
Settings.gitlab.default_projects_features['issues'] = true if Settings.gitlab.default_projects_features['issues'].nil?
|
||||
|
||||
@@ -3,14 +3,19 @@ module Gitlab
|
||||
ISSUE_CLOSING_REGEX = Regexp.new(Gitlab.config.gitlab.issue_closing_pattern)
|
||||
|
||||
def self.closed_by_message_in_project(message, project)
|
||||
md = ISSUE_CLOSING_REGEX.match(message)
|
||||
if md
|
||||
extractor = Gitlab::ReferenceExtractor.new
|
||||
extractor.analyze(md[0], project)
|
||||
extractor.issues_for(project)
|
||||
else
|
||||
[]
|
||||
issues = []
|
||||
|
||||
unless message.nil?
|
||||
md = message.scan(ISSUE_CLOSING_REGEX)
|
||||
|
||||
md.each do |ref|
|
||||
extractor = Gitlab::ReferenceExtractor.new
|
||||
extractor.analyze(ref[0], project)
|
||||
issues += extractor.issues_for(project)
|
||||
end
|
||||
end
|
||||
|
||||
issues.uniq
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::ClosingIssueExtractor do
|
||||
let(:project) { create(:project) }
|
||||
let(:issue) { create(:issue, project: project) }
|
||||
let(:iid1) { issue.iid }
|
||||
|
||||
describe :closed_by_message_in_project do
|
||||
context 'with a single reference' do
|
||||
it do
|
||||
message = "Awesome commit (Closes ##{iid1})"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
|
||||
it do
|
||||
message = "Awesome commit (closes ##{iid1})"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
|
||||
it do
|
||||
message = "Closed ##{iid1}"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
|
||||
it do
|
||||
message = "closed ##{iid1}"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
|
||||
it do
|
||||
message = "Awesome commit (fixes ##{iid1})"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
|
||||
it do
|
||||
message = "Awesome commit (fix ##{iid1})"
|
||||
subject.closed_by_message_in_project(message, project).should == [issue]
|
||||
end
|
||||
end
|
||||
|
||||
context 'with multiple references' do
|
||||
let(:other_issue) { create(:issue, project: project) }
|
||||
let(:third_issue) { create(:issue, project: project) }
|
||||
let(:iid2) { other_issue.iid }
|
||||
let(:iid3) { third_issue.iid }
|
||||
|
||||
it 'fetches issues in single line message' do
|
||||
message = "Closes ##{iid1} and fix ##{iid2}"
|
||||
|
||||
subject.closed_by_message_in_project(message, project).
|
||||
should == [issue, other_issue]
|
||||
end
|
||||
|
||||
it 'fetches comma-separated issues references in single line message' do
|
||||
message = "Closes ##{iid1}, closes ##{iid2}"
|
||||
|
||||
subject.closed_by_message_in_project(message, project).
|
||||
should == [issue, other_issue]
|
||||
end
|
||||
|
||||
it 'fetches comma-separated issues numbers in single line message' do
|
||||
message = "Closes ##{iid1}, ##{iid2} and ##{iid3}"
|
||||
|
||||
subject.closed_by_message_in_project(message, project).
|
||||
should == [issue, other_issue, third_issue]
|
||||
end
|
||||
|
||||
it 'fetches issues in multi-line message' do
|
||||
message = "Awesome commit (closes ##{iid1})\nAlso fixes ##{iid2}"
|
||||
|
||||
subject.closed_by_message_in_project(message, project).
|
||||
should == [issue, other_issue]
|
||||
end
|
||||
|
||||
it 'fetches issues in hybrid message' do
|
||||
message = "Awesome commit (closes ##{iid1})\n"\
|
||||
"Also fixing issues ##{iid2}, ##{iid3} and #4"
|
||||
|
||||
subject.closed_by_message_in_project(message, project).
|
||||
should == [issue, other_issue, third_issue]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -57,16 +57,12 @@ eos
|
||||
let(:other_issue) { create :issue, project: other_project }
|
||||
|
||||
it 'detects issues that this commit is marked as closing' do
|
||||
stub_const('Gitlab::ClosingIssueExtractor::ISSUE_CLOSING_REGEX',
|
||||
/Fixes #\d+/)
|
||||
commit.stub(safe_message: "Fixes ##{issue.iid}")
|
||||
commit.closes_issues(project).should == [issue]
|
||||
end
|
||||
|
||||
it 'does not detect issues from other projects' do
|
||||
ext_ref = "#{other_project.path_with_namespace}##{other_issue.iid}"
|
||||
stub_const('Gitlab::ClosingIssueExtractor::ISSUE_CLOSING_REGEX',
|
||||
/^([Cc]loses|[Ff]ixes)/)
|
||||
commit.stub(safe_message: "Fixes #{ext_ref}")
|
||||
commit.closes_issues(project).should be_empty
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user