diff options
11 files changed, 87 insertions, 2 deletions
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue index d2198bcccfe..0357a0e44c3 100644 --- a/app/assets/javascripts/repository/components/table/index.vue +++ b/app/assets/javascripts/repository/components/table/index.vue @@ -135,6 +135,7 @@ export default { :path="entry.flatPath" :type="entry.type" :url="entry.webUrl" + :lfs-oid="entry.lfsOid" /> </template> </tbody> diff --git a/app/assets/javascripts/repository/components/table/row.vue b/app/assets/javascripts/repository/components/table/row.vue index 764882a7936..e24a5e2c447 100644 --- a/app/assets/javascripts/repository/components/table/row.vue +++ b/app/assets/javascripts/repository/components/table/row.vue @@ -1,8 +1,12 @@ <script> +import { GlBadge } from '@gitlab/ui'; import { getIconName } from '../../utils/icon'; import getRefMixin from '../../mixins/get_ref'; export default { + components: { + GlBadge, + }, mixins: [getRefMixin], props: { id: { @@ -26,6 +30,11 @@ export default { required: false, default: null, }, + lfsOid: { + type: String, + required: false, + default: null, + }, }, computed: { routerLinkTo() { @@ -67,6 +76,9 @@ export default { <component :is="linkComponent" :to="routerLinkTo" :href="url" class="str-truncated"> {{ fullPath }} </component> + <gl-badge v-if="lfsOid" variant="default" class="label-lfs ml-1"> + LFS + </gl-badge> <template v-if="isSubmodule"> @ <a href="#" class="commit-sha">{{ shortSha }}</a> </template> diff --git a/app/assets/javascripts/repository/queries/getFiles.graphql b/app/assets/javascripts/repository/queries/getFiles.graphql index 7d92bc46455..ef924fde556 100644 --- a/app/assets/javascripts/repository/queries/getFiles.graphql +++ b/app/assets/javascripts/repository/queries/getFiles.graphql @@ -45,6 +45,7 @@ query getFiles( node { ...TreeEntry webUrl + lfsOid } } pageInfo { diff --git a/app/graphql/types/tree/blob_type.rb b/app/graphql/types/tree/blob_type.rb index f2b7d5df2b2..ba191b59132 100644 --- a/app/graphql/types/tree/blob_type.rb +++ b/app/graphql/types/tree/blob_type.rb @@ -9,6 +9,9 @@ module Types graphql_name 'Blob' field :web_url, GraphQL::STRING_TYPE, null: true + field :lfs_oid, GraphQL::STRING_TYPE, null: true, resolve: -> (blob, args, ctx) do + Gitlab::Graphql::Loaders::BatchCommitLoader.new(blob.repository, blob.id).find + end end end end diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb index c5675ef3ea3..91c9abe750b 100644 --- a/app/presenters/blob_presenter.rb +++ b/app/presenters/blob_presenter.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class BlobPresenter < Gitlab::View::Presenter::Simple +class BlobPresenter < Gitlab::View::Presenter::Delegated presents :blob def highlight(plain: nil) diff --git a/changelogs/unreleased/add-lfs-blob-ids-to-tree-type.yml b/changelogs/unreleased/add-lfs-blob-ids-to-tree-type.yml new file mode 100644 index 00000000000..14a5ef1cef3 --- /dev/null +++ b/changelogs/unreleased/add-lfs-blob-ids-to-tree-type.yml @@ -0,0 +1,5 @@ +--- +title: Add LFS oid to GraphQL blob type +merge_request: 28666 +author: +type: added diff --git a/lib/gitlab/graphql/loaders/batch_commit_loader.rb b/lib/gitlab/graphql/loaders/batch_commit_loader.rb new file mode 100644 index 00000000000..f410c3195f8 --- /dev/null +++ b/lib/gitlab/graphql/loaders/batch_commit_loader.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Gitlab + module Graphql + module Loaders + class BatchCommitLoader + def initialize(repository, blob_id) + @repository, @blob_id = repository, blob_id + end + + def find + BatchLoader.for(blob_id).batch(key: repository) do |blob_ids, loader, batch_args| + Gitlab::Git::Blob.batch_lfs_pointers(batch_args[:key], blob_ids).each do |loaded_blob| + loader.call(loaded_blob.id, loaded_blob.lfs_oid) + end + end + end + + private + + attr_reader :repository, :blob_id + end + end + end +end diff --git a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap index 1b4564303e4..86bfde1a28c 100644 --- a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap +++ b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap @@ -22,6 +22,8 @@ exports[`Repository table row component renders table row 1`] = ` </a> <!----> + + <!----> </td> <td diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js index a70dc7bb866..90a502966ad 100644 --- a/spec/frontend/repository/components/table/row_spec.js +++ b/spec/frontend/repository/components/table/row_spec.js @@ -1,4 +1,5 @@ import { shallowMount, RouterLinkStub } from '@vue/test-utils'; +import { GlBadge } from '@gitlab/ui'; import TableRow from '~/repository/components/table/row.vue'; let vm; @@ -98,4 +99,16 @@ describe('Repository table row component', () => { expect(vm.find('a').attributes('href')).toEqual('https://test.com'); }); + + it('renders LFS badge', () => { + factory({ + id: '1', + path: 'test', + type: 'commit', + currentPath: '/', + lfsOid: '1', + }); + + expect(vm.find(GlBadge).exists()).toBe(true); + }); }); diff --git a/spec/graphql/types/tree/blob_type_spec.rb b/spec/graphql/types/tree/blob_type_spec.rb index b12e214ca84..22c11aff90a 100644 --- a/spec/graphql/types/tree/blob_type_spec.rb +++ b/spec/graphql/types/tree/blob_type_spec.rb @@ -5,5 +5,5 @@ require 'spec_helper' describe Types::Tree::BlobType do it { expect(described_class.graphql_name).to eq('Blob') } - it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path, :web_url) } + it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path, :web_url, :lfs_oid) } end diff --git a/spec/lib/gitlab/graphql/loaders/batch_commit_loader_spec.rb b/spec/lib/gitlab/graphql/loaders/batch_commit_loader_spec.rb new file mode 100644 index 00000000000..0137b1029cd --- /dev/null +++ b/spec/lib/gitlab/graphql/loaders/batch_commit_loader_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Gitlab::Graphql::Loaders::BatchCommitLoader do + include GraphqlHelpers + + set(:project) { create(:project, :repository) } + let(:repository) { project.repository } + let(:blob) { Gitlab::Graphql::Representation::TreeEntry.new(repository.blob_at('master', 'files/lfs/lfs_object.iso'), repository) } + let(:otherblob) { Gitlab::Graphql::Representation::TreeEntry.new(repository.blob_at('master', 'README'), repository) } + + describe '#find' do + it 'batch-resolves LFS blob IDs' do + expect(Gitlab::Git::Blob).to receive(:batch_lfs_pointers).once.and_call_original + + result = batch do + [blob, otherblob].map { |b| described_class.new(repository, b.id).find } + end + + expect(result.first).to eq(blob.lfs_oid) + expect(result.last).to eq(nil) + end + end +end |