From dee3acb7c98a7931337079abd253de412c60035b Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Tue, 26 Apr 2022 17:26:59 +0300 Subject: [PATCH] fix: free pointers to pointers --- lib/src/bindings/annotated.dart | 26 +++++--- lib/src/bindings/attr.dart | 12 ++-- lib/src/bindings/blame.dart | 12 ++-- lib/src/bindings/blob.dart | 23 +++++-- lib/src/bindings/branch.dart | 62 +++++++++++------- lib/src/bindings/commit.dart | 55 +++++++++++----- lib/src/bindings/config.dart | 100 ++++++++++++++++++------------ lib/src/bindings/credentials.dart | 20 ++++-- lib/src/bindings/describe.dart | 15 +++-- lib/src/bindings/diff.dart | 64 +++++++++++++------ lib/src/bindings/index.dart | 15 +++-- lib/src/bindings/mailmap.dart | 24 +++++-- lib/src/bindings/merge.dart | 22 ++++--- lib/src/bindings/note.dart | 16 +++-- lib/src/bindings/object.dart | 7 ++- lib/src/bindings/odb.dart | 21 +++++-- lib/src/bindings/oid.dart | 12 ++-- lib/src/bindings/packbuilder.dart | 7 ++- lib/src/bindings/patch.dart | 51 +++++++++++---- lib/src/bindings/rebase.dart | 20 ++++-- lib/src/bindings/reference.dart | 63 +++++++++++++------ lib/src/bindings/reflog.dart | 5 +- lib/src/bindings/refspec.dart | 14 +++-- lib/src/bindings/remote.dart | 20 +++--- lib/src/bindings/repository.dart | 83 ++++++++++++++++++------- lib/src/bindings/revparse.dart | 21 ++++--- lib/src/bindings/revwalk.dart | 9 ++- lib/src/bindings/signature.dart | 22 +++++-- lib/src/bindings/status.dart | 13 ++-- lib/src/bindings/submodule.dart | 24 ++++--- lib/src/bindings/tag.dart | 14 +++-- lib/src/bindings/tree.dart | 13 ++-- lib/src/bindings/treebuilder.dart | 7 ++- lib/src/bindings/worktree.dart | 18 ++++-- 34 files changed, 621 insertions(+), 289 deletions(-) diff --git a/lib/src/bindings/annotated.dart b/lib/src/bindings/annotated.dart index 30bc0d3..be021cb 100644 --- a/lib/src/bindings/annotated.dart +++ b/lib/src/bindings/annotated.dart @@ -27,11 +27,14 @@ Pointer lookup({ oidPointer, ); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -49,11 +52,14 @@ Pointer fromRef({ referencePointer, ); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -75,13 +81,15 @@ Pointer fromRevSpec({ revspecC, ); + final result = out.value; + calloc.free(revspecC); + calloc.free(out); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -105,14 +113,16 @@ Pointer fromFetchHead({ oid, ); + final result = out.value; + + calloc.free(out); calloc.free(branchNameC); calloc.free(remoteUrlC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/attr.dart b/lib/src/bindings/attr.dart index 8bdd29e..363c304 100644 --- a/lib/src/bindings/attr.dart +++ b/lib/src/bindings/attr.dart @@ -19,27 +19,25 @@ Object? getAttribute({ final nameC = name.toNativeUtf8().cast(); libgit2.git_attr_get(out, repoPointer, flags, pathC, nameC); + final result = out.value; + + calloc.free(out); calloc.free(pathC); calloc.free(nameC); - final attributeValue = libgit2.git_attr_value(out.value); + final attributeValue = libgit2.git_attr_value(result); if (attributeValue == git_attr_value_t.GIT_ATTR_VALUE_UNSPECIFIED) { - calloc.free(out); return null; } if (attributeValue == git_attr_value_t.GIT_ATTR_VALUE_TRUE) { - calloc.free(out); return true; } if (attributeValue == git_attr_value_t.GIT_ATTR_VALUE_FALSE) { - calloc.free(out); return false; } if (attributeValue == git_attr_value_t.GIT_ATTR_VALUE_STRING) { - final result = out.value.cast().toDartString(); - calloc.free(out); - return result; + return result.cast().toDartString(); } return null; } diff --git a/lib/src/bindings/blame.dart b/lib/src/bindings/blame.dart index 2600e40..7bf9941 100644 --- a/lib/src/bindings/blame.dart +++ b/lib/src/bindings/blame.dart @@ -47,14 +47,16 @@ Pointer file({ final error = libgit2.git_blame_file(out, repoPointer, pathC, options); + final result = out.value; + + calloc.free(out); calloc.free(pathC); calloc.free(options); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -80,13 +82,15 @@ Pointer buffer({ buffer.length, ); + final result = out.value; + + calloc.free(out); calloc.free(bufferC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/blob.dart b/lib/src/bindings/blob.dart index b69edc5..dd3dad8 100644 --- a/lib/src/bindings/blob.dart +++ b/lib/src/bindings/blob.dart @@ -16,11 +16,14 @@ Pointer lookup({ final out = calloc>(); final error = libgit2.git_blob_lookup(out, repoPointer, oidPointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -128,7 +131,11 @@ Pointer createFromDisk({ Pointer duplicate(Pointer source) { final out = calloc>(); libgit2.git_blob_dup(out, source); - return out.value; + final result = out.value; + + calloc.free(out); + + return result; } /// Get a buffer with the filtered content of a blob. @@ -156,15 +163,19 @@ String filterContent({ final error = libgit2.git_blob_filter(out, blobPointer, asPathC, opts); + late final String result; + if (out.ref.ptr != nullptr) { + result = out.ref.ptr.cast().toDartString(length: out.ref.size); + } + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(asPathC); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } diff --git a/lib/src/bindings/branch.dart b/lib/src/bindings/branch.dart index a634121..72ecddd 100644 --- a/lib/src/bindings/branch.dart +++ b/lib/src/bindings/branch.dart @@ -35,13 +35,15 @@ List> list({ error = libgit2.git_branch_next(reference, refType, iterator.value); if (error == 0) { result.add(reference.value); - calloc.free(refType); } else { break; } + calloc.free(reference); + calloc.free(refType); } libgit2.git_branch_iterator_free(iterator.value); + calloc.free(iterator); return result; } @@ -65,13 +67,15 @@ Pointer lookup({ branchType, ); + final result = out.value; + + calloc.free(out); calloc.free(branchNameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -103,13 +107,15 @@ Pointer create({ forceC, ); + final result = out.value; + + calloc.free(out); calloc.free(branchNameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -192,13 +198,14 @@ String name(Pointer ref) { final out = calloc>(); final error = libgit2.git_branch_name(out, ref); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.value.cast().toDartString(); - calloc.free(out); - return result; + return result.cast().toDartString(); } } @@ -218,14 +225,15 @@ String remoteName({ final branchNameC = branchName.toNativeUtf8().cast(); final error = libgit2.git_branch_remote_name(out, repoPointer, branchNameC); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(branchNameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -240,11 +248,14 @@ Pointer getUpstream(Pointer branch) { final out = calloc>(); final error = libgit2.git_branch_upstream(out, branch); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -286,14 +297,15 @@ String upstreamName({ final branchNameC = branchName.toNativeUtf8().cast(); final error = libgit2.git_branch_upstream_name(out, repoPointer, branchNameC); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(branchNameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -316,14 +328,15 @@ String upstreamRemote({ branchNameC, ); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(branchNameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -346,12 +359,15 @@ String upstreamMerge({ branchNameC, ); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + calloc.free(branchNameC); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } diff --git a/lib/src/bindings/commit.dart b/lib/src/bindings/commit.dart index d1aa89f..0059575 100644 --- a/lib/src/bindings/commit.dart +++ b/lib/src/bindings/commit.dart @@ -17,11 +17,14 @@ Pointer lookup({ final out = calloc>(); final error = libgit2.git_commit_lookup(out, repoPointer, oidPointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -124,17 +127,18 @@ String createBuffer({ parentsC, ); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(updateRefC); calloc.free(messageEncodingC); calloc.free(messageC); calloc.free(parentsC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -196,7 +200,12 @@ Pointer amend({ Pointer duplicate(Pointer source) { final out = calloc>(); libgit2.git_commit_dup(out, source); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Get the encoding for the message of a commit, as a string representing a @@ -254,14 +263,15 @@ String headerField({ final fieldC = field.toNativeUtf8().cast(); final error = libgit2.git_commit_header_field(out, commitPointer, fieldC); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(fieldC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -292,11 +302,14 @@ Pointer parent({ final out = calloc>(); final error = libgit2.git_commit_parent(out, commitPointer, position); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -315,11 +328,14 @@ Pointer nthGenAncestor({ final out = calloc>(); final error = libgit2.git_commit_nth_gen_ancestor(out, commitPointer, n); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -350,7 +366,12 @@ Pointer treeOid(Pointer commit) { Pointer tree(Pointer commit) { final out = calloc>(); libgit2.git_commit_tree(out, commit); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Reverts the given commit, producing changes in the index and working @@ -393,13 +414,15 @@ Pointer revertCommit({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/config.dart b/lib/src/bindings/config.dart index b6e3f8a..d3919b5 100644 --- a/lib/src/bindings/config.dart +++ b/lib/src/bindings/config.dart @@ -29,11 +29,14 @@ Pointer openDefault() { final out = calloc>(); final error = libgit2.git_config_open_default(out); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -54,12 +57,14 @@ String findGlobal() { final out = calloc(); final error = libgit2.git_config_find_global(out); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -73,12 +78,14 @@ String findSystem() { final out = calloc(); final error = libgit2.git_config_find_system(out); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -93,12 +100,14 @@ String findXdg() { final out = calloc(); final error = libgit2.git_config_find_xdg(out); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -111,7 +120,12 @@ String findXdg() { Pointer snapshot(Pointer config) { final out = calloc>(); libgit2.git_config_snapshot(out, config); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Get the config entry of a config variable. @@ -122,16 +136,18 @@ Pointer getEntry({ required String variable, }) { final out = calloc>(); - final name = variable.toNativeUtf8().cast(); - final error = libgit2.git_config_get_entry(out, configPointer, name); + final nameC = variable.toNativeUtf8().cast(); + final error = libgit2.git_config_get_entry(out, configPointer, nameC); - calloc.free(name); + final result = out.value; + + calloc.free(out); + calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -142,10 +158,10 @@ void setBool({ required String variable, required bool value, }) { - final name = variable.toNativeUtf8().cast(); + final nameC = variable.toNativeUtf8().cast(); final valueC = value ? 1 : 0; - libgit2.git_config_set_bool(configPointer, name, valueC); - calloc.free(name); + libgit2.git_config_set_bool(configPointer, nameC, valueC); + calloc.free(nameC); } /// Set the value of an integer config variable in the config file with the @@ -155,9 +171,9 @@ void setInt({ required String variable, required int value, }) { - final name = variable.toNativeUtf8().cast(); - libgit2.git_config_set_int64(configPointer, name, value); - calloc.free(name); + final nameC = variable.toNativeUtf8().cast(); + libgit2.git_config_set_int64(configPointer, nameC, value); + calloc.free(nameC); } /// Set the value of a string config variable in the config file with the @@ -167,10 +183,10 @@ void setString({ required String variable, required String value, }) { - final name = variable.toNativeUtf8().cast(); + final nameC = variable.toNativeUtf8().cast(); final valueC = value.toNativeUtf8().cast(); - libgit2.git_config_set_string(configPointer, name, valueC); - calloc.free(name); + libgit2.git_config_set_string(configPointer, nameC, valueC); + calloc.free(nameC); calloc.free(valueC); } @@ -178,7 +194,12 @@ void setString({ Pointer iterator(Pointer cfg) { final out = calloc>(); libgit2.git_config_iterator_new(out, cfg); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Delete a config variable from the config file with the highest level @@ -189,10 +210,10 @@ void delete({ required Pointer configPointer, required String variable, }) { - final name = variable.toNativeUtf8().cast(); - final error = libgit2.git_config_delete_entry(configPointer, name); + final nameC = variable.toNativeUtf8().cast(); + final error = libgit2.git_config_delete_entry(configPointer, nameC); - calloc.free(name); + calloc.free(nameC); if (error < 0) { throw LibGit2Error(libgit2.git_error_last()); @@ -208,7 +229,7 @@ List multivarValues({ required String variable, String? regexp, }) { - final name = variable.toNativeUtf8().cast(); + final nameC = variable.toNativeUtf8().cast(); final regexpC = regexp?.toNativeUtf8().cast() ?? nullptr; final iterator = calloc>(); final entry = calloc>(); @@ -216,7 +237,7 @@ List multivarValues({ libgit2.git_config_multivar_iterator_new( iterator, configPointer, - name, + nameC, regexpC, ); @@ -232,8 +253,9 @@ List multivarValues({ } } - calloc.free(name); + calloc.free(nameC); calloc.free(regexpC); + libgit2.git_config_iterator_free(iterator.value); calloc.free(iterator); calloc.free(entry); @@ -250,13 +272,13 @@ void setMultivar({ required String regexp, required String value, }) { - final name = variable.toNativeUtf8().cast(); + final nameC = variable.toNativeUtf8().cast(); final regexpC = regexp.toNativeUtf8().cast(); final valueC = value.toNativeUtf8().cast(); - libgit2.git_config_set_multivar(configPointer, name, regexpC, valueC); + libgit2.git_config_set_multivar(configPointer, nameC, regexpC, valueC); - calloc.free(name); + calloc.free(nameC); calloc.free(regexpC); calloc.free(valueC); } @@ -270,12 +292,12 @@ void deleteMultivar({ required String variable, required String regexp, }) { - final name = variable.toNativeUtf8().cast(); + final nameC = variable.toNativeUtf8().cast(); final regexpC = regexp.toNativeUtf8().cast(); - libgit2.git_config_delete_multivar(configPointer, name, regexpC); + libgit2.git_config_delete_multivar(configPointer, nameC, regexpC); - calloc.free(name); + calloc.free(nameC); calloc.free(regexpC); } diff --git a/lib/src/bindings/credentials.dart b/lib/src/bindings/credentials.dart index 6ead9ed..fffe30d 100644 --- a/lib/src/bindings/credentials.dart +++ b/lib/src/bindings/credentials.dart @@ -15,10 +15,13 @@ Pointer userPass({ libgit2.git_credential_userpass_plaintext_new(out, usernameC, passwordC); + final result = out.value; + + calloc.free(out); calloc.free(usernameC); calloc.free(passwordC); - return out.value; + return result; } /// Create a new passphrase-protected ssh key credential object. @@ -42,12 +45,15 @@ Pointer sshKey({ passPhraseC, ); + final result = out.value; + + calloc.free(out); calloc.free(usernameC); calloc.free(publicKeyC); calloc.free(privateKeyC); calloc.free(passPhraseC); - return out.value; + return result; } /// Create a new ssh key credential object used for querying an ssh-agent. @@ -57,9 +63,12 @@ Pointer sshKeyFromAgent(String username) { libgit2.git_credential_ssh_key_from_agent(out, usernameC); + final result = out.value; + + calloc.free(out); calloc.free(usernameC); - return out.value; + return result; } /// Create a new ssh key credential object reading the keys from memory. @@ -83,10 +92,13 @@ Pointer sshKeyFromMemory({ passPhraseC, ); + final result = out.value; + + calloc.free(out); calloc.free(usernameC); calloc.free(publicKeyC); calloc.free(privateKeyC); calloc.free(passPhraseC); - return out.value; + return result; } diff --git a/lib/src/bindings/describe.dart b/lib/src/bindings/describe.dart index d8237cc..5c2725f 100644 --- a/lib/src/bindings/describe.dart +++ b/lib/src/bindings/describe.dart @@ -32,13 +32,15 @@ Pointer commit({ final error = libgit2.git_describe_commit(out, commitPointer.cast(), opts); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -68,13 +70,15 @@ Pointer workdir({ final error = libgit2.git_describe_workdir(out, repo, opts); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -106,8 +110,9 @@ String format({ final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(opts); + libgit2.git_buf_dispose(out); calloc.free(out); + calloc.free(opts); return result; } diff --git a/lib/src/bindings/diff.dart b/lib/src/bindings/diff.dart index 316baf8..8cdd7c6 100644 --- a/lib/src/bindings/diff.dart +++ b/lib/src/bindings/diff.dart @@ -31,13 +31,15 @@ Pointer indexToIndex({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -58,9 +60,12 @@ Pointer indexToWorkdir({ libgit2.git_diff_index_to_workdir(out, repoPointer, indexPointer, opts); + final result = out.value; + + calloc.free(out); calloc.free(opts); - return out.value; + return result; } /// Create a diff between a tree and repository index. @@ -87,9 +92,12 @@ Pointer treeToIndex({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); - return out.value; + return result; } /// Create a diff between a tree and the working directory. @@ -116,13 +124,15 @@ Pointer treeToWorkdir({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -155,13 +165,15 @@ Pointer treeToWorkdirWithIndex({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -191,13 +203,15 @@ Pointer treeToTree({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -235,9 +249,12 @@ Pointer parse(String content) { final contentC = content.toNativeUtf8().cast(); libgit2.git_diff_from_buffer(out, contentC, content.length); + final result = out.value; + + calloc.free(out); calloc.free(contentC); - return out.value; + return result; } /// Transform a diff marking file renames, copies, etc. @@ -324,11 +341,14 @@ Pointer stats(Pointer diff) { final out = calloc>(); final error = libgit2.git_diff_get_stats(out, diff); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -355,12 +375,14 @@ String statsPrint({ final out = calloc(); final error = libgit2.git_diff_stats_to_buf(out, statsPointer, format, width); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -369,10 +391,14 @@ String statsPrint({ String addToBuf(Pointer diff) { final out = calloc(); libgit2.git_diff_to_buf(out, diff, git_diff_format_t.GIT_DIFF_FORMAT_PATCH); + final result = out.ref.ptr == nullptr ? '' : out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); calloc.free(out); + return result; } @@ -462,14 +488,16 @@ Pointer applyToTree({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(payload); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/index.dart b/lib/src/bindings/index.dart index faa77ce..6a342eb 100644 --- a/lib/src/bindings/index.dart +++ b/lib/src/bindings/index.dart @@ -14,7 +14,12 @@ import 'package:libgit2dart/src/util.dart'; Pointer newInMemory() { final out = calloc>(); libgit2.git_index_new(out); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Read index capabilities flags. @@ -266,6 +271,8 @@ void addFromBuffer({ buffer.length, ); + calloc.free(bufferC); + if (error < 0) { throw LibGit2Error(libgit2.git_error_last()); } @@ -452,12 +459,12 @@ List>> conflictList( 'our': ourOut.value, 'their': theirOut.value, }); - calloc.free(ancestorOut); - calloc.free(ourOut); - calloc.free(theirOut); } else { break; } + calloc.free(ancestorOut); + calloc.free(ourOut); + calloc.free(theirOut); } libgit2.git_index_conflict_iterator_free(iterator.value); diff --git a/lib/src/bindings/mailmap.dart b/lib/src/bindings/mailmap.dart index 8c8f361..74704c1 100644 --- a/lib/src/bindings/mailmap.dart +++ b/lib/src/bindings/mailmap.dart @@ -13,7 +13,11 @@ Pointer init() { final out = calloc>(); libgit2.git_mailmap_new(out); - return out.value; + final result = out.value; + + calloc.free(out); + + return result; } /// Create a new mailmap instance containing a single mailmap file. @@ -23,9 +27,12 @@ Pointer fromBuffer(String buffer) { libgit2.git_mailmap_from_buffer(out, bufferC, buffer.length); + final result = out.value; + + calloc.free(out); calloc.free(bufferC); - return out.value; + return result; } /// Create a new mailmap instance from a repository, loading mailmap files based @@ -43,11 +50,14 @@ Pointer fromRepository(Pointer repo) { final out = calloc>(); final error = libgit2.git_mailmap_from_repository(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -87,7 +97,11 @@ Pointer resolveSignature({ final out = calloc>(); libgit2.git_mailmap_resolve_signature(out, mailmapPointer, signaturePointer); - return out.value; + final result = out.value; + + calloc.free(out); + + return result; } /// Add a single entry to the given mailmap object. If the entry already exists, diff --git a/lib/src/bindings/merge.dart b/lib/src/bindings/merge.dart index 45d98e9..1a92b00 100644 --- a/lib/src/bindings/merge.dart +++ b/lib/src/bindings/merge.dart @@ -234,12 +234,16 @@ String mergeFileFromIndex({ nullptr, ); + late final String result; + if (out.ref.ptr != nullptr) { + result = out.ref.ptr.cast().toDartString(length: out.ref.len); + } + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.len); - calloc.free(out); return result; } } @@ -275,13 +279,15 @@ Pointer mergeCommits({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -318,13 +324,15 @@ Pointer mergeTrees({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/note.dart b/lib/src/bindings/note.dart index da26a8a..5243957 100644 --- a/lib/src/bindings/note.dart +++ b/lib/src/bindings/note.dart @@ -30,15 +30,21 @@ List> list(Pointer repo) { if (nextError >= 0) { final out = calloc>(); libgit2.git_note_read(out, repo, notesRef, annotatedOid); - calloc.free(noteOid); - result.add({'note': out.value, 'annotatedOid': annotatedOid}); + + final note = out.value; + + calloc.free(out); + + result.add({'note': note, 'annotatedOid': annotatedOid}); } else { break; } + calloc.free(noteOid); } calloc.free(notesRef); libgit2.git_note_iterator_free(iterator.value); + calloc.free(iterator); return result; } @@ -57,13 +63,15 @@ Pointer lookup({ final notesRefC = notesRef.toNativeUtf8().cast(); final error = libgit2.git_note_read(out, repoPointer, notesRefC, oidPointer); + final result = out.value; + + calloc.free(out); calloc.free(notesRefC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/object.dart b/lib/src/bindings/object.dart index 3e691f1..b3dd558 100644 --- a/lib/src/bindings/object.dart +++ b/lib/src/bindings/object.dart @@ -26,11 +26,14 @@ Pointer lookup({ final out = calloc>(); final error = libgit2.git_object_lookup(out, repoPointer, oidPointer, type); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/odb.dart b/lib/src/bindings/odb.dart index 77f45f4..20e3e86 100644 --- a/lib/src/bindings/odb.dart +++ b/lib/src/bindings/odb.dart @@ -14,7 +14,12 @@ import 'package:libgit2dart/src/util.dart'; Pointer create() { final out = calloc>(); libgit2.git_odb_new(out); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Add an on-disk alternate to an existing Object DB. @@ -120,11 +125,14 @@ Pointer read({ final out = calloc>(); final error = libgit2.git_odb_read(out, odbPointer, oidPointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -185,14 +193,15 @@ Pointer write({ throw LibGit2Error(libgit2.git_error_last()); } - final buffer = data.toNativeUtf8().cast(); - libgit2.git_odb_stream_write(stream.value, buffer, data.length); + final bufferC = data.toNativeUtf8().cast(); + libgit2.git_odb_stream_write(stream.value, bufferC, data.length); final out = calloc(); libgit2.git_odb_stream_finalize_write(out, stream.value); - calloc.free(buffer); + calloc.free(bufferC); libgit2.git_odb_stream_free(stream.value); + calloc.free(stream); return out; } diff --git a/lib/src/bindings/oid.dart b/lib/src/bindings/oid.dart index 20523b7..c95b49d 100644 --- a/lib/src/bindings/oid.dart +++ b/lib/src/bindings/oid.dart @@ -7,10 +7,10 @@ import 'package:libgit2dart/src/util.dart'; /// Parse N characters of a hex formatted object id into a git_oid. Pointer fromStrN(String hex) { final out = calloc(); - final str = hex.toNativeUtf8().cast(); - libgit2.git_oid_fromstrn(out, str, hex.length); + final hexC = hex.toNativeUtf8().cast(); + libgit2.git_oid_fromstrn(out, hexC, hex.length); - calloc.free(str); + calloc.free(hexC); return out; } @@ -18,10 +18,10 @@ Pointer fromStrN(String hex) { /// Parse a hex formatted object id into a git_oid. Pointer fromSHA(String hex) { final out = calloc(); - final str = hex.toNativeUtf8().cast(); - libgit2.git_oid_fromstr(out, str); + final hexC = hex.toNativeUtf8().cast(); + libgit2.git_oid_fromstr(out, hexC); - calloc.free(str); + calloc.free(hexC); return out; } diff --git a/lib/src/bindings/packbuilder.dart b/lib/src/bindings/packbuilder.dart index 12a4de6..219e32c 100644 --- a/lib/src/bindings/packbuilder.dart +++ b/lib/src/bindings/packbuilder.dart @@ -12,11 +12,14 @@ Pointer init(Pointer repo) { final out = calloc>(); final error = libgit2.git_packbuilder_new(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/patch.dart b/lib/src/bindings/patch.dart index f24724c..4037672 100644 --- a/lib/src/bindings/patch.dart +++ b/lib/src/bindings/patch.dart @@ -42,14 +42,17 @@ Pointer fromBuffers({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(oldAsPathC); calloc.free(newAsPathC); calloc.free(opts); - // We are not freeing buffers because patch object does not have reference to - // underlying buffers. So if the buffer is freed the patch text becomes - // corrupted. + // We are not freeing buffers `oldBufferC` and `newBufferC` because patch + // object does not have reference to underlying buffers. So if the buffer is + // freed the patch text becomes corrupted. - return out.value; + return result; } /// Directly generate a patch from the difference between two blobs. @@ -83,11 +86,14 @@ Pointer fromBlobs({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(oldAsPathC); calloc.free(newAsPathC); calloc.free(opts); - return out.value; + return result; } /// Directly generate a patch from the difference between a blob and a buffer. @@ -124,11 +130,17 @@ Pointer fromBlobAndBuffer({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(oldAsPathC); calloc.free(bufferAsPathC); calloc.free(opts); + // We are not freeing buffer `bufferC` because patch object does not have + // reference to underlying buffers. So if the buffer is freed the patch text + // becomes corrupted. - return out.value; + return result; } /// Return a patch for an entry in the diff list. @@ -145,11 +157,14 @@ Pointer fromDiff({ final out = calloc>(); final error = libgit2.git_patch_from_diff(out, diffPointer, index); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -172,9 +187,13 @@ Map hunk({ final linesInHunk = calloc(); libgit2.git_patch_get_hunk(out, linesInHunk.cast(), patchPointer, hunkIndex); + final hunk = out.value; final linesN = linesInHunk.value; + + calloc.free(out); calloc.free(linesInHunk); - return {'hunk': out.value, 'linesN': linesN}; + + return {'hunk': hunk, 'linesN': linesN}; } /// Get line counts of each type in a patch. @@ -211,7 +230,11 @@ Pointer lines({ final out = calloc>(); libgit2.git_patch_get_line_in_hunk(out, patchPointer, hunkIndex, lineOfHunk); - return out.value; + final result = out.value; + + calloc.free(out); + + return result; } /// Get the content of a patch as a single diff text. @@ -221,12 +244,14 @@ String text(Pointer patch) { final out = calloc(); final error = libgit2.git_patch_to_buf(out, patch); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } diff --git a/lib/src/bindings/rebase.dart b/lib/src/bindings/rebase.dart index 853459c..d0b734a 100644 --- a/lib/src/bindings/rebase.dart +++ b/lib/src/bindings/rebase.dart @@ -40,13 +40,15 @@ Pointer init({ opts, ); + final result = out.value; + + calloc.free(out); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -61,11 +63,14 @@ Pointer open(Pointer repo) { final error = libgit2.git_rebase_open(out, repo, opts); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -100,11 +105,14 @@ Pointer next(Pointer rebase) { final out = calloc>(); final error = libgit2.git_rebase_next(out, rebase); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/reference.dart b/lib/src/bindings/reference.dart index c911e45..7bd2589 100644 --- a/lib/src/bindings/reference.dart +++ b/lib/src/bindings/reference.dart @@ -33,11 +33,14 @@ Pointer resolve(Pointer ref) { final out = calloc>(); final error = libgit2.git_reference_resolve(out, ref); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -56,13 +59,15 @@ Pointer lookup({ final nameC = name.toNativeUtf8().cast(); final error = libgit2.git_reference_lookup(out, repoPointer, nameC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -110,14 +115,16 @@ Pointer rename({ logMessageC, ); + final result = out.value; + + calloc.free(out); calloc.free(newNameC); calloc.free(logMessageC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -149,10 +156,10 @@ bool hasLog({ required Pointer repoPointer, required String name, }) { - final refname = name.toNativeUtf8().cast(); - final result = libgit2.git_reference_has_log(repoPointer, refname); + final nameC = name.toNativeUtf8().cast(); + final result = libgit2.git_reference_has_log(repoPointer, nameC); - calloc.free(refname); + calloc.free(nameC); return result == 1 || false; } @@ -244,14 +251,16 @@ Pointer createDirect({ logMessageC, ); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(logMessageC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -303,15 +312,17 @@ Pointer createSymbolic({ logMessageC, ); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(targetC); calloc.free(logMessageC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -348,13 +359,15 @@ Pointer setTarget({ logMessageC, ); + final result = out.value; + + calloc.free(out); calloc.free(logMessageC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -386,14 +399,16 @@ Pointer setTargetSymbolic({ logMessageC, ); + final result = out.value; + + calloc.free(out); calloc.free(targetC); calloc.free(logMessageC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -421,11 +436,14 @@ Pointer peel({ final out = calloc>(); final error = libgit2.git_reference_peel(out, refPointer, type); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -433,7 +451,12 @@ Pointer peel({ Pointer duplicate(Pointer source) { final out = calloc>(); libgit2.git_reference_dup(out, source); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Free the given reference. diff --git a/lib/src/bindings/reflog.dart b/lib/src/bindings/reflog.dart index 5a5977c..8765ac8 100644 --- a/lib/src/bindings/reflog.dart +++ b/lib/src/bindings/reflog.dart @@ -19,9 +19,12 @@ Pointer read({ final nameC = name.toNativeUtf8().cast(); libgit2.git_reflog_read(out, repoPointer, nameC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); - return out.value; + return result; } /// Write an existing in-memory reflog object back to disk using an atomic file diff --git a/lib/src/bindings/refspec.dart b/lib/src/bindings/refspec.dart index 1656f7f..a7a484a 100644 --- a/lib/src/bindings/refspec.dart +++ b/lib/src/bindings/refspec.dart @@ -66,14 +66,15 @@ String transform({ final nameC = name.toNativeUtf8().cast(); final error = libgit2.git_refspec_transform(out, refspecPointer, nameC); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -90,14 +91,15 @@ String rTransform({ final nameC = name.toNativeUtf8().cast(); final error = libgit2.git_refspec_rtransform(out, refspecPointer, nameC); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } diff --git a/lib/src/bindings/remote.dart b/lib/src/bindings/remote.dart index adae26f..1d65cc4 100644 --- a/lib/src/bindings/remote.dart +++ b/lib/src/bindings/remote.dart @@ -9,8 +9,6 @@ import 'package:libgit2dart/src/oid.dart'; import 'package:libgit2dart/src/util.dart'; /// Get a list of the configured remotes for a repo. -/// -/// Throws a [LibGit2Error] if error occured. List list(Pointer repo) { final out = calloc(); libgit2.git_remote_list(out, repo); @@ -38,13 +36,15 @@ Pointer lookup({ final nameC = name.toNativeUtf8().cast(); final error = libgit2.git_remote_lookup(out, repoPointer, nameC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -62,14 +62,16 @@ Pointer create({ final urlC = url.toNativeUtf8().cast(); final error = libgit2.git_remote_create(out, repoPointer, nameC, urlC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(urlC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -95,15 +97,17 @@ Pointer createWithFetchSpec({ fetchC, ); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(urlC); calloc.free(fetchC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/repository.dart b/lib/src/bindings/repository.dart index 222b9ee..cd0bbe3 100644 --- a/lib/src/bindings/repository.dart +++ b/lib/src/bindings/repository.dart @@ -19,13 +19,15 @@ Pointer open(String path) { final pathC = path.toNativeUtf8().cast(); final error = libgit2.git_repository_open(out, pathC); + final result = out.value; + + calloc.free(out); calloc.free(pathC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -50,7 +52,10 @@ String discover({ calloc.free(ceilingDirsC); final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); calloc.free(out); + return result; } @@ -90,6 +95,9 @@ Pointer init({ final error = libgit2.git_repository_init_ext(out, pathC, opts); + final result = out.value; + + calloc.free(out); calloc.free(pathC); calloc.free(workdirPathC); calloc.free(descriptionC); @@ -99,10 +107,9 @@ Pointer init({ calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -158,6 +165,9 @@ Pointer clone({ final error = libgit2.git_clone(out, urlC, localPathC, cloneOptions); + final result = out.value; + + calloc.free(out); calloc.free(urlC); calloc.free(localPathC); calloc.free(checkoutBranchC); @@ -166,10 +176,9 @@ Pointer clone({ RemoteCallbacks.reset(); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -212,9 +221,9 @@ void setNamespace({ required Pointer repoPointer, String? namespace, }) { - final nmspace = namespace?.toNativeUtf8().cast() ?? nullptr; - libgit2.git_repository_set_namespace(repoPointer, nmspace); - calloc.free(nmspace); + final namespaceC = namespace?.toNativeUtf8().cast() ?? nullptr; + libgit2.git_repository_set_namespace(repoPointer, namespaceC); + calloc.free(namespaceC); } /// Check if a repository is bare or not. @@ -248,11 +257,14 @@ Pointer head(Pointer repo) { final out = calloc>(); final error = libgit2.git_repository_head(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -338,7 +350,12 @@ Map identity(Pointer repo) { Pointer config(Pointer repo) { final out = calloc>(); libgit2.git_repository_config(out, repo); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Get a snapshot of the repository's configuration. @@ -352,7 +369,12 @@ Pointer config(Pointer repo) { Pointer configSnapshot(Pointer repo) { final out = calloc>(); libgit2.git_repository_config_snapshot(out, repo); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Get the Index file for this repository. @@ -364,7 +386,12 @@ Pointer configSnapshot(Pointer repo) { Pointer index(Pointer repo) { final out = calloc>(); libgit2.git_repository_index(out, repo); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Determine if the repository was a shallow clone. @@ -393,12 +420,14 @@ String message(Pointer repo) { final out = calloc(); final error = libgit2.git_repository_message(out, repo); + final result = out.ref.ptr.cast().toDartString(length: out.ref.size); + + libgit2.git_buf_dispose(out); + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.ref.ptr.cast().toDartString(length: out.ref.size); - calloc.free(out); return result; } } @@ -420,11 +449,14 @@ Pointer odb(Pointer repo) { final out = calloc>(); final error = libgit2.git_repository_odb(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -441,11 +473,14 @@ Pointer refdb(Pointer repo) { final out = calloc>(); final error = libgit2.git_repository_refdb(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -517,15 +552,15 @@ void setWorkdir({ required String path, required bool updateGitlink, }) { - final workdir = path.toNativeUtf8().cast(); + final workdirC = path.toNativeUtf8().cast(); final updateGitlinkC = updateGitlink ? 1 : 0; final error = libgit2.git_repository_set_workdir( repoPointer, - workdir, + workdirC, updateGitlinkC, ); - calloc.free(workdir); + calloc.free(workdirC); if (error < 0) { throw LibGit2Error(libgit2.git_error_last()); diff --git a/lib/src/bindings/revparse.dart b/lib/src/bindings/revparse.dart index 89c5e3f..044d581 100644 --- a/lib/src/bindings/revparse.dart +++ b/lib/src/bindings/revparse.dart @@ -46,13 +46,15 @@ Pointer revParseSingle({ final error = libgit2.git_revparse_single(out, repoPointer, specC); + final result = out.value; + + calloc.free(out); calloc.free(specC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -83,18 +85,19 @@ List revParseExt({ specC, ); + final result = []; + result.add(objectOut.value); + if (referenceOut.value != nullptr) { + result.add(referenceOut.value); + } + + calloc.free(objectOut); + calloc.free(referenceOut); calloc.free(specC); if (error < 0) { - calloc.free(objectOut); - calloc.free(referenceOut); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = []; - result.add(objectOut.value); - if (referenceOut.value != nullptr) { - result.add(referenceOut.value); - } return result; } } diff --git a/lib/src/bindings/revwalk.dart b/lib/src/bindings/revwalk.dart index a60be4c..c914553 100644 --- a/lib/src/bindings/revwalk.dart +++ b/lib/src/bindings/revwalk.dart @@ -23,11 +23,14 @@ Pointer create(Pointer repo) { final out = calloc>(); final error = libgit2.git_revwalk_new(out, repo); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -152,10 +155,10 @@ List> walk({ oidPointer: oid, ); result.add(commit); - calloc.free(oid); } else { break; } + calloc.free(oid); } return result; diff --git a/lib/src/bindings/signature.dart b/lib/src/bindings/signature.dart index 2f234ff..af7b365 100644 --- a/lib/src/bindings/signature.dart +++ b/lib/src/bindings/signature.dart @@ -22,14 +22,16 @@ Pointer create({ final emailC = email.toNativeUtf8().cast(); final error = libgit2.git_signature_new(out, nameC, emailC, time, offset); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(emailC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -42,14 +44,16 @@ Pointer now({required String name, required String email}) { final emailC = email.toNativeUtf8().cast(); final error = libgit2.git_signature_now(out, nameC, emailC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(emailC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -61,15 +65,23 @@ Pointer now({required String name, required String email}) { Pointer defaultSignature(Pointer repo) { final out = calloc>(); libgit2.git_signature_default(out, repo); - return out.value; + + final result = out.value; + + calloc.free(out); + + return result; } /// Create a copy of an existing signature. Pointer duplicate(Pointer sig) { final out = calloc>(); libgit2.git_signature_dup(out, sig); + final result = out.value; + calloc.free(out); + return result; } diff --git a/lib/src/bindings/status.dart b/lib/src/bindings/status.dart index 89a12c7..07da663 100644 --- a/lib/src/bindings/status.dart +++ b/lib/src/bindings/status.dart @@ -13,11 +13,14 @@ Pointer listNew(Pointer repo) { final out = calloc>(); final error = libgit2.git_status_list_new(out, repo, nullptr); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -62,14 +65,14 @@ int file({required Pointer repoPointer, required String path}) { final pathC = path.toNativeUtf8().cast(); final error = libgit2.git_status_file(out, repoPointer, pathC); + final result = out.value; + + calloc.free(out); calloc.free(pathC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - final result = out.value; - calloc.free(out); return result; } } diff --git a/lib/src/bindings/submodule.dart b/lib/src/bindings/submodule.dart index 984c62d..baf672c 100644 --- a/lib/src/bindings/submodule.dart +++ b/lib/src/bindings/submodule.dart @@ -55,13 +55,15 @@ Pointer lookup({ final error = libgit2.git_submodule_lookup(out, repoPointer, nameC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -130,11 +132,14 @@ Pointer open(Pointer submodule) { final out = calloc>(); final error = libgit2.git_submodule_open(out, submodule); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -165,14 +170,16 @@ Pointer addSetup({ useGitlinkC, ); + final result = out.value; + + calloc.free(out); calloc.free(urlC); calloc.free(pathC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -229,10 +236,11 @@ int status({ final nameC = name.toNativeUtf8().cast(); libgit2.git_submodule_status(out, repoPointer, nameC, ignore); + final result = out.value; + + calloc.free(out); calloc.free(nameC); - final result = out.value; - calloc.free(out); return result; } diff --git a/lib/src/bindings/tag.dart b/lib/src/bindings/tag.dart index 429a335..f1ed60a 100644 --- a/lib/src/bindings/tag.dart +++ b/lib/src/bindings/tag.dart @@ -36,11 +36,14 @@ Pointer lookup({ final out = calloc>(); final error = libgit2.git_tag_lookup(out, repoPointer, oidPointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -54,11 +57,14 @@ Pointer target(Pointer tag) { final out = calloc>(); final error = libgit2.git_tag_target(out, tag); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/tree.dart b/lib/src/bindings/tree.dart index 33d1f10..489ef9b 100644 --- a/lib/src/bindings/tree.dart +++ b/lib/src/bindings/tree.dart @@ -18,11 +18,14 @@ Pointer lookup({ final out = calloc>(); final error = libgit2.git_tree_lookup(out, repoPointer, oidPointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -82,13 +85,15 @@ Pointer getByPath({ final pathC = path.toNativeUtf8().cast(); final error = libgit2.git_tree_entry_bypath(out, rootPointer, pathC); + final result = out.value; + + calloc.free(out); calloc.free(pathC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/treebuilder.dart b/lib/src/bindings/treebuilder.dart index 757be0b..9bee27f 100644 --- a/lib/src/bindings/treebuilder.dart +++ b/lib/src/bindings/treebuilder.dart @@ -24,11 +24,14 @@ Pointer create({ final out = calloc>(); final error = libgit2.git_treebuilder_new(out, repoPointer, sourcePointer); + final result = out.value; + + calloc.free(out); + if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } diff --git a/lib/src/bindings/worktree.dart b/lib/src/bindings/worktree.dart index 979e908..92581c8 100644 --- a/lib/src/bindings/worktree.dart +++ b/lib/src/bindings/worktree.dart @@ -33,15 +33,17 @@ Pointer create({ final error = libgit2.git_worktree_add(out, repoPointer, nameC, pathC, opts); + final result = out.value; + + calloc.free(out); calloc.free(nameC); calloc.free(pathC); calloc.free(opts); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -56,13 +58,15 @@ Pointer lookup({ final nameC = name.toNativeUtf8().cast(); final error = libgit2.git_worktree_lookup(out, repoPointer, nameC); + final result = out.value; + + calloc.free(out); calloc.free(nameC); if (error < 0) { - calloc.free(out); throw LibGit2Error(libgit2.git_error_last()); } else { - return out.value; + return result; } } @@ -80,7 +84,11 @@ bool isPrunable(Pointer wt) { GIT_WORKTREE_PRUNE_OPTIONS_VERSION, ); - return libgit2.git_worktree_is_prunable(wt, opts) > 0 || false; + final result = libgit2.git_worktree_is_prunable(wt, opts); + + calloc.free(opts); + + return result > 0 || false; } /// Prune working tree.