Skip to content

Commit e263e13

Browse files
committed
feat: respect core.logallrefupdates configuration setting. (#331)
1 parent 6b90184 commit e263e13

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

git-repository/src/config.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ pub(crate) struct Cache {
2828
pub object_hash: git_hash::Kind,
2929
/// If true, multi-pack indices, whether present or not, may be used by the object database.
3030
pub use_multi_pack_index: bool,
31+
/// The representation of `core.logallrefupdates`, or `None` if the variable wasn't set.
32+
pub reflog: Option<git_ref::store::WriteReflog>,
3133
/// If true, we are on a case-insensitive file system.
3234
#[cfg_attr(not(feature = "git-index"), allow(dead_code))]
3335
pub ignore_case: bool,
@@ -70,7 +72,7 @@ mod cache {
7072

7173
let is_bare = config_bool(&config, "core.bare", false)?;
7274
let use_multi_pack_index = config_bool(&config, "core.multiPackIndex", true)?;
73-
let ignore_case = config_bool(&config, "core.ignorecase", false)?;
75+
let ignore_case = config_bool(&config, "core.ignoreCase", false)?;
7476
let excludes_file = config
7577
.path("core", None, "excludesFile")
7678
.map(|p| {
@@ -84,12 +86,12 @@ mod cache {
8486
.transpose()?;
8587
let repo_format_version = config
8688
.value::<Integer>("core", None, "repositoryFormatVersion")
87-
.map_or(0, |v| v.value);
89+
.map_or(0, |v| v.to_decimal().unwrap_or_default());
8890
let object_hash = (repo_format_version != 1)
8991
.then(|| Ok(git_hash::Kind::Sha1))
9092
.or_else(|| {
9193
config.string("extensions", None, "objectFormat").map(|format| {
92-
if format.as_ref() == "sha1" {
94+
if format.as_ref().eq_ignore_ascii_case(b"sha1") {
9395
Ok(git_hash::Kind::Sha1)
9496
} else {
9597
Err(Error::UnsupportedObjectFormat {
@@ -100,13 +102,23 @@ mod cache {
100102
})
101103
.transpose()?
102104
.unwrap_or(git_hash::Kind::Sha1);
105+
let reflog = config.string("core", None, "logallrefupdates").map(|val| {
106+
(val.eq_ignore_ascii_case(b"always"))
107+
.then(|| git_ref::store::WriteReflog::Always)
108+
.or_else(|| {
109+
git_config::Boolean::try_from(val)
110+
.ok()
111+
.and_then(|b| b.is_true().then(|| git_ref::store::WriteReflog::Normal))
112+
})
113+
.unwrap_or(git_ref::store::WriteReflog::Disable)
114+
});
103115

104116
let mut hex_len = None;
105117
if let Some(hex_len_str) = config.string("core", None, "abbrev") {
106118
if hex_len_str.trim().is_empty() {
107119
return Err(Error::EmptyValue { key: "core.abbrev" });
108120
}
109-
if hex_len_str.as_ref() != "auto" {
121+
if !hex_len_str.eq_ignore_ascii_case(b"auto") {
110122
let value_bytes = hex_len_str.as_ref();
111123
if let Ok(false) = Boolean::try_from(value_bytes).map(Into::into) {
112124
hex_len = object_hash.len_in_hex().into();
@@ -136,6 +148,7 @@ mod cache {
136148
resolved: config.into(),
137149
use_multi_pack_index,
138150
object_hash,
151+
reflog,
139152
is_bare,
140153
ignore_case,
141154
hex_len,

git-repository/src/open.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,13 @@ impl ThreadSafeRepository {
255255
}
256256

257257
let refs = {
258-
let reflog = if worktree_dir.is_none() {
259-
git_ref::store::WriteReflog::Disable
260-
} else {
261-
git_ref::store::WriteReflog::Normal
262-
};
258+
let reflog = config.reflog.unwrap_or_else(|| {
259+
if worktree_dir.is_none() {
260+
git_ref::store::WriteReflog::Disable
261+
} else {
262+
git_ref::store::WriteReflog::Normal
263+
}
264+
});
263265
match &common_dir {
264266
Some(common_dir) => {
265267
crate::RefStore::for_linked_worktree(&git_dir, common_dir, reflog, config.object_hash)

0 commit comments

Comments
 (0)