[WIP] feat: unstable SHA256 support#1206
[WIP] feat: unstable SHA256 support#1206weihanglo wants to merge 10 commits intorust-lang:masterfrom
Conversation
dd35da4 to
a332c64
Compare
* GIT_SHA1_COLLISIONDETECT -> GIT_SHA1_BUILTIN * GIT_WINHTTP -> GIT_HTTPS_WINHTTP * GIT_SECURE_TRANSPORT -> GIT_HTTPS_SECURETRANSPORT * GIT_OPENSSL -> GIT_HTTPS_OPENSSL See <libgit2/libgit2#6994>
* Add `GIT_REPOSITORY_INIT_RELATIVE_GITLINK` at libgit2/libgit2@bc737620d * Remove `GIT_REPOSITORY_INIT_NO_DOTGIT_DIR` at libgit2/libgit2@ca2a241e4
* Remove `GIT_OBJECT_OFS_DELTA` * Remove `GIT_OBJECT_REF_DELTA` See libgit2/libgit2@23da3a8f3
libgit2 simplified SHA256 API to use `_ext` suffixes instead of changing base function signatures. This avoids breaking changes for users who don't need SHA256 support. Updated bindings: - git_oid_from_raw - git_oid_from_prefix - git_oid_from_string - git_diff_from_buffer_ext - git_index_new_ext - git_index_open_ext - git_odb_new_ext - git_odb_open_ext - git_repository_new_ext See libgit2/libgit2@56e2a85643f (libgit2/libgit2#6975)
This adds an `unstable-sha256` Cargo feature, as a follow-up of rust-lang#1201 Also adds some smoke tests for affected operations/types. ## Insta-stable * **NEW** `Index::with_object_format` to create with different format ## Behind `unstable-sha256 * **NEW** `ObjectFormat::Sha256` enum variant * **NEW** `RepositoryInitOptions::object_format()` method to set hash algo * **NEW** `Remote::object_format` method to get hash algo on a remote * **CHANGED** `Diff::from_buffer` to accept a extra object format argument * **CHANGED** `Index::open` to accept a extra object format argument * **CHANGED** `Indexer::new` to accept a extra object format argument * **CHANGED** `Oid::from_str` to accept a extra object format argument * **CHANGED** `Oid::hash_{object,file}` to accept a extra object format argument * **REMOVED** `Index::new` to avoid misuse. * **REMOVED** `impl std::FromStr for Oid` to avoid misuse
This also run systest first, so we can dicover bindding mismatch before
a332c64 to
fd975c7
Compare
| /// View this OID as a byte-slice. | ||
| /// | ||
| /// * 20 bytes in length if the feature `unstable-sha256` is not enabled. | ||
| /// * 32 bytes in length if the feature `unstable-sha256` is enabled. | ||
| pub fn as_bytes(&self) -> &[u8] { | ||
| &self.raw.id | ||
| } |
There was a problem hiding this comment.
I think this should return 20 bytes if unstable-sha256 is enabled but the object format is SHA-1.
One reason for this is that crate features should be additive; turning on the feature shouldn't unnecessarily affect how the crate behaves with already-supported repositories.
There was a problem hiding this comment.
Thanks for calling this out. That's a fair point, but I'm not sure "feature additivity" is the core issue here.
I think the real question is what Oid::as_bytes() is supposed to mean in this crate: the logical object ID bytes, or the raw backing storage from libgit2.
I'm leaning toward the logical interpretation. That seems like the less surprising API for callers, as you mentioned.
The reason I wasn’t fully convinced yet is that this type has historically been a fairly thin wrapper over libgit2, so I wanted to check whether anyone might rely on the raw representation or the backing buffer. Or maybe we should just mark this with a big
There was a problem hiding this comment.
There is the option to have Oid::as_bytes() give you the logical representation and introduce a new Oid::raw_bytes() for the (probably few) users that actually want the entire buffer.
This adds an
unstable-sha256Cargo feature, as a follow-up of #1201.Also adds some smoke tests for affected operations/types.
Part of #1090
Insta-stable
Index::with_object_formatto create with different formatBehind
unstable-sha256ObjectFormat::Sha256enum variantRepositoryInitOptions::object_format()method to set hash algoRemote::object_formatmethod to get hash algo on a remoteDiff::from_bufferto accept an extra object format argumentIndex::opento accept an extra object format argumentIndexer::newto accept an extra object format argumentOid::from_strto accept an extra object format argumentOid::hash_{object,file}to accept an extra object format argumentIndex::newto avoid misuse.impl std::FromStr for Oidto avoid misuselibgit2 1.9 compatibility changes
This PR also includes fixes for libgit2 1.9 breaking changes:
GIT_SHA1_COLLISIONDETECT->GIT_SHA1_BUILTIN, HTTPS backend macros)refdb_typefield togit_repository_init_optionsSee libgit2/libgit2#6994 and libgit2/libgit2#7102 for upstream changes.
These changes can be split out if needed.