diff --git a/lib/src/index.dart b/lib/src/index.dart index 2dabf5b..567c70f 100644 --- a/lib/src/index.dart +++ b/lib/src/index.dart @@ -105,9 +105,8 @@ class Index { oid = Oid.fromSHA(target); tree = Tree.lookup(bindings.owner(_indexPointer), oid.pointer); } else { - final shortOid = Oid.fromSHAn(target); final odb = Odb(repo_bindings.odb(bindings.owner(_indexPointer))); - oid = Oid(odb.existsPrefix(shortOid.pointer, target.length)); + oid = Oid.fromShortSHA(target, odb); odb.free(); tree = Tree.lookup(bindings.owner(_indexPointer), oid.pointer); } diff --git a/lib/src/oid.dart b/lib/src/oid.dart index fa3e096..8134ef9 100644 --- a/lib/src/oid.dart +++ b/lib/src/oid.dart @@ -1,6 +1,7 @@ import 'dart:ffi'; import 'bindings/libgit2_bindings.dart'; import 'bindings/oid.dart' as bindings; +import 'odb.dart'; import 'util.dart'; class Oid { @@ -20,13 +21,14 @@ class Oid { _oidPointer = bindings.fromSHA(sha); } - /// Initializes a new instance of [Oid] class from provided - /// hexadecimal [sha] string that is lesser than 40 characters long. + /// Initializes a new instance of [Oid] class by determining if an object can be found + /// in the object database of repository with provided hexadecimal [sha] string that is + /// lesser than 40 characters long and [Odb] object. /// /// Throws a [LibGit2Error] if error occured. - Oid.fromSHAn(String sha) { + Oid.fromShortSHA(String sha, Odb odb) { libgit2.git_libgit2_init(); - _oidPointer = bindings.fromStrN(sha); + _oidPointer = odb.existsPrefix(bindings.fromStrN(sha), sha.length); } late final Pointer _oidPointer; diff --git a/lib/src/reference.dart b/lib/src/reference.dart index 9efb8f6..4b2d71d 100644 --- a/lib/src/reference.dart +++ b/lib/src/reference.dart @@ -142,9 +142,8 @@ class Reference { if (target.length == 40) { oid = Oid.fromSHA(target); } else { - final shortOid = Oid.fromSHAn(target); final odb = Odb(repo_bindings.odb(owner)); - oid = Oid(odb.existsPrefix(shortOid.pointer, target.length)); + oid = Oid.fromShortSHA(target, odb); odb.free(); } } else { diff --git a/lib/src/repository.dart b/lib/src/repository.dart index 243843c..63fed51 100644 --- a/lib/src/repository.dart +++ b/lib/src/repository.dart @@ -122,9 +122,8 @@ class Repository { if (target.length == 40) { oid = Oid.fromSHA(target); } else { - final shortOid = Oid.fromSHAn(target); final odb = this.odb; - oid = Oid(odb.existsPrefix(shortOid.pointer, target.length)); + oid = Oid.fromShortSHA(target, odb); odb.free(); } bindings.setHeadDetached(_repoPointer, oid.pointer); @@ -328,9 +327,8 @@ class Repository { if (sha.length == 40) { oid = Oid.fromSHA(sha); } else { - final shortOid = Oid.fromSHAn(sha); final odb = this.odb; - oid = Oid(odb.existsPrefix(shortOid.pointer, sha.length)); + oid = Oid.fromShortSHA(sha, odb); odb.free(); } return oid; diff --git a/test/odb_test.dart b/test/odb_test.dart index ff9a8a5..91e93d9 100644 --- a/test/odb_test.dart +++ b/test/odb_test.dart @@ -34,10 +34,10 @@ void main() { test('finds object by short oid', () { final shortSha = '78b8bf'; - final shortOid = Oid.fromSHAn(shortSha); - final oid = repo.odb.existsPrefix(shortOid.pointer, shortSha.length); - expect(Oid(oid).sha, lastCommit); - repo.odb.free(); + final odb = repo.odb; + final oid = Oid.fromShortSHA(shortSha, odb); + expect(oid.sha, lastCommit); + odb.free(); }); }); } diff --git a/test/oid_test.dart b/test/oid_test.dart index 829fa8c..b53f784 100644 --- a/test/oid_test.dart +++ b/test/oid_test.dart @@ -1,20 +1,50 @@ +import 'dart:io'; + import 'package:test/test.dart'; import 'package:libgit2dart/libgit2dart.dart'; +import 'helpers/util.dart'; void main() { - const sha = '9d81c715ff606057fa448e558c7458467a86c8c7'; + const sha = '78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e8'; + const biggerSha = '78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e9'; + const lesserSha = '78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e7'; group('Oid', () { + late Repository repo; + final tmpDir = '${Directory.systemTemp.path}/oid_testrepo/'; + + setUp(() async { + if (await Directory(tmpDir).exists()) { + await Directory(tmpDir).delete(recursive: true); + } + await copyRepo( + from: Directory('test/assets/testrepo/'), + to: await Directory(tmpDir).create(), + ); + repo = Repository.open(tmpDir); + }); + + tearDown(() async { + repo.free(); + await Directory(tmpDir).delete(recursive: true); + }); group('fromSHA()', () { test('initializes successfully', () { - expect(Oid.fromSHA(sha), isA()); + final oid = Oid.fromSHA(sha); + expect(oid, isA()); + expect(oid.sha, sha); }); }); - group('fromSHAn()', () { + group('fromShortSHA()', () { test('initializes successfully from short hex string', () { - final oid = Oid.fromSHAn('9d81'); + final odb = repo.odb; + final oid = Oid.fromShortSHA(sha.substring(0, 4), odb); + expect(oid, isA()); + expect(oid.sha, sha); + + odb.free(); }); }); @@ -26,7 +56,7 @@ void main() { group('compare', () { test('< and <=', () { final oid1 = Oid.fromSHA(sha); - final oid2 = Oid.fromSHA('9d81c715ff606057fa448e558c7458467a86c8c8'); + final oid2 = Oid.fromSHA(biggerSha); expect(oid1 < oid2, true); expect(oid1 <= oid2, true); }); @@ -39,7 +69,7 @@ void main() { test('> and >=', () { final oid1 = Oid.fromSHA(sha); - final oid2 = Oid.fromSHA('9d81c715ff606057fa448e558c7458467a86c8c6'); + final oid2 = Oid.fromSHA(lesserSha); expect(oid1 > oid2, true); expect(oid1 >= oid2, true); });