Skip to content

Commit b62d5b4

Browse files
committed
definitely write all non-symbolic refs into packed-refs (#450)
1 parent a9a621e commit b62d5b4

File tree

2 files changed

+29
-6
lines changed
  • git-repository
    • src/remote/connection/fetch/update_refs
    • tests/clone

2 files changed

+29
-6
lines changed

git-repository/src/remote/connection/fetch/update_refs/mod.rs

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::{collections::BTreeMap, convert::TryInto, path::PathBuf};
22

3-
use git_odb::FindExt;
4-
use git_pack::Find;
3+
use git_odb::{Find, FindExt};
54
use git_ref::{
65
transaction::{Change, LogChange, PreviousValue, RefEdit, RefLog},
76
Target, TargetRef,
@@ -200,7 +199,26 @@ pub(crate) fn update(
200199
}
201200

202201
let edits = match dry_run {
203-
fetch::DryRun::No => repo.edit_references(edits)?,
202+
fetch::DryRun::No => {
203+
let (file_lock_fail, packed_refs_lock_fail) = repo
204+
.config
205+
.lock_timeout()
206+
.map_err(crate::reference::edit::Error::from)?;
207+
repo.refs
208+
.transaction()
209+
.packed_refs(git_ref::file::transaction::PackedRefs::DeletionsAndNonSymbolicUpdates(
210+
Box::new(|oid, buf| {
211+
repo.objects
212+
.try_find(oid, buf)
213+
.map(|obj| obj.map(|obj| obj.kind))
214+
.map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync + 'static>)
215+
}),
216+
))
217+
.prepare(edits, file_lock_fail, packed_refs_lock_fail)
218+
.map_err(crate::reference::edit::Error::from)?
219+
.commit(repo.committer_or_default())
220+
.map_err(crate::reference::edit::Error::from)?
221+
}
204222
fetch::DryRun::Yes => edits,
205223
};
206224

git-repository/tests/clone/mod.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,14 @@ mod blocking_io {
107107
"it points to the local tracking branch of what the remote actually points to"
108108
);
109109

110-
assert!(
111-
repo.refs.cached_packed_buffer()?.is_some(),
112-
"packed refs should be present"
110+
let packed_refs = repo
111+
.refs
112+
.cached_packed_buffer()?
113+
.expect("packed refs should be present");
114+
assert_eq!(
115+
packed_refs.iter()?.count(),
116+
14,
117+
"all non-symbolic refs should be stored"
113118
);
114119

115120
let head = repo.head()?;

0 commit comments

Comments
 (0)