repository: Implement wrappers for `git_object_lookup_prefix` (#658) (#659)

While we already have wrappers for `git_object_lookup`, there are none
yet for the prefixed variant where only the first n bytes of the OID are
used for the lookup. This commit adds them.

(cherry picked from commit 37b81b61f1)

Co-authored-by: Patrick Steinhardt <ps@pks.im>
This commit is contained in:
github-actions[bot] 2020-10-22 06:05:23 -07:00 committed by GitHub
parent 27f87bd821
commit f58d71b8a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 64 additions and 0 deletions

View File

@ -185,10 +185,30 @@ func (v *Repository) lookupType(id *Oid, t ObjectType) (*Object, error) {
return allocObject(ptr, v), nil
}
func (v *Repository) lookupPrefixType(id *Oid, prefix uint, t ObjectType) (*Object, error) {
var ptr *C.git_object
runtime.LockOSThread()
defer runtime.UnlockOSThread()
ret := C.git_object_lookup_prefix(&ptr, v.ptr, id.toC(), C.size_t(prefix), C.git_otype(t))
runtime.KeepAlive(id)
if ret < 0 {
return nil, MakeGitError(ret)
}
return allocObject(ptr, v), nil
}
func (v *Repository) Lookup(id *Oid) (*Object, error) {
return v.lookupType(id, ObjectAny)
}
// LookupPrefix looks up an object by its OID given a prefix of its identifier.
func (v *Repository) LookupPrefix(id *Oid, prefix uint) (*Object, error) {
return v.lookupPrefixType(id, prefix, ObjectAny)
}
func (v *Repository) LookupTree(id *Oid) (*Tree, error) {
obj, err := v.lookupType(id, ObjectTree)
if err != nil {
@ -199,6 +219,17 @@ func (v *Repository) LookupTree(id *Oid) (*Tree, error) {
return obj.AsTree()
}
// LookupPrefixTree looks up a tree by its OID given a prefix of its identifier.
func (v *Repository) LookupPrefixTree(id *Oid, prefix uint) (*Tree, error) {
obj, err := v.lookupPrefixType(id, prefix, ObjectTree)
if err != nil {
return nil, err
}
defer obj.Free()
return obj.AsTree()
}
func (v *Repository) LookupCommit(id *Oid) (*Commit, error) {
obj, err := v.lookupType(id, ObjectCommit)
if err != nil {
@ -209,6 +240,17 @@ func (v *Repository) LookupCommit(id *Oid) (*Commit, error) {
return obj.AsCommit()
}
// LookupPrefixCommit looks up a commit by its OID given a prefix of its identifier.
func (v *Repository) LookupPrefixCommit(id *Oid, prefix uint) (*Commit, error) {
obj, err := v.lookupPrefixType(id, prefix, ObjectCommit)
if err != nil {
return nil, err
}
defer obj.Free()
return obj.AsCommit()
}
func (v *Repository) LookupBlob(id *Oid) (*Blob, error) {
obj, err := v.lookupType(id, ObjectBlob)
if err != nil {
@ -219,6 +261,17 @@ func (v *Repository) LookupBlob(id *Oid) (*Blob, error) {
return obj.AsBlob()
}
// LookupPrefixBlob looks up a blob by its OID given a prefix of its identifier.
func (v *Repository) LookupPrefixBlob(id *Oid, prefix uint) (*Blob, error) {
obj, err := v.lookupPrefixType(id, prefix, ObjectBlob)
if err != nil {
return nil, err
}
defer obj.Free()
return obj.AsBlob()
}
func (v *Repository) LookupTag(id *Oid) (*Tag, error) {
obj, err := v.lookupType(id, ObjectTag)
if err != nil {
@ -229,6 +282,17 @@ func (v *Repository) LookupTag(id *Oid) (*Tag, error) {
return obj.AsTag()
}
// LookupPrefixTag looks up a tag by its OID given a prefix of its identifier.
func (v *Repository) LookupPrefixTag(id *Oid, prefix uint) (*Tag, error) {
obj, err := v.lookupPrefixType(id, prefix, ObjectTag)
if err != nil {
return nil, err
}
defer obj.Free()
return obj.AsTag()
}
func (v *Repository) Head() (*Reference, error) {
var ptr *C.git_reference