From 56713da6483523251ae05225ea3e875e28dd0587 Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Sat, 4 Sep 2021 13:52:29 +0300 Subject: [PATCH] fix(tag): tag can point to any type of git object --- lib/src/bindings/tag.dart | 3 +++ lib/src/tag.dart | 21 +++++++++++++++++++-- test/repository_test.dart | 2 +- test/tag_test.dart | 4 ++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/src/bindings/tag.dart b/lib/src/bindings/tag.dart index 63bdc57..1758d6d 100644 --- a/lib/src/bindings/tag.dart +++ b/lib/src/bindings/tag.dart @@ -34,6 +34,9 @@ Pointer target(Pointer tag) { } } +/// Get the type of a tag's tagged object. +int targetType(Pointer tag) => libgit2.git_tag_target_type(tag); + /// Get the id of a tag. Pointer id(Pointer tag) => libgit2.git_tag_id(tag); diff --git a/lib/src/tag.dart b/lib/src/tag.dart index f8bc9ac..8de67b1 100644 --- a/lib/src/tag.dart +++ b/lib/src/tag.dart @@ -1,5 +1,7 @@ import 'dart:ffi'; +import 'package:libgit2dart/libgit2dart.dart'; + import 'bindings/libgit2_bindings.dart'; import 'bindings/tag.dart' as bindings; import 'bindings/object.dart' as object_bindings; @@ -73,12 +75,27 @@ class Tag { return Oid(result); } - /// Get the tagged object of a tag. + /// Get the tagged object (commit, tree, blob, tag) of a tag. /// /// This method performs a repository lookup for the given object and returns it. /// + /// Returned object should be explicitly downcasted to one of four of git object types. + /// /// Throws a [LibGit2Error] if error occured. - Commit get target => Commit(bindings.target(_tagPointer).cast()); + Object get target { + final type = bindings.targetType(_tagPointer); + final object = bindings.target(_tagPointer); + + if (type == GitObject.commit.value) { + return Commit(object.cast()); + } else if (type == GitObject.tree.value) { + return Tree(object.cast()); + } else if (type == GitObject.blob.value) { + return Blob(object.cast()); + } else { + return Tag(object.cast()); + } + } /// Get the id of a tag. Oid get id => Oid(bindings.id(_tagPointer)); diff --git a/test/repository_test.dart b/test/repository_test.dart index e0d2e15..c7f1f2c 100644 --- a/test/repository_test.dart +++ b/test/repository_test.dart @@ -325,7 +325,7 @@ void main() { final newTag = repo[oid.sha] as Tag; final tagger = newTag.tagger; - final newTagTarget = newTag.target; + final newTagTarget = newTag.target as Commit; expect(newTag.id.sha, '131a5eb6b7a880b5096c550ee7351aeae7b95a42'); expect(newTag.name, tagName); diff --git a/test/tag_test.dart b/test/tag_test.dart index 5751512..cdb1548 100644 --- a/test/tag_test.dart +++ b/test/tag_test.dart @@ -40,7 +40,7 @@ void main() { time: 1630599723, offset: 180, ); - final target = tag.target; + final target = tag.target as Commit; final tagger = tag.tagger; expect(tag.id.sha, tagSHA); @@ -74,7 +74,7 @@ void main() { final newTag = Tag.lookup(repo, oid.sha); final tagger = newTag.tagger; - final newTagTarget = newTag.target; + final newTagTarget = newTag.target as Commit; expect(newTag.id.sha, '131a5eb6b7a880b5096c550ee7351aeae7b95a42'); expect(newTag.name, tagName);