@@ -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+
188203func (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+
192212func (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+
202233func (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+
212254func (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+
222275func (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+
232296func (v * Repository ) Head () (* Reference , error ) {
233297 var ptr * C.git_reference
234298
0 commit comments