Commit ac2b94ad by Marc Pegon Committed by Vicent Marti

Added a GIT_OID_MINPREFIXLEN constant to define the minimum length allowed for…

Added a GIT_OID_MINPREFIXLEN constant to define the minimum length allowed for oid prefixes (set to 4, like in git). Consequently updated some object lookup methods and their documentation.
parent dd453c4d
...@@ -65,9 +65,9 @@ GIT_EXTERN(int) git_object_lookup(git_object **object, git_repository *repo, con ...@@ -65,9 +65,9 @@ GIT_EXTERN(int) git_object_lookup(git_object **object, git_repository *repo, con
* The object obtained will be so that its identifier * The object obtained will be so that its identifier
* matches the first 'len' hexadecimal characters * matches the first 'len' hexadecimal characters
* (packets of 4 bits) of the given 'id'. * (packets of 4 bits) of the given 'id'.
* 'len' must be long enough to identify a unique * 'len' must be at least GIT_OID_MINPREFIXLEN, and
* object matching the prefix; otherwise the method will * long enough to identify a unique object matching
* fail. * the prefix; otherwise the method will fail.
* *
* The generated reference is owned by the repository and * The generated reference is owned by the repository and
* should be closed with the `git_object_close` method * should be closed with the `git_object_close` method
......
...@@ -132,9 +132,10 @@ GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *i ...@@ -132,9 +132,10 @@ GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *i
* This method queries all available ODB backends * This method queries all available ODB backends
* trying to match the 'len' first hexadecimal * trying to match the 'len' first hexadecimal
* characters of the 'short_id'. * characters of the 'short_id'.
* The remaining bits (GIT_OID_HEXSZ-len)*4 bits of * The remaining (GIT_OID_HEXSZ-len)*4 bits of
* 'short_id' must be 0s. * 'short_id' must be 0s.
* The prefix must be long enough to identify * 'len' must be at least GIT_OID_MINPREFIXLEN,
* and the prefix must be long enough to identify
* a unique object in all the backends; the * a unique object in all the backends; the
* method will fail otherwise. * method will fail otherwise.
* *
......
...@@ -43,6 +43,10 @@ GIT_BEGIN_DECL ...@@ -43,6 +43,10 @@ GIT_BEGIN_DECL
/** Size (in bytes) of a hex formatted oid */ /** Size (in bytes) of a hex formatted oid */
#define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2) #define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2)
/** Minimum length (in number of hex characters,
* i.e. packets of 4 bits) of an oid prefix */
#define GIT_OID_MINPREFIXLEN 4
/** Unique identity of any object (commit, tree, blob, tag). */ /** Unique identity of any object (commit, tree, blob, tag). */
typedef struct { typedef struct {
/** raw binary formatted id */ /** raw binary formatted id */
......
...@@ -104,8 +104,8 @@ int git_object_lookup_short_oid(git_object **object_out, git_repository *repo, c ...@@ -104,8 +104,8 @@ int git_object_lookup_short_oid(git_object **object_out, git_repository *repo, c
assert(repo && object_out && id); assert(repo && object_out && id);
if (len == 0) if (len < GIT_OID_MINPREFIXLEN)
return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to lookup object. Prefix length should be not be 0."); return git__throw(GIT_EAMBIGUOUSOIDPREFIX, "Failed to lookup object. Prefix length is lower than %d.", GIT_OID_MINPREFIXLEN);
if (len > GIT_OID_HEXSZ) { if (len > GIT_OID_HEXSZ) {
len = GIT_OID_HEXSZ; len = GIT_OID_HEXSZ;
} }
......
...@@ -268,6 +268,8 @@ static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n); ...@@ -268,6 +268,8 @@ static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n);
* a prefix of an identifier. * a prefix of an identifier.
* Throws GIT_EAMBIGUOUSOIDPREFIX if short oid * Throws GIT_EAMBIGUOUSOIDPREFIX if short oid
* is ambiguous within the pack. * is ambiguous within the pack.
* This method assumes that len is between
* GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ.
*/ */
static int pack_entry_find_offset( static int pack_entry_find_offset(
off_t *offset_out, off_t *offset_out,
...@@ -289,6 +291,8 @@ static int pack_entry_find(struct pack_entry *e, ...@@ -289,6 +291,8 @@ static int pack_entry_find(struct pack_entry *e,
* a prefix of an identifier. * a prefix of an identifier.
* Throws GIT_EAMBIGUOUSOIDPREFIX if short oid * Throws GIT_EAMBIGUOUSOIDPREFIX if short oid
* is ambiguous. * is ambiguous.
* This method assumes that len is between
* GIT_OID_MINPREFIXLEN and GIT_OID_HEXSZ.
*/ */
static int pack_entry_find_unique_short_oid(struct pack_entry *e, static int pack_entry_find_unique_short_oid(struct pack_entry *e,
struct pack_backend *backend, struct pack_backend *backend,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment