[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
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.
There was a problem hiding this comment.
Addressed the as_bytes part and also added the raw_bytes method. Thanks for the feedback, folks!
c07b123 to
5c04d59
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 - **NEW** `Oid::object_format` to access underlying oid type ## 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 - **NEW** `Oid::raw_bytes` to return the full underlying bytes - **CHANGED** `Diff::from_buffer` to accept an extra object format argument - **CHANGED** `Index::open` to accept an extra object format argument - **CHANGED** `Indexer::new` to accept an extra object format argument - **CHANGED** `Oid::from_str` to accept an extra object format argument - **CHANGED** `Oid::hash_{object,file}` to accept an extra object format argument - **CHANGED** `Oid::as_bytes` to return the logic bytes (SHA1 -> 20 bytes; SHA256 -> 32 bytes) - **CHANGED** `impl Hash for Oid` to hash `git_oid->kind` - **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
|
I believe to have found something that you missed in this PR. Note that Lines 271 to 275 in e6919b7 I believe that this means that the The function Line 231 in e6919b7 will hit the Line 29 in e6919b7 This is because I discovered this experimenting in code that is downstream of Then I started to think about how much #[inline]
pub(crate) fn zeroed_raw_oid(format: ObjectFormat) -> raw::git_oid {
raw::git_oid {
kind: format.raw(),
id: [0; raw::GIT_OID_MAX_SIZE],
}
}In fact one might even ask why not to have impl Oid {
pub const ZERO_SHA1: Self = Self {
raw: raw::git_oid {
kind: raw::GIT_OID_SHA1,
id: [0; raw::GIT_OID_MAX_SIZE],
}
};
pub const ZERO_SHA256: Self = Self {
raw: raw::git_oid {
kind: raw::GIT_OID_SHA256,
id: [0; raw::GIT_OID_MAX_SIZE],
}
};
// NOTE: Maybe call this `zero_with_object_format` to not break `zero`.
pub fn zero(format: ObjectFormat) -> Self {
// TODO: Match on `format` and return `Oid::ZERO_SHA1` or `Oid::ZERO_SHA256`.
}
}This way, users that know at compile time which kind of zero they want can just use the constant, while those that decide at run time would call If you do not want For |
|
Another comment regarding |
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 formatOid::object_formatto access underlying oid typeBehind
unstable-sha256ObjectFormat::Sha256enum variantRepositoryInitOptions::object_format()method to set hash algoRemote::object_formatmethod to get hash algo on a remoteOid::raw_bytesto return the full underlying bytesDiff::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 argumentOid::as_bytesto return the logic bytes (SHA1 -> 20 bytes; SHA256 -> 32 bytes)impl Hash for Oidto hashgit_oid->kindIndex::newto avoid misuse.impl std::FromStr for Oidto avoid misuseimpl 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.