summaryrefslogtreecommitdiff
path: root/app/models/repository.rb
diff options
context:
space:
mode:
authorNick Thomas <nick@gitlab.com>2018-10-12 14:42:35 +0100
committerNick Thomas <nick@gitlab.com>2018-10-17 16:24:36 +0100
commit0669127a328af171850afb01deef2a07eb89a6a6 (patch)
tree8a25b2e738eb131f89b21ce1cb93442ae89b6299 /app/models/repository.rb
parente347170cc59dfa1e48de451f7c48ccb65d3e581a (diff)
downloadgitlab-ce-0669127a328af171850afb01deef2a07eb89a6a6.tar.gz
Use cached readme blobs where appropriate
GitLab keeps a cache of the rendered HTML for a repository's README as stored in the HEAD branch. However, it was not used in all circumstances. In particular, the new blob viewer framework bypassed this cache entirely. This MR ensures a ::ReadmeBlob is returned instead of a ::Blob when asking a repository for an individual blob, if the commit and path match the readme for HEAD. This makes the cached HTML available to consumers, including the blob viewer. The ReadmeBlob is a simple delegator to the Blob, so should be compatible in all cases. Adding the rendered_markdown method is the only additional behaviour it contains.
Diffstat (limited to 'app/models/repository.rb')
-rw-r--r--app/models/repository.rb19
1 files changed, 15 insertions, 4 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 6ce480c32c4..37a1dd64052 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -487,7 +487,20 @@ class Repository
end
def blob_at(sha, path)
- Blob.decorate(raw_repository.blob_at(sha, path), project)
+ blob = Blob.decorate(raw_repository.blob_at(sha, path), project)
+
+ # Don't attempt to return a special result if there is no blob at all
+ return unless blob
+
+ # Don't attempt to return a special result unless we're looking at HEAD
+ return blob unless head_commit&.sha == sha
+
+ case path
+ when head_tree&.readme_path
+ ReadmeBlob.new(blob, self)
+ else
+ blob
+ end
rescue Gitlab::Git::Repository::NoRepository
nil
end
@@ -569,9 +582,7 @@ class Repository
cache_method :merge_request_template_names, fallback: []
def readme
- if readme = tree(:head)&.readme
- ReadmeBlob.new(readme, self)
- end
+ head_tree&.readme
end
def rendered_readme