feat(revwalk): add ability to limit number of commits to walk

This commit is contained in:
Aleksey Kulikov 2022-06-09 17:08:17 +03:00
parent a708d54b0a
commit a2915624bd
3 changed files with 30 additions and 4 deletions

View file

@ -145,11 +145,12 @@ void pushRange({
List<Pointer<git_commit>> walk({
required Pointer<git_repository> repoPointer,
required Pointer<git_revwalk> walkerPointer,
required int limit,
}) {
final result = <Pointer<git_commit>>[];
var error = 0;
while (error == 0) {
void next() {
final oid = calloc<git_oid>();
error = libgit2.git_revwalk_next(oid, walkerPointer);
if (error == 0) {
@ -158,10 +159,21 @@ List<Pointer<git_commit>> walk({
oidPointer: oid,
);
result.add(commit);
calloc.free(oid);
} else {
break;
calloc.free(oid);
return;
}
}
if (limit == 0) {
while (error == 0) {
next();
}
} else {
for (var i = 0; i < limit; i++) {
next();
}
calloc.free(oid);
}
return result;

View file

@ -19,11 +19,15 @@ class RevWalk {
/// Returns the list of commits from the revision walk.
///
/// [limit] is optional number of commits to walk (by default walks through
/// all of the commits pushed onto the walker).
///
/// Default sorting is reverse chronological order (default in git).
List<Commit> walk() {
List<Commit> walk({int limit = 0}) {
final pointers = bindings.walk(
repoPointer: bindings.repository(_revWalkPointer),
walkerPointer: _revWalkPointer,
limit: limit,
);
return pointers.map((e) => Commit(e)).toList();