@@ -185,10 +185,30 @@ func (v *Repository) lookupType(id *Oid, t ObjectType) (*Object, error) {
185
185
return allocObject (ptr , v ), nil
186
186
}
187
187
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
+
188
203
func (v * Repository ) Lookup (id * Oid ) (* Object , error ) {
189
204
return v .lookupType (id , ObjectAny )
190
205
}
191
206
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
+
192
212
func (v * Repository ) LookupTree (id * Oid ) (* Tree , error ) {
193
213
obj , err := v .lookupType (id , ObjectTree )
194
214
if err != nil {
@@ -199,6 +219,17 @@ func (v *Repository) LookupTree(id *Oid) (*Tree, error) {
199
219
return obj .AsTree ()
200
220
}
201
221
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
+
202
233
func (v * Repository ) LookupCommit (id * Oid ) (* Commit , error ) {
203
234
obj , err := v .lookupType (id , ObjectCommit )
204
235
if err != nil {
@@ -209,6 +240,17 @@ func (v *Repository) LookupCommit(id *Oid) (*Commit, error) {
209
240
return obj .AsCommit ()
210
241
}
211
242
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
+
212
254
func (v * Repository ) LookupBlob (id * Oid ) (* Blob , error ) {
213
255
obj , err := v .lookupType (id , ObjectBlob )
214
256
if err != nil {
@@ -219,6 +261,17 @@ func (v *Repository) LookupBlob(id *Oid) (*Blob, error) {
219
261
return obj .AsBlob ()
220
262
}
221
263
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
+
222
275
func (v * Repository ) LookupTag (id * Oid ) (* Tag , error ) {
223
276
obj , err := v .lookupType (id , ObjectTag )
224
277
if err != nil {
@@ -229,6 +282,17 @@ func (v *Repository) LookupTag(id *Oid) (*Tag, error) {
229
282
return obj .AsTag ()
230
283
}
231
284
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
+
232
296
func (v * Repository ) Head () (* Reference , error ) {
233
297
var ptr * C.git_reference
234
298
0 commit comments