Skip to content

Commit a9a621e

Browse files
committed
auto-pack references when creating them during clone (#450)
1 parent 328900a commit a9a621e

File tree

2 files changed

+38
-21
lines changed

2 files changed

+38
-21
lines changed

git-repository/src/clone/fetch.rs

+38-20
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ mod util {
188188
use super::Error;
189189
use crate::bstr::BStr;
190190
use crate::Repository;
191+
use git_odb::Find;
191192
use git_ref::transaction::{LogChange, RefLog};
192193

193194
pub fn write_remote_to_local_config_file(
@@ -259,26 +260,43 @@ mod util {
259260
head_ref_name: referent.to_owned(),
260261
source: err,
261262
})?;
262-
repo.edit_references([
263-
RefEdit {
264-
change: git_ref::transaction::Change::Update {
265-
log: reflog_message(),
266-
expected: PreviousValue::Any,
267-
new: Target::Peeled(head_peeled_id.to_owned()),
268-
},
269-
name: referent.clone(),
270-
deref: false,
271-
},
272-
RefEdit {
273-
change: git_ref::transaction::Change::Update {
274-
log: reflog_message(),
275-
expected: PreviousValue::Any,
276-
new: Target::Symbolic(referent),
277-
},
278-
name: name.clone(),
279-
deref: false,
280-
},
281-
])?;
263+
repo.refs
264+
.transaction()
265+
.packed_refs(git_ref::file::transaction::PackedRefs::DeletionsAndNonSymbolicUpdates(
266+
Box::new(|oid, buf| {
267+
repo.objects
268+
.try_find(oid, buf)
269+
.map(|obj| obj.map(|obj| obj.kind))
270+
.map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync + 'static>)
271+
}),
272+
))
273+
.prepare(
274+
[
275+
RefEdit {
276+
change: git_ref::transaction::Change::Update {
277+
log: reflog_message(),
278+
expected: PreviousValue::Any,
279+
new: Target::Peeled(head_peeled_id.to_owned()),
280+
},
281+
name: referent.clone(),
282+
deref: false,
283+
},
284+
RefEdit {
285+
change: git_ref::transaction::Change::Update {
286+
log: reflog_message(),
287+
expected: PreviousValue::Any,
288+
new: Target::Symbolic(referent),
289+
},
290+
name: name.clone(),
291+
deref: false,
292+
},
293+
],
294+
git_lock::acquire::Fail::Immediately,
295+
git_lock::acquire::Fail::Immediately,
296+
)
297+
.map_err(crate::reference::edit::Error::from)?
298+
.commit(repo.committer_or_default())
299+
.map_err(crate::reference::edit::Error::from)?;
282300
let mut log = reflog_message();
283301
log.mode = RefLog::Only;
284302
repo.edit_reference(RefEdit {

git-repository/tests/clone/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ mod blocking_io {
1111
use crate::remote;
1212

1313
#[test]
14-
#[ignore]
1514
fn fetch_only_with_configuration() -> crate::Result {
1615
let tmp = git_testtools::tempfile::TempDir::new()?;
1716
let called_configure_remote = std::sync::Arc::new(std::sync::atomic::AtomicBool::default());

0 commit comments

Comments
 (0)