diff --git a/lib/src/bindings/refdb.dart b/lib/src/bindings/refdb.dart new file mode 100644 index 0000000..e548411 --- /dev/null +++ b/lib/src/bindings/refdb.dart @@ -0,0 +1,20 @@ +import 'dart:ffi'; +import '../error.dart'; +import 'libgit2_bindings.dart'; +import '../util.dart'; + +/// Suggests that the given refdb compress or optimize its references. +/// This mechanism is implementation specific. For on-disk reference databases, +/// for example, this may pack all loose references. +/// +/// Throws a [LibGit2Error] if error occured. +void compress(Pointer refdb) { + final error = libgit2.git_refdb_compress(refdb); + + if (error < 0) { + throw LibGit2Error(libgit2.git_error_last()); + } +} + +/// Close an open reference database to release memory. +void free(Pointer refdb) => libgit2.git_refdb_free(refdb); diff --git a/lib/src/reference.dart b/lib/src/reference.dart index 1bd4fd0..02a8104 100644 --- a/lib/src/reference.dart +++ b/lib/src/reference.dart @@ -4,6 +4,8 @@ import 'package:libgit2dart/libgit2dart.dart'; import 'bindings/libgit2_bindings.dart'; import 'bindings/reference.dart' as bindings; import 'bindings/object.dart' as object_bindings; +import 'bindings/refdb.dart' as refdb_bindings; +import 'bindings/repository.dart' as repository_bindings; import 'blob.dart'; import 'commit.dart'; import 'oid.dart'; @@ -40,6 +42,17 @@ class References { final refPointer = bindings.lookup(_repoPointer, name); return Reference(_repoPointer, refPointer); } + + /// Suggests that the given refdb compress or optimize its references. + /// This mechanism is implementation specific. For on-disk reference databases, + /// for example, this may pack all loose references. + /// + /// Throws a [LibGit2Error] if error occured. + void compress() { + final refdb = repository_bindings.refdb(_repoPointer); + refdb_bindings.compress(refdb); + refdb_bindings.free(refdb); + } } class Reference { diff --git a/test/assets/testrepo/.gitdir/refs/tags/empty_marker b/test/assets/testrepo/.gitdir/refs/tags/empty_marker deleted file mode 100644 index e69de29..0000000 diff --git a/test/reference_test.dart b/test/reference_test.dart index bc0b61c..eb8f488 100644 --- a/test/reference_test.dart +++ b/test/reference_test.dart @@ -514,5 +514,17 @@ void main() { tree.free(); ref.free(); }); + + test('successfully compresses references', () { + final packedRefsFile = File('$tmpDir.git/packed-refs'); + expect(packedRefsFile.existsSync(), false); + final oldRefs = repo.references.list(); + + repo.references.compress(); + + expect(packedRefsFile.existsSync(), true); + final newRefs = repo.references.list(); + expect(newRefs, oldRefs); + }); }); }