diff --git a/CHANGELOG.md b/CHANGELOG.md index 7156b40..1737cad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.1.2 + +- fix: lookup library in Flutter's .pub_cache folder + +- feat: add ability to limit number of commits to walk in revision walk + ## 1.1.1 - fix: lookup library in correct locations 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/lib/src/util.dart b/lib/src/util.dart index 001e488..d81b8c7 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -6,6 +6,7 @@ import 'dart:io'; import 'package:libgit2dart/src/bindings/libgit2_bindings.dart'; import 'package:libgit2dart/src/bindings/libgit2_opts_bindings.dart'; import 'package:path/path.dart' as path; +import 'package:pub_cache/pub_cache.dart'; const libgit2Version = '1.4.3'; final libDir = path.join('.dart_tool', 'libgit2'); @@ -52,6 +53,21 @@ String? _resolveLibPath(String name) { libPath = path.join(path.dirname(Platform.resolvedExecutable), 'lib', name); if (_doesFileExist(libPath)) return libPath; + String checkCache(PubCache pubCache) { + final pubCacheDir = + pubCache.getLatestVersion('libgit2dart')!.resolve()!.location; + return path.join(pubCacheDir.path, Platform.operatingSystem, name); + } + + // If lib is in Flutter's '.pub_cache' folder. + final env = Platform.environment; + if (env.containsKey('FLUTTER_ROOT')) { + final flutterPubCache = + PubCache(Directory(path.join(env['FLUTTER_ROOT']!, '.pub-cache'))); + libPath = checkCache(flutterPubCache); + if (_doesFileExist(libPath)) return libPath; + } + return null; } diff --git a/macos/libgit2dart.podspec b/macos/libgit2dart.podspec index 756018f..af9dfa3 100644 --- a/macos/libgit2dart.podspec +++ b/macos/libgit2dart.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'libgit2dart' - s.version = '1.1.1' + s.version = '1.1.2' s.summary = 'Dart bindings to libgit2.' s.description = <<-DESC Dart bindings to libgit2. diff --git a/pubspec.yaml b/pubspec.yaml index 696d650..5d564d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: libgit2dart description: Dart bindings to libgit2, provides ability to use libgit2 library in Dart and Flutter. -version: 1.1.1 +version: 1.1.2 homepage: https://github.com/SkinnyMind/libgit2dart 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);