From cc426e0bd96f6bacd3ac8a577c0884171de27a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Tue, 30 Mar 2021 15:30:03 +0800 Subject: [PATCH 01/13] Add instance method for blob to judge whether the file is soft link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By judging the mode value of the blob instance, Find out whether the file type is soft link Signed-off-by: 李少辉 --- lib/gitlab/git/blob.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index 5d91eb605e84be..9bcec54eb17f8c 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? + return @mode == '120000' + end + private def record_metric_blob_size -- GitLab From d0c96bfbcae324f3007265f354ea39f33659bee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Tue, 30 Mar 2021 15:39:47 +0800 Subject: [PATCH 02/13] Displays the content of the linked file directly when the file is soft link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When rendering the file content, It first determines whether the file is a soft link. When the file is a soft link, It directly displays the linked file content Signed-off-by: 李少辉 --- app/controllers/projects/blob_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index a398fc56a35a9c..1ecc233642a509 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -49,6 +49,7 @@ def create end def show + @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? conditionally_expand_blob(@blob) respond_to do |format| -- GitLab From 929283de0fce3a8ae76d1ae25934c351d4bfa46d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Thu, 15 Apr 2021 19:06:35 +0800 Subject: [PATCH 03/13] Remove Redundant return from Blob file_link? method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李少辉 --- lib/gitlab/git/blob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index 9bcec54eb17f8c..72bf5f98f26cea 100644 --- a/lib/gitlab/git/blob.rb +++ b/lib/gitlab/git/blob.rb @@ -206,7 +206,7 @@ def external_storage alias_method :external_size, :lfs_size def file_link? - return @mode == '120000' + @mode == '120000' end private -- GitLab From 2d9cf6f8c588e6f70567cc5b400c2c940c2395f0 Mon Sep 17 00:00:00 2001 From: lish Date: Tue, 29 Jun 2021 17:47:05 +0800 Subject: [PATCH 04/13] Move the logic for judging and getting the content of linked file to blob method Signed-off-by: lish --- app/controllers/projects/blob_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 1ecc233642a509..3b808e86593133 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -49,7 +49,6 @@ def create end def show - @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? conditionally_expand_blob(@blob) respond_to do |format| @@ -123,6 +122,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) -- GitLab From 88f48f04c1c1113a9a8b15ccbc3340a446454450 Mon Sep 17 00:00:00 2001 From: lish Date: Wed, 7 Jul 2021 10:43:53 +0800 Subject: [PATCH 05/13] Add unit tests for the Blob#file_link? method Signed-off-by: lish --- spec/lib/gitlab/git/blob_spec.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb index fb4510a78de75f..b0488d22581096 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 -- GitLab From 1e4ba2cdb9bf15452a18e39d6b4ecef8e1c1e829 Mon Sep 17 00:00:00 2001 From: lish Date: Tue, 29 Jun 2021 17:47:05 +0800 Subject: [PATCH 06/13] Move the logic for judging linked file to blob method Signed-off-by: lish --- app/controllers/projects/blob_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 1ecc233642a509..3b808e86593133 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -49,7 +49,6 @@ def create end def show - @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? conditionally_expand_blob(@blob) respond_to do |format| @@ -123,6 +122,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) -- GitLab From cd48adb6e55a24befaa334c40cc0b1d4b67a66b6 Mon Sep 17 00:00:00 2001 From: lish Date: Wed, 7 Jul 2021 10:43:53 +0800 Subject: [PATCH 07/13] Add unit tests for the Blob#file_link? method Signed-off-by: lish --- spec/lib/gitlab/git/blob_spec.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb index fb4510a78de75f..b0488d22581096 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 -- GitLab From 4f8e4c50aab9c007d1fbbd2582983d28585f4e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Tue, 30 Mar 2021 15:30:03 +0800 Subject: [PATCH 08/13] Add instance method for blob to judge whether the file is soft link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By judging the mode value of the blob instance, Find out whether the file type is soft link Signed-off-by: 李少辉 --- lib/gitlab/git/blob.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index 1c8e55ecf50752..7ae6f3408d51e6 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? + return @mode == '120000' + end + private def record_metric_blob_size -- GitLab From 43845695e364bb567d2ef1c824c8194e6703bb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Tue, 30 Mar 2021 15:39:47 +0800 Subject: [PATCH 09/13] Displays the content of the linked file directly when the file is soft link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When rendering the file content, It first determines whether the file is a soft link. When the file is a soft link, It directly displays the linked file content Signed-off-by: 李少辉 --- app/controllers/projects/blob_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 08066acb45c7f2..4e1a7283015b2a 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -58,6 +58,7 @@ def create end def show + @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? conditionally_expand_blob(@blob) respond_to do |format| -- GitLab From 64196be3b8fe4846891476ab34fdc910a9894ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=91=E8=BE=89?= Date: Thu, 15 Apr 2021 19:06:35 +0800 Subject: [PATCH 10/13] Remove Redundant return from Blob file_link? method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李少辉 --- lib/gitlab/git/blob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index 7ae6f3408d51e6..e0e41a8ce15a17 100644 --- a/lib/gitlab/git/blob.rb +++ b/lib/gitlab/git/blob.rb @@ -206,7 +206,7 @@ def external_storage alias_method :external_size, :lfs_size def file_link? - return @mode == '120000' + @mode == '120000' end private -- GitLab From a88314a8ab78003a25b6558f07eacfa301d20517 Mon Sep 17 00:00:00 2001 From: lish Date: Tue, 29 Jun 2021 17:47:05 +0800 Subject: [PATCH 11/13] Move the logic for judging linked file to blob method Signed-off-by: lish --- app/controllers/projects/blob_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 4e1a7283015b2a..2a588a06c7e74f 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -58,7 +58,6 @@ def create end def show - @blob = @repository.blob_at(@commit.id, @blob.data.strip) if @blob.file_link? conditionally_expand_blob(@blob) respond_to do |format| @@ -132,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) -- GitLab From 054c3244ec5f15b32a88f50f4d08387c9aa98336 Mon Sep 17 00:00:00 2001 From: lish Date: Wed, 7 Jul 2021 10:43:53 +0800 Subject: [PATCH 12/13] Add unit tests for the Blob#file_link? method Signed-off-by: lish --- spec/lib/gitlab/git/blob_spec.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb index fb4510a78de75f..b0488d22581096 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 -- GitLab From ce7cc058c83a2832dd0903dea9b56e4b7e836a0e Mon Sep 17 00:00:00 2001 From: lish Date: Tue, 27 Jul 2021 13:51:26 +0800 Subject: [PATCH 13/13] Add unit tests for accessing link files Signed-off-by: lish --- .../features/projects/blobs/blob_show_spec.rb | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index b6b9a8ae96270a..d0f976e364e90a 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 -- GitLab