Skip to content

Commit 5ab1d44

Browse files
committed
Add support for GIT_FILEMODE_BLOB_GROUP_WRITABLE
This type no longer exists in modern git, but there are existing git repositories out there with tree entries of this type (e.g. Linux kernel). Currently, traversing commits of a repository like that leads to a panic in DiffFile::mode().
1 parent 3f85678 commit 5ab1d44

File tree

4 files changed

+11
-0
lines changed

4 files changed

+11
-0
lines changed

libgit2-sys/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,7 @@ git_enum! {
692692
GIT_FILEMODE_UNREADABLE = 0o000000,
693693
GIT_FILEMODE_TREE = 0o040000,
694694
GIT_FILEMODE_BLOB = 0o100644,
695+
GIT_FILEMODE_BLOB_GROUP_WRITABLE = 0o100664,
695696
GIT_FILEMODE_BLOB_EXECUTABLE = 0o100755,
696697
GIT_FILEMODE_LINK = 0o120000,
697698
GIT_FILEMODE_COMMIT = 0o160000,

src/diff.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ impl<'a> DiffFile<'a> {
621621
raw::GIT_FILEMODE_UNREADABLE => FileMode::Unreadable,
622622
raw::GIT_FILEMODE_TREE => FileMode::Tree,
623623
raw::GIT_FILEMODE_BLOB => FileMode::Blob,
624+
raw::GIT_FILEMODE_BLOB_GROUP_WRITABLE => FileMode::BlobGroupWritable,
624625
raw::GIT_FILEMODE_BLOB_EXECUTABLE => FileMode::BlobExecutable,
625626
raw::GIT_FILEMODE_LINK => FileMode::Link,
626627
raw::GIT_FILEMODE_COMMIT => FileMode::Commit,

src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,8 @@ pub enum FileMode {
10981098
Tree,
10991099
/// Blob
11001100
Blob,
1101+
/// Group writable blob. Obsolete mode kept for compatibility reasons
1102+
BlobGroupWritable,
11011103
/// Blob executable
11021104
BlobExecutable,
11031105
/// Link
@@ -1112,6 +1114,7 @@ impl From<FileMode> for i32 {
11121114
FileMode::Unreadable => raw::GIT_FILEMODE_UNREADABLE as i32,
11131115
FileMode::Tree => raw::GIT_FILEMODE_TREE as i32,
11141116
FileMode::Blob => raw::GIT_FILEMODE_BLOB as i32,
1117+
FileMode::BlobGroupWritable => raw::GIT_FILEMODE_BLOB_GROUP_WRITABLE as i32,
11151118
FileMode::BlobExecutable => raw::GIT_FILEMODE_BLOB_EXECUTABLE as i32,
11161119
FileMode::Link => raw::GIT_FILEMODE_LINK as i32,
11171120
FileMode::Commit => raw::GIT_FILEMODE_COMMIT as i32,
@@ -1125,6 +1128,7 @@ impl From<FileMode> for u32 {
11251128
FileMode::Unreadable => raw::GIT_FILEMODE_UNREADABLE as u32,
11261129
FileMode::Tree => raw::GIT_FILEMODE_TREE as u32,
11271130
FileMode::Blob => raw::GIT_FILEMODE_BLOB as u32,
1131+
FileMode::BlobGroupWritable => raw::GIT_FILEMODE_BLOB_GROUP_WRITABLE as u32,
11281132
FileMode::BlobExecutable => raw::GIT_FILEMODE_BLOB_EXECUTABLE as u32,
11291133
FileMode::Link => raw::GIT_FILEMODE_LINK as u32,
11301134
FileMode::Commit => raw::GIT_FILEMODE_COMMIT as u32,
@@ -1562,8 +1566,10 @@ mod tests {
15621566
#[test]
15631567
fn convert_filemode() {
15641568
assert_eq!(i32::from(FileMode::Blob), 0o100644);
1569+
assert_eq!(i32::from(FileMode::BlobGroupWritable), 0o100664);
15651570
assert_eq!(i32::from(FileMode::BlobExecutable), 0o100755);
15661571
assert_eq!(u32::from(FileMode::Blob), 0o100644);
1572+
assert_eq!(u32::from(FileMode::BlobGroupWritable), 0o100664);
15671573
assert_eq!(u32::from(FileMode::BlobExecutable), 0o100755);
15681574
}
15691575
}

systest/build.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ fn main() {
3939
}
4040
});
4141

42+
// GIT_FILEMODE_BLOB_GROUP_WRITABLE is not a public const in libgit2
43+
cfg.define("GIT_FILEMODE_BLOB_GROUP_WRITABLE", Some("0100664"));
44+
4245
// not entirely sure why this is failing...
4346
cfg.skip_roundtrip(|t| t == "git_clone_options" || t == "git_submodule_update_options");
4447

0 commit comments

Comments
 (0)