Skip to content

Commit d508a2c

Browse files
committed
Return error if prefix is not relative
1 parent 863549b commit d508a2c

File tree

2 files changed

+27
-17
lines changed

2 files changed

+27
-17
lines changed

gix/src/open/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ pub enum Error {
5656
UnsafeGitDir { path: PathBuf },
5757
#[error(transparent)]
5858
EnvironmentAccessDenied(#[from] gix_sec::permission::Error<std::path::PathBuf>),
59+
#[error(transparent)]
60+
PrefixNotRelative(#[from] gix_path::relative_path::Error),
5961
}
6062

6163
mod options;

gix/src/open/repository.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::{
1212
};
1313
use gix_features::threading::OwnShared;
1414
use gix_object::bstr::ByteSlice;
15+
use gix_path::relative_path::RelativePath;
1516
use std::ffi::OsStr;
1617
use std::{borrow::Cow, path::PathBuf};
1718

@@ -345,23 +346,30 @@ impl ThreadSafeRepository {
345346

346347
refs.write_reflog = config::cache::util::reflog_or_default(config.reflog, worktree_dir.is_some());
347348
refs.namespace.clone_from(&config.refs_namespace);
348-
let replacements = replacement_objects_refs_prefix(&config.resolved, lenient_config, filter_config_section)?
349-
.and_then(|prefix| {
350-
let _span = gix_trace::detail!("find replacement objects");
351-
let platform = refs.iter().ok()?;
352-
let iter = platform.prefixed(prefix.as_bstr().try_into().ok()?).ok()?;
353-
let replacements = iter
354-
.filter_map(Result::ok)
355-
.filter_map(|r: gix_ref::Reference| {
356-
let target = r.target.try_id()?.to_owned();
357-
let source =
358-
gix_hash::ObjectId::from_hex(r.name.as_bstr().strip_prefix(prefix.as_slice())?).ok()?;
359-
Some((source, target))
360-
})
361-
.collect::<Vec<_>>();
362-
Some(replacements)
363-
})
364-
.unwrap_or_default();
349+
let prefix = replacement_objects_refs_prefix(&config.resolved, lenient_config, filter_config_section)?;
350+
let replacements = match prefix {
351+
Some(prefix) => {
352+
let prefix: &RelativePath = prefix.as_bstr().try_into()?;
353+
354+
Some(prefix).and_then(|prefix| {
355+
let _span = gix_trace::detail!("find replacement objects");
356+
let platform = refs.iter().ok()?;
357+
let iter = platform.prefixed(prefix).ok()?;
358+
let replacements = iter
359+
.filter_map(Result::ok)
360+
.filter_map(|r: gix_ref::Reference| {
361+
let target = r.target.try_id()?.to_owned();
362+
let source =
363+
gix_hash::ObjectId::from_hex(r.name.as_bstr().strip_prefix(prefix.as_ref())?).ok()?;
364+
Some((source, target))
365+
})
366+
.collect::<Vec<_>>();
367+
Some(replacements)
368+
})
369+
}
370+
None => None,
371+
};
372+
let replacements = replacements.unwrap_or_default();
365373

366374
Ok(ThreadSafeRepository {
367375
objects: OwnShared::new(gix_odb::Store::at_opts(

0 commit comments

Comments
 (0)