Skip to content

Commit 504afec

Browse files
committed
Fix discover::upwards when working dir is the repo
The upwards search for the repository directory takes a directory as input and then walks through the parents. It turns out that it was broken when the repository was the same as the working directory. The code checked when the directory components had been stripped to "", in case the directory was replaced with `cwd.parent()`, so the loop missed to check `cwd` itself. If the input directory was "./something", then "." was checked which then succeeded.
1 parent f7c7145 commit 504afec

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

gix-discover/src/upwards/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ pub(crate) mod function {
168168
}
169169
}
170170
}
171-
if cursor.parent().is_some_and(|p| p.as_os_str().is_empty()) {
171+
if cursor.as_os_str().is_empty() || cursor.as_os_str() == OsStr::new(".") {
172172
cursor = cwd.to_path_buf();
173173
dir_made_absolute = true;
174174
}

gix-discover/tests/isolated.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,23 @@ use std::path::{Path, PathBuf};
33
use gix_discover::upwards::Options;
44
use serial_test::serial;
55

6+
#[test]
7+
#[serial]
8+
fn in_cwd_upwards_from_nested_dir() -> gix_testtools::Result {
9+
let repo = gix_testtools::scripted_fixture_read_only("make_basic_repo.sh")?;
10+
11+
let _keep = gix_testtools::set_current_dir(repo)?;
12+
for dir in ["subdir", "some/very/deeply/nested/subdir"] {
13+
let (repo_path, _trust) = gix_discover::upwards(Path::new(dir))?;
14+
assert_eq!(
15+
repo_path.kind(),
16+
gix_discover::repository::Kind::WorkTree { linked_git_dir: None },
17+
);
18+
assert_eq!(repo_path.as_ref(), Path::new("."));
19+
}
20+
Ok(())
21+
}
22+
623
#[test]
724
#[serial]
825
fn upwards_bare_repo_with_index() -> gix_testtools::Result {
@@ -48,14 +65,16 @@ fn in_cwd_upwards_nonbare_repo_without_index() -> gix_testtools::Result {
4865
fn upwards_with_relative_directories_and_optional_ceiling() -> gix_testtools::Result {
4966
let repo = gix_testtools::scripted_fixture_read_only("make_basic_repo.sh")?;
5067

51-
let _keep = gix_testtools::set_current_dir(repo.join("subdir"))?;
68+
let _keep = gix_testtools::set_current_dir(repo.join("some"))?;
5269
let cwd = std::env::current_dir()?;
5370

5471
for (search_dir, ceiling_dir_component) in [
5572
(".", ".."),
5673
(".", "./.."),
5774
("./.", "./.."),
5875
(".", "./does-not-exist/../.."),
76+
("./././very/deeply/nested/subdir", ".."),
77+
("very/deeply/nested/subdir", ".."),
5978
] {
6079
let ceiling_dir = cwd.join(ceiling_dir_component);
6180
let (repo_path, _trust) = gix_discover::upwards_opts(
@@ -91,7 +110,16 @@ fn upwards_with_relative_directories_and_optional_ceiling() -> gix_testtools::Re
91110
)
92111
.unwrap_err();
93112

94-
assert!(matches!(err, gix_discover::upwards::Error::NoMatchingCeilingDir));
113+
if Path::new(search_dir).parent() == Some(Path::new("."))
114+
|| Path::new(search_dir).parent() == Some(Path::new(""))
115+
{
116+
assert!(matches!(err, gix_discover::upwards::Error::NoMatchingCeilingDir));
117+
} else {
118+
assert!(matches!(
119+
err,
120+
gix_discover::upwards::Error::NoGitRepositoryWithinCeiling { .. }
121+
));
122+
}
95123
}
96124

97125
Ok(())

0 commit comments

Comments
 (0)