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