|
| 1 | +use git_odb::Find; |
| 2 | +use git_ref::file::ReferenceExt; |
1 | 3 | use std::path::PathBuf;
|
2 | 4 |
|
3 |
| -fn dir(packed: bool) -> PathBuf { |
| 5 | +fn dir(packed: bool) -> crate::Result<PathBuf> { |
4 | 6 | let name = "make_worktree_repo.sh";
|
5 | 7 | if packed {
|
6 | 8 | git_testtools::scripted_fixture_repo_read_only_with_args(name, Some("packed"))
|
7 | 9 | } else {
|
8 | 10 | git_testtools::scripted_fixture_repo_read_only(name)
|
9 | 11 | }
|
10 |
| - .unwrap() |
11 | 12 | }
|
12 | 13 |
|
13 |
| -fn main_store(packed: bool) -> git_ref::file::Store { |
14 |
| - let dir = dir(packed); |
15 |
| - git_ref::file::Store::at(dir.join("repo").join(".git"), Default::default(), Default::default()) |
| 14 | +fn main_store(packed: bool) -> crate::Result<(git_ref::file::Store, git_odb::Handle)> { |
| 15 | + let dir = dir(packed)?; |
| 16 | + let git_dir = dir.join("repo").join(".git"); |
| 17 | + Ok(( |
| 18 | + git_ref::file::Store::at(&git_dir, Default::default(), Default::default()), |
| 19 | + git_odb::at(git_dir.join("objects"))?, |
| 20 | + )) |
16 | 21 | }
|
17 | 22 |
|
18 |
| -fn worktree_store(packed: bool) -> git_ref::file::Store { |
19 |
| - let dir = dir(packed); |
20 |
| - let (git_dir, _work_tree) = git_discover::upwards(dir.join("w1")) |
21 |
| - .unwrap() |
| 23 | +fn worktree_store(packed: bool) -> crate::Result<(git_ref::file::Store, git_odb::Handle)> { |
| 24 | + let dir = dir(packed)?; |
| 25 | + let (git_dir, _work_tree) = git_discover::upwards(dir.join("w1"))? |
22 | 26 | .0
|
23 | 27 | .into_repository_and_work_tree_directories();
|
24 | 28 | let common_dir = git_dir.join("../..");
|
25 |
| - git_ref::file::Store::for_linked_worktree(git_dir, common_dir, Default::default(), Default::default()) |
| 29 | + Ok(( |
| 30 | + git_ref::file::Store::for_linked_worktree(git_dir, &common_dir, Default::default(), Default::default()), |
| 31 | + git_odb::at(common_dir.join("objects"))?, |
| 32 | + )) |
| 33 | +} |
| 34 | + |
| 35 | +fn into_peel( |
| 36 | + store: &git_ref::file::Store, |
| 37 | + odb: git_odb::Handle, |
| 38 | +) -> impl Fn(git_ref::Reference) -> git_hash::ObjectId + '_ { |
| 39 | + move |mut r: git_ref::Reference| { |
| 40 | + r.peel_to_id_in_place( |
| 41 | + store, |
| 42 | + |id, buf| -> Result<Option<(git_object::Kind, &[u8])>, git_odb::store::find::Error> { |
| 43 | + let data = odb.try_find(id, buf)?; |
| 44 | + Ok(data.map(|d| (d.kind, d.data))) |
| 45 | + }, |
| 46 | + ) |
| 47 | + .unwrap() |
| 48 | + } |
26 | 49 | }
|
27 | 50 |
|
28 | 51 | #[test]
|
29 |
| -fn with_common_dir() { |
| 52 | +fn linked() { |
30 | 53 | for packed in [false, true] {
|
31 |
| - let _store = worktree_store(packed); |
| 54 | + let (store, odb) = worktree_store(packed).unwrap(); |
| 55 | + let peel = into_peel(&store, odb); |
| 56 | + assert_ne!( |
| 57 | + peel(store.find("HEAD").unwrap()), |
| 58 | + peel(store.find("main-worktree/HEAD").unwrap()) |
| 59 | + ); |
32 | 60 | }
|
33 | 61 | }
|
34 | 62 |
|
35 | 63 | #[test]
|
36 |
| -fn with_git_dir() { |
| 64 | +fn main() { |
37 | 65 | for packed in [false, true] {
|
38 |
| - let _store = main_store(packed); |
| 66 | + let (store, odb) = main_store(packed).unwrap(); |
| 67 | + let peel = into_peel(&store, odb); |
| 68 | + |
| 69 | + assert_eq!( |
| 70 | + peel(store.find("HEAD").unwrap()), |
| 71 | + peel(store.find("main-worktree/HEAD").unwrap()) |
| 72 | + ); |
| 73 | + assert_eq!( |
| 74 | + peel(store.find("main").unwrap()), |
| 75 | + peel(store.find("main-worktree/refs/heads/main").unwrap()) |
| 76 | + ); |
39 | 77 | }
|
40 | 78 | }
|
0 commit comments