-
-
Notifications
You must be signed in to change notification settings - Fork 385
Description
Looked at 3ac5d0b after hitting the privatisation of EntryMode's state1 and I might be misreading the code but I think the normalisation behaviour is not correct: https://github.com/Byron/gitoxide/blob/main/gix-object/src/tree/mod.rs#L77-L90
This converts exact tree, link, and commit (submodules) modes to the corresponding kind, then everything else is converted to an executable blob if 0o100 is set, and to a non-executable blob otherwise.
Git's own mode canonicalisation works very differently though: it uses the S_IS*
macros from stat.h to parse the various modes. To my understanding this means it masks in the upper nibble, then checks that exactly against one of the type constants. So e.g.
0o40534
is considered a directory, because the permission bits are discarded before dispatch. In gix-object, I think this currently would parse as an executable blob.
Git checks for BLOB, LINK, then TREE but that should not matter overly much as all of those are equality checks, however it then falls back to GITLINK (Commit
) so e.g. 0o10000 or 0o140000 should be interpreted as Commit
, not Blob
.
That would also make the first four is_
functions incorrect as they check for exact values rather than follow normalisation.
Footnotes
-
incidentally the ability to create an arbitrary
EntryMode
might be useful to test git implementations themselves, but the payload is notpub
and there seems to be no way to convert au16
to anEntryMode
. ↩