Skip to content

Commit 37b81b6

Browse files
authored
repository: Implement wrappers for git_object_lookup_prefix (libgit2#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.
1 parent 1111858 commit 37b81b6

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

repository.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,30 @@ func (v *Repository) lookupType(id *Oid, t ObjectType) (*Object, error) {
185185
return allocObject(ptr, v), nil
186186
}
187187

188+
func (v *Repository) lookupPrefixType(id *Oid, prefix uint, t ObjectType) (*Object, error) {
189+
var ptr *C.git_object
190+
191+
runtime.LockOSThread()
192+
defer runtime.UnlockOSThread()
193+
194+
ret := C.git_object_lookup_prefix(&ptr, v.ptr, id.toC(), C.size_t(prefix), C.git_object_t(t))
195+
runtime.KeepAlive(id)
196+
if ret < 0 {
197+
return nil, MakeGitError(ret)
198+
}
199+
200+
return allocObject(ptr, v), nil
201+
}
202+
188203
func (v *Repository) Lookup(id *Oid) (*Object, error) {
189204
return v.lookupType(id, ObjectAny)
190205
}
191206

207+
// LookupPrefix looks up an object by its OID given a prefix of its identifier.
208+
func (v *Repository) LookupPrefix(id *Oid, prefix uint) (*Object, error) {
209+
return v.lookupPrefixType(id, prefix, ObjectAny)
210+
}
211+
192212
func (v *Repository) LookupTree(id *Oid) (*Tree, error) {
193213
obj, err := v.lookupType(id, ObjectTree)
194214
if err != nil {
@@ -199,6 +219,17 @@ func (v *Repository) LookupTree(id *Oid) (*Tree, error) {
199219
return obj.AsTree()
200220
}
201221

222+
// LookupPrefixTree looks up a tree by its OID given a prefix of its identifier.
223+
func (v *Repository) LookupPrefixTree(id *Oid, prefix uint) (*Tree, error) {
224+
obj, err := v.lookupPrefixType(id, prefix, ObjectTree)
225+
if err != nil {
226+
return nil, err
227+
}
228+
defer obj.Free()
229+
230+
return obj.AsTree()
231+
}
232+
202233
func (v *Repository) LookupCommit(id *Oid) (*Commit, error) {
203234
obj, err := v.lookupType(id, ObjectCommit)
204235
if err != nil {
@@ -209,6 +240,17 @@ func (v *Repository) LookupCommit(id *Oid) (*Commit, error) {
209240
return obj.AsCommit()
210241
}
211242

243+
// LookupPrefixCommit looks up a commit by its OID given a prefix of its identifier.
244+
func (v *Repository) LookupPrefixCommit(id *Oid, prefix uint) (*Commit, error) {
245+
obj, err := v.lookupPrefixType(id, prefix, ObjectCommit)
246+
if err != nil {
247+
return nil, err
248+
}
249+
defer obj.Free()
250+
251+
return obj.AsCommit()
252+
}
253+
212254
func (v *Repository) LookupBlob(id *Oid) (*Blob, error) {
213255
obj, err := v.lookupType(id, ObjectBlob)
214256
if err != nil {
@@ -219,6 +261,17 @@ func (v *Repository) LookupBlob(id *Oid) (*Blob, error) {
219261
return obj.AsBlob()
220262
}
221263

264+
// LookupPrefixBlob looks up a blob by its OID given a prefix of its identifier.
265+
func (v *Repository) LookupPrefixBlob(id *Oid, prefix uint) (*Blob, error) {
266+
obj, err := v.lookupPrefixType(id, prefix, ObjectBlob)
267+
if err != nil {
268+
return nil, err
269+
}
270+
defer obj.Free()
271+
272+
return obj.AsBlob()
273+
}
274+
222275
func (v *Repository) LookupTag(id *Oid) (*Tag, error) {
223276
obj, err := v.lookupType(id, ObjectTag)
224277
if err != nil {
@@ -229,6 +282,17 @@ func (v *Repository) LookupTag(id *Oid) (*Tag, error) {
229282
return obj.AsTag()
230283
}
231284

285+
// LookupPrefixTag looks up a tag by its OID given a prefix of its identifier.
286+
func (v *Repository) LookupPrefixTag(id *Oid, prefix uint) (*Tag, error) {
287+
obj, err := v.lookupPrefixType(id, prefix, ObjectTag)
288+
if err != nil {
289+
return nil, err
290+
}
291+
defer obj.Free()
292+
293+
return obj.AsTag()
294+
}
295+
232296
func (v *Repository) Head() (*Reference, error) {
233297
var ptr *C.git_reference
234298

0 commit comments

Comments
 (0)