Skip to content

Commit

Permalink
repository: Implement wrappers for git_object_lookup_prefix (libgit…
Browse files Browse the repository at this point in the history
…2#658)

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.
  • Loading branch information
pks-t authored Oct 22, 2020
1 parent 1111858 commit 37b81b6
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -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_object_t(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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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

Expand Down

0 comments on commit 37b81b6

Please sign in to comment.