fix: release memory

This commit is contained in:
Aleksey Kulikov 2021-06-02 12:16:55 +03:00
parent a1481564b2
commit 0fe3fa9f23
3 changed files with 10 additions and 16 deletions

View file

@ -5,6 +5,4 @@ import 'package:libgit2dart/libgit2dart.dart';
void main() { void main() {
final repo = Repository.open(Directory.current.path); final repo = Repository.open(Directory.current.path);
print(repo.path); print(repo.path);
stdout.write(repo.headCommit);
} }

View file

@ -27,10 +27,11 @@ Pointer<Pointer<git_repository>> open(String path) {
/// The [bare_path] can point to only a bare repository. /// The [bare_path] can point to only a bare repository.
/// ///
/// Throws a [LibGit2Error] if error occured. /// Throws a [LibGit2Error] if error occured.
Pointer<Pointer<git_repository>> openBare(String bare_path) { Pointer<Pointer<git_repository>> openBare(String barePath) {
final out = calloc<Pointer<git_repository>>(); final out = calloc<Pointer<git_repository>>();
final error = libgit2.git_repository_open_bare( final barePathC = barePath.toNativeUtf8().cast<Int8>();
out, bare_path.toNativeUtf8().cast<Int8>()); final error = libgit2.git_repository_open_bare(out, barePathC);
calloc.free(barePathC);
if (error < 0) { if (error < 0) {
throw LibGit2Error(error, libgit2.git_error_last()); throw LibGit2Error(error, libgit2.git_error_last());
@ -75,11 +76,13 @@ Pointer<Pointer<git_object>> revParseSingle(
String spec, String spec,
) { ) {
final out = calloc<Pointer<git_object>>(); final out = calloc<Pointer<git_object>>();
final specC = spec.toNativeUtf8().cast<Int8>();
final error = libgit2.git_revparse_single( final error = libgit2.git_revparse_single(
out, out,
repo, repo,
spec.toNativeUtf8().cast<Int8>(), specC,
); );
calloc.free(specC);
if (error < 0) { if (error < 0) {
throw LibGit2Error(error, libgit2.git_error_last()); throw LibGit2Error(error, libgit2.git_error_last());

View file

@ -15,25 +15,18 @@ class Repository {
Repository.open(String dir) { Repository.open(String dir) {
libgit2.git_libgit2_init(); libgit2.git_libgit2_init();
_repoPointer = repository.open(dir); final _repoPointer = repository.open(dir);
_head = repository.revParseSingle(_repoPointer.value, 'HEAD^{commit}');
headCommit = libgit2
.git_commit_message(_head.value.cast<git_commit>())
.cast<Utf8>()
.toDartString();
path = repository.path(_repoPointer.value); path = repository.path(_repoPointer.value);
namespace = repository.getNamespace(_repoPointer.value); namespace = repository.getNamespace(_repoPointer.value);
isBare = repository.isBare(_repoPointer.value); isBare = repository.isBare(_repoPointer.value);
// free up neccessary pointers // free up neccessary pointers
calloc.free(_repoPointer); calloc.free(_repoPointer);
calloc.free(_head);
libgit2.git_libgit2_shutdown(); libgit2.git_libgit2_shutdown();
} }
late Pointer<Pointer<git_repository>> _repoPointer; /// Path to the `.git` folder for normal repositories
late Pointer<Pointer<git_object>> _head; /// or path to the repository itself for bare repositories.
late String headCommit;
late String path; late String path;
late String namespace; late String namespace;
late bool isBare; late bool isBare;