diff options
author | Igor Drozdov <idrozdov@gitlab.com> | 2019-07-15 13:02:42 +0300 |
---|---|---|
committer | Igor Drozdov <idrozdov@gitlab.com> | 2019-07-16 13:46:01 +0300 |
commit | 878a6bcc5f76119350619ce4667527774097ae79 (patch) | |
tree | 736f880b26d181fd7a5d24d59d38cf7ec14ec190 /lib | |
parent | 2b5ec95feba38b39689e8ae4ad60a3bcefa557a2 (diff) | |
download | gitlab-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.rb | 3 | ||||
-rw-r--r-- | lib/gitlab/graphql/representation/submodule_tree_entry.rb | 23 | ||||
-rw-r--r-- | lib/gitlab/submodule_links.rb | 26 |
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 |