History

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.

Fredrik Medley committed 1 year ago

Commit 504afec1 parent f7c71452 files · +31 −3Browse files

Unified · Split

2 files
  1. gix-discover/src/upwards/mod.rs +1 −1
  2. gix-discover/tests/isolated.rs +30 −2
gix-discover/src/upwards/mod.rs+1−1
@@ -168,7 +168,7 @@ pub(crate) mod function { · 167 unmodified lines
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+30−2
@@ -3,6 +3,23 @@ use std::path::{Path, PathBuf}; · 2 unmodified lines
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,7 +65,7 @@ fn in_cwd_upwards_nonbare_repo_without_index() -> gix_testtools::Result { · 39 unmodified lines
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 [
@@ -56,6 +73,8 @@ fn upwards_with_relative_directories_and_optional_ceiling() -> gix_testtools::Re · 1 unmodified line
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 · 29 unmodified lines
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(())

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t