test(reference): add tests for symbolic refs

This commit is contained in:
Aleksey Kulikov 2021-08-04 16:11:29 +03:00
parent 2f896e6180
commit 6643527f2d
3 changed files with 40 additions and 8 deletions

View file

@ -14,6 +14,28 @@ int referenceType(Pointer<git_reference> ref) =>
Pointer<git_oid>? target(Pointer<git_reference> ref) =>
libgit2.git_reference_target(ref);
/// Resolve a symbolic reference to a direct reference.
///
/// This method iteratively peels a symbolic reference until it resolves
/// to a direct reference to an OID.
///
/// The peeled reference must be freed manually once it's no longer needed.
///
/// If a direct reference is passed as an argument, a copy of that reference is returned.
/// This copy must be manually freed too.
///
/// Throws a [LibGit2Error] if error occured.
Pointer<git_reference> resolve(Pointer<git_reference> ref) {
final out = calloc<Pointer<git_reference>>();
final error = libgit2.git_reference_resolve(out, ref);
if (error < 0) {
throw LibGit2Error(libgit2.git_error_last());
} else {
return out.value;
}
}
/// Lookup a reference by name in a repository.
///
/// The returned reference must be freed by the user.

View file

@ -60,18 +60,18 @@ class Reference {
: ReferenceType.symbolic;
}
/// Returns the SHA hex of the OID pointed to by a direct reference.
///
/// Only available if the reference is direct (i.e. an object id reference, not a symbolic one).
/// Returns the SHA hex of the OID pointed to by a reference.
String get target {
final oidPointer = bindings.target(_refPointer);
late final Pointer<git_oid>? oidPointer;
final sha = '';
if (oidPointer == nullptr) {
return sha;
if (type == ReferenceType.direct) {
oidPointer = bindings.target(_refPointer);
} else {
final oid = Oid(oidPointer!);
return oid.sha;
oidPointer = bindings.target(bindings.resolve(_refPointer));
}
return oidPointer == nullptr ? sha : Oid(oidPointer!).sha;
}
/// Returns the full name of a reference.