On 2020-01-15 at 21:40:54, Junio C Hamano wrote: > "brian m. carlson" writes: > > > +/* > > + * NOTE: This function relies on hash algorithms being in order from shortest > > + * length to longest length. > > + */ > > +int get_oid_hex_any(const char *hex, struct object_id *oid) > > +{ > > + int i; > > + for (i = GIT_HASH_NALGOS - 1; i > 0; i--) { > > + if (!get_hash_hex_algop(hex, oid->hash, &hash_algos[i])) > > + return i; > > + } > > + return GIT_HASH_UNKNOWN; > > +} > > Two rather obvious questions are > > - what if we have more than one algos that produce hashes of the > same length? Than we have a problem that we'll have to deal with then. There are a handful of functions that essentially document all these locations and we'll have to decide how we fix them. Notably, the dumb HTTP protocol doesn't provide any capability advertisement, so it's not possible to ask the remote server which algorithm it's using or negotiate a different one. Bundles and get-tar-commit-id are the other problem cases. Granted, I did very much try to limit these cases as much as possible, and most of our more modern code doesn't have this problem, but in some cases it's just unavoidable. I feel like with only three uses, doing this won't be mortgaging our future too much. > - it feels that GIT_HASH_UNKNOWN being 0 wastes the first/zeroth > element in the hash_algos[] array. I actually think it's really useful to have it this way, because then it's easy to check for a valid hash algorithm by a comparison against 0. > In the future, I would imagine that we would want to be able to say > "here I have a dozen hexdigits that is an abbreviated SHA2 hash", > and we would use some syntax (e.g. "sha2:123456123456") for that. > Would this function be at the layer that would be extended later to > support such a syntax, or would we have a layer higher than this to > do so? That's going to be at a different layer. We'll have the ^{sha1} and ^{sha256} disambiguators that can be used with the normal revision parsing syntax, and we'll handle the ambiguity there if one isn't provided. As for output, we'll only produce output in one algorithm at a time so ambiguity isn't a problem there. -- brian m. carlson: Houston, Texas, US OpenPGP: https://keybase.io/bk2204