feat(tag): add bindings and api

This commit is contained in:
Aleksey Kulikov 2021-09-03 12:13:23 +03:00
parent f0803298c8
commit 0cdaa6f8f4
10 changed files with 392 additions and 1 deletions

94
lib/src/tag.dart Normal file
View file

@ -0,0 +1,94 @@
import 'dart:ffi';
import 'bindings/libgit2_bindings.dart';
import 'bindings/tag.dart' as bindings;
import 'bindings/object.dart' as object_bindings;
import 'commit.dart';
import 'oid.dart';
import 'repository.dart';
import 'signature.dart';
import 'enums.dart';
class Tag {
/// Initializes a new instance of [Tag] class from provided
/// [Repository] and [Oid] objects.
///
/// Should be freed with `free()` to release allocated memory.
Tag.lookup(Repository repo, Oid oid) {
_tagPointer = bindings.lookup(repo.pointer, oid.pointer);
}
late final Pointer<git_tag> _tagPointer;
/// Pointer to memory address for allocated tag object.
Pointer<git_tag> get pointer => _tagPointer;
/// Creates a new tag in the repository from provided Oid object.
///
/// A new reference will also be created pointing to this tag object. If force is true
/// and a reference already exists with the given name, it'll be replaced.
///
/// The message will not be cleaned up.
///
/// The tag name will be checked for validity. You must avoid the characters
/// '~', '^', ':', '\', '?', '[', and '*', and the sequences ".." and "@{" which have
/// special meaning to revparse.
///
/// Throws a [LibGit2Error] if error occured.
static Oid create({
required Repository repository,
required String tagName,
required Oid target,
required GitObject targetType,
required Signature tagger,
required String message,
bool force = false,
}) {
// add 1 to GitObject enum index to match libgit2
final object = object_bindings.lookup(
repository.pointer,
target.pointer,
targetType.index + 1,
);
final result = bindings.create(
repository.pointer,
tagName,
object,
tagger.pointer,
message,
force,
);
object_bindings.free(object);
return Oid(result);
}
/// Get the tagged object of a tag.
///
/// This method performs a repository lookup for the given object and returns it.
///
/// Throws a [LibGit2Error] if error occured.
Commit get target => Commit(bindings.target(_tagPointer).cast());
/// Get the id of a tag.
Oid get id => Oid(bindings.id(_tagPointer));
/// Returns the name of a tag.
String get name => bindings.name(_tagPointer);
/// Returns the message of a tag.
String get message => bindings.message(_tagPointer);
/// Returns the tagger (author) of a tag if there is one.
Signature? get tagger {
final sigPointer = bindings.tagger(_tagPointer);
if (sigPointer != nullptr) {
return Signature(sigPointer);
} else {
return null;
}
}
/// Releases memory allocated for tag object.
void free() => bindings.free(_tagPointer);
}