fix panic on broken symlink in git repository

The issue including reproducer is described here:
https://github.com/ogham/exa/issues/526
This commit includes proposed change as well as integration test.
This commit is contained in:
Martin Sehnoutka 2019-09-15 16:56:58 +02:00
parent 89c861f24d
commit a7a8e99cf3
3 changed files with 21 additions and 3 deletions

15
Vagrantfile vendored
View File

@ -484,6 +484,21 @@ Vagrant.configure(2) do |config|
sudo chown #{user}:#{user} -R "#{test_dir}/git2"
EOF
# A third Git repository
# Regression test for https://github.com/ogham/exa/issues/526
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir -p "#{test_dir}/git3"
cd "#{test_dir}/git3"
git init
# Create a symbolic link pointing to a non-existing file
ln -s aaa/aaa/a b
find "#{test_dir}/git3" -exec touch {} -t #{some_date} \\;
sudo chown #{user}:#{user} -R "#{test_dir}/git3"
EOF
# Hidden and dot file testcases.
# We need to set the permissions of `.` and `..` because they actually
# get displayed in the output here, so this has to come last.

View File

@ -265,11 +265,11 @@ impl Git {
fn reorient(path: &Path) -> PathBuf {
use std::env::current_dir;
// Im not 100% on this func tbh
match current_dir() {
let path = match current_dir() {
Err(_) => Path::new(".").join(&path),
Ok(dir) => dir.join(&path),
}.canonicalize().unwrap() // errors can be ignored here because they only occur if
// the path does not exist / a component is not a folder
};
path.canonicalize().unwrap_or(path)
}
/// The character to display if the file has been modified, but not staged.

View File

@ -210,6 +210,9 @@ $exa $testcases/git2/target -l --git 2>&1 | diff -q - $results
$exa $testcases/git2/deeply/nested/repository -l --git 2>&1 | diff -q - $results/git_2_repository || exit 1
$exa $testcases/git2/{deeply,ignoreds,target} -l --git 2>&1 | diff -q - $results/git_2_all || exit 1
# Regressions test
$exa $testcases/git3 -l --git &>/dev/null || echo "Failed to display broken symlink in git repository"; exit 1
COLUMNS=150 $exa $testcases/git/**/* $testcases --git --long --grid -d | diff -q - $results/git_1_files || exit 1
$exa $testcases/git $testcases/git2 --git --long | diff -q - $results/git_12 || exit 1