From 48e2240c73252078247b1f0fa5f7bf19875112c6 Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Thu, 9 Jun 2022 17:15:55 +0300 Subject: [PATCH] feat(revwalk): add ability to limit number of commits to walk (#65) --- lib/src/bindings/revwalk.dart | 18 +++++++++++++++--- lib/src/revwalk.dart | 6 +++++- test/revwalk_test.dart | 10 ++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/src/bindings/revwalk.dart b/lib/src/bindings/revwalk.dart index 93d9bf6..1869067 100644 --- a/lib/src/bindings/revwalk.dart +++ b/lib/src/bindings/revwalk.dart @@ -145,11 +145,12 @@ void pushRange({ List> walk({ required Pointer repoPointer, required Pointer walkerPointer, + required int limit, }) { final result = >[]; var error = 0; - while (error == 0) { + void next() { final oid = calloc(); error = libgit2.git_revwalk_next(oid, walkerPointer); if (error == 0) { @@ -158,10 +159,21 @@ List> 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; diff --git a/lib/src/revwalk.dart b/lib/src/revwalk.dart index c3a08c7..610ebb9 100644 --- a/lib/src/revwalk.dart +++ b/lib/src/revwalk.dart @@ -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 walk() { + List walk({int limit = 0}) { final pointers = bindings.walk( repoPointer: bindings.repository(_revWalkPointer), walkerPointer: _revWalkPointer, + limit: limit, ); return pointers.map((e) => Commit(e)).toList(); diff --git a/test/revwalk_test.dart b/test/revwalk_test.dart index e491ab0..5b3c9a0 100644 --- a/test/revwalk_test.dart +++ b/test/revwalk_test.dart @@ -50,6 +50,16 @@ void main() { } }); + test('walks only number of commits provided with limit', () { + final walker = RevWalk(repo); + + walker.push(repo[log.first]); + final commits = walker.walk(limit: 1); + + expect(commits.length, 1); + expect(commits[0].oid.sha, log[0]); + }); + test('returns list of commits with reverse sorting', () { final walker = RevWalk(repo);