mirror of
https://github.com/SkinnyMind/libgit2dart.git
synced 2025-05-05 04:39:07 -04:00
feat(tree): add bindings and api
This commit is contained in:
parent
6bd04bb09d
commit
84ee4be945
22 changed files with 316 additions and 84 deletions
|
@ -1,9 +1,9 @@
|
|||
import 'dart:ffi';
|
||||
import 'package:libgit2dart/src/repository.dart';
|
||||
|
||||
import 'bindings/libgit2_bindings.dart';
|
||||
import 'bindings/tree.dart' as bindings;
|
||||
import 'repository.dart';
|
||||
import 'oid.dart';
|
||||
import 'enums.dart';
|
||||
import 'util.dart';
|
||||
|
||||
class Tree {
|
||||
|
@ -17,8 +17,8 @@ class Tree {
|
|||
/// [Repository] and [Oid] objects.
|
||||
///
|
||||
/// Should be freed with `free()` to release allocated memory.
|
||||
Tree.lookup(Repository repo, Oid id) {
|
||||
_treePointer = bindings.lookup(repo.pointer, id.pointer);
|
||||
Tree.lookup(Repository repo, Oid oid) {
|
||||
_treePointer = bindings.lookup(repo.pointer, oid.pointer);
|
||||
}
|
||||
|
||||
late final Pointer<git_tree> _treePointer;
|
||||
|
@ -26,8 +26,89 @@ class Tree {
|
|||
/// Pointer to memory address for allocated tree object.
|
||||
Pointer<git_tree> get pointer => _treePointer;
|
||||
|
||||
/// Releases memory allocated for tree object.
|
||||
void free() {
|
||||
bindings.free(_treePointer);
|
||||
/// Returns a list with tree entries of a tree.
|
||||
List<TreeEntry> get entries {
|
||||
final entryCount = bindings.entryCount(_treePointer);
|
||||
var result = <TreeEntry>[];
|
||||
for (var i = 0; i < entryCount; i++) {
|
||||
result.add(TreeEntry(bindings.getByIndex(_treePointer, i)));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Looksup a tree entry in the tree.
|
||||
///
|
||||
/// If integer [value] is provided, lookup is done by entry position in the tree.
|
||||
///
|
||||
/// If string [value] is provided, lookup is done by entry filename.
|
||||
///
|
||||
/// If provided string [value] is a path to file, lookup is done by path. In that case
|
||||
/// returned object should be freed explicitly.
|
||||
TreeEntry operator [](Object value) {
|
||||
if (value is int) {
|
||||
return TreeEntry(bindings.getByIndex(_treePointer, value));
|
||||
} else if (value is String && value.contains('/')) {
|
||||
return TreeEntry(bindings.getByPath(_treePointer, value));
|
||||
} else if (value is String) {
|
||||
return TreeEntry(bindings.getByName(_treePointer, value));
|
||||
} else {
|
||||
throw ArgumentError.value(
|
||||
'$value should be either index position, filename or path');
|
||||
}
|
||||
}
|
||||
|
||||
/// Releases memory allocated for tree object.
|
||||
void free() => bindings.free(_treePointer);
|
||||
}
|
||||
|
||||
class TreeEntry {
|
||||
/// Initializes a new instance of [TreeEntry] class.
|
||||
TreeEntry(this._treeEntryPointer);
|
||||
|
||||
/// Pointer to memory address for allocated tree entry object.
|
||||
final Pointer<git_tree_entry> _treeEntryPointer;
|
||||
|
||||
/// Returns the Oid of the object pointed by the entry.
|
||||
Oid get id => Oid(bindings.entryId(_treeEntryPointer));
|
||||
|
||||
/// Returns the filename of a tree entry.
|
||||
String get name => bindings.entryName(_treeEntryPointer);
|
||||
|
||||
/// Returns the UNIX file attributes of a tree entry.
|
||||
GitFilemode get filemode {
|
||||
return intToGitFilemode(bindings.entryFilemode(_treeEntryPointer));
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(other) {
|
||||
return (other is TreeEntry) &&
|
||||
(bindings.compare(_treeEntryPointer, other._treeEntryPointer) == 0);
|
||||
}
|
||||
|
||||
bool operator <(other) {
|
||||
return (other is TreeEntry) &&
|
||||
(bindings.compare(_treeEntryPointer, other._treeEntryPointer) == -1);
|
||||
}
|
||||
|
||||
bool operator <=(other) {
|
||||
return (other is TreeEntry) &&
|
||||
(bindings.compare(_treeEntryPointer, other._treeEntryPointer) == -1);
|
||||
}
|
||||
|
||||
bool operator >(other) {
|
||||
return (other is TreeEntry) &&
|
||||
(bindings.compare(_treeEntryPointer, other._treeEntryPointer) == 1);
|
||||
}
|
||||
|
||||
bool operator >=(other) {
|
||||
return (other is TreeEntry) &&
|
||||
(bindings.compare(_treeEntryPointer, other._treeEntryPointer) == 1);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => _treeEntryPointer.address.hashCode;
|
||||
|
||||
/// Releases memory allocated for tree entry object.
|
||||
void free() => bindings.entryFree(_treeEntryPointer);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue