Commit 01f5035b authored by Sean McGivern's avatar Sean McGivern

Fix squash with renamed files

We need to ignore the names for renamed files when configuring with sparse
checkout.
parent 0b032daa
---
title: Fix squashing when a file is renamed
merge_request:
author:
type: fixed
...@@ -2188,7 +2188,7 @@ module Gitlab ...@@ -2188,7 +2188,7 @@ module Gitlab
) )
diff_range = "#{start_sha}...#{end_sha}" diff_range = "#{start_sha}...#{end_sha}"
diff_files = run_git!( diff_files = run_git!(
%W(diff --name-only --diff-filter=a --binary #{diff_range}) %W(diff --name-only --diff-filter=ar --binary #{diff_range})
).chomp ).chomp
with_worktree(squash_path, branch, sparse_checkout_files: diff_files, env: env) do with_worktree(squash_path, branch, sparse_checkout_files: diff_files, env: env) do
......
...@@ -2204,7 +2204,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -2204,7 +2204,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
context 'sparse checkout', :skip_gitaly_mock do context 'sparse checkout', :skip_gitaly_mock do
let(:expected_files) { %w(files files/js files/js/application.js) } let(:expected_files) { %w(files files/js files/js/application.js) }
before do it 'checks out only the files in the diff' do
allow(repository).to receive(:with_worktree).and_wrap_original do |m, *args| allow(repository).to receive(:with_worktree).and_wrap_original do |m, *args|
m.call(*args) do m.call(*args) do
worktree_path = args[0] worktree_path = args[0]
...@@ -2216,11 +2216,34 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -2216,11 +2216,34 @@ describe Gitlab::Git::Repository, seed_helper: true do
expect(Dir[files_pattern]).to eq(expected) expect(Dir[files_pattern]).to eq(expected)
end end
end end
end
it 'checkouts only the files in the diff' do
subject subject
end end
context 'when the diff contains a rename' do
let(:repo) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged }
let(:end_sha) { new_commit_move_file(repo).oid }
after do
# Erase our commits so other tests get the original repo
repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
repo.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
end
it 'does not include the renamed file in the sparse checkout' do
allow(repository).to receive(:with_worktree).and_wrap_original do |m, *args|
m.call(*args) do
worktree_path = args[0]
files_pattern = File.join(worktree_path, '**', '*')
expect(Dir[files_pattern]).not_to include('CHANGELOG')
expect(Dir[files_pattern]).not_to include('encoding/CHANGELOG')
end
end
subject
end
end
end end
context 'with an ASCII-8BIT diff', :skip_gitaly_mock do context 'with an ASCII-8BIT diff', :skip_gitaly_mock do
...@@ -2230,7 +2253,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -2230,7 +2253,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
allow(repository).to receive(:run_git!).and_call_original allow(repository).to receive(:run_git!).and_call_original
allow(repository).to receive(:run_git!).with(%W(diff --binary #{start_sha}...#{end_sha})).and_return(diff.force_encoding('ASCII-8BIT')) allow(repository).to receive(:run_git!).with(%W(diff --binary #{start_sha}...#{end_sha})).and_return(diff.force_encoding('ASCII-8BIT'))
expect(subject.length).to eq(40) expect(subject).to match(/\h{40}/)
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment