Commit d964eb11 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'cache-issuable-template-names' into 'master'

Cache issuable template names

See merge request gitlab-org/gitlab-ce!14823
parents 1e4b75ba b7303b65
...@@ -314,20 +314,12 @@ module IssuablesHelper ...@@ -314,20 +314,12 @@ module IssuablesHelper
@issuable_templates ||= @issuable_templates ||=
case issuable case issuable
when Issue when Issue
issue_template_names ref_project.repository.issue_template_names
when MergeRequest when MergeRequest
merge_request_template_names ref_project.repository.merge_request_template_names
end end
end end
def merge_request_template_names
@merge_request_templates ||= Gitlab::Template::MergeRequestTemplate.dropdown_names(ref_project)
end
def issue_template_names
@issue_templates ||= Gitlab::Template::IssueTemplate.dropdown_names(ref_project)
end
def selected_template(issuable) def selected_template(issuable)
params[:issuable_template] if issuable_templates(issuable).any? { |template| template[:name] == params[:issuable_template] } params[:issuable_template] if issuable_templates(issuable).any? { |template| template[:name] == params[:issuable_template] }
end end
......
...@@ -156,7 +156,9 @@ class Blob < SimpleDelegator ...@@ -156,7 +156,9 @@ class Blob < SimpleDelegator
end end
def file_type def file_type
Gitlab::FileDetector.type_of(path) name = File.basename(path)
Gitlab::FileDetector.type_of(path) || Gitlab::FileDetector.type_of(name)
end end
def video? def video?
......
...@@ -34,7 +34,8 @@ class Repository ...@@ -34,7 +34,8 @@ class Repository
CACHED_METHODS = %i(size commit_count rendered_readme contribution_guide CACHED_METHODS = %i(size commit_count rendered_readme contribution_guide
changelog license_blob license_key gitignore koding_yml changelog license_blob license_key gitignore koding_yml
gitlab_ci_yml branch_names tag_names branch_count gitlab_ci_yml branch_names tag_names branch_count
tag_count avatar exists? empty? root_ref has_visible_content?).freeze tag_count avatar exists? empty? root_ref has_visible_content?
issue_template_names merge_request_template_names).freeze
# Methods that use cache_method but only memoize the value # Methods that use cache_method but only memoize the value
MEMOIZED_CACHED_METHODS = %i(license empty_repo?).freeze MEMOIZED_CACHED_METHODS = %i(license empty_repo?).freeze
...@@ -50,7 +51,9 @@ class Repository ...@@ -50,7 +51,9 @@ class Repository
gitignore: :gitignore, gitignore: :gitignore,
koding: :koding_yml, koding: :koding_yml,
gitlab_ci: :gitlab_ci_yml, gitlab_ci: :gitlab_ci_yml,
avatar: :avatar avatar: :avatar,
issue_template: :issue_template_names,
merge_request_template: :merge_request_template_names
}.freeze }.freeze
# Wraps around the given method and caches its output in Redis and an instance # Wraps around the given method and caches its output in Redis and an instance
...@@ -535,6 +538,16 @@ class Repository ...@@ -535,6 +538,16 @@ class Repository
end end
cache_method :avatar cache_method :avatar
def issue_template_names
Gitlab::Template::IssueTemplate.dropdown_names(project)
end
cache_method :issue_template_names, fallback: []
def merge_request_template_names
Gitlab::Template::MergeRequestTemplate.dropdown_names(project)
end
cache_method :merge_request_template_names, fallback: []
def readme def readme
if readme = tree(:head)&.readme if readme = tree(:head)&.readme
ReadmeBlob.new(readme, self) ReadmeBlob.new(readme, self)
......
---
title: Cache issue and MR template names in Redis
merge_request:
author:
type: other
...@@ -6,31 +6,33 @@ module Gitlab ...@@ -6,31 +6,33 @@ module Gitlab
module FileDetector module FileDetector
PATTERNS = { PATTERNS = {
# Project files # Project files
readme: /\Areadme/i, readme: /\Areadme[^\/]*\z/i,
changelog: /\A(changelog|history|changes|news)/i, changelog: /\A(changelog|history|changes|news)[^\/]*\z/i,
license: /\A(licen[sc]e|copying)(\..+|\z)/i, license: /\A(licen[sc]e|copying)(\.[^\/]+)?\z/i,
contributing: /\Acontributing/i, contributing: /\Acontributing[^\/]*\z/i,
version: 'version', version: 'version',
avatar: /\Alogo\.(png|jpg|gif)\z/, avatar: /\Alogo\.(png|jpg|gif)\z/,
issue_template: /\A\.gitlab\/issue_templates\/[^\/]+\.md\z/,
merge_request_template: /\A\.gitlab\/merge_request_templates\/[^\/]+\.md\z/,
# Configuration files # Configuration files
gitignore: '.gitignore', gitignore: '.gitignore',
koding: '.koding.yml', koding: '.koding.yml',
gitlab_ci: '.gitlab-ci.yml', gitlab_ci: '.gitlab-ci.yml',
route_map: 'route-map.yml', route_map: '.gitlab/route-map.yml',
# Dependency files # Dependency files
cartfile: /\ACartfile/, cartfile: /\ACartfile[^\/]*\z/,
composer_json: 'composer.json', composer_json: 'composer.json',
gemfile: /\A(Gemfile|gems\.rb)\z/, gemfile: /\A(Gemfile|gems\.rb)\z/,
gemfile_lock: 'Gemfile.lock', gemfile_lock: 'Gemfile.lock',
gemspec: /\.gemspec\z/, gemspec: /\A[^\/]*\.gemspec\z/,
godeps_json: 'Godeps.json', godeps_json: 'Godeps.json',
package_json: 'package.json', package_json: 'package.json',
podfile: 'Podfile', podfile: 'Podfile',
podspec_json: /\.podspec\.json\z/, podspec_json: /\A[^\/]*\.podspec\.json\z/,
podspec: /\.podspec\z/, podspec: /\A[^\/]*\.podspec\z/,
requirements_txt: /requirements\.txt\z/, requirements_txt: /\A[^\/]*requirements\.txt\z/,
yarn_lock: 'yarn.lock' yarn_lock: 'yarn.lock'
}.freeze }.freeze
...@@ -63,13 +65,11 @@ module Gitlab ...@@ -63,13 +65,11 @@ module Gitlab
# type_of('README.md') # => :readme # type_of('README.md') # => :readme
# type_of('VERSION') # => :version # type_of('VERSION') # => :version
def self.type_of(path) def self.type_of(path)
name = File.basename(path)
PATTERNS.each do |type, search| PATTERNS.each do |type, search|
did_match = if search.is_a?(Regexp) did_match = if search.is_a?(Regexp)
name =~ search path =~ search
else else
name.casecmp(search) == 0 path.casecmp(search) == 0
end end
return type if did_match return type if did_match
......
...@@ -18,6 +18,10 @@ describe Gitlab::FileDetector do ...@@ -18,6 +18,10 @@ describe Gitlab::FileDetector do
expect(described_class.type_of('README.md')).to eq(:readme) expect(described_class.type_of('README.md')).to eq(:readme)
end end
it 'returns nil for a README file in a directory' do
expect(described_class.type_of('foo/README.md')).to be_nil
end
it 'returns the type of a changelog file' do it 'returns the type of a changelog file' do
%w(CHANGELOG HISTORY CHANGES NEWS).each do |file| %w(CHANGELOG HISTORY CHANGES NEWS).each do |file|
expect(described_class.type_of(file)).to eq(:changelog) expect(described_class.type_of(file)).to eq(:changelog)
...@@ -52,6 +56,14 @@ describe Gitlab::FileDetector do ...@@ -52,6 +56,14 @@ describe Gitlab::FileDetector do
end end
end end
it 'returns the type of an issue template' do
expect(described_class.type_of('.gitlab/issue_templates/foo.md')).to eq(:issue_template)
end
it 'returns the type of a merge request template' do
expect(described_class.type_of('.gitlab/merge_request_templates/foo.md')).to eq(:merge_request_template)
end
it 'returns nil for an unknown file' do it 'returns nil for an unknown file' do
expect(described_class.type_of('foo.txt')).to be_nil expect(described_class.type_of('foo.txt')).to be_nil
end end
......
...@@ -1509,7 +1509,9 @@ describe Repository do ...@@ -1509,7 +1509,9 @@ describe Repository do
:gitignore, :gitignore,
:koding, :koding,
:gitlab_ci, :gitlab_ci,
:avatar :avatar,
:issue_template,
:merge_request_template
]) ])
repository.after_change_head repository.after_change_head
......
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