summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIgor Drozdov <idrozdov@gitlab.com>2019-07-15 13:02:42 +0300
committerIgor Drozdov <idrozdov@gitlab.com>2019-07-16 13:46:01 +0300
commit878a6bcc5f76119350619ce4667527774097ae79 (patch)
tree736f880b26d181fd7a5d24d59d38cf7ec14ec190 /lib
parent2b5ec95feba38b39689e8ae4ad60a3bcefa557a2 (diff)
downloadgitlab-ce-id-submodule-url-graphql.tar.gz
Reduce the number of submodule calls for diff filesid-submodule-url-graphql
Now 1 request is performed instead of 2 per submodule
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/git/repository.rb3
-rw-r--r--lib/gitlab/graphql/representation/submodule_tree_entry.rb23
-rw-r--r--lib/gitlab/submodule_links.rb26
3 files changed, 36 insertions, 16 deletions
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 87284776db0..a7d9ba51277 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -1071,7 +1071,8 @@ module Gitlab
return unless commit_object && commit_object.type == :COMMIT
- gitaly_submodule_urls_for(ref)[path]
+ urls = gitaly_submodule_urls_for(ref)
+ urls && urls[path]
end
def gitaly_submodule_urls_for(ref)
diff --git a/lib/gitlab/graphql/representation/submodule_tree_entry.rb b/lib/gitlab/graphql/representation/submodule_tree_entry.rb
index 80d254ce68a..65716dff75d 100644
--- a/lib/gitlab/graphql/representation/submodule_tree_entry.rb
+++ b/lib/gitlab/graphql/representation/submodule_tree_entry.rb
@@ -5,35 +5,28 @@ module Gitlab
module Representation
class SubmoduleTreeEntry < SimpleDelegator
class << self
- def decorate(tree)
+ def decorate(submodules, tree)
repository = tree.repository
- submodule_urls = repository.submodule_urls_for(tree.sha)
+ submodule_links = Gitlab::SubmoduleLinks.new(repository)
- tree.submodules.map do |submodule|
- self.new(submodule, submodule_urls[submodule.path], repository)
+ submodules.map do |submodule|
+ self.new(submodule, submodule_links.for(submodule, tree.sha))
end
end
end
- def initialize(submodule, submodule_url, repository)
- @submodule_url = submodule_url
- @repository = repository
+ def initialize(submodule, submodule_links)
+ @submodule_links = submodule_links
super(submodule)
end
def web_url
- submodule_links.first
+ @submodule_links.first
end
def tree_url
- submodule_links.last
- end
-
- private
-
- def submodule_links
- @links ||= SubmoduleHelper.submodule_links_for_url(id, @submodule_url, @repository)
+ @submodule_links.last
end
end
end
diff --git a/lib/gitlab/submodule_links.rb b/lib/gitlab/submodule_links.rb
new file mode 100644
index 00000000000..a6c0369d864
--- /dev/null
+++ b/lib/gitlab/submodule_links.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class SubmoduleLinks
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(repository)
+ @repository = repository
+ end
+
+ def for(submodule, sha)
+ submodule_url = submodule_url_for(sha)[submodule.path]
+ SubmoduleHelper.submodule_links_for_url(submodule.id, submodule_url, repository)
+ end
+
+ private
+
+ attr_reader :repository
+
+ def submodule_url_for(sha)
+ strong_memoize(:"submodule_links_for_#{sha}") do
+ repository.submodule_urls_for(sha)
+ end
+ end
+ end
+end