From c88b75b0fd60d06ac8fd859297754ddfdf92ffd0 Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Wed, 6 Oct 2021 15:36:17 +0300 Subject: [PATCH] feat(tag): add more bindings and api methods --- lib/src/bindings/tag.dart | 44 +++++++++++++++++++++++++++++++++++++++ lib/src/tag.dart | 17 +++++++++++++++ test/tag_test.dart | 11 ++++++++++ 3 files changed, 72 insertions(+) diff --git a/lib/src/bindings/tag.dart b/lib/src/bindings/tag.dart index bc40ed5..e274ec8 100644 --- a/lib/src/bindings/tag.dart +++ b/lib/src/bindings/tag.dart @@ -4,6 +4,26 @@ import '../error.dart'; import 'libgit2_bindings.dart'; import '../util.dart'; +/// Fill a list with all the tags in the repository. +/// +/// Throws a [LibGit2Error] if error occured. +List list(Pointer repo) { + final out = calloc(); + final error = libgit2.git_tag_list(out, repo); + + var result = []; + + if (error < 0) { + throw LibGit2Error(libgit2.git_error_last()); + } else { + for (var i = 0; i < out.ref.count; i++) { + result.add(out.ref.strings[i].cast().toDartString()); + } + calloc.free(out); + return result; + } +} + /// Lookup a tag object from the repository. /// /// Throws a [LibGit2Error] if error occured. @@ -99,5 +119,29 @@ Pointer create({ } } +/// Delete an existing tag reference. +/// +/// The tag name will be checked for validity. +/// +/// Throws a [LibGit2Error] if error occured. +void delete({ + required Pointer repoPointer, + required String tagName, +}) { + final tagNameC = tagName.toNativeUtf8().cast(); + final error = libgit2.git_tag_delete(repoPointer, tagNameC); + + calloc.free(tagNameC); + + if (error < 0) { + throw LibGit2Error(libgit2.git_error_last()); + } +} + +/// Get the repository that contains the tag. +Pointer owner(Pointer tag) { + return libgit2.git_tag_owner(tag); +} + /// Close an open tag to release memory. void free(Pointer tag) => libgit2.git_tag_free(tag); diff --git a/lib/src/tag.dart b/lib/src/tag.dart index 31cd8e0..637e47c 100644 --- a/lib/src/tag.dart +++ b/lib/src/tag.dart @@ -74,6 +74,13 @@ class Tag { return Oid(result); } + /// Returns a list with all the tags in the repository. + /// + /// Throws a [LibGit2Error] if error occured. + static List list(Repository repo) { + return bindings.list(repo.pointer); + } + /// Get the tagged object (commit, tree, blob, tag) of a tag. /// /// This method performs a repository lookup for the given object and returns it. @@ -122,6 +129,16 @@ class Tag { } } + /// Deletes an existing tag reference. + /// + /// The tag name will be checked for validity. + /// + /// Throws a [LibGit2Error] if error occured. + void delete() { + final owner = bindings.owner(_tagPointer); + bindings.delete(repoPointer: owner, tagName: name); + } + /// Releases memory allocated for tag object. void free() => bindings.free(_tagPointer); } diff --git a/test/tag_test.dart b/test/tag_test.dart index b6f06e9..afb9696 100644 --- a/test/tag_test.dart +++ b/test/tag_test.dart @@ -80,5 +80,16 @@ void main() { newTagTarget.free(); signature.free(); }); + + test('returns list of tags in repository', () { + expect(Tag.list(repo), ['v0.1', 'v0.2']); + }); + + test('successfully deletes tag', () { + expect(Tag.list(repo), ['v0.1', 'v0.2']); + + tag.delete(); + expect(Tag.list(repo), ['v0.1']); + }); }); }