diff --git a/bin/setup.dart b/bin/setup.dart index b8b0b9c..a87ea7f 100644 --- a/bin/setup.dart +++ b/bin/setup.dart @@ -1,33 +1,22 @@ import 'dart:io'; -import 'package:archive/archive.dart'; import 'package:args/command_runner.dart'; import 'package:cli_util/cli_logging.dart' show Ansi, Logger; import 'package:libgit2dart/src/util.dart'; +import 'package:path/path.dart' as path; +import 'package:pub_cache/pub_cache.dart'; +/// Checks whether libgit2 library is present in directory for [platform]. bool libgit2IsPresent(String platform) { final result = File.fromUri( - Directory.current.uri - .resolve('.dart_tool/libgit2/$platform/${getLibName()}'), + Directory.current.uri.resolve(path.join(libDir, platform, getLibName())), ).existsSync(); return result; } -/// Extracts a tar.gz file. -void extract(String fileName, String dir) { - final tarGzFile = File(fileName).readAsBytesSync(); - final archive = GZipDecoder().decodeBytes(tarGzFile, verify: true); - final tarData = TarDecoder().decodeBytes(archive, verify: true); - for (final file in tarData) { - File('$dir${file.name}') - ..createSync(recursive: true) - ..writeAsBytesSync(file.content as List); - } -} - -/// Downloads libgit2 from GitHub releases, extracts and places it in correct -/// directory. -Future download(String platform) async { +/// Copies prebuilt libgit2 library from package in '.pub_cache' into correct +/// directory for [platform]. +Future copyLibrary(String platform) async { final logger = Logger.standard(); final ansi = Ansi(Ansi.terminalSupportsAnsi); @@ -37,39 +26,21 @@ Future download(String platform) async { } else { logger.stdout( '${ansi.red}libgit2 for $platform is outdated.\n' - 'If it is dart application run: \n' + 'Please run following commands: \n' 'dart run libgit2dart:setup clean\n' - 'dart run libgit2dart:setup\n\n' - 'If it is flutter application run: \n' - 'flutter pub run libgit2dart:setup clean\n' - 'flutter pub run libgit2dart:setup\n\n', + 'dart run libgit2dart:setup\n\n', ); } } else { - final fileName = '$platform.tar.gz'; - final downloadUrl = '$libUrl$fileName'; - logger.stdout('Downloading libgit2 for $platform'); - logger.stdout(downloadUrl); + final pubCache = PubCache(); + final pubCacheDir = + pubCache.getLatestVersion('libgit2dart')!.resolve()!.location; + final libUri = pubCacheDir.uri.resolve(path.join(platform, getLibName())); - try { - final httpClient = HttpClient(); - final request = await httpClient.getUrl(Uri.parse(downloadUrl)); - final response = await request.close(); - final fileSink = File(fileName).openWrite(); - await response.pipe(fileSink); - await fileSink.flush(); - await fileSink.close(); - httpClient.close(); - } catch (error) { - Exception("Can't download. Check your internet connection."); - } - - logger.stdout('${ansi.yellow}Extracting libgit2 for $platform${ansi.none}'); - Directory('$libDir$platform/').createSync(recursive: true); - extract(fileName, '$libDir$platform/'); - logger.stdout('${ansi.green}Done! Cleaning up...'); - - File(fileName).deleteSync(); + logger.stdout('Copying libgit2 for $platform'); + final destination = path.join(libDir, platform); + Directory(destination).createSync(recursive: true); + File.fromUri(libUri).copySync(destination); logger.stdout( '${ansi.green}Done! libgit2 for $platform is now available!' @@ -80,7 +51,7 @@ Future download(String platform) async { class CleanCommand extends Command { @override - String get description => 'Cleans downloaded libraries.'; + String get description => 'Cleans copied libgit2 libraries.'; @override String get name => 'clean'; @@ -88,7 +59,7 @@ class CleanCommand extends Command { @override void run() { final logger = Logger.standard(); - logger.stdout('cleaning...'); + logger.stdout('Cleaning...'); Directory(libDir).deleteSync(recursive: true); } } @@ -96,9 +67,9 @@ class CleanCommand extends Command { void main(List args) { final runner = CommandRunner( 'setup', - 'Downloads the libgit2 library.', + 'Setups the libgit2 library.', ); runner.addCommand(CleanCommand()); - (args.isEmpty) ? download(Platform.operatingSystem) : runner.run(args); + (args.isEmpty) ? copyLibrary(Platform.operatingSystem) : runner.run(args); } diff --git a/lib/src/util.dart b/lib/src/util.dart index 2fad713..3d34d51 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -6,12 +6,9 @@ import 'dart:io'; import 'package:cli_util/cli_logging.dart' show Ansi, Logger; import 'package:ffi/ffi.dart'; import 'package:libgit2dart/src/bindings/libgit2_bindings.dart'; -import 'package:path/path.dart' as p; +import 'package:path/path.dart' as path; import 'package:pub_cache/pub_cache.dart'; -const tag = 'libs-v1.3.0'; -const libUrl = - 'https://github.com/SkinnyMind/libgit2dart/releases/download/$tag/'; const libgit2Version = '1.3.0'; const libDir = '.dart_tool/libgit2/'; @@ -45,7 +42,7 @@ String? _resolveLibUri(String name) { // If lib is in Present Working Directory's '.dart_tool/libgit2/[platform]' folder. libUri = Directory.current.uri.resolve( - p.join(libDir, Platform.operatingSystem, name), + path.join(libDir, Platform.operatingSystem, name), ); if (_doesFileExist(libUri)) { return libUri.toFilePath(windows: Platform.isWindows); @@ -53,7 +50,7 @@ String? _resolveLibUri(String name) { // If lib is in Present Working Directory's '[platform]' folder. libUri = Directory.current.uri.resolve( - p.join(Platform.operatingSystem, name), + path.join(Platform.operatingSystem, name), ); if (_doesFileExist(libUri)) { return libUri.toFilePath(windows: Platform.isWindows); @@ -63,7 +60,7 @@ String? _resolveLibUri(String name) { final pubCache = PubCache(); final pubCacheDir = pubCache.getLatestVersion('libgit2dart')!.resolve()!.location; - libUri = pubCacheDir.uri.resolve(p.join(Platform.operatingSystem, name)); + libUri = pubCacheDir.uri.resolve(path.join(Platform.operatingSystem, name)); if (_doesFileExist(libUri)) { return libUri.toFilePath(windows: Platform.isWindows); } @@ -82,21 +79,8 @@ DynamicLibrary loadLibrary(String name) { final ansi = Ansi(Ansi.terminalSupportsAnsi); logger.stderr( - '${ansi.red}Failed to open the library. Make sure that required ' - 'library is in place.${ansi.none}', - ); - logger.stdout( - 'To download the library, please run the following command from the ' - 'root of your project:', - ); - logger.stdout( - '${ansi.yellow}dart run libgit2dart:setup${ansi.none} for ' - 'dart application', - ); - logger.stdout(ansi.none); - logger.stdout( - '${ansi.yellow}flutter pub run libgit2dart:setup${ansi.none} for ' - 'flutter application', + '${ansi.red}Failed to open the library. Make sure that libgit2 ' + 'library is bundled with the application.${ansi.none}', ); logger.stdout(ansi.none); rethrow;