Skip to content

Commit 3222556

Browse files
committed
fix: make realpath conditional
1 parent 3ee9b63 commit 3222556

File tree

2 files changed

+14
-24
lines changed

2 files changed

+14
-24
lines changed

gix/src/open/repository.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,13 @@ impl ThreadSafeRepository {
272272
section
273273
.path
274274
.as_deref()
275-
.and_then(|p| gix_path::normalize(p.into(), current_dir))
275+
.and_then(|p| {
276+
if p.exists() {
277+
gix_path::realpath_opts(p, current_dir, gix_path::realpath::MAX_SYMLINKS).ok()
278+
} else {
279+
gix_path::normalize(p.into(), current_dir).map(Cow::into_owned)
280+
}
281+
})
276282
.is_some_and(|config_path| config_path.starts_with(git_dir))
277283
}
278284
let worktree_path = config
@@ -305,9 +311,14 @@ impl ThreadSafeRepository {
305311
// the reason we use realpath instead of gix_path::normalize here is because there
306312
// could be any intermediate symlinks (for example due to a symlinked .git
307313
// directory)
308-
worktree_dir = gix_path::realpath(&wt_path).ok();
314+
let is_relative = wt_path.is_relative();
315+
worktree_dir = if wt_path.exists() {
316+
gix_path::realpath(&wt_path).ok()
317+
} else {
318+
Some(wt_path.into_owned())
319+
};
309320
// restore the relative path if possible after resolving the absolute path
310-
if wt_path.is_relative() {
321+
if is_relative {
311322
if let Some(rel_path) = worktree_dir.as_deref().and_then(|p| p.strip_prefix(current_dir).ok()) {
312323
worktree_dir = Some(rel_path.to_path_buf());
313324
}

gix/tests/gix/status.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -310,27 +310,6 @@ mod index_worktree {
310310
);
311311
}
312312

313-
#[test]
314-
fn submodule_in_symlinked_dir() -> crate::Result {
315-
use crate::util::named_subrepo_opts;
316-
let repo = named_subrepo_opts(
317-
"make_submodule_with_symlinked_git_dir.sh",
318-
"symlinked-git-dir",
319-
gix::open::Options::isolated(),
320-
)?;
321-
let status = repo
322-
.status(gix::progress::Discard)?
323-
.index_worktree_options_mut(|opts| {
324-
opts.sorting =
325-
Some(gix::status::plumbing::index_as_worktree_with_renames::Sorting::ByPathCaseSensitive);
326-
})
327-
.into_index_worktree_iter(None)?;
328-
for change in status {
329-
change?;
330-
}
331-
Ok(())
332-
}
333-
334313
#[test]
335314
fn submodule_modification() -> crate::Result {
336315
let repo = submodule_repo("modified-untracked-and-submodule-head-changed-and-modified")?;

0 commit comments

Comments
 (0)