From ed67a4e307b352513060c7efb037e145f11a7ca5 Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Thu, 2 Feb 2023 15:29:31 +0300 Subject: [PATCH 1/4] fix: lookup package in correct location of Dart/Flutter cached packages (#81) --- bin/setup.dart | 36 +++++++++++++++++------------------- lib/src/util.dart | 31 ++++++++++++++++++++----------- pubspec.yaml | 2 +- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/bin/setup.dart b/bin/setup.dart index a71be0d..74bce74 100644 --- a/bin/setup.dart +++ b/bin/setup.dart @@ -5,7 +5,6 @@ import 'package:libgit2dart/libgit2dart.dart'; import 'package:libgit2dart/src/libgit2.dart'; import 'package:libgit2dart/src/util.dart'; import 'package:path/path.dart' as path; -import 'package:pub_cache/pub_cache.dart'; /// Copies prebuilt libgit2 library from package in '.pub_cache' into correct /// directory for [platform]. @@ -23,27 +22,24 @@ Future copyLibrary(String platform) async { ); } } else { - String? checkCache(PubCache pubCache) => - pubCache.getLatestVersion('libgit2dart')?.resolve()?.location.path; - - final libPath = checkCache(PubCache()) ?? - checkCache( - PubCache( - Directory( - path.join(Platform.environment['FLUTTER_ROOT']!, '.pub-cache'), - ), - ), - ); + final libPath = checkCache(); final libName = getLibName(); stdout.writeln('Copying libgit2 for $platform'); - final destination = path.join(libDir, platform); - Directory(destination).createSync(recursive: true); - File(path.join(libPath!, platform, libName)).copySync( - path.join(destination, libName), - ); + if (libPath == null) { + stdout.writeln( + "Couldn't find libgit2dart package.\n" + "Make sure to run 'dart pub get' to resolve dependencies.", + ); + } else { + final destination = path.join(libDir, platform); + Directory(destination).createSync(recursive: true); + File(path.join(libPath, platform, libName)).copySync( + path.join(destination, libName), + ); - stdout.writeln('Done! libgit2 for $platform is now available!'); + stdout.writeln('Done! libgit2 for $platform is now available!'); + } } } @@ -57,7 +53,9 @@ class CleanCommand extends Command { @override void run() { stdout.writeln('Cleaning...'); - Directory(libDir).deleteSync(recursive: true); + if (Directory(libDir).existsSync()) { + Directory(libDir).deleteSync(recursive: true); + } } } diff --git a/lib/src/util.dart b/lib/src/util.dart index be4a017..3ba855c 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,12 +1,13 @@ // coverage:ignore-file +import 'dart:convert'; import 'dart:ffi'; 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'; +import 'package:pub_semver/pub_semver.dart'; const libgit2Version = '1.5.0'; final libDir = path.join('.dart_tool', 'libgit2'); @@ -25,6 +26,20 @@ String getLibName() { return 'libgit2-$libgit2Version.$ext'; } +/// Returns location of the most recent verison of the libgit2dart package +/// contained in the cache. +String? checkCache() { + final cache = json.decode( + Process.runSync('dart', ['pub', 'cache', 'list']).stdout as String, + ) as Map; + final packages = cache['packages'] as Map; + final libPackages = packages['libgit2dart'] as Map?; + final versions = libPackages?.keys.map((e) => Version.parse(e)).toList(); + final latestVersion = libPackages?[Version.primary(versions!).toString()] + as Map?; + return latestVersion?['location'] as String?; +} + /// Checks if [File]/[Link] exists for [path]. bool _doesFileExist(String path) { return File(path).existsSync() || Link(path).existsSync(); @@ -65,16 +80,10 @@ String? _resolveLibPath(String name) { } } - 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')) { - libPath = checkCache(PubCache()); + // If lib is in '.pub_cache' folder. + final cachedLocation = checkCache(); + if (cachedLocation != null) { + libPath = path.join(cachedLocation, Platform.operatingSystem, name); if (_doesFileExist(libPath)) return libPath; } diff --git a/pubspec.yaml b/pubspec.yaml index 1663ddc..260dbb0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: ffi: ^2.0.0 meta: ^1.7.0 path: ^1.8.1 - pub_cache: ^0.3.1 + pub_semver: ^2.1.3 dev_dependencies: ffigen: ^6.0.1 From 7c6060b02c1007137d415279eb2d977257ab06fb Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Thu, 2 Feb 2023 16:15:24 +0300 Subject: [PATCH 2/4] test(credentials): enable some of the previously disabled tests for Linux (#82) --- test/credentials_test.dart | 92 +++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/test/credentials_test.dart b/test/credentials_test.dart index cdfaa1c..f198093 100644 --- a/test/credentials_test.dart +++ b/test/credentials_test.dart @@ -83,32 +83,28 @@ void main() { cloneDir.deleteSync(recursive: true); }); - test( - testOn: '!linux', - 'clones repository with provided keypair', - () { - final cloneDir = Directory.systemTemp.createTempSync('clone'); - final keypair = Keypair( - username: 'git', - pubKey: p.join('test', 'assets', 'keys', 'id_rsa.pub'), - privateKey: p.join('test', 'assets', 'keys', 'id_rsa'), - passPhrase: 'empty', - ); - final callbacks = Callbacks(credentials: keypair); + test('clones repository with provided keypair', () { + final cloneDir = Directory.systemTemp.createTempSync('clone'); + final keypair = Keypair( + username: 'git', + pubKey: p.join('test', 'assets', 'keys', 'id_rsa.pub'), + privateKey: p.join('test', 'assets', 'keys', 'id_rsa'), + passPhrase: 'empty', + ); + final callbacks = Callbacks(credentials: keypair); - final repo = Repository.clone( - url: 'ssh://git@github.com/libgit2/TestGitRepository', - localPath: cloneDir.path, - callbacks: callbacks, - ); + final repo = Repository.clone( + url: 'ssh://git@github.com/libgit2/TestGitRepository', + localPath: cloneDir.path, + callbacks: callbacks, + ); - expect(repo.isEmpty, false); + expect(repo.isEmpty, false); - if (Platform.isLinux || Platform.isMacOS) { - cloneDir.deleteSync(recursive: true); - } - }, - ); + if (Platform.isLinux || Platform.isMacOS) { + cloneDir.deleteSync(recursive: true); + } + }); test('throws when no credentials is provided', () { final cloneDir = Directory.systemTemp.createTempSync('clone'); @@ -189,36 +185,32 @@ void main() { cloneDir.deleteSync(recursive: true); }); - test( - testOn: '!linux', - 'clones repository with provided keypair from memory', - () { - final cloneDir = Directory.systemTemp.createTempSync('clone'); - final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) - .readAsStringSync(); - final privateKey = - File(p.join('test', 'assets', 'keys', 'id_rsa')).readAsStringSync(); - final keypair = KeypairFromMemory( - username: 'git', - pubKey: pubKey, - privateKey: privateKey, - passPhrase: 'empty', - ); - final callbacks = Callbacks(credentials: keypair); + test('clones repository with provided keypair from memory', () { + final cloneDir = Directory.systemTemp.createTempSync('clone'); + final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) + .readAsStringSync(); + final privateKey = + File(p.join('test', 'assets', 'keys', 'id_rsa')).readAsStringSync(); + final keypair = KeypairFromMemory( + username: 'git', + pubKey: pubKey, + privateKey: privateKey, + passPhrase: 'empty', + ); + final callbacks = Callbacks(credentials: keypair); - final repo = Repository.clone( - url: 'ssh://git@github.com/libgit2/TestGitRepository', - localPath: cloneDir.path, - callbacks: callbacks, - ); + final repo = Repository.clone( + url: 'ssh://git@github.com/libgit2/TestGitRepository', + localPath: cloneDir.path, + callbacks: callbacks, + ); - expect(repo.isEmpty, false); + expect(repo.isEmpty, false); - if (Platform.isLinux || Platform.isMacOS) { - cloneDir.deleteSync(recursive: true); - } - }, - ); + if (Platform.isLinux || Platform.isMacOS) { + cloneDir.deleteSync(recursive: true); + } + }); test('throws when provided keypair from memory is incorrect', () { final cloneDir = Directory.systemTemp.createTempSync('clone'); From e1ca7e81a2222fb8787eaf7898147bd55a650d05 Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Thu, 2 Feb 2023 16:20:28 +0300 Subject: [PATCH 3/4] chore: remove coverage badge --- README.md | 3 --- coverage.sh | 2 +- coverage_badge.svg | 20 -------------------- 3 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 coverage_badge.svg diff --git a/README.md b/README.md index 370e00b..e1c6679 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # libgit2dart -![Coverage](coverage_badge.svg) - **Dart bindings to libgit2** libgit2dart package provides ability to use [libgit2](https://github.com/libgit2/libgit2) in Dart/Flutter. @@ -705,7 +703,6 @@ To run all tests and generate coverage report make sure to have activated packag ```sh $ dart pub global activate coverage -$ dart pub global activate flutter_coverage_badge ``` And run: diff --git a/coverage.sh b/coverage.sh index 79f52cb..1ea3ef2 100755 --- a/coverage.sh +++ b/coverage.sh @@ -1,2 +1,2 @@ #!/bin/bash -dart test --coverage=coverage --test-randomize-ordering-seed random && dart pub global run coverage:format_coverage --lcov --check-ignore --in=coverage --out=coverage/lcov.info --report-on=lib && genhtml coverage/lcov.info -o coverage/ && dart pub global run flutter_coverage_badge \ No newline at end of file +dart test --coverage=coverage --test-randomize-ordering-seed random && dart pub global run coverage:format_coverage --lcov --check-ignore --in=coverage --out=coverage/lcov.info --report-on=lib && genhtml coverage/lcov.info -o coverage/ \ No newline at end of file diff --git a/coverage_badge.svg b/coverage_badge.svg deleted file mode 100644 index 0c4efc0..0000000 --- a/coverage_badge.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - coverage - coverage - 100% - 100% - - From b66662f33cfbe2fd4881f63775fa44ae12961afa Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Fri, 3 Feb 2023 12:54:44 +0300 Subject: [PATCH 4/4] chore: v1.2.2 --- CHANGELOG.md | 4 ++++ macos/libgit2dart.podspec | 2 +- pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4606182..8479242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.2 + +- fix: lookup package in correct location of Dart/Flutter cached packages + ## 1.2.1 - fix: use default location of Flutter's '.pub_cache' folder diff --git a/macos/libgit2dart.podspec b/macos/libgit2dart.podspec index e2f4a77..5ccfc67 100644 --- a/macos/libgit2dart.podspec +++ b/macos/libgit2dart.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'libgit2dart' - s.version = '1.2.1' + s.version = '1.2.2' s.summary = 'Dart bindings to libgit2.' s.description = <<-DESC Dart bindings to libgit2. diff --git a/pubspec.yaml b/pubspec.yaml index 260dbb0..d0c47a5 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.2.1 +version: 1.2.2 homepage: https://github.com/SkinnyMind/libgit2dart