diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 08066acb45c7f241fc3053b90e8b7fcdee7380bc..2a588a06c7e74f67b39eed1959c356981c596ea4 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -131,6 +131,7 @@ def blob @blob ||= @repository.blob_at(@commit.id, @path) if @blob + @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? @blob else if tree = @repository.tree(@commit.id, @path) diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index 1c8e55ecf50752f8a1764dde15745170cb96408b..e0e41a8ce15a17cf0723424f9d02775a657b9e30 100644 --- a/lib/gitlab/git/blob.rb +++ b/lib/gitlab/git/blob.rb @@ -205,6 +205,10 @@ def external_storage alias_method :external_size, :lfs_size + def file_link? + @mode == '120000' + end + private def record_metric_blob_size diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index b6b9a8ae96270ae6e654259893d8bdab7ba1f5d2..d0f976e364e90aa7a9796d59b6d97e1e616017e4 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -135,6 +135,29 @@ def create_file(file_name, content) end end + context 'visiting a symlink' do + before do + allow_any_instance_of(Repository).to receive(:blob_at).with(anything, 'files/markdown/ruby-style-guide.md').and_call_original + + # Fake symlink file + allow_any_instance_of(Repository).to receive(:blob_at).with(anything, 'test-link.md') do + double(:blob, file_link?: true, data: 'files/markdown/ruby-style-guide.md') + end + + allow_any_instance_of(Gitlab::Git::Commit).to receive(:last_for_path).with(anything, anything, 'test-link.md', literal_pathspec: true) do + double(:commit, sha: project.commit.sha) + end + + visit_blob('test-link.md') + + wait_for_requests + end + + it 'displays the linked blob' do + expect(page).to have_content("[PEP-8](http://www.python.org/dev/peps/pep-0008/)") + end + end + context 'when ref switch' do def switch_ref_to(ref_name) first('.qa-branches-select').click diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb index fb4510a78de75fe75e514b31dfb495b38cc1eab5..b0488d225810967deb8ff684eb1405d60933f549 100644 --- a/spec/lib/gitlab/git/blob_spec.rb +++ b/spec/lib/gitlab/git/blob_spec.rb @@ -664,4 +664,36 @@ end end end + + describe '#file_link?' do + subject { blob.file_link? } + + context 'file is a soft link' do + let(:blob) do + Gitlab::Git::Blob.new(name: 'test', mode: '120000') + end + + it { is_expected.to be_truthy } + end + + context 'file is a normal file' do + let(:blob) do + data = "test\nblob" + + Gitlab::Git::Blob.new(name: 'test', size: data.bytesize, data: data, mode: '100644') + end + + it { is_expected.to be_falsey } + end + + context 'file is an executable' do + let(:blob) do + data = "test\nblob" + + Gitlab::Git::Blob.new(name: 'test', size: data.bytesize, data: data, mode: '100755') + end + + it { is_expected.to be_falsey } + end + end end