Skip to content

Commit 275a0c5

Browse files
authored
Merge pull request #1679 from GitoxideLabs/fix-1678
fix 1678
2 parents 66c222c + dc3d8bf commit 275a0c5

File tree

12 files changed

+39
-6
lines changed

12 files changed

+39
-6
lines changed

gix/src/object/errors.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@ pub mod write {
4646
/// An error to indicate writing to the loose object store failed.
4747
#[derive(Debug, thiserror::Error)]
4848
#[error(transparent)]
49-
pub struct Error(#[from] pub gix_object::find::Error);
49+
pub struct Error(#[from] pub gix_object::write::Error);
5050
}

gix/src/repository/object.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ impl crate::Repository {
164164
/// we avoid writing duplicate objects using slow disks that will eventually have to be garbage collected.
165165
pub fn write_object(&self, object: impl gix_object::WriteTo) -> Result<Id<'_>, object::write::Error> {
166166
let mut buf = self.empty_reusable_buffer();
167-
object.write_to(buf.deref_mut()).expect("write to memory works");
167+
object
168+
.write_to(buf.deref_mut())
169+
.map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync + 'static>)?;
168170

169171
self.write_object_inner(&buf, object.kind())
170172
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

gix/tests/gix/repository/object.rs

+35-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::util::named_subrepo_opts;
12
use gix_testtools::tempfile;
23

34
#[cfg(feature = "tree-editor")]
@@ -220,11 +221,11 @@ mod edit_tree {
220221
use utils::display_tree;
221222
}
222223
mod write_object {
223-
use crate::repository::object::empty_bare_repo;
224+
use crate::repository::object::empty_bare_in_memory_repo;
224225

225226
#[test]
226227
fn empty_tree() -> crate::Result {
227-
let (_tmp, repo) = empty_bare_repo()?;
228+
let repo = empty_bare_in_memory_repo()?;
228229
let oid = repo.write_object(gix::objs::TreeRef::empty())?;
229230
assert_eq!(
230231
oid,
@@ -233,12 +234,38 @@ mod write_object {
233234
);
234235
Ok(())
235236
}
237+
238+
#[test]
239+
fn commit_with_invalid_author() -> crate::Result {
240+
let repo = empty_bare_in_memory_repo()?;
241+
let actor = gix::actor::Signature {
242+
name: "1 < 0".into(),
243+
email: Default::default(),
244+
time: Default::default(),
245+
};
246+
let commit = gix::objs::Commit {
247+
tree: gix::hash::ObjectId::empty_tree(repo.object_hash()),
248+
author: actor.clone(),
249+
committer: actor,
250+
parents: Default::default(),
251+
encoding: None,
252+
message: Default::default(),
253+
extra_headers: vec![],
254+
};
255+
assert_eq!(
256+
repo.write_object(commit).unwrap_err().to_string(),
257+
"Signature name or email must not contain '<', '>' or \\n",
258+
"the actor is invalid so triggers an error when persisting it"
259+
);
260+
Ok(())
261+
}
236262
}
237263

238264
mod write_blob {
239265
use std::io::{Seek, SeekFrom};
240266

241-
use crate::{repository::object::empty_bare_repo, util::hex_to_id};
267+
use crate::repository::object::empty_bare_repo;
268+
use crate::{repository::object::empty_bare_in_memory_repo, util::hex_to_id};
242269

243270
#[test]
244271
fn from_slice() -> crate::Result {
@@ -266,7 +293,7 @@ mod write_blob {
266293

267294
#[test]
268295
fn from_stream() -> crate::Result {
269-
let (_tmp, repo) = empty_bare_repo()?;
296+
let repo = empty_bare_in_memory_repo()?;
270297
let mut cursor = std::io::Cursor::new(b"hello world");
271298
let mut seek_cursor = cursor.clone();
272299
let mut repo = repo.without_freelist();
@@ -655,6 +682,10 @@ mod commit {
655682
}
656683
}
657684

685+
fn empty_bare_in_memory_repo() -> crate::Result<gix::Repository> {
686+
Ok(named_subrepo_opts("make_basic_repo.sh", "bare.git", gix::open::Options::isolated())?.with_object_memory())
687+
}
688+
658689
fn empty_bare_repo() -> crate::Result<(tempfile::TempDir, gix::Repository)> {
659690
let tmp = tempfile::tempdir()?;
660691
let repo = gix::ThreadSafeRepository::init_opts(
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)