Revert "Merge dependency services (#3303)"
This reverts commit 0a6252c80bfc599bc7fc1d19798aa62537643193.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 6177eba..f469a93 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:lints/recommended.yaml
+include: package:pedantic/analysis_options.yaml
analyzer:
errors:
@@ -12,27 +12,52 @@
linter:
rules:
- avoid_catching_errors
+ - avoid_function_literals_in_foreach_calls
- avoid_private_typedef_functions
- avoid_redundant_argument_values
+ - avoid_renaming_method_parameters
- avoid_returning_null_for_future
+ - avoid_returning_null_for_void
- avoid_unused_constructor_parameters
- avoid_void_async
+ - await_only_futures
+ - camel_case_types
- cancel_subscriptions
+ - control_flow_in_finally
- directives_ordering
+ - empty_statements
+ - file_names
+ - implementation_imports
+ - iterable_contains_unrelated_type
+ - list_remove_unrelated_type
- missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
- no_runtimeType_toString
+ - non_constant_identifier_names
- only_throw_errors
+ - overridden_fields
- package_api_docs
+ - package_names
+ - package_prefixed_library_names
- prefer_asserts_in_initializer_lists
- prefer_const_declarations
+ - prefer_function_declarations_over_variables
+ - prefer_initializing_formals
+ - prefer_inlined_adds
+ - prefer_is_not_operator
+ - prefer_null_aware_operators
- prefer_relative_imports
- - prefer_single_quotes
+ - prefer_typing_uninitialized_variables
+ - prefer_void_to_null
- sort_pub_dependencies
- test_types_in_equals
- throw_in_finally
- - unawaited_futures
+ - unnecessary_brace_in_string_interps
+ - unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_null_aware_assignments
+ - unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
+ - unnecessary_string_interpolations
+ - void_checks
diff --git a/bin/dependency_services.dart b/bin/dependency_services.dart
index 1e7b4c1..3b73165 100644
--- a/bin/dependency_services.dart
+++ b/bin/dependency_services.dart
@@ -97,7 +97,7 @@
}
@override
- log.Verbosity get verbosity => log.Verbosity.normal;
+ log.Verbosity get verbosity => log.Verbosity.NORMAL;
}
Future<void> main(List<String> arguments) async {
diff --git a/doc/repository-spec-v2.md b/doc/repository-spec-v2.md
index 6ddfd0f..6db7763 100644
--- a/doc/repository-spec-v2.md
+++ b/doc/repository-spec-v2.md
@@ -227,7 +227,7 @@
"replacedBy": "<package>", /* optional field, if isDiscontinued == true */
"latest": {
"version": "<version>",
- "retracted": true || false, /* optional field, false if omitted */
+ "isRetracted": true || false, /* optional field, false if omitted */
"archive_url": "https://.../archive.tar.gz",
"pubspec": {
/* pubspec contents as JSON object */
@@ -236,7 +236,7 @@
"versions": [
{
"version": "<package>",
- "retracted": true || false, /* optional field, false if omitted */
+ "isRetracted": true || false, /* optional field, false if omitted */
"archive_url": "https://.../archive.tar.gz",
"pubspec": {
/* pubspec contents as JSON object */
@@ -371,9 +371,7 @@
archive size, or enforce any other repository specific constraints.
This upload flow allows for archives to be uploaded directly to a signed POST
-URL for [S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/HTTPPOSTExamples.html),
-[GCS](https://cloud.google.com/storage/docs/xml-api/post-object-forms) or
-similar blob storage service. Both the
+URL for S3, GCS or similar blob storage service. Both the
`<multipart-upload-url>` and `<finalize-upload-url>` is allowed to contain
query-string parameters, and both of these URLs need only be temporary.
diff --git a/lib/pub.dart b/lib/pub.dart
index 71de9d6..5b3054f 100644
--- a/lib/pub.dart
+++ b/lib/pub.dart
@@ -18,12 +18,8 @@
///
/// If [analytics] is given, pub will use that analytics instance to send
/// statistics about resolutions.
-///
-/// [isVerbose] should return `true` (after argument resolution) if the
-/// embedding top-level is in verbose mode.
-Command<int> pubCommand(
- {PubAnalytics? analytics, required bool Function() isVerbose}) =>
- PubEmbeddableCommand(analytics, isVerbose);
+Command<int> pubCommand({PubAnalytics? analytics}) =>
+ PubEmbeddableCommand(analytics);
/// Support for the `pub` toplevel command.
@Deprecated('Use [pubCommand] instead.')
diff --git a/lib/src/authentication/client.dart b/lib/src/authentication/client.dart
index a6001ec..1f37149 100644
--- a/lib/src/authentication/client.dart
+++ b/lib/src/authentication/client.dart
@@ -8,6 +8,7 @@
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
+import '../exceptions.dart';
import '../http.dart';
import '../log.dart' as log;
import '../system_cache.dart';
@@ -21,17 +22,14 @@
/// Constructs Http client wrapper that injects `authorization` header to
/// requests and handles authentication errors.
///
- /// [_credential] might be `null`. In that case `authorization` header will not
+ /// [credential] might be `null`. In that case `authorization` header will not
/// be injected to requests.
- _AuthenticatedClient(this._inner, this._credential);
+ _AuthenticatedClient(this._inner, this.credential);
final http.BaseClient _inner;
/// Authentication scheme that could be used for authenticating requests.
- final Credential? _credential;
-
- /// Detected that [_credential] are invalid, happens when server responds 401.
- bool _detectInvalidCredentials = false;
+ final Credential? credential;
@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
@@ -42,16 +40,15 @@
// to given serverBaseUrl. Otherwise credential leaks might ocurr when
// archive_url hosted on 3rd party server that should not receive
// credentials of the first party.
- if (_credential != null &&
- _credential!.canAuthenticate(request.url.toString())) {
+ if (credential != null &&
+ credential!.canAuthenticate(request.url.toString())) {
request.headers[HttpHeaders.authorizationHeader] =
- await _credential!.getAuthorizationHeaderValue();
+ await credential!.getAuthorizationHeaderValue();
}
try {
final response = await _inner.send(request);
if (response.statusCode == 401) {
- _detectInvalidCredentials = true;
_throwAuthException(response);
}
return response;
@@ -127,17 +124,31 @@
Future<T> Function(http.Client) fn,
) async {
final credential = systemCache.tokenStore.findCredential(hostedUrl);
- final client = _AuthenticatedClient(httpClient, credential);
+ final http.Client client = _AuthenticatedClient(httpClient, credential);
try {
return await fn(client);
- } finally {
- if (client._detectInvalidCredentials) {
- // try to remove the credential, if we detected that it is invalid!
- final removed = systemCache.tokenStore.removeCredential(hostedUrl);
- if (removed) {
+ } on AuthenticationException catch (error) {
+ var message = '';
+
+ if (error.statusCode == 401) {
+ if (systemCache.tokenStore.removeCredential(hostedUrl)) {
log.warning('Invalid token for $hostedUrl deleted.');
}
+ message = '$hostedUrl package repository requested authentication! '
+ 'You can provide credential using:\n'
+ ' pub token add $hostedUrl';
}
+ if (error.statusCode == 403) {
+ message = 'Insufficient permissions to the resource in $hostedUrl '
+ 'package repository. You can modify credential using:\n'
+ ' pub token add $hostedUrl';
+ }
+
+ if (error.serverMessage?.isNotEmpty == true) {
+ message += '\n${error.serverMessage}';
+ }
+
+ throw DataException(message);
}
}
diff --git a/lib/src/command.dart b/lib/src/command.dart
index ee62392..ea3c2d3 100644
--- a/lib/src/command.dart
+++ b/lib/src/command.dart
@@ -10,15 +10,16 @@
import 'package:collection/collection.dart' show IterableExtension;
import 'package:http/http.dart' as http;
import 'package:meta/meta.dart';
-import 'package:path/path.dart' as p;
import 'authentication/token_store.dart';
+import 'command_runner.dart';
import 'entrypoint.dart';
import 'exceptions.dart';
import 'exit_codes.dart' as exit_codes;
import 'git.dart' as git;
import 'global_packages.dart';
import 'http.dart';
+import 'io.dart';
import 'log.dart' as log;
import 'pub_embeddable_command.dart';
import 'sdk.dart';
@@ -55,11 +56,7 @@
return a;
}
- String get directory =>
- (argResults.options.contains('directory')
- ? argResults['directory']
- : null) ??
- _pubTopLevel.directory;
+ String get directory => argResults['directory'] ?? _pubTopLevel.directory;
late final SystemCache cache = SystemCache(isOffline: isOffline);
@@ -174,11 +171,12 @@
@nonVirtual
FutureOr<int> run() async {
computeCommand(_pubTopLevel.argResults);
-
+ if (_pubTopLevel.trace) {
+ log.recordTranscript();
+ }
log.verbosity = _pubTopLevel.verbosity;
log.fine('Pub ${sdk.version}');
- var crashed = false;
try {
await captureErrors<void>(() async => runProtected(),
captureStackChains: _pubTopLevel.captureStackChains);
@@ -190,61 +188,31 @@
log.exception(error, chain);
if (_pubTopLevel.trace) {
- log.dumpTranscriptToStdErr();
+ log.dumpTranscript();
} else if (!isUserFacingException(error)) {
- log.error('''
-This is an unexpected error. The full log and other details are collected in:
+ log.error("""
+This is an unexpected error. Please run
- $transcriptPath
+ dart pub --trace ${_topCommand.name} ${_topCommand.argResults!.arguments.map(protectArgument).join(' ')}
-Consider creating an issue on https://github.com/dart-lang/pub/issues/new
-and attaching the relevant parts of that log file.
-''');
- crashed = true;
+and include the logs in an issue on https://github.com/dart-lang/pub/issues/new
+""");
}
return _chooseExitCode(error);
} finally {
- final verbose = _pubTopLevel.verbosity == log.Verbosity.all;
-
- // Write the whole log transcript to file.
- if (verbose || crashed) {
- // Escape the argument for users to copy-paste in bash.
- // Wrap with single quotation, and use '\'' to insert single quote, as
- // long as we have no spaces this doesn't create a new argument.
- String protectArgument(String x) =>
- RegExp(r'^[a-zA-Z0-9-_]+$').stringMatch(x) == null
- ? "'${x.replaceAll("'", r"'\''")}'"
- : x;
-
- late final Entrypoint? e;
- try {
- e = entrypoint;
- } on ApplicationException {
- e = null;
- }
- log.dumpTranscriptToFile(
- transcriptPath,
- 'dart pub ${_topCommand.argResults!.arguments.map(protectArgument).join(' ')}',
- e,
- );
-
- if (!crashed) {
- log.message('Logs written to $transcriptPath.');
- }
- }
httpClient.close();
}
}
/// Returns the appropriate exit code for [exception], falling back on 1 if no
/// appropriate exit code could be found.
- int _chooseExitCode(Object exception) {
+ int _chooseExitCode(exception) {
if (exception is SolveFailure) {
var packageNotFound = exception.packageNotFound;
if (packageNotFound != null) exception = packageNotFound;
}
while (exception is WrappedException && exception.innerError is Exception) {
- exception = exception.innerError!;
+ exception = exception.innerError;
}
if (exception is HttpException ||
@@ -314,10 +282,6 @@
}
_command = list.join(' ');
}
-
- String get transcriptPath {
- return p.join(cache.rootDir, 'log', 'pub_log.txt');
- }
}
abstract class PubTopLevel {
diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart
index 3557104..09cc426 100644
--- a/lib/src/command/add.dart
+++ b/lib/src/command/add.dart
@@ -13,7 +13,6 @@
import '../exceptions.dart';
import '../git.dart';
import '../io.dart';
-import '../language_version.dart';
import '../log.dart' as log;
import '../package.dart';
import '../package_name.dart';
@@ -34,10 +33,9 @@
@override
String get name => 'add';
@override
- String get description => 'Add dependencies to pubspec.yaml.';
+ String get description => 'Add a dependency to pubspec.yaml.';
@override
- String get argumentsDescription =>
- '<package>[:<constraint>] [<package2>[:<constraint2>]...] [options]';
+ String get argumentsDescription => '<package>[:<constraint>] [options]';
@override
String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-add';
@override
@@ -55,24 +53,19 @@
bool get hasGitOptions => gitUrl != null || gitRef != null || gitPath != null;
bool get hasHostOptions => hostUrl != null;
- bool get isHosted => !hasGitOptions && path == null && path == null;
-
AddCommand() {
argParser.addFlag('dev',
abbr: 'd',
negatable: false,
- help: 'Adds to the development dependencies instead.');
+ help: 'Adds package to the development dependencies instead.');
argParser.addOption('git-url', help: 'Git URL of the package');
argParser.addOption('git-ref',
help: 'Git branch or commit to be retrieved');
argParser.addOption('git-path', help: 'Path of git package in repository');
argParser.addOption('hosted-url', help: 'URL of package host server');
- argParser.addOption('path', help: 'Add package from local path');
- argParser.addOption('sdk',
- help: 'add package from SDK source',
- allowed: ['flutter'],
- valueHelp: '[flutter]');
+ argParser.addOption('path', help: 'Local path');
+ argParser.addOption('sdk', help: 'SDK source for package');
argParser.addFlag(
'example',
help:
@@ -91,30 +84,23 @@
argParser.addFlag('precompile',
help: 'Build executables in immediate dependencies.');
argParser.addOption('directory',
- abbr: 'C', help: 'Run this in the directory <dir>.', valueHelp: 'dir');
- argParser.addFlag('legacy-packages-file',
- help: 'Generate the legacy ".packages" file', negatable: false);
+ abbr: 'C', help: 'Run this in the directory<dir>.', valueHelp: 'dir');
}
@override
Future<void> runProtected() async {
if (argResults.rest.isEmpty) {
- usageException('Must specify at least one package to be added.');
- } else if (argResults.rest.length > 1 && gitUrl != null) {
- usageException('Can only add a single git package at a time.');
- } else if (argResults.rest.length > 1 && path != null) {
- usageException('Can only add a single local package at a time.');
+ usageException('Must specify a package to be added.');
+ } else if (argResults.rest.length > 1) {
+ usageException('Takes only a single argument.');
}
- final languageVersion = entrypoint.root.pubspec.languageVersion;
- final updates =
- argResults.rest.map((p) => _parsePackage(p, languageVersion)).toList();
- var updatedPubSpec = entrypoint.root.pubspec;
- for (final update in updates) {
- /// Perform version resolution in-memory.
- updatedPubSpec =
- await _addPackageToPubspec(updatedPubSpec, update.packageRange);
- }
+ final packageInformation = _parsePackage(argResults.rest.first);
+ final package = packageInformation.first;
+
+ /// Perform version resolution in-memory.
+ final updatedPubSpec =
+ await _addPackageToPubspec(entrypoint.root.pubspec, package);
late SolveResult solveResult;
@@ -125,11 +111,9 @@
/// that a resolution exists before we update pubspec.yaml.
// TODO(sigurdm): We should really use a spinner here.
solveResult = await resolveVersions(
- SolveType.upgrade, cache, Package.inMemory(updatedPubSpec));
+ SolveType.UPGRADE, cache, Package.inMemory(updatedPubSpec));
} on GitException {
- final packageRange = updates.first.packageRange;
- dataError(
- 'Unable to resolve package "${packageRange.name}" with the given '
+ dataError('Unable to resolve package "${package.name}" with the given '
'git parameters.');
} on SolveFailure catch (e) {
dataError(e.message);
@@ -138,63 +122,59 @@
dataError(e.message);
}
- /// Verify the results for each package.
- for (final update in updates) {
- final packageRange = update.packageRange;
- final name = packageRange.name;
- final resultPackage = solveResult.packages
- .firstWhere((packageId) => packageId.name == name);
+ final resultPackage = solveResult.packages
+ .firstWhere((packageId) => packageId.name == package.name);
- /// Assert that [resultPackage] is within the original user's expectations.
- var constraint = packageRange.constraint;
- if (!constraint.allows(resultPackage.version)) {
- var dependencyOverrides = updatedPubSpec.dependencyOverrides;
- if (dependencyOverrides.isNotEmpty) {
- dataError('"$name" resolved to "${resultPackage.version}" which '
- 'does not satisfy constraint "$constraint". This could be '
- 'caused by "dependency_overrides".');
- }
- dataError('"$name" resolved to "${resultPackage.version}" which '
- 'does not satisfy constraint "$constraint".');
+ /// Assert that [resultPackage] is within the original user's expectations.
+ var constraint = package.constraint;
+ if (!constraint.allows(resultPackage.version)) {
+ var dependencyOverrides = updatedPubSpec.dependencyOverrides;
+ if (dependencyOverrides.isNotEmpty) {
+ dataError(
+ '"${package.name}" resolved to "${resultPackage.version}" which '
+ 'does not satisfy constraint "${package.constraint}". This could be '
+ 'caused by "dependency_overrides".');
}
+ dataError(
+ '"${package.name}" resolved to "${resultPackage.version}" which '
+ 'does not satisfy constraint "${package.constraint}".');
}
+
if (isDryRun) {
/// Even if it is a dry run, run `acquireDependencies` so that the user
/// gets a report on the other packages that might change version due
/// to this new dependency.
final newRoot = Package.inMemory(updatedPubSpec);
- await Entrypoint.inMemory(newRoot, cache,
- solveResult: solveResult, lockFile: entrypoint.lockFile)
- .acquireDependencies(SolveType.get,
+ // TODO(jonasfj): Stop abusing Entrypoint.global for dry-run output
+ await Entrypoint.global(newRoot, entrypoint.lockFile, cache,
+ solveResult: solveResult)
+ .acquireDependencies(SolveType.GET,
dryRun: true,
precompile: argResults['precompile'],
- analytics: analytics,
- generateDotPackages: false);
+ analytics: analytics);
} else {
/// Update the `pubspec.yaml` before calling [acquireDependencies] to
/// ensure that the modification timestamp on `pubspec.lock` and
/// `.dart_tool/package_config.json` is newer than `pubspec.yaml`,
/// ensuring that [entrypoint.assertUptoDate] will pass.
- _updatePubspec(solveResult.packages, updates, isDev);
+ _updatePubspec(resultPackage, packageInformation, isDev);
/// Create a new [Entrypoint] since we have to reprocess the updated
/// pubspec file.
final updatedEntrypoint = Entrypoint(directory, cache);
await updatedEntrypoint.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
precompile: argResults['precompile'],
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
if (argResults['example'] && entrypoint.example != null) {
await entrypoint.example!.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
precompile: argResults['precompile'],
onlyReportSuccessOrFailure: true,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
}
}
@@ -294,7 +274,9 @@
///
/// If any of the other git options are defined when `--git-url` is not
/// defined, an error will be thrown.
- _ParseResult _parsePackage(String package, LanguageVersion languageVersion) {
+ Pair<PackageRange, dynamic> _parsePackage(String package) {
+ ArgumentError.checkNotNull(package, 'package');
+
final _conflictingFlagSets = [
['git-url', 'git-ref', 'git-path'],
['hosted-url'],
@@ -398,18 +380,13 @@
.withConstraint(constraint ?? VersionConstraint.any);
pubspecInformation = {'sdk': sdk};
} else {
- // Hosted
- final Object? hostInfo;
- if (hasHostOptions) {
- hostInfo = languageVersion.supportsShorterHostedSyntax
- ? hostUrl
- : {'url': hostUrl, 'name': packageName};
- pubspecInformation = {
- 'hosted': hostInfo,
- };
- } else {
- hostInfo = null;
+ final hostInfo =
+ hasHostOptions ? {'url': hostUrl, 'name': packageName} : null;
+
+ if (hostInfo == null) {
pubspecInformation = constraint?.toString();
+ } else {
+ pubspecInformation = {'hosted': hostInfo};
}
packageRange = cache.hosted.source
@@ -431,64 +408,66 @@
};
}
- return _ParseResult(packageRange, pubspecInformation);
+ return Pair(packageRange, pubspecInformation);
}
/// Writes the changes to the pubspec file.
- void _updatePubspec(List<PackageId> resultPackages,
- List<_ParseResult> updates, bool isDevelopment) {
+ void _updatePubspec(PackageId resultPackage,
+ Pair<PackageRange, dynamic> packageInformation, bool isDevelopment) {
+ ArgumentError.checkNotNull(resultPackage, 'resultPackage');
+ ArgumentError.checkNotNull(packageInformation, 'pubspecInformation');
+
+ final package = packageInformation.first;
+ var pubspecInformation = packageInformation.last;
+
+ if ((sdk != null || hasHostOptions) &&
+ pubspecInformation is Map &&
+ pubspecInformation['version'] == null) {
+ /// We cannot simply assign the value of version since it is likely that
+ /// [pubspecInformation] takes on the type
+ /// [Map<String, Map<String, String>>]
+ pubspecInformation = {
+ ...pubspecInformation,
+ 'version': '^${resultPackage.version}'
+ };
+ }
+
+ final dependencyKey = isDevelopment ? 'dev_dependencies' : 'dependencies';
+ final packagePath = [dependencyKey, package.name];
+
final yamlEditor = YamlEditor(readTextFile(entrypoint.pubspecPath));
log.io('Reading ${entrypoint.pubspecPath}.');
log.fine('Contents:\n$yamlEditor');
- for (final update in updates) {
- final packageRange = update.packageRange;
- final name = packageRange.name;
- final resultId = resultPackages.firstWhere((id) => id.name == name);
- var description = update.description;
+ /// Handle situations where the user might not have the dependencies or
+ /// dev_dependencies map.
+ if (yamlEditor.parseAt([dependencyKey],
+ orElse: () => YamlScalar.wrap(null)).value ==
+ null) {
+ yamlEditor.update([dependencyKey],
+ {package.name: pubspecInformation ?? '^${resultPackage.version}'});
+ } else {
+ yamlEditor.update(
+ packagePath, pubspecInformation ?? '^${resultPackage.version}');
+ }
- if (isHosted) {
- final inferredConstraint =
- VersionConstraint.compatibleWith(resultId.version).toString();
- if (description == null) {
- description = inferredConstraint;
- } else if (description is Map && description['version'] == null) {
- /// We cannot simply assign the value of version since it is likely that
- /// [description] takes on the type
- /// [Map<String, Map<String, String>>]
- description = {...description, 'version': '^${resultId.version}'};
+ log.fine('Added ${package.name} to "$dependencyKey".');
+
+ /// Remove the package from dev_dependencies if we are adding it to
+ /// dependencies. Refer to [_addPackageToPubspec] for additional discussion.
+ if (!isDevelopment) {
+ final devDependenciesNode = yamlEditor
+ .parseAt(['dev_dependencies'], orElse: () => YamlScalar.wrap(null));
+
+ if (devDependenciesNode is YamlMap &&
+ devDependenciesNode.containsKey(package.name)) {
+ if (devDependenciesNode.length == 1) {
+ yamlEditor.remove(['dev_dependencies']);
+ } else {
+ yamlEditor.remove(['dev_dependencies', package.name]);
}
- }
- final dependencyKey = isDevelopment ? 'dev_dependencies' : 'dependencies';
- final packagePath = [dependencyKey, name];
-
- /// Ensure we have a [dependencyKey] map in the `pubspec.yaml`.
- if (yamlEditor.parseAt([dependencyKey],
- orElse: () => YamlScalar.wrap(null)).value ==
- null) {
- yamlEditor.update([dependencyKey], {});
- }
- yamlEditor.update(packagePath, description);
-
- log.fine('Added ${packageRange.name} to "$dependencyKey".');
-
- /// Remove the package from dev_dependencies if we are adding it to
- /// dependencies. Refer to [_addPackageToPubspec] for additional discussion.
- if (!isDevelopment) {
- final devDependenciesNode = yamlEditor
- .parseAt(['dev_dependencies'], orElse: () => YamlScalar.wrap(null));
-
- if (devDependenciesNode is YamlMap &&
- devDependenciesNode.containsKey(name)) {
- if (devDependenciesNode.length == 1) {
- yamlEditor.remove(['dev_dependencies']);
- } else {
- yamlEditor.remove(['dev_dependencies', name]);
- }
-
- log.fine('Removed $name from "dev_dependencies".');
- }
+ log.fine('Removed ${package.name} from "dev_dependencies".');
}
}
@@ -496,9 +475,3 @@
writeTextFile(entrypoint.pubspecPath, yamlEditor.toString());
}
}
-
-class _ParseResult {
- PackageRange packageRange;
- Object? description;
- _ParseResult(this.packageRange, this.description);
-}
diff --git a/lib/src/command/cache_repair.dart b/lib/src/command/cache_repair.dart
index 74968be..41bae2b 100644
--- a/lib/src/command/cache_repair.dart
+++ b/lib/src/command/cache_repair.dart
@@ -23,8 +23,6 @@
@override
Future<void> runProtected() async {
- // Delete any eventual temp-files left in the cache.
- cache.deleteTempDir();
// Repair every cached source.
final repairResults = (await Future.wait(
cache.sources.all.map(cache.source).map((source) async {
diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index 161a352..ca5c247 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -93,7 +93,7 @@
}
final resolution = await tryResolveVersions(
- SolveType.get,
+ SolveType.GET,
cache,
Package.inMemory(pubspec),
lockFile: lockFile,
@@ -210,7 +210,7 @@
/// resolution was found.
Future<List<PackageId>?> _tryResolve(Pubspec pubspec, SystemCache cache) async {
final solveResult = await tryResolveVersions(
- SolveType.upgrade,
+ SolveType.UPGRADE,
cache,
Package.inMemory(pubspec),
);
@@ -346,8 +346,8 @@
await log.warningsOnlyUnlessTerminal(
() async {
// This will fail if the new configuration does not resolve.
- await Entrypoint(directory, cache).acquireDependencies(SolveType.get,
- analytics: null, generateDotPackages: false);
+ await Entrypoint(directory, cache)
+ .acquireDependencies(SolveType.GET, analytics: null);
},
);
// Dummy message.
diff --git a/lib/src/command/downgrade.dart b/lib/src/command/downgrade.dart
index fce5ef3..5dd9d41 100644
--- a/lib/src/command/downgrade.dart
+++ b/lib/src/command/downgrade.dart
@@ -42,8 +42,6 @@
argParser.addOption('directory',
abbr: 'C', help: 'Run this in the directory<dir>.', valueHelp: 'dir');
- argParser.addFlag('legacy-packages-file',
- help: 'Generate the legacy ".packages" file', negatable: false);
}
@override
@@ -55,21 +53,19 @@
var dryRun = argResults['dry-run'];
await entrypoint.acquireDependencies(
- SolveType.downgrade,
+ SolveType.DOWNGRADE,
unlock: argResults.rest,
dryRun: dryRun,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
var example = entrypoint.example;
if (argResults['example'] && example != null) {
await example.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
unlock: argResults.rest,
dryRun: dryRun,
onlyReportSuccessOrFailure: true,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
}
diff --git a/lib/src/command/get.dart b/lib/src/command/get.dart
index 7b8906c..9255e1e 100644
--- a/lib/src/command/get.dart
+++ b/lib/src/command/get.dart
@@ -33,9 +33,6 @@
argParser.addFlag('packages-dir', hide: true);
- argParser.addFlag('legacy-packages-file',
- help: 'Generate the legacy ".packages" file', negatable: false);
-
argParser.addFlag(
'example',
help: 'Also run in `example/` (if it exists).',
@@ -53,23 +50,19 @@
'The --packages-dir flag is no longer used and does nothing.'));
}
await entrypoint.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
dryRun: argResults['dry-run'],
precompile: argResults['precompile'],
- generateDotPackages: argResults['legacy-packages-file'],
analytics: analytics,
);
var example = entrypoint.example;
if (argResults['example'] && example != null) {
- await example.acquireDependencies(
- SolveType.get,
- dryRun: argResults['dry-run'],
- precompile: argResults['precompile'],
- generateDotPackages: argResults['legacy-packages-file'],
- analytics: analytics,
- onlyReportSuccessOrFailure: true,
- );
+ await example.acquireDependencies(SolveType.GET,
+ dryRun: argResults['dry-run'],
+ precompile: argResults['precompile'],
+ onlyReportSuccessOrFailure: true,
+ analytics: analytics);
}
}
}
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index c927e07..325d482 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -91,7 +91,7 @@
try {
await log.progress('Uploading', () async {
- var newUri = server.resolve('api/packages/versions/new');
+ var newUri = server.resolve('/api/packages/versions/new');
var response = await client.get(newUri, headers: pubApiHeaders);
var parameters = parseJsonResponse(response);
@@ -120,22 +120,6 @@
handleJsonSuccess(
await client.get(Uri.parse(location), headers: pubApiHeaders));
});
- } on AuthenticationException catch (error) {
- var msg = '';
- if (error.statusCode == 401) {
- msg += '$server package repository requested authentication!\n'
- 'You can provide credentials using:\n'
- ' pub token add $server\n';
- }
- if (error.statusCode == 403) {
- msg += 'Insufficient permissions to the resource at the $server '
- 'package repository.\nYou can modify credentials using:\n'
- ' pub token add $server\n';
- }
- if (error.serverMessage != null) {
- msg += '\n' + error.serverMessage! + '\n';
- }
- dataError(msg + log.red('Authentication failed!'));
} on PubHttpException catch (error) {
var url = error.response.request!.url;
if (url == cloudStorageUrl) {
diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 0d78c11..4384048 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -366,7 +366,7 @@
/// resolution was found.
Future<List<PackageId>?> _tryResolve(Pubspec pubspec, SystemCache cache) async {
final solveResult = await tryResolveVersions(
- SolveType.upgrade,
+ SolveType.UPGRADE,
cache,
Package.inMemory(pubspec),
);
@@ -807,9 +807,6 @@
_overridden == other._overridden &&
_id.source == other._id.source &&
_pubspec.version == other._pubspec.version;
-
- @override
- int get hashCode => Object.hash(_pubspec.version, _id.source, _overridden);
}
class _PackageDetails implements Comparable<_PackageDetails> {
diff --git a/lib/src/command/remove.dart b/lib/src/command/remove.dart
index 82a9547..c7c674a 100644
--- a/lib/src/command/remove.dart
+++ b/lib/src/command/remove.dart
@@ -50,9 +50,6 @@
argParser.addOption('directory',
abbr: 'C', help: 'Run this in the directory<dir>.', valueHelp: 'dir');
-
- argParser.addFlag('legacy-packages-file',
- help: 'Generate the legacy ".packages" file', negatable: false);
}
@override
@@ -68,12 +65,11 @@
final newPubspec = _removePackagesFromPubspec(rootPubspec, packages);
final newRoot = Package.inMemory(newPubspec);
- await Entrypoint.inMemory(newRoot, cache, lockFile: entrypoint.lockFile)
- .acquireDependencies(SolveType.get,
+ await Entrypoint.global(newRoot, entrypoint.lockFile, cache)
+ .acquireDependencies(SolveType.GET,
precompile: argResults['precompile'],
dryRun: true,
- analytics: null,
- generateDotPackages: false);
+ analytics: null);
} else {
/// Update the pubspec.
_writeRemovalToPubspec(packages);
@@ -82,20 +78,18 @@
/// pubspec file.
final updatedEntrypoint = Entrypoint(directory, cache);
await updatedEntrypoint.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
precompile: argResults['precompile'],
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
var example = entrypoint.example;
if (argResults['example'] && example != null) {
await example.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
precompile: argResults['precompile'],
onlyReportSuccessOrFailure: true,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
}
}
diff --git a/lib/src/command/token_add.dart b/lib/src/command/token_add.dart
index caf3b8b..fddc0cc 100644
--- a/lib/src/command/token_add.dart
+++ b/lib/src/command/token_add.dart
@@ -57,11 +57,17 @@
} on FormatException catch (e) {
usageException('Invalid [hosted-url]: "$rawHostedUrl"\n'
'${e.message}');
+ } on TimeoutException catch (_) {
+ // Timeout is added to readLine call to make sure automated jobs doesn't
+ // get stuck on noop state if user forget to pipe token to the 'token add'
+ // command. This behavior might be removed.
+ throw ApplicationException('Token is not provided within 15 minutes.');
}
}
Future<void> _addTokenFromStdin(Uri hostedUrl) async {
- final token = await stdinPrompt('Enter secret token:', echoMode: false);
+ final token = await stdinPrompt('Enter secret token:', echoMode: false)
+ .timeout(const Duration(minutes: 15));
if (token.isEmpty) {
usageException('Token is not provided.');
}
diff --git a/lib/src/command/upgrade.dart b/lib/src/command/upgrade.dart
index 0dc5fb7..8e44abf 100644
--- a/lib/src/command/upgrade.dart
+++ b/lib/src/command/upgrade.dart
@@ -56,9 +56,6 @@
argParser.addFlag('packages-dir', hide: true);
- argParser.addFlag('legacy-packages-file',
- help: 'Generate the legacy ".packages" file', negatable: false);
-
argParser.addFlag(
'major-versions',
help: 'Upgrades packages to their latest resolvable versions, '
@@ -83,8 +80,6 @@
bool get _precompile => argResults['precompile'];
- bool get _packagesFile => argResults['legacy-packages-file'];
-
bool get _upgradeNullSafety =>
argResults['nullsafety'] || argResults['null-safety'];
@@ -126,12 +121,11 @@
Future<void> _runUpgrade(Entrypoint e, {bool onlySummary = false}) async {
await e.acquireDependencies(
- SolveType.upgrade,
+ SolveType.UPGRADE,
unlock: argResults.rest,
dryRun: _dryRun,
precompile: _precompile,
onlyReportSuccessOrFailure: onlySummary,
- generateDotPackages: _packagesFile,
analytics: analytics,
);
_showOfflineWarning();
@@ -185,7 +179,7 @@
final resolvedPackages = <String, PackageId>{};
final solveResult = await log.spinner('Resolving dependencies', () async {
return await resolveVersions(
- SolveType.upgrade,
+ SolveType.UPGRADE,
cache,
Package.inMemory(resolvablePubspec),
);
@@ -224,37 +218,32 @@
resolvedPackage.version,
));
}
- final newPubspecText = _updatePubspec(changes);
if (_dryRun) {
// Even if it is a dry run, run `acquireDependencies` so that the user
// gets a report on changes.
- await Entrypoint.inMemory(
- Package.inMemory(
- Pubspec.parse(newPubspecText, cache.sources),
- ),
+ // TODO(jonasfj): Stop abusing Entrypoint.global for dry-run output
+ await Entrypoint.global(
+ Package.inMemory(resolvablePubspec),
+ entrypoint.lockFile,
cache,
- lockFile: entrypoint.lockFile,
solveResult: solveResult,
).acquireDependencies(
- SolveType.get,
+ SolveType.UPGRADE,
dryRun: true,
precompile: _precompile,
analytics: null, // No analytics for dry-run
- generateDotPackages: false,
);
} else {
- if (changes.isNotEmpty) {
- writeTextFile(entrypoint.pubspecPath, newPubspecText);
- }
+ await _updatePubspec(changes);
+
// TODO: Allow Entrypoint to be created with in-memory pubspec, so that
// we can show the changes when not in --dry-run mode. For now we only show
// the changes made to pubspec.yaml in dry-run mode.
await Entrypoint(directory, cache).acquireDependencies(
- SolveType.get,
+ SolveType.UPGRADE,
precompile: _precompile,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
}
@@ -287,7 +276,7 @@
final resolvedPackages = <String, PackageId>{};
final solveResult = await log.spinner('Resolving dependencies', () async {
return await resolveVersions(
- SolveType.upgrade,
+ SolveType.UPGRADE,
cache,
Package.inMemory(nullsafetyPubspec),
);
@@ -324,35 +313,31 @@
changes[dep] = dep.withConstraint(constraint);
}
- final newPubspecText = _updatePubspec(changes);
if (_dryRun) {
// Even if it is a dry run, run `acquireDependencies` so that the user
// gets a report on changes.
// TODO(jonasfj): Stop abusing Entrypoint.global for dry-run output
- await Entrypoint.inMemory(
- Package.inMemory(Pubspec.parse(newPubspecText, cache.sources)),
+ await Entrypoint.global(
+ Package.inMemory(nullsafetyPubspec),
+ entrypoint.lockFile,
cache,
- lockFile: entrypoint.lockFile,
solveResult: solveResult,
).acquireDependencies(
- SolveType.upgrade,
+ SolveType.UPGRADE,
dryRun: true,
precompile: _precompile,
analytics: null,
- generateDotPackages: false,
);
} else {
- if (changes.isNotEmpty) {
- writeTextFile(entrypoint.pubspecPath, newPubspecText);
- }
+ await _updatePubspec(changes);
+
// TODO: Allow Entrypoint to be created with in-memory pubspec, so that
// we can show the changes in --dry-run mode. For now we only show
// the changes made to pubspec.yaml in dry-run mode.
await Entrypoint(directory, cache).acquireDependencies(
- SolveType.upgrade,
+ SolveType.UPGRADE,
precompile: _precompile,
analytics: analytics,
- generateDotPackages: argResults['legacy-packages-file'],
);
}
@@ -396,11 +381,13 @@
}
/// Updates `pubspec.yaml` with given [changes].
- String _updatePubspec(
+ Future<void> _updatePubspec(
Map<PackageRange, PackageRange> changes,
- ) {
+ ) async {
ArgumentError.checkNotNull(changes, 'changes');
+ if (changes.isEmpty) return;
+
final yamlEditor = YamlEditor(readTextFile(entrypoint.pubspecPath));
final deps = entrypoint.root.pubspec.dependencies.keys;
final devDeps = entrypoint.root.pubspec.devDependencies.keys;
@@ -420,7 +407,9 @@
);
}
}
- return yamlEditor.toString();
+
+ /// Windows line endings are already handled by [yamlEditor]
+ writeTextFile(entrypoint.pubspecPath, yamlEditor.toString());
}
/// Outputs a summary of changes made to `pubspec.yaml`.
diff --git a/lib/src/command_runner.dart b/lib/src/command_runner.dart
index 21f568b..4ed33f6 100644
--- a/lib/src/command_runner.dart
+++ b/lib/src/command_runner.dart
@@ -58,22 +58,21 @@
Verbosity get verbosity {
switch (argResults['verbosity']) {
case 'error':
- return log.Verbosity.error;
+ return log.Verbosity.ERROR;
case 'warning':
- return log.Verbosity.warning;
+ return log.Verbosity.WARNING;
case 'normal':
- return log.Verbosity.normal;
+ return log.Verbosity.NORMAL;
case 'io':
- return log.Verbosity.io;
+ return log.Verbosity.IO;
case 'solver':
- return log.Verbosity.solver;
+ return log.Verbosity.SOLVER;
case 'all':
- return log.Verbosity.all;
+ return log.Verbosity.ALL;
default:
// No specific verbosity given, so check for the shortcut.
- if (argResults['verbose']) return log.Verbosity.all;
- if (runningFromTest) return log.Verbosity.testing;
- return log.Verbosity.normal;
+ if (argResults['verbose']) return log.Verbosity.ALL;
+ return log.Verbosity.NORMAL;
}
}
diff --git a/lib/src/dart.dart b/lib/src/dart.dart
index f4f8686..97219dc 100644
--- a/lib/src/dart.dart
+++ b/lib/src/dart.dart
@@ -146,14 +146,11 @@
String toString() => errors.join('\n');
}
-/// Precompiles the Dart executable at [executablePath].
+/// Precompiles the Dart executable at [executablePath] to a kernel file at
+/// [outputPath].
///
-/// If the compilation succeeds it is saved to a kernel file at [outputPath].
-///
-/// If compilation fails, the output is cached at [incrementalDillOutputPath].
-///
-/// Whichever of [incrementalDillOutputPath] and [outputPath] already exists is
-/// used to initialize the compiler run.
+/// This file is also cached at [incrementalDillOutputPath] which is used to
+/// initialize the compiler on future runs.
///
/// The [packageConfigPath] should point at the package config file to be used
/// for `package:` uri resolution.
@@ -161,65 +158,39 @@
/// The [name] is used to describe the executable in logs and error messages.
Future<void> precompile({
required String executablePath,
- required String incrementalDillPath,
+ required String incrementalDillOutputPath,
required String name,
required String outputPath,
required String packageConfigPath,
}) async {
ensureDir(p.dirname(outputPath));
- ensureDir(p.dirname(incrementalDillPath));
-
+ ensureDir(p.dirname(incrementalDillOutputPath));
const platformDill = 'lib/_internal/vm_platform_strong.dill';
final sdkRoot = p.relative(p.dirname(p.dirname(Platform.resolvedExecutable)));
- String? tempDir;
- FrontendServerClient? client;
+ var client = await FrontendServerClient.start(
+ executablePath,
+ incrementalDillOutputPath,
+ platformDill,
+ sdkRoot: sdkRoot,
+ packagesJson: packageConfigPath,
+ printIncrementalDependencies: false,
+ );
try {
- tempDir = createTempDir(p.dirname(incrementalDillPath), 'tmp');
- // To avoid potential races we copy the incremental data to a temporary file
- // for just this compilation.
- final temporaryIncrementalDill =
- p.join(tempDir, '${p.basename(incrementalDillPath)}.incremental.dill');
- try {
- if (fileExists(incrementalDillPath)) {
- copyFile(incrementalDillPath, temporaryIncrementalDill);
- } else if (fileExists(outputPath)) {
- copyFile(outputPath, temporaryIncrementalDill);
- }
- } on FileSystemException {
- // Not able to copy existing file, compilation will start from scratch.
- }
-
- client = await FrontendServerClient.start(
- executablePath,
- temporaryIncrementalDill,
- platformDill,
- sdkRoot: sdkRoot,
- packagesJson: packageConfigPath,
- printIncrementalDependencies: false,
- );
- final result = await client.compile();
+ var result = await client.compile();
final highlightedName = log.bold(name);
if (result?.errorCount == 0) {
log.message('Built $highlightedName.');
- // By using rename we ensure atomicity. An external observer will either
- // see the old or the new snapshot.
- renameFile(temporaryIncrementalDill, outputPath);
+ await File(incrementalDillOutputPath).copy(outputPath);
} else {
- // By using rename we ensure atomicity. An external observer will either
- // see the old or the new snapshot.
- renameFile(temporaryIncrementalDill, incrementalDillPath);
- // If compilation failed we don't want to leave an incorrect snapshot.
- tryDeleteEntry(outputPath);
+ // Don't leave partial results.
+ deleteEntry(outputPath);
throw ApplicationException(
log.yellow('Failed to build $highlightedName:\n') +
(result?.compilerOutputLines.join('\n') ?? ''));
}
} finally {
- client?.kill();
- if (tempDir != null) {
- tryDeleteEntry(tempDir);
- }
+ client.kill();
}
}
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 202580c..453ef56 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -10,12 +10,12 @@
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
-import 'package:yaml/yaml.dart';
import 'command_runner.dart';
import 'dart.dart' as dart;
import 'exceptions.dart';
import 'executable.dart';
+import 'http.dart' as http;
import 'io.dart';
import 'language_version.dart';
import 'lock_file.dart';
@@ -72,14 +72,8 @@
/// but may be the entrypoint when you're running its tests.
class Entrypoint {
/// The root package this entrypoint is associated with.
- ///
- /// For a global package, this is the activated package.
final Package root;
- /// For a global package, this is the directory that the package is installed
- /// in. Non-global packages have null.
- final String? globalDir;
-
/// The system-wide cache which caches packages that need to be fetched over
/// the network.
final SystemCache cache;
@@ -88,8 +82,7 @@
bool get isCached => !root.isInMemory && p.isWithin(cache.rootDir, root.dir);
/// Whether this is an entrypoint for a globally-activated package.
- // final bool isGlobal;
- bool get isGlobal => globalDir != null;
+ final bool isGlobal;
/// The lockfile for the entrypoint.
///
@@ -129,7 +122,8 @@
///
/// Global packages (except those from path source)
/// store these in the global cache.
- String? get _configRoot => isCached ? globalDir : root.dir;
+ String? get _configRoot =>
+ isCached ? p.join(cache.rootDir, 'global_packages', root.name) : root.dir;
/// The path to the entrypoint's ".packages" file.
///
@@ -158,7 +152,11 @@
/// but the configuration is stored at the package itself.
String get cachePath {
if (isGlobal) {
- return globalDir!;
+ return p.join(
+ cache.rootDir,
+ 'global_packages',
+ root.name,
+ );
} else {
var newPath = root.path('.dart_tool/pub');
var oldPath = root.path('.pub');
@@ -175,25 +173,15 @@
String get _incrementalDillsPath => p.join(cachePath, 'incremental');
/// Loads the entrypoint from a package at [rootDir].
- Entrypoint(
- String rootDir,
- this.cache,
- ) : root = Package.load(null, rootDir, cache.sources),
- globalDir = null;
-
- Entrypoint.inMemory(this.root, this.cache,
- {required LockFile? lockFile, SolveResult? solveResult})
- : _lockFile = lockFile,
- globalDir = null {
- if (solveResult != null) {
- _packageGraph = PackageGraph.fromSolveResult(this, solveResult);
- }
- }
+ Entrypoint(String rootDir, this.cache)
+ : root = Package.load(null, rootDir, cache.sources),
+ isGlobal = false;
/// Creates an entrypoint given package and lockfile objects.
/// If a SolveResult is already created it can be passed as an optimization.
- Entrypoint.global(this.globalDir, this.root, this._lockFile, this.cache,
- {SolveResult? solveResult}) {
+ Entrypoint.global(this.root, this._lockFile, this.cache,
+ {SolveResult? solveResult})
+ : isGlobal = true {
if (solveResult != null) {
_packageGraph = PackageGraph.fromSolveResult(this, solveResult);
}
@@ -213,25 +201,19 @@
Entrypoint? _example;
/// Writes .packages and .dart_tool/package_config.json
- Future<void> writePackagesFiles({bool generateDotPackages = false}) async {
- final entrypointName = isGlobal ? null : root.name;
- if (generateDotPackages) {
- writeTextFile(
- packagesFile,
- lockFile.packagesFile(cache,
- entrypoint: entrypointName,
- relativeFrom: isGlobal ? null : root.dir));
- } else {
- tryDeleteEntry(packagesFile);
- }
+ Future<void> writePackagesFiles() async {
+ writeTextFile(
+ packagesFile,
+ lockFile.packagesFile(cache,
+ entrypoint: root.name, relativeFrom: root.dir));
ensureDir(p.dirname(packageConfigFile));
writeTextFile(
packageConfigFile,
await lockFile.packageConfigFile(cache,
- entrypoint: entrypointName,
+ entrypoint: root.name,
entrypointSdkConstraint:
root.pubspec.sdkConstraints[sdk.identifier],
- relativeFrom: isGlobal ? null : root.dir));
+ relativeFrom: root.dir));
}
/// Gets all dependencies of the [root] package.
@@ -261,7 +243,6 @@
Iterable<String>? unlock,
bool dryRun = false,
bool precompile = false,
- required bool generateDotPackages,
required PubAnalytics? analytics,
bool onlyReportSuccessOrFailure = false,
}) async {
@@ -269,7 +250,8 @@
SolveResult result;
try {
result = await log.progress('Resolving dependencies$suffix', () async {
- _checkSdkConstraint(root.pubspec);
+ // We require an SDK constraint lower-bound as of Dart 2.12.0
+ _checkSdkConstraintIsDefined(root.pubspec);
return resolveVersions(
type,
cache,
@@ -312,7 +294,7 @@
await result.showReport(type, cache);
}
if (!dryRun) {
- await result.downloadCachedPackages(cache);
+ await Future.wait(result.packages.map(_get));
_saveLockFile(result);
}
if (onlyReportSuccessOrFailure) {
@@ -330,7 +312,7 @@
/// have to reload and reparse all the pubspecs.
_packageGraph = PackageGraph.fromSolveResult(this, result);
- await writePackagesFiles(generateDotPackages: generateDotPackages);
+ await writePackagesFiles();
try {
if (precompile) {
@@ -405,11 +387,10 @@
Future<void> _precompileExecutable(Executable executable) async {
final package = executable.package;
-
await dart.precompile(
executablePath: resolveExecutable(executable),
outputPath: pathOfExecutable(executable),
- incrementalDillPath: incrementalDillPathOfExecutable(executable),
+ incrementalDillOutputPath: incrementalDillPathOfExecutable(executable),
packageConfigPath: packageConfigFile,
name:
'$package:${p.basenameWithoutExtension(executable.relativePath)}');
@@ -489,6 +470,21 @@
}
}
+ /// Makes sure the package at [id] is locally available.
+ ///
+ /// This automatically downloads the package to the system-wide cache as well
+ /// if it requires network access to retrieve (specifically, if the package's
+ /// source is a [CachedSource]).
+ Future<void> _get(PackageId id) async {
+ return await http.withDependencyType(root.dependencyType(id.name),
+ () async {
+ if (id.isRoot) return;
+
+ var source = cache.source(id.source);
+ if (source is CachedSource) await source.downloadToSystemCache(id);
+ });
+ }
+
/// Throws a [DataError] if the `.dart_tool/package_config.json` file doesn't
/// exist or if it's out-of-date relative to the lockfile or the pubspec.
///
@@ -876,9 +872,7 @@
}
/// We require an SDK constraint lower-bound as of Dart 2.12.0
- ///
- /// We don't allow unknown sdks.
- void _checkSdkConstraint(Pubspec pubspec) {
+ void _checkSdkConstraintIsDefined(Pubspec pubspec) {
final dartSdkConstraint = pubspec.sdkConstraints['dart'];
if (dartSdkConstraint is! VersionRange || dartSdkConstraint.min == null) {
// Suggest version range '>=2.10.0 <3.0.0', we avoid using:
@@ -908,24 +902,6 @@
See https://dart.dev/go/sdk-constraint
''');
}
- for (final sdk in pubspec.sdkConstraints.keys) {
- if (!sdks.containsKey(sdk)) {
- final environment = pubspec.fields.nodes['environment'] as YamlMap;
- final keyNode = environment.nodes.entries
- .firstWhere((e) => (e.key as YamlNode).value == sdk)
- .key as YamlNode;
- throw PubspecException('''
-$pubspecPath refers to an unknown sdk '$sdk'.
-
-Did you mean to add it as a dependency?
-
-Either remove the constraint, or upgrade to a version of pub that supports the
-given sdk.
-
-See https://dart.dev/go/sdk-constraint
-''', keyNode.span);
- }
- }
}
}
diff --git a/lib/src/exceptions.dart b/lib/src/exceptions.dart
index fcde747..82a5dac 100644
--- a/lib/src/exceptions.dart
+++ b/lib/src/exceptions.dart
@@ -11,6 +11,7 @@
import 'package:yaml/yaml.dart';
import 'dart.dart';
+import 'sdk.dart';
/// An exception class for exceptions that are intended to be seen by the user.
///
@@ -88,20 +89,18 @@
/// that other code in pub can use this to show a more detailed explanation of
/// why the package was being requested.
class PackageNotFoundException extends WrappedException {
- /// A hint indicating an action the user could take to resolve this problem.
- ///
- /// This will be printed after the package resolution conflict.
- final String? hint;
+ /// If this failure was caused by an SDK being unavailable, this is that SDK.
+ final Sdk? missingSdk;
PackageNotFoundException(
String message, {
Object? innerError,
StackTrace? innerTrace,
- this.hint,
+ this.missingSdk,
}) : super(message, innerError, innerTrace);
@override
- String toString() => 'Package not available ($message).';
+ String toString() => "Package doesn't exist ($message).";
}
/// Returns whether [error] is a user-facing error object.
diff --git a/lib/src/executable.dart b/lib/src/executable.dart
index 3f8f6a9..2112acc 100644
--- a/lib/src/executable.dart
+++ b/lib/src/executable.dart
@@ -306,9 +306,8 @@
try {
await warningsOnlyUnlessTerminal(
() => entrypoint.acquireDependencies(
- SolveType.get,
+ SolveType.GET,
analytics: analytics,
- generateDotPackages: false,
),
);
} on ApplicationException catch (e) {
diff --git a/lib/src/exit_codes.dart b/lib/src/exit_codes.dart
index c6acaf7..e072ef2 100644
--- a/lib/src/exit_codes.dart
+++ b/lib/src/exit_codes.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// ignore_for_file: constant_identifier_names
-
/// Exit code constants.
///
/// From [the BSD sysexits manpage][manpage]. Not every constant here is used,
diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart
index 07e2513..578eca1 100644
--- a/lib/src/global_packages.dart
+++ b/lib/src/global_packages.dart
@@ -12,6 +12,7 @@
import 'entrypoint.dart';
import 'exceptions.dart';
import 'executable.dart' as exec;
+import 'http.dart' as http;
import 'io.dart';
import 'lock_file.dart';
import 'log.dart' as log;
@@ -61,8 +62,6 @@
/// The directory where the lockfiles for activated packages are stored.
String get _directory => p.join(cache.rootDir, 'global_packages');
- String _packageDir(String packageName) => p.join(_directory, packageName);
-
/// The directory where binstubs for global package executables are stored.
String get _binStubDir => p.join(cache.rootDir, 'bin');
@@ -150,25 +149,28 @@
var entrypoint = Entrypoint(path, cache);
// Get the package's dependencies.
- await entrypoint.acquireDependencies(
- SolveType.get,
- analytics: analytics,
- generateDotPackages: false,
- );
+ await entrypoint.acquireDependencies(SolveType.GET, analytics: analytics);
var name = entrypoint.root.name;
- _describeActive(name, cache);
+
+ try {
+ var originalLockFile =
+ LockFile.load(_getLockFilePath(name), cache.sources);
+ // Call this just to log what the current active package is, if any.
+ _describeActive(originalLockFile, name);
+ } on IOException {
+ // Couldn't read the lock file. It probably doesn't exist.
+ }
// Write a lockfile that points to the local package.
var fullPath = canonicalize(entrypoint.root.dir);
var id = cache.path.source.idFor(name, entrypoint.root.version, fullPath);
- final tempDir = cache.createTempDir();
// TODO(rnystrom): Look in "bin" and display list of binaries that
// user can run.
- _writeLockFile(tempDir, LockFile([id]));
+ _writeLockFile(name, LockFile([id]));
- tryDeleteEntry(_packageDir(name));
- tryRenameDir(tempDir, _packageDir(name));
+ var binDir = p.join(_directory, name, 'bin');
+ if (dirExists(binDir)) deleteEntry(binDir);
_updateBinStubs(entrypoint, entrypoint.root, executables,
overwriteBinStubs: overwriteBinStubs);
@@ -176,12 +178,17 @@
}
/// Installs the package [dep] and its dependencies into the system cache.
- ///
- /// If [silent] less logging will be printed.
Future<void> _installInCache(PackageRange dep, List<String>? executables,
- {required bool overwriteBinStubs, bool silent = false}) async {
- final name = dep.name;
- LockFile? originalLockFile = _describeActive(name, cache);
+ {required bool overwriteBinStubs}) async {
+ LockFile? originalLockFile;
+ try {
+ originalLockFile =
+ LockFile.load(_getLockFilePath(dep.name), cache.sources);
+ // Call this just to log what the current active package is, if any.
+ _describeActive(originalLockFile, dep.name);
+ } on IOException {
+ // Couldn't read the lock file. It probably doesn't exist.
+ }
// Create a dummy package with just [dep] so we can do resolution on it.
var root = Package.inMemory(Pubspec('pub global activate',
@@ -193,89 +200,103 @@
// being available, report that as a [dataError].
SolveResult result;
try {
- result = await log.spinner(
- 'Resolving dependencies',
- () => resolveVersions(SolveType.get, cache, root),
- condition: !silent,
- );
+ result = await log.progress('Resolving dependencies',
+ () => resolveVersions(SolveType.GET, cache, root));
} on SolveFailure catch (error) {
for (var incompatibility
in error.incompatibility.externalIncompatibilities) {
if (incompatibility.cause != IncompatibilityCause.noVersions) continue;
- if (incompatibility.terms.single.package.name != name) continue;
+ if (incompatibility.terms.single.package.name != dep.name) continue;
dataError(error.toString());
}
rethrow;
}
- // We want the entrypoint to be rooted at 'dep' not the dummy-package.
- result.packages.removeWhere((id) => id.name == 'pub global activate');
final sameVersions = originalLockFile != null &&
originalLockFile.samePackageIds(result.lockFile);
- final PackageId id = result.lockFile.packages[name]!;
if (sameVersions) {
log.message('''
-The package $name is already activated at newest available version.
-To recompile executables, first run `$topLevelProgram pub global deactivate $name`.
+The package ${dep.name} is already activated at newest available version.
+To recompile executables, first run `$topLevelProgram pub global deactivate ${dep.name}`.
''');
} else {
- // Only precompile binaries if we have a new resolution.
- if (!silent) await result.showReport(SolveType.get, cache);
-
- await result.downloadCachedPackages(cache);
-
- final lockFile = result.lockFile;
- final tempDir = cache.createTempDir();
- _writeLockFile(tempDir, lockFile);
-
- // Load the package graph from [result] so we don't need to re-parse all
- // the pubspecs.
- final entrypoint = Entrypoint.global(
- tempDir,
- cache.loadCached(id),
- lockFile,
- cache,
- solveResult: result,
- );
-
- await entrypoint.writePackagesFiles();
-
- await entrypoint.precompileExecutables();
-
- tryDeleteEntry(_packageDir(name));
- tryRenameDir(tempDir, _packageDir(name));
+ await result.showReport(SolveType.GET, cache);
}
+
+ // Make sure all of the dependencies are locally installed.
+ await Future.wait(result.packages.map((id) {
+ return http.withDependencyType(root.dependencyType(id.name), () async {
+ if (id.isRoot) return;
+
+ var source = cache.source(id.source);
+ if (source is CachedSource) await source.downloadToSystemCache(id);
+ });
+ }));
+
+ var lockFile = result.lockFile;
+ _writeLockFile(dep.name, lockFile);
+ await _writePackageConfigFiles(dep.name, lockFile);
+
+ // We want the entrypoint to be rooted at 'dep' not the dummy-package.
+ result.packages.removeWhere((id) => id.name == 'pub global activate');
+
+ var id = lockFile.packages[dep.name]!;
+ // Load the package graph from [result] so we don't need to re-parse all
+ // the pubspecs.
final entrypoint = Entrypoint.global(
- _packageDir(id.name),
- cache.loadCached(id),
- result.lockFile,
+ Package(
+ result.pubspecs[dep.name]!,
+ (cache.source(dep.source) as CachedSource).getDirectoryInCache(id),
+ ),
+ lockFile,
cache,
solveResult: result,
);
+ if (!sameVersions) {
+ // Only precompile binaries if we have a new resolution.
+ await entrypoint.precompileExecutables();
+ }
+
_updateBinStubs(
entrypoint,
cache.load(entrypoint.lockFile.packages[dep.name]!),
executables,
overwriteBinStubs: overwriteBinStubs,
);
- if (!silent) log.message('Activated ${_formatPackage(id)}.');
+
+ log.message('Activated ${_formatPackage(id)}.');
+ }
+
+ Future<void> _writePackageConfigFiles(
+ String package, LockFile lockFile) async {
+ // TODO(sigurdm): Use [Entrypoint.writePackagesFiles] instead.
+ final packagesFilePath = _getPackagesFilePath(package);
+ final packageConfigFilePath = _getPackageConfigFilePath(package);
+ final dir = p.dirname(packagesFilePath);
+ writeTextFile(
+ packagesFilePath, lockFile.packagesFile(cache, relativeFrom: dir));
+ ensureDir(p.dirname(packageConfigFilePath));
+ writeTextFile(packageConfigFilePath,
+ await lockFile.packageConfigFile(cache, relativeFrom: dir));
}
/// Finishes activating package [package] by saving [lockFile] in the cache.
- void _writeLockFile(String dir, LockFile lockFile) {
- writeTextFile(p.join(dir, 'pubspec.lock'), lockFile.serialize(null));
+ void _writeLockFile(String package, LockFile lockFile) {
+ ensureDir(p.join(_directory, package));
+
+ // TODO(nweiz): This cleans up Dart 1.6's old lockfile location. Remove it
+ // when Dart 1.6 is old enough that we don't think anyone will have these
+ // lockfiles anymore (issue 20703).
+ var oldPath = p.join(_directory, '$package.lock');
+ if (fileExists(oldPath)) deleteEntry(oldPath);
+
+ writeTextFile(_getLockFilePath(package),
+ lockFile.serialize(p.join(_directory, package)));
}
/// Shows the user the currently active package with [name], if any.
- LockFile? _describeActive(String name, SystemCache cache) {
- late final LockFile lockFile;
- try {
- lockFile = LockFile.load(_getLockFilePath(name), cache.sources);
- } on IOException {
- // Couldn't read the lock file. It probably doesn't exist.
- return null;
- }
+ void _describeActive(LockFile lockFile, String? name) {
var id = lockFile.packages[name]!;
var source = id.source;
@@ -291,7 +312,6 @@
log.message('Package ${log.bold(name)} is currently active at version '
'${log.bold(id.version)}.');
}
- return lockFile;
}
/// Deactivates a previously-activated package named [name].
@@ -321,8 +341,22 @@
try {
lockFile = LockFile.load(lockFilePath, cache.sources);
} on IOException {
- // If we couldn't read the lock file, it's not activated.
- dataError('No active package ${log.bold(name)}.');
+ var oldLockFilePath = p.join(_directory, '$name.lock');
+ try {
+ // TODO(nweiz): This looks for Dart 1.6's old lockfile location.
+ // Remove it when Dart 1.6 is old enough that we don't think anyone
+ // will have these lockfiles anymore (issue 20703).
+ lockFile = LockFile.load(oldLockFilePath, cache.sources);
+ } on IOException {
+ // If we couldn't read the lock file, it's not activated.
+ dataError('No active package ${log.bold(name)}.');
+ }
+
+ // Move the old lockfile to its new location.
+ ensureDir(p.dirname(lockFilePath));
+ File(oldLockFilePath).renameSync(lockFilePath);
+ // Just make sure these files are created as well.
+ await _writePackageConfigFiles(name, lockFile);
}
// Remove the package itself from the lockfile. We put it in there so we
@@ -336,8 +370,7 @@
if (source is CachedSource) {
// For cached sources, the package itself is in the cache and the
// lockfile is the one we just loaded.
- entrypoint = Entrypoint.global(
- _packageDir(id.name), cache.loadCached(id), lockFile, cache);
+ entrypoint = Entrypoint.global(cache.loadCached(id), lockFile, cache);
} else {
// For uncached sources (i.e. path), the ID just points to the real
// directory for the package.
@@ -413,6 +446,16 @@
String _getLockFilePath(String name) =>
p.join(_directory, name, 'pubspec.lock');
+ /// Gets the path to the .packages file for an activated cached package with
+ /// [name].
+ String _getPackagesFilePath(String name) =>
+ p.join(_directory, name, '.packages');
+
+ /// Gets the path to the `package_config.json` file for an
+ /// activated cached package with [name].
+ String _getPackageConfigFilePath(String name) =>
+ p.join(_directory, name, '.dart_tool', 'package_config.json');
+
/// Shows the user a formatted list of globally activated packages.
void listActivePackages() {
if (!dirExists(_directory)) return;
@@ -499,24 +542,17 @@
log.message('Reactivating ${log.bold(id.name)} ${id.version}...');
var entrypoint = await find(id.name);
- final packageExecutables = executables.remove(id.name) ?? [];
- if (entrypoint.isCached) {
- deleteEntry(entrypoint.globalDir!);
- await _installInCache(
- id.toRange(),
- packageExecutables,
- overwriteBinStubs: true,
- silent: true,
- );
- } else {
- await activatePath(
- entrypoint.root.dir,
- packageExecutables,
- overwriteBinStubs: true,
- analytics: null,
- );
- }
+ await _writePackageConfigFiles(id.name, entrypoint.lockFile);
+ await entrypoint.precompileExecutables();
+ var packageExecutables = executables.remove(id.name) ?? [];
+ _updateBinStubs(
+ entrypoint,
+ cache.load(id),
+ packageExecutables,
+ overwriteBinStubs: true,
+ suggestIfNotOnPath: false,
+ );
successes.add(id.name);
} catch (error, stackTrace) {
var message = 'Failed to reactivate '
@@ -670,7 +706,10 @@
// Show errors for any missing scripts.
// TODO(rnystrom): This can print false positives since a script may be
// produced by a transformer. Do something better.
- var binFiles = package.executablePaths;
+ var binFiles = package
+ .listFiles(beneath: 'bin', recursive: false)
+ .map(package.relative)
+ .toList();
for (var executable in installed) {
var script = package.pubspec.executables[executable];
var scriptPath = p.join('bin', '$script.dart');
@@ -722,7 +761,6 @@
// If the script was built to a snapshot, just try to invoke that
// directly and skip pub global run entirely.
String invocation;
- late String binstub;
if (Platform.isWindows) {
if (fileExists(snapshot)) {
// We expect absolute paths from the precompiler since relative ones
@@ -748,7 +786,7 @@
} else {
invocation = 'dart pub global run ${package.name}:$script %*';
}
- binstub = '''
+ var batch = '''
@echo off
rem This file was created by pub v${sdk.version}.
rem Package: ${package.name}
@@ -757,6 +795,7 @@
rem Script: $script
$invocation
''';
+ writeTextFile(binStubPath, batch);
} else {
if (fileExists(snapshot)) {
// We expect absolute paths from the precompiler since relative ones
@@ -779,7 +818,7 @@
} else {
invocation = 'dart pub global run ${package.name}:$script "\$@"';
}
- binstub = '''
+ var bash = '''
#!/usr/bin/env sh
# This file was created by pub v${sdk.version}.
# Package: ${package.name}
@@ -788,31 +827,25 @@
# Script: $script
$invocation
''';
- }
- // Write the binstub to a temporary location, make it executable and move
- // it into place afterwards to avoid races.
- final tempDir = cache.createTempDir();
- try {
- final tmpPath = p.join(tempDir, binStubPath);
+ // Write this as the system encoding since the system is going to execute
+ // it and it might contain non-ASCII characters in the pathnames.
+ writeTextFile(binStubPath, bash, encoding: const SystemEncoding());
- // Write this as the system encoding since the system is going to
- // execute it and it might contain non-ASCII characters in the
- // pathnames.
- writeTextFile(tmpPath, binstub, encoding: const SystemEncoding());
-
- if (Platform.isLinux || Platform.isMacOS) {
- // Make it executable.
- var result = Process.runSync('chmod', ['+x', tmpPath]);
- if (result.exitCode != 0) {
- // Couldn't make it executable so don't leave it laying around.
- fail('Could not make "$tmpPath" executable (exit code '
- '${result.exitCode}):\n${result.stderr}');
+ // Make it executable.
+ var result = Process.runSync('chmod', ['+x', binStubPath]);
+ if (result.exitCode != 0) {
+ // Couldn't make it executable so don't leave it laying around.
+ try {
+ deleteEntry(binStubPath);
+ } on IOException catch (err) {
+ // Do nothing. We're going to fail below anyway.
+ log.fine('Could not delete binstub:\n$err');
}
+
+ fail('Could not make "$binStubPath" executable (exit code '
+ '${result.exitCode}):\n${result.stderr}');
}
- File(tmpPath).renameSync(binStubPath);
- } finally {
- deleteEntry(tempDir);
}
return previousPackage;
diff --git a/lib/src/http.dart b/lib/src/http.dart
index 724962b..fb6e9aa 100644
--- a/lib/src/http.dart
+++ b/lib/src/http.dart
@@ -10,6 +10,7 @@
import 'package:http/http.dart' as http;
import 'package:http/retry.dart';
+import 'package:pedantic/pedantic.dart';
import 'package:pool/pool.dart';
import 'package:stack_trace/stack_trace.dart';
diff --git a/lib/src/ignore.dart b/lib/src/ignore.dart
index ff22dff..fbd93e8 100644
--- a/lib/src/ignore.dart
+++ b/lib/src/ignore.dart
@@ -464,9 +464,6 @@
} else {
expr += '.*';
}
- } else if (peekChar() == '/' || peekChar() == null) {
- // /a/* should not match '/a/'
- expr += '[^/]+';
} else {
// Handle a single '*'
expr += '[^/]*';
@@ -523,6 +520,7 @@
expr = '$expr/\$';
} else {
expr = '$expr/?\$';
+ // expr = '$expr\$';
}
try {
return _IgnoreParseResult(
diff --git a/lib/src/io.dart b/lib/src/io.dart
index acc1a6f..5e9a210 100644
--- a/lib/src/io.dart
+++ b/lib/src/io.dart
@@ -8,12 +8,14 @@
import 'dart:convert';
import 'dart:io';
+import 'package:async/async.dart';
import 'package:cli_util/cli_util.dart'
show EnvironmentNotFoundException, applicationConfigHome;
import 'package:http/http.dart' show ByteStream;
import 'package:http_multi_server/http_multi_server.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
+import 'package:pedantic/pedantic.dart';
import 'package:pool/pool.dart';
import 'package:stack_trace/stack_trace.dart';
@@ -361,54 +363,52 @@
/// when we try to delete or move something while it's being scanned. To
/// mitigate that, on Windows, this will retry the operation a few times if it
/// fails.
-///
-/// For some operations it makes sense to handle ERROR_DIR_NOT_EMPTY
-/// differently. They can pass [ignoreEmptyDir] = `true`.
-void _attempt(String description, void Function() operation,
- {bool ignoreEmptyDir = false}) {
+void _attempt(String description, void Function() operation) {
if (!Platform.isWindows) {
operation();
return;
}
String? getErrorReason(FileSystemException error) {
- // ERROR_ACCESS_DENIED
if (error.osError?.errorCode == 5) {
return 'access was denied';
}
- // ERROR_SHARING_VIOLATION
if (error.osError?.errorCode == 32) {
return 'it was in use by another process';
}
- // ERROR_DIR_NOT_EMPTY
- if (!ignoreEmptyDir && _isDirectoryNotEmptyException(error)) {
+ if (error.osError?.errorCode == 145) {
return 'of dart-lang/sdk#25353';
}
return null;
}
- for (var i = 0; i < 3; i++) {
+ for (var i = 0; i < 2; i++) {
try {
operation();
- break;
+ return;
} on FileSystemException catch (error) {
var reason = getErrorReason(error);
if (reason == null) rethrow;
- if (i < 2) {
- log.io('Pub failed to $description because $reason. '
- 'Retrying in 50ms.');
- sleep(Duration(milliseconds: 50));
- } else {
- fail('Pub failed to $description because $reason.\n'
- 'This may be caused by a virus scanner or having a file\n'
- 'in the directory open in another application.');
- }
+ log.io('Pub failed to $description because $reason. '
+ 'Retrying in 50ms.');
+ sleep(Duration(milliseconds: 50));
}
}
+
+ try {
+ operation();
+ } on FileSystemException catch (error) {
+ var reason = getErrorReason(error);
+ if (reason == null) rethrow;
+
+ fail('Pub failed to $description because $reason.\n'
+ 'This may be caused by a virus scanner or having a file\n'
+ 'in the directory open in another application.');
+ }
}
/// Deletes whatever's at [path], whether it's a file, directory, or symlink.
@@ -453,53 +453,14 @@
void renameDir(String from, String to) {
_attempt('rename directory', () {
log.io('Renaming directory $from to $to.');
- Directory(from).renameSync(to);
- }, ignoreEmptyDir: true);
-}
-
-/// Renames directory [from] to [to].
-/// If it fails with "destination not empty" we log and continue, assuming
-/// another process got there before us.
-void tryRenameDir(String from, String to) {
- ensureDir(path.dirname(to));
- try {
- renameDir(from, to);
- } on FileSystemException catch (e) {
- tryDeleteEntry(from);
- if (!_isDirectoryNotEmptyException(e)) {
+ try {
+ Directory(from).renameSync(to);
+ } on IOException {
+ // Ensure that [to] isn't left in an inconsistent state. See issue 12436.
+ if (entryExists(to)) deleteEntry(to);
rethrow;
}
- log.fine('''
-Destination directory $to already existed.
-Assuming a concurrent pub invocation installed it.''');
- }
-}
-
-void copyFile(String from, String to) {
- log.io('Copying "$from" to "$to".');
- File(from).copySync(to);
-}
-
-void renameFile(String from, String to) {
- log.io('Renaming "$from" to "$to".');
- File(from).renameSync(to);
-}
-
-bool _isDirectoryNotEmptyException(FileSystemException e) {
- final errorCode = e.osError?.errorCode;
- return
- // On Linux rename will fail with ENOTEMPTY if directory exists:
- // https://man7.org/linux/man-pages/man2/rename.2.html
- // #define ENOTEMPTY 39 /* Directory not empty */
- // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/errno.h#n20
- (Platform.isLinux && errorCode == 39) ||
- // On Windows this may fail with ERROR_DIR_NOT_EMPTY
- // https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
- (Platform.isWindows && errorCode == 145) ||
- // On MacOS rename will fail with ENOTEMPTY if directory exists.
- // #define ENOTEMPTY 66 /* Directory not empty */
- // https://github.com/apple-oss-distributions/xnu/blob/bb611c8fecc755a0d8e56e2fa51513527c5b7a0e/bsd/sys/errno.h#L190
- (Platform.isMacOS && errorCode == 66);
+ });
}
/// Creates a new symlink at path [symlink] that points to [target].
@@ -601,6 +562,10 @@
return path.fromUri(url);
})();
+/// A line-by-line stream of standard input.
+final StreamQueue<String> _stdinLines = StreamQueue(
+ ByteStream(stdin).toStringStream().transform(const LineSplitter()));
+
/// Displays a message and reads a yes/no confirmation from the user.
///
/// Returns a [Future] that completes to `true` if the user confirms or `false`
@@ -626,14 +591,14 @@
final previousEchoMode = stdin.echoMode;
try {
stdin.echoMode = echoMode;
- final result = stdin.readLineSync() ?? '';
+ final result = await _stdinLines.next;
stdout.write('\n');
return result;
} finally {
stdin.echoMode = previousEchoMode;
}
} else {
- return stdin.readLineSync() ?? '';
+ return await _stdinLines.next;
}
}
@@ -1007,10 +972,10 @@
log.fine(buffer.toString());
ArgumentError.checkNotNull(baseDir, 'baseDir');
- baseDir = path.normalize(path.absolute(baseDir));
+ baseDir = path.absolute(baseDir);
final tarContents = Stream.fromIterable(contents.map((entry) {
- entry = path.normalize(path.absolute(entry));
+ entry = path.absolute(entry);
if (!path.isWithin(baseDir, entry)) {
throw ArgumentError('Entry $entry is not inside $baseDir.');
}
diff --git a/lib/src/language_version.dart b/lib/src/language_version.dart
index ad331b2..e294014 100644
--- a/lib/src/language_version.dart
+++ b/lib/src/language_version.dart
@@ -69,21 +69,6 @@
bool get supportsNullSafety => this >= firstVersionWithNullSafety;
- /// Minimum language version at which short hosted syntax is supported.
- ///
- /// This allows `hosted` dependencies to be expressed as:
- /// ```yaml
- /// dependencies:
- /// foo:
- /// hosted: https://some-pub.com/path
- /// version: ^1.0.0
- /// ```
- ///
- /// At older versions, `hosted` dependencies had to be a map with a `url` and
- /// a `name` key.
- bool get supportsShorterHostedSyntax =>
- this >= firstVersionWithShorterHostedSyntax;
-
@override
int compareTo(LanguageVersion other) {
if (major != other.major) return major.compareTo(other.major);
@@ -104,7 +89,6 @@
static const defaultLanguageVersion = LanguageVersion(2, 7);
static const firstVersionWithNullSafety = LanguageVersion(2, 12);
- static const firstVersionWithShorterHostedSyntax = LanguageVersion(2, 15);
/// Transform language version to string that can be parsed with
/// [LanguageVersion.parse].
diff --git a/lib/src/lock_file.dart b/lib/src/lock_file.dart
index 8f563ab..e2723c7 100644
--- a/lib/src/lock_file.dart
+++ b/lib/src/lock_file.dart
@@ -218,7 +218,7 @@
String packagesFile(
SystemCache cache, {
String? entrypoint,
- String? relativeFrom,
+ required String relativeFrom,
}) {
var header = '''
This file is deprecated. Tools should instead consume
@@ -256,7 +256,7 @@
SystemCache cache, {
String? entrypoint,
VersionConstraint? entrypointSdkConstraint,
- String? relativeFrom,
+ required String relativeFrom,
}) async {
final entries = <PackageConfigEntry>[];
for (final name in ordered(packages.keys)) {
@@ -306,9 +306,8 @@
/// Returns the serialized YAML text of the lock file.
///
/// [packageDir] is the containing directory of the root package, used to
- /// serialize relative path package descriptions. If it is null, they will be
- /// serialized as absolute.
- String serialize(String? packageDir) {
+ /// properly serialize package descriptions.
+ String serialize(String packageDir) {
// Convert the dependencies to a simple object.
var packageMap = {};
packages.forEach((name, package) {
diff --git a/lib/src/log.dart b/lib/src/log.dart
index db24d7a..ff7fe29 100644
--- a/lib/src/log.dart
+++ b/lib/src/log.dart
@@ -12,11 +12,9 @@
import 'package:source_span/source_span.dart';
import 'package:stack_trace/stack_trace.dart';
-import 'entrypoint.dart';
import 'exceptions.dart';
import 'io.dart';
import 'progress.dart';
-import 'sdk.dart';
import 'transcript.dart';
import 'utils.dart';
@@ -26,7 +24,7 @@
final json = _JsonLogger();
/// The current logging verbosity.
-Verbosity verbosity = Verbosity.normal;
+Verbosity verbosity = Verbosity.NORMAL;
/// In cases where there's a ton of log spew, make sure we don't eat infinite
/// memory.
@@ -34,11 +32,11 @@
/// This can occur when the backtracking solver stumbles into a pathological
/// dependency graph. It generally will find a solution, but it may log
/// thousands and thousands of entries to get there.
-const _maxTranscript = 10000;
+const _MAX_TRANSCRIPT = 10000;
/// The list of recorded log messages. Will only be recorded if
/// [recordTranscript()] is called.
-final Transcript<_Entry> _transcript = Transcript(_maxTranscript);
+Transcript<_Entry>? _transcript;
/// The currently-animated progress indicator, if any.
///
@@ -60,34 +58,34 @@
/// An enum type for defining the different logging levels a given message can
/// be associated with.
///
-/// By default, [error] and [warning] messages are printed to sterr. [message]
+/// By default, [ERROR] and [WARNING] messages are printed to sterr. [MESSAGE]
/// messages are printed to stdout, and others are ignored.
class Level {
/// An error occurred and an operation could not be completed.
///
/// Usually shown to the user on stderr.
- static const error = Level._('ERR ');
+ static const ERROR = Level._('ERR ');
/// Something unexpected happened, but the program was able to continue,
/// though possibly in a degraded fashion.
- static const warning = Level._('WARN');
+ static const WARNING = Level._('WARN');
/// A message intended specifically to be shown to the user.
- static const message = Level._('MSG ');
+ static const MESSAGE = Level._('MSG ');
/// Some interaction with the external world occurred, such as a network
/// operation, process spawning, or file IO.
- static const io = Level._('IO ');
+ static const IO = Level._('IO ');
/// Incremental output during pub's version constraint solver.
- static const solver = Level._('SLVR');
+ static const SOLVER = Level._('SLVR');
/// Fine-grained and verbose additional information.
///
/// Used to provide program state context for other logs (such as what pub
/// was doing when an IO operation occurred) or just more detail for an
/// operation.
- static const fine = Level._('FINE');
+ static const FINE = Level._('FINE');
const Level._(this.name);
@@ -101,83 +99,73 @@
/// displayed.
class Verbosity {
/// Silence all logging.
- static const none = Verbosity._('none', {
- Level.error: null,
- Level.warning: null,
- Level.message: null,
- Level.io: null,
- Level.solver: null,
- Level.fine: null
+ static const NONE = Verbosity._('none', {
+ Level.ERROR: null,
+ Level.WARNING: null,
+ Level.MESSAGE: null,
+ Level.IO: null,
+ Level.SOLVER: null,
+ Level.FINE: null
});
/// Shows only errors.
- static const error = Verbosity._('error', {
- Level.error: _logToStderr,
- Level.warning: null,
- Level.message: null,
- Level.io: null,
- Level.solver: null,
- Level.fine: null
+ static const ERROR = Verbosity._('error', {
+ Level.ERROR: _logToStderr,
+ Level.WARNING: null,
+ Level.MESSAGE: null,
+ Level.IO: null,
+ Level.SOLVER: null,
+ Level.FINE: null
});
/// Shows only errors and warnings.
- static const warning = Verbosity._('warning', {
- Level.error: _logToStderr,
- Level.warning: _logToStderr,
- Level.message: null,
- Level.io: null,
- Level.solver: null,
- Level.fine: null
+ static const WARNING = Verbosity._('warning', {
+ Level.ERROR: _logToStderr,
+ Level.WARNING: _logToStderr,
+ Level.MESSAGE: null,
+ Level.IO: null,
+ Level.SOLVER: null,
+ Level.FINE: null
});
/// The default verbosity which shows errors, warnings, and messages.
- static const normal = Verbosity._('normal', {
- Level.error: _logToStderr,
- Level.warning: _logToStderr,
- Level.message: _logToStdout,
- Level.io: null,
- Level.solver: null,
- Level.fine: null
+ static const NORMAL = Verbosity._('normal', {
+ Level.ERROR: _logToStderr,
+ Level.WARNING: _logToStderr,
+ Level.MESSAGE: _logToStdout,
+ Level.IO: null,
+ Level.SOLVER: null,
+ Level.FINE: null
});
/// Shows errors, warnings, messages, and IO event logs.
- static const io = Verbosity._('io', {
- Level.error: _logToStderrWithLabel,
- Level.warning: _logToStderrWithLabel,
- Level.message: _logToStdoutWithLabel,
- Level.io: _logToStderrWithLabel,
- Level.solver: null,
- Level.fine: null
+ static const IO = Verbosity._('io', {
+ Level.ERROR: _logToStderrWithLabel,
+ Level.WARNING: _logToStderrWithLabel,
+ Level.MESSAGE: _logToStdoutWithLabel,
+ Level.IO: _logToStderrWithLabel,
+ Level.SOLVER: null,
+ Level.FINE: null
});
/// Shows errors, warnings, messages, and version solver logs.
- static const solver = Verbosity._('solver', {
- Level.error: _logToStderr,
- Level.warning: _logToStderr,
- Level.message: _logToStdout,
- Level.io: null,
- Level.solver: _logToStdout,
- Level.fine: null
+ static const SOLVER = Verbosity._('solver', {
+ Level.ERROR: _logToStderr,
+ Level.WARNING: _logToStderr,
+ Level.MESSAGE: _logToStdout,
+ Level.IO: null,
+ Level.SOLVER: _logToStdout,
+ Level.FINE: null
});
/// Shows all logs.
- static const all = Verbosity._('all', {
- Level.error: _logToStderrWithLabel,
- Level.warning: _logToStderrWithLabel,
- Level.message: _logToStdoutWithLabel,
- Level.io: _logToStderrWithLabel,
- Level.solver: _logToStderrWithLabel,
- Level.fine: _logToStderrWithLabel
- });
-
- /// Shows all logs.
- static const testing = Verbosity._('testing', {
- Level.error: _logToStderrWithLabel,
- Level.warning: _logToStderrWithLabel,
- Level.message: _logToStdoutWithLabel,
- Level.io: _logToStderrWithLabel,
- Level.solver: _logToStderrWithLabel,
- Level.fine: _logToStderrWithLabel
+ static const ALL = Verbosity._('all', {
+ Level.ERROR: _logToStderrWithLabel,
+ Level.WARNING: _logToStderrWithLabel,
+ Level.MESSAGE: _logToStdoutWithLabel,
+ Level.IO: _logToStderrWithLabel,
+ Level.SOLVER: _logToStderrWithLabel,
+ Level.FINE: _logToStderrWithLabel
});
const Verbosity._(this.name, this._loggers);
@@ -200,7 +188,7 @@
_Entry(this.level, this.lines);
}
-/// Logs [message] at [Level.error].
+/// Logs [message] at [Level.ERROR].
///
/// If [error] is passed, it's appended to [message]. If [trace] is passed, it's
/// printed at log level fine.
@@ -210,24 +198,24 @@
message = message.isEmpty ? '$error' : '$message: $error';
if (error is Error && trace == null) trace = error.stackTrace;
}
- write(Level.error, message);
- if (trace != null) write(Level.fine, Chain.forTrace(trace));
+ write(Level.ERROR, message);
+ if (trace != null) write(Level.FINE, Chain.forTrace(trace));
}
-/// Logs [message] at [Level.warning].
-void warning(message) => write(Level.warning, message);
+/// Logs [message] at [Level.WARNING].
+void warning(message) => write(Level.WARNING, message);
-/// Logs [message] at [Level.message].
-void message(message) => write(Level.message, message);
+/// Logs [message] at [Level.MESSAGE].
+void message(message) => write(Level.MESSAGE, message);
-/// Logs [message] at [Level.io].
-void io(message) => write(Level.io, message);
+/// Logs [message] at [Level.IO].
+void io(message) => write(Level.IO, message);
-/// Logs [message] at [Level.solver].
-void solver(message) => write(Level.solver, message);
+/// Logs [message] at [Level.SOLVER].
+void solver(message) => write(Level.SOLVER, message);
-/// Logs [message] at [Level.fine].
-void fine(message) => write(Level.fine, message);
+/// Logs [message] at [Level.FINE].
+void fine(message) => write(Level.FINE, message);
/// Logs [message] at [level].
void write(Level level, message) {
@@ -245,10 +233,10 @@
var logFn = verbosity._loggers[level];
if (logFn != null) logFn(entry);
- _transcript.add(entry);
+ if (_transcript != null) _transcript!.add(entry);
}
-/// Logs the spawning of an [executable] process with [arguments] at [io]
+/// Logs the spawning of an [executable] process with [arguments] at [IO]
/// level.
void process(
String executable, List<String> arguments, String workingDirectory) {
@@ -325,10 +313,18 @@
}
}
-/// Prints the recorded log transcript to stderr.
-void dumpTranscriptToStdErr() {
+/// Enables recording of log entries.
+void recordTranscript() {
+ _transcript = Transcript<_Entry>(_MAX_TRANSCRIPT);
+}
+
+/// If [recordTranscript()] was called, then prints the previously recorded log
+/// transcript to stderr.
+void dumpTranscript() {
+ if (_transcript == null) return;
+
stderr.writeln('---- Log transcript ----');
- _transcript.forEach((entry) {
+ _transcript!.forEach((entry) {
_printToStream(stderr, entry, showLabel: true);
}, (discarded) {
stderr.writeln('---- ($discarded discarded) ----');
@@ -336,68 +332,6 @@
stderr.writeln('---- End log transcript ----');
}
-String _limit(String input, int limit) {
- const snip = '[...]';
- if (input.length < limit - snip.length) return input;
- return '${input.substring(0, limit ~/ 2 - snip.length)}'
- '$snip'
- '${input.substring(limit)}';
-}
-
-/// Prints relevant system information and the log transcript to [path].
-void dumpTranscriptToFile(String path, String command, Entrypoint? entrypoint) {
- final buffer = StringBuffer();
- buffer.writeln('''
-Information about the latest pub run.
-
-If you believe something is not working right, you can go to
-https://github.com/dart-lang/pub/issues/new to post a new issue and attach this file.
-
-Before making this file public, make sure to remove any sensitive information!
-
-Pub version: ${sdk.version}
-Created: ${DateTime.now().toIso8601String()}
-FLUTTER_ROOT: ${Platform.environment['FLUTTER_ROOT'] ?? '<not set>'}
-PUB_HOSTED_URL: ${Platform.environment['PUB_HOSTED_URL'] ?? '<not set>'}
-PUB_CACHE: "${Platform.environment['PUB_CACHE'] ?? '<not set>'}"
-Command: $command
-Platform: ${Platform.operatingSystem}
-''');
-
- if (entrypoint != null) {
- buffer.writeln('---- ${p.absolute(entrypoint.pubspecPath)} ----');
- if (fileExists(entrypoint.pubspecPath)) {
- buffer.writeln(_limit(readTextFile(entrypoint.pubspecPath), 5000));
- } else {
- buffer.writeln('<No pubspec.yaml>');
- }
- buffer.writeln('---- End pubspec.yaml ----');
- buffer.writeln('---- ${p.absolute(entrypoint.lockFilePath)} ----');
- if (fileExists(entrypoint.lockFilePath)) {
- buffer.writeln(_limit(readTextFile(entrypoint.lockFilePath), 5000));
- } else {
- buffer.writeln('<No pubspec.lock>');
- }
- buffer.writeln('---- End pubspec.lock ----');
- }
-
- buffer.writeln('---- Log transcript ----');
-
- _transcript.forEach((entry) {
- _printToStream(buffer, entry, showLabel: true);
- }, (discarded) {
- buffer.writeln('---- ($discarded entries discarded) ----');
- });
- buffer.writeln('---- End log transcript ----');
- ensureDir(p.dirname(path));
- try {
- writeTextFile(path, buffer.toString(), dontLogContents: true);
- } on IOException catch (e) {
- stderr.writeln('Failed writing log to `$path` ($e), writing it to stderr:');
- dumpTranscriptToStdErr();
- }
-}
-
/// Filter out normal pub output when not attached to a terminal
///
/// Unless the user has overriden the verbosity,
@@ -405,8 +339,8 @@
/// This is useful to not pollute stdout when the output is piped somewhere.
Future<T> warningsOnlyUnlessTerminal<T>(FutureOr<T> Function() callback) async {
final oldVerbosity = verbosity;
- if (verbosity == Verbosity.normal && !stdout.hasTerminal) {
- verbosity = Verbosity.warning;
+ if (verbosity == Verbosity.NORMAL && !stdout.hasTerminal) {
+ verbosity = Verbosity.WARNING;
}
final result = await callback();
verbosity = oldVerbosity;
@@ -419,7 +353,7 @@
/// If anything else is logged during this (including another call to
/// [progress]) that cancels the progress animation, although the total time
/// will still be printed once it finishes. If [fine] is passed, the progress
-/// information will only be visible at [Level.fine].
+/// information will only be visible at [Level.FINE].
Future<T> progress<T>(String message, Future<T> Function() callback) {
_stopProgress();
@@ -558,7 +492,7 @@
_printToStream(sink, entry, showLabel: showLabel);
}
-void _printToStream(StringSink sink, _Entry entry, {required bool showLabel}) {
+void _printToStream(IOSink sink, _Entry entry, {required bool showLabel}) {
_stopProgress();
var firstLine = true;
diff --git a/lib/src/null_safety_analysis.dart b/lib/src/null_safety_analysis.dart
index 5b882a8..2ad034d 100644
--- a/lib/src/null_safety_analysis.dart
+++ b/lib/src/null_safety_analysis.dart
@@ -109,7 +109,7 @@
SolveResult result;
try {
result = await resolveVersions(
- SolveType.get,
+ SolveType.GET,
_systemCache,
fakeRoot,
);
diff --git a/lib/src/package.dart b/lib/src/package.dart
index d100157..0bc6f89 100644
--- a/lib/src/package.dart
+++ b/lib/src/package.dart
@@ -83,12 +83,10 @@
..addAll(dependencyOverrides);
}
- /// Returns a list of paths to all Dart executables in this package's bin
+ /// Returns a list of asset ids for all Dart executables in this package's bin
/// directory.
List<String> get executablePaths {
- final binDir = p.join(dir, 'bin');
- if (!dirExists(binDir)) return <String>[];
- return ordered(listDir(p.join(dir, 'bin'), includeDirs: false))
+ return ordered(listFiles(beneath: 'bin', recursive: false))
.where((executable) => p.extension(executable) == '.dart')
.map((executable) => p.relative(executable, from: dir))
.toList();
diff --git a/lib/src/package_config.dart b/lib/src/package_config.dart
index d64808b..0493dcc 100644
--- a/lib/src/package_config.dart
+++ b/lib/src/package_config.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:convert';
-
import 'package:pub_semver/pub_semver.dart';
import 'language_version.dart';
@@ -162,6 +160,8 @@
/// Given as `<major>.<minor>` version, similar to the `// @dart = X.Y`
/// comment. This is derived from the lower-bound on the Dart SDK requirement
/// in the `pubspec.yaml` for the given package.
+ ///
+ /// `null` if not given.
LanguageVersion? languageVersion;
/// Additional properties not in the specification for the
@@ -173,8 +173,10 @@
required this.rootUri,
this.packageUri,
this.languageVersion,
- this.additionalProperties = const {},
- });
+ this.additionalProperties,
+ }) {
+ additionalProperties ??= {};
+ }
/// Create [PackageConfigEntry] from JSON [data].
///
@@ -247,13 +249,7 @@
Map<String, Object?> toJson() => {
'name': name,
'rootUri': rootUri.toString(),
- if (packageUri != null) 'packageUri': packageUri.toString(),
+ if (packageUri != null) 'packageUri': packageUri?.toString(),
if (languageVersion != null) 'languageVersion': '$languageVersion',
}..addAll(additionalProperties ?? {});
-
- @override
- String toString() {
- // TODO: implement toString
- return JsonEncoder.withIndent(' ').convert(toJson());
- }
}
diff --git a/lib/src/package_name.dart b/lib/src/package_name.dart
index d83f466..50f4bcc 100644
--- a/lib/src/package_name.dart
+++ b/lib/src/package_name.dart
@@ -57,10 +57,6 @@
}
@override
- bool operator ==(Object other) =>
- throw UnimplementedError('Subclass should implement ==');
-
- @override
int get hashCode {
var thisSource = source;
if (thisSource == null) return name.hashCode;
@@ -108,9 +104,6 @@
@override
bool operator ==(other) => other is PackageRef && samePackage(other);
-
- @override
- int get hashCode => super.hashCode ^ 'PackageRef'.hashCode;
}
/// A reference to a specific version of a package.
diff --git a/lib/src/progress.dart b/lib/src/progress.dart
index b9c6931..06ad9e9 100644
--- a/lib/src/progress.dart
+++ b/lib/src/progress.dart
@@ -34,7 +34,7 @@
Progress(this._message, {bool fine = false}) {
_stopwatch.start();
- var level = fine ? log.Level.fine : log.Level.message;
+ var level = fine ? log.Level.FINE : log.Level.MESSAGE;
// The animation is only shown when it would be meaningful to a human.
// That means we're writing a visible message to a TTY at normal log levels
@@ -43,7 +43,7 @@
!log.verbosity.isLevelVisible(level) ||
log.json.enabled ||
fine ||
- log.verbosity.isLevelVisible(log.Level.fine)) {
+ log.verbosity.isLevelVisible(log.Level.FINE)) {
// Not animating, so just log the start and wait until the task is
// completed.
log.write(level, '$_message...');
diff --git a/lib/src/pub_embeddable_command.dart b/lib/src/pub_embeddable_command.dart
index b9e59c6..c1fa863 100644
--- a/lib/src/pub_embeddable_command.dart
+++ b/lib/src/pub_embeddable_command.dart
@@ -58,13 +58,11 @@
@override
final PubAnalytics? analytics;
- final bool Function() isVerbose;
-
- PubEmbeddableCommand(this.analytics, this.isVerbose) : super() {
+ PubEmbeddableCommand(this.analytics) : super() {
argParser.addFlag('trace',
help: 'Print debugging information when an error occurs.');
argParser.addFlag('verbose',
- abbr: 'v', negatable: false, help: 'Print detailed logging.');
+ abbr: 'v', negatable: false, help: 'Shortcut for "--verbosity=all".');
argParser.addOption(
'directory',
abbr: 'C',
@@ -103,15 +101,12 @@
}
@override
- bool get captureStackChains => _isVerbose;
+ bool get captureStackChains => argResults['verbose'];
@override
- Verbosity get verbosity => _isVerbose ? Verbosity.all : Verbosity.normal;
+ Verbosity get verbosity =>
+ argResults['verbose'] ? Verbosity.ALL : Verbosity.NORMAL;
@override
- bool get trace => _isVerbose;
-
- bool get _isVerbose {
- return argResults['verbose'] || isVerbose();
- }
+ bool get trace => argResults['verbose'];
}
diff --git a/lib/src/rate_limited_scheduler.dart b/lib/src/rate_limited_scheduler.dart
index 85d73cd..2d301d3 100644
--- a/lib/src/rate_limited_scheduler.dart
+++ b/lib/src/rate_limited_scheduler.dart
@@ -5,6 +5,7 @@
import 'dart:async';
import 'dart:collection';
+import 'package:pedantic/pedantic.dart';
import 'package:pool/pool.dart';
/// Handles rate-limited scheduling of tasks.
diff --git a/lib/src/solver/failure.dart b/lib/src/solver/failure.dart
index 60f70c5..ba27a3b 100644
--- a/lib/src/solver/failure.dart
+++ b/lib/src/solver/failure.dart
@@ -7,6 +7,7 @@
import '../exceptions.dart';
import '../log.dart' as log;
import '../package_name.dart';
+import '../sdk.dart';
import '../utils.dart';
import 'incompatibility.dart';
import 'incompatibility_cause.dart';
@@ -92,20 +93,39 @@
String write() {
var buffer = StringBuffer();
- // Find all notices from incompatibility causes. This allows an
- // [IncompatibilityCause] to provide a notice that is printed before the
- // explanation of the conflict.
- // Notably, this is used for stating which SDK version is currently
- // installed, if an SDK is incompatible with a dependency.
- final notices = _root.externalIncompatibilities
- .map((c) => c.cause.notice)
- .whereNotNull()
- .toSet() // Avoid duplicates
- .sortedBy((n) => n); // sort for consistency
- for (final n in notices) {
- buffer.writeln(n);
+ // SDKs whose version constraints weren't matched.
+ var sdkConstraintCauses = <Sdk>{};
+
+ // SDKs implicated in any way in the solve failure.
+ var sdkCauses = <Sdk>{};
+
+ for (var incompatibility in _root.externalIncompatibilities) {
+ var cause = incompatibility.cause;
+ if (cause is PackageNotFoundCause) {
+ var sdk = cause.sdk;
+ if (sdk != null) {
+ sdkCauses.add(sdk);
+ }
+ } else if (cause is SdkCause) {
+ sdkCauses.add(cause.sdk);
+ sdkConstraintCauses.add(cause.sdk);
+ }
}
- if (notices.isNotEmpty) buffer.writeln();
+
+ // If the failure was caused in part by unsatisfied SDK constraints,
+ // indicate the actual versions so we don't have to list them (possibly
+ // multiple times) in the main body of the error message.
+ //
+ // Iterate through [sdks] to ensure that SDKs versions are printed in a
+ // consistent order
+ var wroteLine = false;
+ for (var sdk in sdks.values) {
+ if (!sdkConstraintCauses.contains(sdk)) continue;
+ if (!sdk.isAvailable) continue;
+ wroteLine = true;
+ buffer.writeln('The current ${sdk.name} SDK version is ${sdk.version}.');
+ }
+ if (wroteLine) buffer.writeln();
if (_root.cause is ConflictCause) {
_visit(_root, const {});
@@ -139,21 +159,15 @@
buffer.writeln(wordWrap(message, prefix: ' ' * (padding + 2)));
}
- // Iterate through all hints, these are intended to be actionable, such as:
- // * How to install an SDK, and,
- // * How to provide authentication.
- // Hence, it makes sense to show these at the end of the explanation, as the
- // user will ideally see these before reading the actual conflict and
- // understand how to fix the issue.
- _root.externalIncompatibilities
- .map((c) => c.cause.hint)
- .whereNotNull()
- .toSet() // avoid duplicates
- .sortedBy((hint) => hint) // sort hints for consistent ordering.
- .forEach((hint) {
+ // Iterate through [sdks] to ensure that SDKs versions are printed in a
+ // consistent order
+ for (var sdk in sdks.values) {
+ if (!sdkCauses.contains(sdk)) continue;
+ if (sdk.isAvailable) continue;
+ if (sdk.installMessage == null) continue;
buffer.writeln();
- buffer.writeln(hint);
- });
+ buffer.writeln(sdk.installMessage);
+ }
return buffer.toString();
}
diff --git a/lib/src/solver/incompatibility_cause.dart b/lib/src/solver/incompatibility_cause.dart
index a2a2327..53dcfe2 100644
--- a/lib/src/solver/incompatibility_cause.dart
+++ b/lib/src/solver/incompatibility_cause.dart
@@ -10,8 +10,6 @@
/// The reason an [Incompatibility]'s terms are incompatible.
abstract class IncompatibilityCause {
- const IncompatibilityCause._();
-
/// The incompatibility represents the requirement that the root package
/// exists.
static const IncompatibilityCause root = _Cause('root');
@@ -29,26 +27,11 @@
/// The incompatibility indicates that the package has an unknown source.
static const IncompatibilityCause unknownSource = _Cause('unknown source');
-
- /// Human readable notice / information providing context for this
- /// incompatibility.
- ///
- /// This may be multiple lines, and will be printed before the explanation.
- /// This is used highlight information that is useful for understanding the
- /// why this conflict happened.
- String? get notice => null;
-
- /// Human readable hint indicating how this incompatibility may be resolved.
- ///
- /// This may be multiple lines, and will be printed after the explanation.
- /// This should only be included if it is actionable and likely to resolve the
- /// issue for the user.
- String? get hint => null;
}
/// The incompatibility was derived from two existing incompatibilities during
/// conflict resolution.
-class ConflictCause extends IncompatibilityCause {
+class ConflictCause implements IncompatibilityCause {
/// The incompatibility that was originally found to be in conflict, from
/// which the target incompatibility was derived.
final Incompatibility conflict;
@@ -57,14 +40,14 @@
/// from which the target incompatibility was derived.
final Incompatibility other;
- ConflictCause(this.conflict, this.other) : super._();
+ ConflictCause(this.conflict, this.other);
}
/// A class for stateless [IncompatibilityCause]s.
-class _Cause extends IncompatibilityCause {
+class _Cause implements IncompatibilityCause {
final String _name;
- const _Cause(this._name) : super._();
+ const _Cause(this._name);
@override
String toString() => _name;
@@ -72,7 +55,7 @@
/// The incompatibility represents a package's SDK constraint being
/// incompatible with the current SDK.
-class SdkCause extends IncompatibilityCause {
+class SdkCause implements IncompatibilityCause {
/// The union of all the incompatible versions' constraints on the SDK.
// TODO(zarah): Investigate if this can be non-nullable
final VersionConstraint? constraint;
@@ -80,41 +63,20 @@
/// The SDK with which the package was incompatible.
final Sdk sdk;
- @override
- String? get notice {
- // If the SDK is not available, then we have an actionable [hint] printed
- // after the explanation. So we don't need to state that the SDK is not
- // available.
- if (!sdk.isAvailable) {
- return null;
- }
- // If the SDK is available and we have an incompatibility, then the user has
- // the wrong SDK version (one that is not compatible with any solution).
- // Thus, it makes sense to highlight the current SDK version.
- return 'The current ${sdk.name} SDK version is ${sdk.version}.';
- }
-
- @override
- String? get hint {
- // If the SDK is available, then installing it won't help
- if (sdk.isAvailable) {
- return null;
- }
- // Return an install message for the SDK, if there is an install message.
- return sdk.installMessage;
- }
-
- SdkCause(this.constraint, this.sdk) : super._();
+ SdkCause(this.constraint, this.sdk);
}
/// The incompatibility represents a package that couldn't be found by its
/// source.
-class PackageNotFoundCause extends IncompatibilityCause {
+class PackageNotFoundCause implements IncompatibilityCause {
/// The exception indicating why the package couldn't be found.
final PackageNotFoundException exception;
- PackageNotFoundCause(this.exception) : super._();
+ /// If the incompatibility was caused by an SDK being unavailable, this is
+ /// that SDK.
+ ///
+ /// Otherwise `null`.
+ Sdk? get sdk => exception.missingSdk;
- @override
- String? get hint => exception.hint;
+ PackageNotFoundCause(this.exception);
}
diff --git a/lib/src/solver/report.dart b/lib/src/solver/report.dart
index e3dd5dc..e345413 100644
--- a/lib/src/solver/report.dart
+++ b/lib/src/solver/report.dart
@@ -89,7 +89,7 @@
}
} else {
if (numChanged == 0) {
- if (_type == SolveType.get) {
+ if (_type == SolveType.GET) {
log.message('Got dependencies$suffix!');
} else {
log.message('No dependencies changed$suffix.');
@@ -245,7 +245,7 @@
String? message;
// See if there are any newer versions of the package that we were
// unable to upgrade to.
- if (newId != null && _type != SolveType.downgrade) {
+ if (newId != null && _type != SolveType.DOWNGRADE) {
var versions = _result.availableVersions[newId.name]!;
var newerStable = false;
@@ -292,7 +292,7 @@
}
}
- if (_type == SolveType.get &&
+ if (_type == SolveType.GET &&
!(alwaysShow || changed || addedOrRemoved || message != null)) {
return;
}
diff --git a/lib/src/solver/result.dart b/lib/src/solver/result.dart
index bc01162..692b05f 100644
--- a/lib/src/solver/result.dart
+++ b/lib/src/solver/result.dart
@@ -5,7 +5,6 @@
import 'package:collection/collection.dart';
import 'package:pub_semver/pub_semver.dart';
-import '../http.dart';
import '../io.dart';
import '../lock_file.dart';
import '../log.dart' as log;
@@ -13,7 +12,6 @@
import '../package_name.dart';
import '../pub_embeddable_command.dart';
import '../pubspec.dart';
-import '../source/cached.dart';
import '../source/hosted.dart';
import '../source_registry.dart';
import '../system_cache.dart';
@@ -80,18 +78,6 @@
final LockFile _previousLockFile;
- /// Downloads all cached packages in [packages].
- Future<void> downloadCachedPackages(SystemCache cache) async {
- await Future.wait(packages.map((id) async {
- if (id.source == null) return;
- final source = cache.source(id.source);
- if (source is! CachedSource) return;
- return await withDependencyType(_root.dependencyType(id.name), () async {
- await source.downloadToSystemCache(id);
- });
- }));
- }
-
/// Returns the names of all packages that were changed.
///
/// This includes packages that were added or removed.
@@ -136,7 +122,7 @@
final report =
SolveReport(type, _sources, _root, _previousLockFile, this, cache);
report.summarize(dryRun: dryRun);
- if (type == SolveType.upgrade) {
+ if (type == SolveType.UPGRADE) {
await report.reportDiscontinued();
report.reportOutdated();
}
diff --git a/lib/src/solver/type.dart b/lib/src/solver/type.dart
index 28a3230..c899e31 100644
--- a/lib/src/solver/type.dart
+++ b/lib/src/solver/type.dart
@@ -6,15 +6,15 @@
class SolveType {
/// As few changes to the lockfile as possible to be consistent with the
/// pubspec.
- static const get = SolveType._('get');
+ static const GET = SolveType._('get');
/// Upgrade all packages or specific packages to the highest versions
/// possible, regardless of the lockfile.
- static const upgrade = SolveType._('upgrade');
+ static const UPGRADE = SolveType._('upgrade');
/// Downgrade all packages or specific packages to the lowest versions
/// possible, regardless of the lockfile.
- static const downgrade = SolveType._('downgrade');
+ static const DOWNGRADE = SolveType._('downgrade');
final String _name;
diff --git a/lib/src/solver/version_solver.dart b/lib/src/solver/version_solver.dart
index d4e3a75..120244a 100644
--- a/lib/src/solver/version_solver.dart
+++ b/lib/src/solver/version_solver.dart
@@ -485,7 +485,7 @@
_root.dependencyType(package.name),
overridden,
_getAllowedRetracted(ref.name),
- downgrade: _type == SolveType.downgrade);
+ downgrade: _type == SolveType.DOWNGRADE);
});
}
@@ -493,7 +493,7 @@
///
/// Returns `null` if it isn't in the lockfile (or has been unlocked).
PackageId? _getLocked(String? package) {
- if (_type == SolveType.get) {
+ if (_type == SolveType.GET) {
if (_unlock.contains(package)) {
return null;
}
@@ -503,7 +503,7 @@
// When downgrading, we don't want to force the latest versions of
// non-hosted packages, since they don't support multiple versions and thus
// can't be downgraded.
- if (_type == SolveType.downgrade) {
+ if (_type == SolveType.DOWNGRADE) {
var locked = _lockFile.packages[package];
if (locked != null && !locked.source!.hasMultipleVersions) return locked;
}
diff --git a/lib/src/source.dart b/lib/src/source.dart
index ecbc5eb..add55fa 100644
--- a/lib/src/source.dart
+++ b/lib/src/source.dart
@@ -116,7 +116,7 @@
/// [description] in the right format.
///
/// [containingPath] is the containing directory of the root package.
- dynamic serializeDescription(String? containingPath, description) {
+ dynamic serializeDescription(String containingPath, description) {
return description;
}
diff --git a/lib/src/source/git.dart b/lib/src/source/git.dart
index 3be752c..0d98ae9 100644
--- a/lib/src/source/git.dart
+++ b/lib/src/source/git.dart
@@ -108,10 +108,10 @@
/// For the descriptions where `relative` attribute is `true`, tries to make
/// `url` relative to the specified [containingPath].
@override
- dynamic serializeDescription(String? containingPath, description) {
+ dynamic serializeDescription(String containingPath, description) {
final copy = Map.from(description);
copy.remove('relative');
- if (description['relative'] == true && containingPath != null) {
+ if (description['relative'] == true) {
copy['url'] = p.url.relative(description['url'],
from: Uri.file(containingPath).toString());
}
diff --git a/lib/src/source/hosted.dart b/lib/src/source/hosted.dart
index 2cfc52a..def4a98 100644
--- a/lib/src/source/hosted.dart
+++ b/lib/src/source/hosted.dart
@@ -10,6 +10,7 @@
show maxBy, IterableNullableExtension;
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as p;
+import 'package:pedantic/pedantic.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:stack_trace/stack_trace.dart';
@@ -159,7 +160,7 @@
}
@override
- dynamic serializeDescription(String? containingPath, description) {
+ dynamic serializeDescription(String containingPath, description) {
final desc = _asDescription(description);
return _serializedDescriptionFor(desc.packageName, desc.uri);
}
@@ -232,7 +233,8 @@
return _HostedDescription(packageName, defaultUrl);
}
- final canUseShorthandSyntax = languageVersion.supportsShorterHostedSyntax;
+ final canUseShorthandSyntax =
+ languageVersion >= _minVersionForShorterHostedSyntax;
if (description is String) {
// Old versions of pub (pre Dart 2.15) interpret `hosted: foo` as
@@ -255,7 +257,7 @@
} else {
throw FormatException(
'Using `hosted: <url>` is only supported with a minimum SDK '
- 'constraint of ${LanguageVersion.firstVersionWithShorterHostedSyntax}.',
+ 'constraint of $_minVersionForShorterHostedSyntax.',
);
}
}
@@ -270,7 +272,7 @@
if (name is! String) {
throw FormatException("The 'name' key must have a string value without "
- 'a minimum Dart SDK constraint of ${LanguageVersion.firstVersionWithShorterHostedSyntax}.0 or higher.');
+ 'a minimum Dart SDK constraint of $_minVersionForShorterHostedSyntax.0 or higher.');
}
var url = defaultUrl;
@@ -285,6 +287,21 @@
return _HostedDescription(name, url);
}
+ /// Minimum language version at which short hosted syntax is supported.
+ ///
+ /// This allows `hosted` dependencies to be expressed as:
+ /// ```yaml
+ /// dependencies:
+ /// foo:
+ /// hosted: https://some-pub.com/path
+ /// version: ^1.0.0
+ /// ```
+ ///
+ /// At older versions, `hosted` dependencies had to be a map with a `url` and
+ /// a `name` key.
+ static const LanguageVersion _minVersionForShorterHostedSyntax =
+ LanguageVersion(2, 15);
+
static final RegExp _looksLikePackageName =
RegExp(r'^[a-zA-Z_]+[a-zA-Z0-9_]*$');
}
@@ -389,8 +406,8 @@
body = decoded;
result = _versionInfoFromPackageListing(body, ref, url);
} on Exception catch (error, stackTrace) {
- final packageName = source._asDescription(ref.description).packageName;
- _throwFriendlyError(error, stackTrace, packageName, serverUrl);
+ var parsed = source._asDescription(ref.description);
+ _throwFriendlyError(error, stackTrace, parsed.packageName, parsed.uri);
}
// Cache the response on disk.
@@ -688,7 +705,6 @@
packages.map((package) async {
var id = source.idFor(package.name, package.version, url: url);
try {
- deleteEntry(package.dir);
await _download(id, package.dir);
return RepairResult(id, success: true);
} catch (error, stackTrace) {
@@ -797,74 +813,51 @@
var tempDir = systemCache.createTempDir();
await extractTarGz(readBinaryFileAsSream(archivePath), tempDir);
+ // Remove the existing directory if it exists. This will happen if
+ // we're forcing a download to repair the cache.
+ if (dirExists(destPath)) deleteEntry(destPath);
+
// Now that the get has succeeded, move it to the real location in the
- // cache.
- //
- // If this fails with a "directory not empty" exception we assume that
- // another pub process has installed the same package version while we
- // downloaded.
- tryRenameDir(tempDir, destPath);
+ // cache. This ensures that we don't leave half-busted ghost
+ // directories in the user's pub cache if a get fails.
+ renameDir(tempDir, destPath);
});
}
- /// When an error occurs trying to read something about [package] from [hostedUrl],
+ /// When an error occurs trying to read something about [package] from [url],
/// this tries to translate into a more user friendly error message.
///
/// Always throws an error, either the original one or a better one.
Never _throwFriendlyError(
- Exception error,
+ error,
StackTrace stackTrace,
String package,
- Uri hostedUrl,
+ Uri url,
) {
if (error is PubHttpException) {
if (error.response.statusCode == 404) {
throw PackageNotFoundException(
- 'could not find package $package at $hostedUrl',
+ 'could not find package $package at $url',
innerError: error,
innerTrace: stackTrace);
}
fail(
'${error.response.statusCode} ${error.response.reasonPhrase} trying '
- 'to find package $package at $hostedUrl.',
+ 'to find package $package at $url.',
error,
stackTrace);
} else if (error is io.SocketException) {
- fail('Got socket error trying to find package $package at $hostedUrl.',
- error, stackTrace);
+ fail('Got socket error trying to find package $package at $url.', error,
+ stackTrace);
} else if (error is io.TlsException) {
- fail('Got TLS error trying to find package $package at $hostedUrl.',
- error, stackTrace);
- } else if (error is AuthenticationException) {
- String? hint;
- var message = 'authentication failed';
-
- assert(error.statusCode == 401 || error.statusCode == 403);
- if (error.statusCode == 401) {
- hint = '$hostedUrl package repository requested authentication!\n'
- 'You can provide credentials using:\n'
- ' pub token add $hostedUrl';
- }
- if (error.statusCode == 403) {
- hint = 'Insufficient permissions to the resource at the $hostedUrl '
- 'package repository.\nYou can modify credentials using:\n'
- ' pub token add $hostedUrl';
- message = 'authorization failed';
- }
-
- if (error.serverMessage?.isNotEmpty == true && hint != null) {
- hint += '\n${error.serverMessage}';
- }
-
- throw PackageNotFoundException(message, hint: hint);
+ fail('Got TLS error trying to find package $package at $url.', error,
+ stackTrace);
} else if (error is FormatException) {
throw PackageNotFoundException(
- 'Got badly formatted response trying to find package $package at $hostedUrl',
- innerError: error,
- innerTrace: stackTrace,
- hint: 'Check that "$hostedUrl" is a valid package repository.',
- );
+ 'Got badly formatted response trying to find package $package at $url',
+ innerError: error,
+ innerTrace: stackTrace);
} else {
// Otherwise re-throw the original exception.
throw error;
@@ -982,9 +975,7 @@
// If there are no versions in the cache, report a clearer error.
if (versions.isEmpty) {
throw PackageNotFoundException(
- 'could not find package ${ref.name} in cache',
- hint: 'Try again without --offline!',
- );
+ 'could not find package ${ref.name} in cache');
}
return versions;
@@ -1000,9 +991,7 @@
@override
Future<Pubspec> describeUncached(PackageId id) {
throw PackageNotFoundException(
- '${id.name} ${id.version} is not available in cache',
- hint: 'Try again without --offline!',
- );
+ '${id.name} ${id.version} is not available in your system cache');
}
@override
diff --git a/lib/src/source/path.dart b/lib/src/source/path.dart
index 4679f98..0401ebd 100644
--- a/lib/src/source/path.dart
+++ b/lib/src/source/path.dart
@@ -130,11 +130,9 @@
///
/// For the descriptions where `relative` attribute is `true`, tries to make
/// `path` relative to the specified [containingPath].
- ///
- /// If [containingPath] is `null` they are serialized as absolute.
@override
- dynamic serializeDescription(String? containingPath, description) {
- if (description['relative'] == true && containingPath != null) {
+ dynamic serializeDescription(String containingPath, description) {
+ if (description['relative']) {
return {
'path': relativePathWithPosixSeparators(
p.relative(description['path'], from: containingPath)),
diff --git a/lib/src/source/sdk.dart b/lib/src/source/sdk.dart
index 1458d1b..f1dde9e 100644
--- a/lib/src/source/sdk.dart
+++ b/lib/src/source/sdk.dart
@@ -101,10 +101,8 @@
if (sdk == null) {
throw PackageNotFoundException('unknown SDK "$identifier"');
} else if (!sdk.isAvailable) {
- throw PackageNotFoundException(
- 'the ${sdk.name} SDK is not available',
- hint: sdk.installMessage,
- );
+ throw PackageNotFoundException('the ${sdk.name} SDK is not available',
+ missingSdk: sdk);
}
var path = sdk.packagePath(package.name);
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 2a5768e..39439e9 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -375,7 +375,7 @@
// If we're using verbose logging, be more verbose but more accurate when
// reporting timing information.
- var msString = log.verbosity.isLevelVisible(log.Level.fine)
+ var msString = log.verbosity.isLevelVisible(log.Level.FINE)
? _padLeft(ms.toString(), 3, '0')
: (ms ~/ 100).toString();
diff --git a/lib/src/validator.dart b/lib/src/validator.dart
index 1b07560..29392fa 100644
--- a/lib/src/validator.dart
+++ b/lib/src/validator.dart
@@ -101,7 +101,7 @@
'Make sure your SDK constraint excludes old versions:\n'
'\n'
'environment:\n'
- ' sdk: "$newSdkConstraint"');
+ ' sdk: \"$newSdkConstraint\"');
}
/// Returns whether [version1] and [version2] are pre-releases of the same version.
diff --git a/lib/src/validator/changelog.dart b/lib/src/validator/changelog.dart
index 614eba2..694ace2 100644
--- a/lib/src/validator/changelog.dart
+++ b/lib/src/validator/changelog.dart
@@ -21,7 +21,7 @@
final changelog = entrypoint.root.changelogPath;
if (changelog == null) {
- warnings.add('Please add a `CHANGELOG.md` to your package. '
+ warnings.add('Please add a`CHANGELOG.md` to your package. '
'See https://dart.dev/tools/pub/publishing#important-files.');
return;
}
diff --git a/lib/src/validator/gitignore.dart b/lib/src/validator/gitignore.dart
index 4fb49b1..7770b57 100644
--- a/lib/src/validator/gitignore.dart
+++ b/lib/src/validator/gitignore.dart
@@ -46,10 +46,8 @@
beneath: beneath,
listDir: (dir) {
var contents = Directory(resolve(dir)).listSync();
- return contents
- .where((e) => !(linkExists(e.path) && dirExists(e.path)))
- .map((entity) => p.posix
- .joinAll(p.split(p.relative(entity.path, from: root))));
+ return contents.map((entity) =>
+ p.posix.joinAll(p.split(p.relative(entity.path, from: root))));
},
ignoreForDir: (dir) {
final gitIgnore = resolve('$dir/.gitignore');
@@ -71,7 +69,7 @@
if (ignoredFilesCheckedIn.isNotEmpty) {
warnings.add('''
-${ignoredFilesCheckedIn.length} checked-in ${pluralize('file', ignoredFilesCheckedIn.length)} ${ignoredFilesCheckedIn.length == 1 ? 'is' : 'are'} ignored by a `.gitignore`.
+${ignoredFilesCheckedIn.length} checked in ${pluralize('file', ignoredFilesCheckedIn.length)} ${ignoredFilesCheckedIn.length == 1 ? 'is' : 'are'} ignored by a `.gitignore`.
Previous versions of Pub would include those in the published package.
Consider adjusting your `.gitignore` files to not ignore those files, and if you do not wish to
diff --git a/lib/src/validator/sdk_constraint.dart b/lib/src/validator/sdk_constraint.dart
index ff25e53..063ad7e 100644
--- a/lib/src/validator/sdk_constraint.dart
+++ b/lib/src/validator/sdk_constraint.dart
@@ -50,7 +50,7 @@
'Expand it manually instead:\n'
'\n'
'environment:\n'
- ' sdk: "$dartConstraintWithoutCaret"');
+ ' sdk: \"$dartConstraintWithoutCaret\"');
}
if (dartConstraint.max == null) {
diff --git a/lib/src/validator/size.dart b/lib/src/validator/size.dart
index e989518..8f258a9 100644
--- a/lib/src/validator/size.dart
+++ b/lib/src/validator/size.dart
@@ -10,7 +10,7 @@
import '../validator.dart';
/// The maximum size of the package to upload (100 MB).
-const _maxSize = 100 * 1024 * 1024;
+const _MAX_SIZE = 100 * 1024 * 1024;
/// A validator that validates that a package isn't too big.
class SizeValidator extends Validator {
@@ -21,7 +21,7 @@
@override
Future validate() {
return packageSize.then((size) {
- if (size <= _maxSize) return;
+ if (size <= _MAX_SIZE) return;
var sizeInMb = (size / math.pow(2, 20)).toStringAsPrecision(4);
// Current implementation of Package.listFiles skips hidden files
var ignoreExists = fileExists(entrypoint.root.path('.gitignore'));
diff --git a/pubspec.yaml b/pubspec.yaml
index a7d9bb4..8c76708 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -18,6 +18,7 @@
meta: ^1.3.0
oauth2: ^2.0.0
path: ^1.8.0
+ pedantic: ^1.11.0
pool: ^1.5.0
pub_semver: ^2.1.0
shelf: ^1.1.1
@@ -28,7 +29,6 @@
yaml_edit: ^2.0.0
dev_dependencies:
- lints: ^1.0.1
shelf_test_handler: ^2.0.0
test: ^1.17.3
test_descriptor: ^2.0.0
diff --git a/test/add/common/add_test.dart b/test/add/common/add_test.dart
index 82e098b..e124be8 100644
--- a/test/add/common/add_test.dart
+++ b/test/add/common/add_test.dart
@@ -13,7 +13,7 @@
void main() {
test('URL encodes the package name', () async {
- await servePackages();
+ await serveNoPackages();
await d.appDir({}).create();
@@ -37,48 +37,49 @@
});
group('normally', () {
+ test('fails if extra arguments are passed', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
+
+ await d.dir(appPath, [
+ d.pubspec({'name': 'myapp'})
+ ]).create();
+
+ await pubAdd(
+ args: ['foo', '^1.2.2'],
+ exitCode: exit_codes.USAGE,
+ error: contains('Takes only a single argument.'));
+
+ await d.dir(appPath, [
+ d.pubspec({
+ 'name': 'myapp',
+ }),
+ d.nothing('.dart_tool/package_config.json'),
+ d.nothing('pubspec.lock'),
+ d.nothing('.packages'),
+ ]).validate();
+ });
+
test('adds a package from a pub server', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({}).create();
await pubAdd(args: ['foo:1.2.3']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': '1.2.3'}).validate();
});
- test('adds multiple package from a pub server', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.serve('bar', '1.1.0');
- server.serve('baz', '2.5.3');
-
- await d.appDir({}).create();
-
- await pubAdd(args: ['foo:1.2.3', 'bar:1.1.0', 'baz:2.5.3']);
-
- await d.cacheDir(
- {'foo': '1.2.3', 'bar': '1.1.0', 'baz': '2.5.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- d.packageConfigEntry(name: 'baz', version: '2.5.3'),
- ]).validate();
- await d
- .appDir({'foo': '1.2.3', 'bar': '1.1.0', 'baz': '2.5.3'}).validate();
- });
-
test(
'does not remove empty dev_dependencies while adding to normal dependencies',
() async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -95,9 +96,7 @@
await pubAdd(args: ['foo:1.2.3']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -110,8 +109,7 @@
test('dry run does not actually add the package or modify the pubspec',
() async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({}).create();
@@ -133,8 +131,7 @@
test(
'adds a package from a pub server even when dependencies key does not exist',
() async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.dir(appPath, [
d.pubspec({'name': 'myapp'})
@@ -143,17 +140,16 @@
await pubAdd(args: ['foo:1.2.3']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': '1.2.3'}).validate();
});
group('warns user to use pub upgrade if package exists', () {
test('if package is added without a version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.appDir({'foo': '1.2.2'}).create();
@@ -168,9 +164,10 @@
});
test('if package is added with a specific version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.appDir({'foo': '1.2.2'}).create();
@@ -185,9 +182,10 @@
});
test('if package is added with a version constraint range', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.appDir({'foo': '1.2.2'}).create();
@@ -203,9 +201,10 @@
});
test('removes dev_dependency and add to normal dependency', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -226,9 +225,7 @@
'adding it to dependencies instead.'));
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -240,9 +237,10 @@
group('dependency override', () {
test('passes if package does not specify a range', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -255,9 +253,7 @@
await pubAdd(args: ['foo']);
await d.cacheDir({'foo': '1.2.2'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
@@ -268,8 +264,9 @@
});
test('passes if constraint matches git dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.git('foo.git',
[d.libDir('foo'), d.libPubspec('foo', '1.2.3')]).create();
@@ -298,8 +295,9 @@
});
test('passes if constraint matches path dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(
'foo', [d.libDir('foo'), d.libPubspec('foo', '1.2.2')]).create();
@@ -327,8 +325,9 @@
});
test('fails with bad version constraint', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.dir(appPath, [
d.pubspec({'name': 'myapp', 'dependencies': {}})
@@ -349,9 +348,10 @@
});
test('fails if constraint does not match override', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -381,8 +381,9 @@
});
test('fails if constraint matches git dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.git('foo.git',
[d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -420,8 +421,9 @@
test('fails if constraint does not match path dependency override',
() async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(
'foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -460,8 +462,7 @@
group('--dev', () {
test('--dev adds packages to dev_dependencies instead', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.dir(appPath, [
d.pubspec({'name': 'myapp', 'dev_dependencies': {}})
@@ -469,9 +470,7 @@
await pubAdd(args: ['--dev', 'foo:1.2.3']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -483,9 +482,10 @@
group('warns user to use pub upgrade if package exists', () {
test('if package is added without a version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -510,9 +510,10 @@
});
test('if package is added with a specific version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -537,9 +538,10 @@
});
test('if package is added with a version constraint range', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -566,9 +568,10 @@
group('dependency override', () {
test('passes if package does not specify a range', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -581,9 +584,7 @@
await pubAdd(args: ['foo', '--dev']);
await d.cacheDir({'foo': '1.2.2'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
@@ -594,8 +595,10 @@
});
test('passes if constraint is git dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
+
await d.git('foo.git',
[d.libDir('foo'), d.libPubspec('foo', '1.2.3')]).create();
@@ -623,8 +626,9 @@
});
test('passes if constraint matches path dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(
'foo', [d.libDir('foo'), d.libPubspec('foo', '1.2.2')]).create();
@@ -652,9 +656,10 @@
});
test('fails if constraint does not match override', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -684,8 +689,9 @@
});
test('fails if constraint matches git dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.git('foo.git',
[d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -723,9 +729,9 @@
test('fails if constraint does not match path dependency override',
() async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
-
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(
'foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -764,9 +770,10 @@
test(
'prints information saying that package is already a dependency if it '
'already exists and exits with a usage exception', () async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -798,8 +805,9 @@
/// Differs from the previous test because this tests YAML in flow format.
test('adds to empty ', () async {
- final server = await servePackages();
- server.serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -817,9 +825,10 @@
});
test('preserves comments', () async {
- await servePackages()
- ..serve('bar', '1.0.0')
- ..serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
diff --git a/test/add/common/invalid_options.dart b/test/add/common/invalid_options.dart
index f5bf23d..0b60ed8 100644
--- a/test/add/common/invalid_options.dart
+++ b/test/add/common/invalid_options.dart
@@ -39,10 +39,12 @@
test('cannot use both --path and --host-<option> flags', () async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveNoPackages();
+ globalPackageServer!.serveErrors();
- final server = await startPackageServer();
- server.serve('foo', '1.2.3');
+ final server = await PackageServer.start((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d
.dir('bar', [d.libDir('bar'), d.libPubspec('foo', '0.0.1')]).create();
@@ -74,10 +76,12 @@
test('cannot use both --hosted-url and --git-<option> flags', () async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveNoPackages();
+ globalPackageServer!.serveErrors();
- final server = await startPackageServer();
- server.serve('foo', '1.2.3');
+ final server = await PackageServer.start((builder) {
+ builder.serve('foo', '1.2.3');
+ });
ensureGit();
diff --git a/test/add/common/version_constraint_test.dart b/test/add/common/version_constraint_test.dart
index f058082..d865727 100644
--- a/test/add/common/version_constraint_test.dart
+++ b/test/add/common/version_constraint_test.dart
@@ -10,96 +10,86 @@
void main() {
test('allows empty version constraint', () async {
- await servePackages()
- ..serve('foo', '0.2.3')
- ..serve('foo', '1.0.1')
- ..serve('foo', '1.2.3')
- ..serve('foo', '2.0.0-dev')
- ..serve('foo', '1.3.4-dev');
+ await servePackages((builder) {
+ builder.serve('foo', '0.2.3');
+ builder.serve('foo', '1.0.1');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '2.0.0-dev');
+ builder.serve('foo', '1.3.4-dev');
+ });
await d.appDir({}).create();
await pubAdd(args: ['foo']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': '^1.2.3'}).validate();
});
test('allows specific version constraint', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({}).create();
await pubAdd(args: ['foo:1.2.3']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': '1.2.3'}).validate();
});
test('allows specific pre-release version constraint', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3-dev');
+ await servePackages((builder) => builder.serve('foo', '1.2.3-dev'));
await d.appDir({}).create();
await pubAdd(args: ['foo:1.2.3-dev']);
await d.cacheDir({'foo': '1.2.3-dev'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3-dev'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3-dev'}).validate();
await d.appDir({'foo': '1.2.3-dev'}).validate();
});
test('allows the "any" version constraint', () async {
- await servePackages()
- ..serve('foo', '0.2.3')
- ..serve('foo', '1.0.1')
- ..serve('foo', '1.2.3')
- ..serve('foo', '2.0.0-dev')
- ..serve('foo', '1.3.4-dev');
+ await servePackages((builder) {
+ builder.serve('foo', '0.2.3');
+ builder.serve('foo', '1.0.1');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '2.0.0-dev');
+ builder.serve('foo', '1.3.4-dev');
+ });
await d.appDir({}).create();
await pubAdd(args: ['foo:any']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': 'any'}).validate();
});
test('allows version constraint range', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({}).create();
await pubAdd(args: ['foo:>1.2.0 <2.0.0']);
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({'foo': '>1.2.0 <2.0.0'}).validate();
});
test(
'empty constraint allows it to choose the latest version not in conflict',
() async {
- await servePackages()
- ..serve('foo', '0.1.0')
- ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
- ..serve('bar', '2.0.3')
- ..serve('bar', '2.0.4');
+ await servePackages((builder) {
+ builder.serve('foo', '0.1.0');
+ builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
+ builder.serve('bar', '2.0.3');
+ builder.serve('bar', '2.0.4');
+ });
await d.appDir({'bar': '2.0.3'}).create();
@@ -108,16 +98,12 @@
await d.appDir({'foo': '^0.1.0', 'bar': '2.0.3'}).validate();
await d.cacheDir({'foo': '0.1.0', 'bar': '2.0.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '0.1.0'),
- d.packageConfigEntry(name: 'bar', version: '2.0.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '0.1.0', 'bar': '2.0.3'}).validate();
});
group('does not update pubspec if no available version found', () {
test('simple', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.3');
+ await servePackages((builder) => builder.serve('foo', '1.0.3'));
await d.appDir({}).create();
@@ -138,10 +124,11 @@
});
test('transitive', () async {
- await servePackages()
- ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
- ..serve('bar', '2.0.3')
- ..serve('bar', '2.0.4');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
+ builder.serve('bar', '2.0.3');
+ builder.serve('bar', '2.0.4');
+ });
await d.appDir({'bar': '2.0.3'}).create();
diff --git a/test/add/common/version_resolution_test.dart b/test/add/common/version_resolution_test.dart
index 0f44d2b..4bd355b 100644
--- a/test/add/common/version_resolution_test.dart
+++ b/test/add/common/version_resolution_test.dart
@@ -13,10 +13,10 @@
test('unlocks transitive dependencies', () async {
/// The server used to only have the foo v3.2.1 as the latest,
/// so pub get will create a pubspec.lock to foo 3.2.1
- final server = await servePackages();
-
- server.serve('foo', '3.2.1');
- server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ await servePackages((builder) {
+ builder.serve('foo', '3.2.1');
+ builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ });
await d.appDir({'bar': '1.0.0'}).create();
await pubGet();
@@ -24,69 +24,66 @@
/// foo's package creator releases a newer version of foo, and we
/// want to test that this is what the user gets when they run
/// pub add foo.
- server.serve('foo', '3.5.0');
- server.serve('foo', '3.1.0');
- server.serve('foo', '2.5.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '3.5.0');
+ builder.serve('foo', '3.1.0');
+ builder.serve('foo', '2.5.0');
+ });
await pubAdd(args: ['foo']);
await d.appDir({'foo': '^3.5.0', 'bar': '1.0.0'}).validate();
await d.cacheDir({'foo': '3.5.0', 'bar': '1.0.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '3.5.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '3.5.0', 'bar': '1.0.0'}).validate();
});
test('chooses the appropriate version to not break other dependencies',
() async {
/// The server used to only have the foo v3.2.1 as the latest,
/// so pub get will create a pubspec.lock to foo 3.2.1
- final server = await servePackages();
-
- server.serve('foo', '3.2.1');
- server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ await servePackages((builder) {
+ builder.serve('foo', '3.2.1');
+ builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ });
await d.appDir({'bar': '1.0.0'}).create();
await pubGet();
- server.serve('foo', '4.0.0');
- server.serve('foo', '2.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '4.0.0');
+ builder.serve('foo', '2.0.0');
+ });
await pubAdd(args: ['foo']);
await d.appDir({'foo': '^3.2.1', 'bar': '1.0.0'}).validate();
await d.cacheDir({'foo': '3.2.1', 'bar': '1.0.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '3.2.1'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '3.2.1', 'bar': '1.0.0'}).validate();
});
test('may upgrade other packages if they allow a later version to be chosen',
() async {
/// The server used to only have the foo v3.2.1 as the latest,
/// so pub get will create a pubspec.lock to foo 3.2.1
- final server = await servePackages();
-
- server.serve('foo', '3.2.1');
- server.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ await servePackages((builder) {
+ builder.serve('foo', '3.2.1');
+ builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
+ });
await d.appDir({'bar': '^1.0.0'}).create();
await pubGet();
- server.serve('foo', '5.0.0');
- server.serve('foo', '4.0.0');
- server.serve('foo', '2.0.0');
- server.serve('bar', '1.5.0', deps: {'foo': '^4.0.0'});
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '5.0.0');
+ builder.serve('foo', '4.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('bar', '1.5.0', deps: {'foo': '^4.0.0'});
+ });
await pubAdd(args: ['foo']);
await d.appDir({'foo': '^4.0.0', 'bar': '^1.0.0'}).validate();
await d.cacheDir({'foo': '4.0.0', 'bar': '1.5.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '4.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.5.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '4.0.0', 'bar': '1.5.0'}).validate();
});
}
diff --git a/test/add/git/git_test.dart b/test/add/git/git_test.dart
index d976172..2577af8 100644
--- a/test/add/git/git_test.dart
+++ b/test/add/git/git_test.dart
@@ -156,8 +156,9 @@
});
test('can be overriden by dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d.git(
'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -173,9 +174,7 @@
await pubAdd(args: ['foo', '--git-url', '../foo.git']);
await d.cacheDir({'foo': '1.2.2'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
@@ -186,18 +185,4 @@
})
]).validate();
});
-
- test('fails if multiple packages passed for git source', () async {
- ensureGit();
-
- await d.git(
- 'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
-
- await d.appDir({}).create();
-
- await pubAdd(
- args: ['foo', 'bar', 'baz', '--git-url', '../foo.git'],
- exitCode: exit_codes.USAGE,
- error: contains('Can only add a single git package at a time.'));
- });
}
diff --git a/test/add/git/subdir_test.dart b/test/add/git/subdir_test.dart
index 8e8c39c..0f78069 100644
--- a/test/add/git/subdir_test.dart
+++ b/test/add/git/subdir_test.dart
@@ -30,11 +30,10 @@
])
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub',
- path: pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir')),
- ]).validate();
+
+ await d.appPackagesFile({
+ 'sub': pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir')
+ }).validate();
await d.appDir({
'sub': {
@@ -69,11 +68,9 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub',
- path: pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub': pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir')
+ }).validate();
await d.appDir({
'sub': {
diff --git a/test/add/hosted/non_default_pub_server_test.dart b/test/add/hosted/non_default_pub_server_test.dart
index 60538e3..fbe966e 100644
--- a/test/add/hosted/non_default_pub_server_test.dart
+++ b/test/add/hosted/non_default_pub_server_test.dart
@@ -12,12 +12,13 @@
test('adds a package from a non-default pub server', () async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveErrors();
- final server = await servePackages();
- server.serve('foo', '0.2.5');
- server.serve('foo', '1.1.0');
- server.serve('foo', '1.2.3');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '0.2.5');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({}).create();
@@ -26,9 +27,7 @@
await pubAdd(args: ['foo:1.2.3', '--hosted-url', url]);
await d.cacheDir({'foo': '1.2.3'}, port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({
'foo': {
'version': '1.2.3',
@@ -37,49 +36,6 @@
}).validate();
});
- test('adds multiple packages from a non-default pub server', () async {
- // Make the default server serve errors. Only the custom server should
- // be accessed.
- (await servePackages()).serveErrors();
-
- final server = await servePackages();
- server.serve('foo', '1.1.0');
- server.serve('foo', '1.2.3');
- server.serve('bar', '0.2.5');
- server.serve('bar', '3.2.3');
- server.serve('baz', '0.1.3');
- server.serve('baz', '1.3.5');
-
- await d.appDir({}).create();
-
- final url = server.url;
-
- await pubAdd(
- args: ['foo:1.2.3', 'bar:3.2.3', 'baz:1.3.5', '--hosted-url', url]);
-
- await d.cacheDir({'foo': '1.2.3', 'bar': '3.2.3', 'baz': '1.3.5'},
- port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- d.packageConfigEntry(name: 'bar', version: '3.2.3'),
- d.packageConfigEntry(name: 'baz', version: '1.3.5'),
- ]).validate();
- await d.appDir({
- 'foo': {
- 'version': '1.2.3',
- 'hosted': {'name': 'foo', 'url': url}
- },
- 'bar': {
- 'version': '3.2.3',
- 'hosted': {'name': 'bar', 'url': url}
- },
- 'baz': {
- 'version': '1.3.5',
- 'hosted': {'name': 'baz', 'url': url}
- }
- }).validate();
- });
-
test('fails when adding from an invalid url', () async {
ensureGit();
@@ -108,12 +64,13 @@
() async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveErrors();
- final server = await servePackages();
- server.serve('foo', '0.2.5');
- server.serve('foo', '1.1.0');
- server.serve('foo', '1.2.3');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '0.2.5');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({}).create();
@@ -122,9 +79,7 @@
await pubAdd(args: ['foo', '--hosted-url', url]);
await d.cacheDir({'foo': '1.2.3'}, port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({
'foo': {
'version': '^1.2.3',
@@ -137,12 +92,13 @@
() async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveErrors();
- final server = await servePackages();
- server.serve('foo', '0.2.5');
- server.serve('foo', '1.1.0');
- server.serve('foo', '1.2.3');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '0.2.5');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({}).create();
@@ -151,9 +107,7 @@
await pubAdd(args: ['foo', '--hosted-url', url]);
await d.cacheDir({'foo': '1.2.3'}, port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({
'foo': {
'version': '^1.2.3',
@@ -167,11 +121,13 @@
'constraint', () async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
- final server = await servePackages();
- server.serve('foo', '0.2.5');
- server.serve('foo', '1.1.0');
- server.serve('foo', '1.2.3');
+ await serveErrors();
+
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '0.2.5');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({}).create();
@@ -180,9 +136,7 @@
await pubAdd(args: ['foo:any', '--hosted-url', url]);
await d.cacheDir({'foo': '1.2.3'}, port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
await d.appDir({
'foo': {
'version': 'any',
diff --git a/test/add/path/absolute_path_test.dart b/test/add/path/absolute_path_test.dart
index 5e63679..0811bea 100644
--- a/test/add/path/absolute_path_test.dart
+++ b/test/add/path/absolute_path_test.dart
@@ -20,9 +20,7 @@
await pubAdd(args: ['foo', '--path', absolutePath]);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: absolutePath),
- ]).validate();
+ await d.appPackagesFile({'foo': absolutePath}).validate();
await d.appDir({
'foo': {'path': absolutePath}
@@ -43,28 +41,6 @@
}).validate();
});
- test('fails when adding multiple packages through local path', () async {
- ensureGit();
-
- await d.git(
- 'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
-
- await d.appDir({}).create();
- final absolutePath = path.join(d.sandbox, 'foo');
-
- await pubAdd(
- args: ['foo:2.0.0', 'bar:0.1.3', 'baz:1.3.1', '--path', absolutePath],
- error: contains('Can only add a single local package at a time.'),
- exitCode: exit_codes.USAGE);
-
- await d.appDir({}).validate();
- await d.dir(appPath, [
- d.nothing('.dart_tool/package_config.json'),
- d.nothing('pubspec.lock'),
- d.nothing('.packages'),
- ]).validate();
- });
-
test('fails when adding with an invalid version constraint', () async {
ensureGit();
@@ -112,8 +88,9 @@
});
test('can be overriden by dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d
.dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
@@ -129,9 +106,7 @@
await pubAdd(args: ['foo', '--path', absolutePath]);
await d.cacheDir({'foo': '1.2.2'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
diff --git a/test/add/path/relative_path_test.dart b/test/add/path/relative_path_test.dart
index e08ba3c..8fa1932 100644
--- a/test/add/path/relative_path_test.dart
+++ b/test/add/path/relative_path_test.dart
@@ -19,9 +19,7 @@
await pubAdd(args: ['foo', '--path', '../foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
await d.appDir({
'foo': {'path': '../foo'}
@@ -40,9 +38,7 @@
output: contains('Changed 1 dependency in myapp!'),
);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
await d.appDir({
'foo': {'path': '../foo'}
@@ -106,8 +102,9 @@
});
test('can be overriden by dependency override', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ });
await d
.dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
@@ -122,9 +119,7 @@
await pubAdd(args: ['foo', '--path', '../foo']);
await d.cacheDir({'foo': '1.2.2'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
diff --git a/test/add/sdk/sdk_test.dart b/test/add/sdk/sdk_test.dart
index ff7d442..25995e3 100644
--- a/test/add/sdk/sdk_test.dart
+++ b/test/add/sdk/sdk_test.dart
@@ -11,8 +11,9 @@
void main() {
setUp(() async {
- final server = await servePackages();
- server.serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ });
await d.dir('flutter', [
d.dir('packages', [
@@ -42,12 +43,11 @@
'foo': {'sdk': 'flutter', 'version': '^0.0.1'}
}
}),
- ]).validate();
-
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'foo', path: p.join(d.sandbox, 'flutter', 'packages', 'foo')),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
+ d.packagesFile({
+ 'myapp': '.',
+ 'foo': p.join(d.sandbox, 'flutter', 'packages', 'foo'),
+ 'bar': '1.0.0'
+ })
]).validate();
});
@@ -66,11 +66,11 @@
'foo': {'sdk': 'flutter', 'version': '0.0.1'}
}
}),
- ]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'foo', path: p.join(d.sandbox, 'flutter', 'packages', 'foo')),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
+ d.packagesFile({
+ 'myapp': '.',
+ 'foo': p.join(d.sandbox, 'flutter', 'packages', 'foo'),
+ 'bar': '1.0.0'
+ })
]).validate();
});
@@ -80,10 +80,11 @@
args: ['baz', '--sdk', 'flutter'],
environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')});
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'baz',
- path: p.join(d.sandbox, 'flutter', 'bin', 'cache', 'pkg', 'baz'))
+ await d.dir(appPath, [
+ d.packagesFile({
+ 'myapp': '.',
+ 'baz': p.join(d.sandbox, 'flutter', 'bin', 'cache', 'pkg', 'baz')
+ })
]).validate();
});
diff --git a/test/cache/add/adds_latest_matching_version_test.dart b/test/cache/add/adds_latest_matching_version_test.dart
index 7bf9625..0e78b12 100644
--- a/test/cache/add/adds_latest_matching_version_test.dart
+++ b/test/cache/add/adds_latest_matching_version_test.dart
@@ -13,11 +13,12 @@
test(
'adds the latest version of the package matching the '
'version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.2')
- ..serve('foo', '1.2.3')
- ..serve('foo', '2.0.0-dev')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '2.0.0-dev');
+ builder.serve('foo', '2.0.0');
+ });
await runPub(
args: ['cache', 'add', 'foo', '-v', '>=1.0.0 <2.0.0'],
diff --git a/test/cache/add/adds_latest_version_test.dart b/test/cache/add/adds_latest_version_test.dart
index cf34857..6e196f6 100644
--- a/test/cache/add/adds_latest_version_test.dart
+++ b/test/cache/add/adds_latest_version_test.dart
@@ -9,10 +9,11 @@
void main() {
test('adds the latest stable version of the package', () async {
- await servePackages()
- ..serve('foo', '1.2.2')
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.4-dev');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.4-dev');
+ });
await runPub(
args: ['cache', 'add', 'foo'], output: 'Downloading foo 1.2.3...');
diff --git a/test/cache/add/all_adds_all_matching_versions_test.dart b/test/cache/add/all_adds_all_matching_versions_test.dart
index a05e8dc..9dfb3c7 100644
--- a/test/cache/add/all_adds_all_matching_versions_test.dart
+++ b/test/cache/add/all_adds_all_matching_versions_test.dart
@@ -9,11 +9,12 @@
void main() {
test('"--all" adds all matching versions of the package', () async {
- await servePackages()
- ..serve('foo', '1.2.2')
- ..serve('foo', '1.2.3-dev')
- ..serve('foo', '1.2.3')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ builder.serve('foo', '1.2.3-dev');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '2.0.0');
+ });
await runPub(
args: ['cache', 'add', 'foo', '-v', '>=1.0.0 <2.0.0', '--all'],
diff --git a/test/cache/add/all_with_some_versions_present_test.dart b/test/cache/add/all_with_some_versions_present_test.dart
index 7b5b36d..861ac4c 100644
--- a/test/cache/add/all_with_some_versions_present_test.dart
+++ b/test/cache/add/all_with_some_versions_present_test.dart
@@ -9,11 +9,12 @@
void main() {
test('"--all" adds all non-installed versions of the package', () async {
- await servePackages()
- ..serve('foo', '1.2.1')
- ..serve('foo', '1.2.2')
- ..serve('foo', '1.2.3')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.1');
+ builder.serve('foo', '1.2.2');
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '2.0.0');
+ });
// Install a couple of versions first.
await runPub(
diff --git a/test/cache/add/already_cached_test.dart b/test/cache/add/already_cached_test.dart
index 8c74da9..ac244dc 100644
--- a/test/cache/add/already_cached_test.dart
+++ b/test/cache/add/already_cached_test.dart
@@ -9,8 +9,9 @@
void main() {
test('does nothing if the package is already cached', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ });
// Run once to put it in the cache.
await runPub(
diff --git a/test/cache/add/no_matching_version_test.dart b/test/cache/add/no_matching_version_test.dart
index a860294..4b4455c 100644
--- a/test/cache/add/no_matching_version_test.dart
+++ b/test/cache/add/no_matching_version_test.dart
@@ -8,9 +8,10 @@
void main() {
test('fails if no version matches the version constraint', () async {
- await servePackages()
- ..serve('foo', '1.2.2')
- ..serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.2');
+ builder.serve('foo', '1.2.3');
+ });
await runPub(
args: ['cache', 'add', 'foo', '-v', '>2.0.0'],
diff --git a/test/cache/add/package_not_found_test.dart b/test/cache/add/package_not_found_test.dart
index caf45f4..91f3f3e 100644
--- a/test/cache/add/package_not_found_test.dart
+++ b/test/cache/add/package_not_found_test.dart
@@ -9,13 +9,12 @@
void main() {
test('fails if the package cound not be found on the source', () async {
- await servePackages();
+ await serveNoPackages();
await runPub(
args: ['cache', 'add', 'foo'],
- error: RegExp(
- r'Package not available \(could not find package foo at http://.*\)\.',
- ),
+ error: RegExp(r"Package doesn't exist \(could not find package foo at "
+ r'http://.*\)\.'),
exitCode: exit_codes.UNAVAILABLE);
});
}
diff --git a/test/cache/clean_test.dart b/test/cache/clean_test.dart
index 7a79bc8..b03c0c8 100644
--- a/test/cache/clean_test.dart
+++ b/test/cache/clean_test.dart
@@ -17,9 +17,9 @@
});
test('running pub cache clean --force deletes cache', () async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.1.2')
- ..serve('bar', '1.2.3');
+ ..serve('bar', '1.2.3'));
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubGet();
final cache = path.join(d.sandbox, cachePath);
@@ -32,9 +32,9 @@
test('running pub cache clean deletes cache only with confirmation',
() async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.1.2')
- ..serve('bar', '1.2.3');
+ ..serve('bar', '1.2.3'));
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubGet();
final cache = path.join(d.sandbox, cachePath);
diff --git a/test/cache/repair/handles_corrupted_binstub_test.dart b/test/cache/repair/handles_corrupted_binstub_test.dart
index 0ca169f..9991ec1 100644
--- a/test/cache/repair/handles_corrupted_binstub_test.dart
+++ b/test/cache/repair/handles_corrupted_binstub_test.dart
@@ -9,10 +9,11 @@
void main() {
test('handles a corrupted binstub script', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/cache/repair/handles_failure_test.dart b/test/cache/repair/handles_failure_test.dart
index d5637ca..471bcf8 100644
--- a/test/cache/repair/handles_failure_test.dart
+++ b/test/cache/repair/handles_failure_test.dart
@@ -11,14 +11,15 @@
void main() {
test('handles failure to reinstall some packages', () async {
// Only serve two packages so repairing will have a failure.
- final server = await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.5');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.5');
+ });
// Set up a cache with some packages.
await d.dir(cachePath, [
d.dir('hosted', [
- d.dir('localhost%58${server.port}', [
+ d.dir('localhost%58${globalServer!.port}', [
d.dir('foo-1.2.3',
[d.libPubspec('foo', '1.2.3'), d.file('broken.txt')]),
d.dir('foo-1.2.4',
@@ -38,7 +39,7 @@
expect(pub.stderr, emits(startsWith('Failed to repair foo 1.2.4. Error:')));
expect(
pub.stderr,
- emits('Package not available '
+ emits('Package doesn\'t exist '
'(Package foo has no version 1.2.4).'));
expect(pub.stdout, emits('Reinstalled 2 packages.'));
diff --git a/test/cache/repair/handles_orphaned_binstub_test.dart b/test/cache/repair/handles_orphaned_binstub_test.dart
index 0754496..9c4e74a 100644
--- a/test/cache/repair/handles_orphaned_binstub_test.dart
+++ b/test/cache/repair/handles_orphaned_binstub_test.dart
@@ -7,7 +7,7 @@
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
-const _orphanedBinstub = '''
+const _ORPHANED_BINSTUB = '''
#!/usr/bin/env sh
# This file was created by pub v0.1.2-3.
# Package: foo
@@ -20,7 +20,7 @@
void main() {
test('handles an orphaned binstub script', () async {
await d.dir(cachePath, [
- d.dir('bin', [d.file(binStubName('script'), _orphanedBinstub)])
+ d.dir('bin', [d.file(binStubName('script'), _ORPHANED_BINSTUB)])
]).create();
await runPub(
diff --git a/test/cache/repair/hosted.dart b/test/cache/repair/hosted.dart
index ec3786b..97c8167 100644
--- a/test/cache/repair/hosted.dart
+++ b/test/cache/repair/hosted.dart
@@ -11,20 +11,21 @@
import '../../test_pub.dart';
void main() {
- setUp(() async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.4')
- ..serve('foo', '1.2.5')
- ..serve('bar', '1.2.3')
- ..serve('bar', '1.2.4');
+ setUp(() {
+ return servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.4');
+ builder.serve('foo', '1.2.5');
+ builder.serve('bar', '1.2.3');
+ builder.serve('bar', '1.2.4');
+ });
});
test('reinstalls previously cached hosted packages', () async {
// Set up a cache with some broken packages.
await d.dir(cachePath, [
d.dir('hosted', [
- d.dir('localhost%58${globalServer.port}', [
+ d.dir('localhost%58${globalServer!.port}', [
d.dir('foo-1.2.3',
[d.libPubspec('foo', '1.2.3'), d.file('broken.txt')]),
d.dir('foo-1.2.5',
@@ -63,7 +64,7 @@
// Set up a cache with some broken packages.
await d.dir(cachePath, [
d.dir('hosted', [
- d.dir('localhost%58${globalServer.port}', [
+ d.dir('localhost%58${globalServer!.port}', [
d.dir('bar-1.2.4', [d.file('broken.txt')]),
d.dir('foo-1.2.3', [d.file('broken.txt')]),
d.dir('foo-1.2.5', [d.file('broken.txt')]),
@@ -99,7 +100,7 @@
// Set up a cache with some broken packages.
await d.dir(cachePath, [
d.dir('hosted', [
- d.dir('localhost%58${globalServer.port}', [
+ d.dir('localhost%58${globalServer!.port}', [
d.dir('bar-1.2.4', [d.file('pubspec.yaml', '{')]),
d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')]),
d.dir('foo-1.2.5', [d.file('pubspec.yaml', '{')]),
diff --git a/test/cache/repair/recompiles_snapshots_test.dart b/test/cache/repair/recompiles_snapshots_test.dart
index f3c3d6c..89b3575 100644
--- a/test/cache/repair/recompiles_snapshots_test.dart
+++ b/test/cache/repair/recompiles_snapshots_test.dart
@@ -9,10 +9,11 @@
void main() {
test('recompiles activated executable snapshots', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/cache/repair/updates_binstubs_test.dart b/test/cache/repair/updates_binstubs_test.dart
index e8cbfb4..1cd848b 100644
--- a/test/cache/repair/updates_binstubs_test.dart
+++ b/test/cache/repair/updates_binstubs_test.dart
@@ -7,7 +7,7 @@
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
-const _outdatedBinstub = '''
+const _OUTDATED_BINSTUB = '''
#!/usr/bin/env sh
# This file was created by pub v0.1.2-3.
# Package: foo
@@ -19,17 +19,19 @@
void main() {
test('updates an outdated binstub script', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'foo-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'foo-script': 'script'}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
await d.dir(cachePath, [
- d.dir('bin', [d.file(binStubName('foo-script'), _outdatedBinstub)])
+ d.dir('bin', [d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)])
]).create();
// Repair them.
diff --git a/test/dependency_override_test.dart b/test/dependency_override_test.dart
index 59f59e4..2ea5abc 100644
--- a/test/dependency_override_test.dart
+++ b/test/dependency_override_test.dart
@@ -12,10 +12,11 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('chooses best version matching override constraint', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -27,14 +28,13 @@
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0'}).validate();
});
test('treats override as implicit dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -45,19 +45,18 @@
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
});
test('ignores other constraints on overridden package', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0')
- ..serve('bar', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ builder.serve('bar', '1.0.0', pubspec: {
'dependencies': {'foo': '5.0.0-nonexistent'}
});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -69,16 +68,14 @@
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0', 'bar': '1.0.0'}).validate();
});
test('ignores SDK constraints', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'environment': {'sdk': '5.6.7-fblthp'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'environment': {'sdk': '5.6.7-fblthp'}
+ });
});
await d.dir(appPath, [
@@ -89,15 +86,15 @@
]).create();
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
});
test('warns about overridden dependencies', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('bar', '1.0.0');
+ });
await d
.dir('baz', [d.libDir('baz'), d.libPubspec('baz', '0.0.1')]).create();
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index 58bf303..3bdd224 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -37,7 +37,7 @@
await precompile(
executablePath: p.join('bin', 'dependency_services.dart'),
outputPath: snapshotFilename,
- incrementalDillPath: snapshotIncrementalFilename,
+ incrementalDillOutputPath: snapshotIncrementalFilename,
name: 'bin/pub.dart',
packageConfigPath: p.join('.dart_tool', 'package_config.json'));
return snapshotFilename;
@@ -99,10 +99,10 @@
Future<void> main() async {
testWithGolden('Removing transitive', (context) async {
- (await servePackages())
+ await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
..serve('foo', '2.2.3')
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
@@ -120,11 +120,11 @@
});
testWithGolden('Compatible', (context) async {
- final server = (await servePackages())
+ await servePackages((builder) => builder
..serve('foo', '1.2.3')
..serve('foo', '2.2.3')
..serve('bar', '1.2.3')
- ..serve('bar', '2.2.3');
+ ..serve('bar', '2.2.3'));
await d.dir(appPath, [
d.pubspec({
'name': 'app',
@@ -135,7 +135,7 @@
})
]).create();
await pubGet();
- server.serve('foo', '1.2.4');
+ globalPackageServer!.add((b) => b.serve('foo', '1.2.4'));
await listReportApply(context, [
_PackageVersion('foo', Version.parse('1.2.3')),
_PackageVersion('transitive', null)
@@ -143,10 +143,10 @@
});
testWithGolden('Adding transitive', (context) async {
- (await servePackages())
+ await servePackages((builder) => builder
..serve('foo', '1.2.3')
..serve('foo', '2.2.3', deps: {'transitive': '^1.0.0'})
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
@@ -164,9 +164,9 @@
});
testWithGolden('multibreaking', (context) async {
- final server = (await servePackages())
+ await servePackages((builder) => builder
..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ ..serve('bar', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
@@ -178,13 +178,13 @@
})
]).create();
await pubGet();
- server
+ globalPackageServer!.add((builder) => builder
..serve('foo', '1.5.0') // compatible
..serve('foo', '2.0.0') // single breaking
..serve('foo', '3.0.0', deps: {'bar': '^2.0.0'}) // multi breaking
..serve('foo', '3.0.1', deps: {'bar': '^2.0.0'})
..serve('bar', '2.0.0', deps: {'foo': '^3.0.0'})
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await listReportApply(context, [
_PackageVersion('foo', Version.parse('3.0.1'),
constraint: VersionConstraint.parse('^3.0.0')),
diff --git a/test/deps_test.dart b/test/deps_test.dart
index 7336f13..207e8e7 100644
--- a/test/deps_test.dart
+++ b/test/deps_test.dart
@@ -10,19 +10,21 @@
void main() {
setUp(() async {
- await servePackages()
- ..serve('normal', '1.2.3',
- deps: {'transitive': 'any', 'circular_a': 'any'})
- ..serve('transitive', '1.2.3', deps: {'shared': 'any'})
- ..serve('shared', '1.2.3', deps: {'other': 'any'})
- ..serve('dev_only', '1.2.3')
- ..serve('unittest', '1.2.3', deps: {'shared': 'any', 'dev_only': 'any'})
- ..serve('other', '1.0.0', deps: {'myapp': 'any'})
- ..serve('overridden', '1.0.0')
- ..serve('overridden', '2.0.0')
- ..serve('override_only', '1.2.3')
- ..serve('circular_a', '1.2.3', deps: {'circular_b': 'any'})
- ..serve('circular_b', '1.2.3', deps: {'circular_a': 'any'});
+ await servePackages((builder) {
+ builder.serve('normal', '1.2.3',
+ deps: {'transitive': 'any', 'circular_a': 'any'});
+ builder.serve('transitive', '1.2.3', deps: {'shared': 'any'});
+ builder.serve('shared', '1.2.3', deps: {'other': 'any'});
+ builder.serve('dev_only', '1.2.3');
+ builder.serve('unittest', '1.2.3',
+ deps: {'shared': 'any', 'dev_only': 'any'});
+ builder.serve('other', '1.0.0', deps: {'myapp': 'any'});
+ builder.serve('overridden', '1.0.0');
+ builder.serve('overridden', '2.0.0');
+ builder.serve('override_only', '1.2.3');
+ builder.serve('circular_a', '1.2.3', deps: {'circular_b': 'any'});
+ builder.serve('circular_b', '1.2.3', deps: {'circular_a': 'any'});
+ });
await d.dir('from_path',
[d.libDir('from_path'), d.libPubspec('from_path', '1.2.3')]).create();
diff --git a/test/descriptor.dart b/test/descriptor.dart
index ee50851..7a592db 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -179,7 +179,7 @@
/// that this cache represents. It defaults to [globalServer.port].
Descriptor hostedCache(Iterable<Descriptor> contents, {int? port}) {
return dir(cachePath, [
- dir('hosted', [dir('localhost%58${port ?? globalServer.port}', contents)])
+ dir('hosted', [dir('localhost%58${port ?? globalServer?.port}', contents)])
]);
}
@@ -277,23 +277,6 @@
}) =>
PackageConfigFileDescriptor(packages, generatorVersion);
-Descriptor appPackageConfigFile(
- List<PackageConfigEntry> packages, {
- String generatorVersion = '0.1.2+3',
-}) =>
- dir(
- appPath,
- [
- packageConfigFile(
- [
- packageConfigEntry(name: 'myapp', path: '.'),
- ...packages,
- ],
- generatorVersion: generatorVersion,
- ),
- ],
- );
-
/// Create a [PackageConfigEntry] which assumes package with [name] is either
/// a cached package with given [version] or a path dependency at given [path].
PackageConfigEntry packageConfigEntry({
@@ -301,7 +284,6 @@
String? version,
String? path,
String? languageVersion,
- PackageServer? server,
}) {
if (version != null && path != null) {
throw ArgumentError.value(
@@ -313,7 +295,7 @@
}
Uri rootUri;
if (version != null) {
- rootUri = p.toUri((server ?? globalServer).pathInCache(name, version));
+ rootUri = p.toUri(globalPackageServer!.pathInCache(name, version));
} else {
rootUri = p.toUri(p.join('..', path));
}
diff --git a/test/descriptor/packages.dart b/test/descriptor/packages.dart
index b670322..de52a80 100644
--- a/test/descriptor/packages.dart
+++ b/test/descriptor/packages.dart
@@ -156,20 +156,10 @@
// Compare packages as sets to ignore ordering.
expect(
- config.packages,
- _packages
- .map(
- (p) => isA<PackageConfigEntry>()
- .having((p0) => p0.name, 'name', p.name)
- .having(
- (p0) => p0.languageVersion,
- 'languageVersion',
- // If the expected entry has no language-version we don't check it.
- p.languageVersion ?? anything)
- .having((p0) => p0.rootUri, 'rootUri', p.rootUri)
- .having((p0) => p0.packageUri, 'packageUri', p.packageUri),
- )
- .toSet(),
+ config.packages.map((e) => e.toJson()).toSet(),
+ equals(_packages.map((e) => e.toJson()).toSet()),
+ reason:
+ '"packages" property in "$packageConfigFile" does not expected values',
);
final expected = PackageConfig.fromJson(_config.toJson());
diff --git a/test/descriptor_server.dart b/test/descriptor_server.dart
new file mode 100644
index 0000000..973a49c
--- /dev/null
+++ b/test/descriptor_server.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:test/test.dart' hide fail;
+
+import 'descriptor.dart' as d;
+
+/// The global [DescriptorServer] that's used by default.
+///
+/// `null` if there's no global server in use. This can be set to replace the
+/// existing global server.
+DescriptorServer? get globalServer => _globalServer;
+set globalServer(DescriptorServer? value) {
+ var server = _globalServer;
+ if (server == null) {
+ addTearDown(() {
+ _globalServer = null;
+ });
+ } else {
+ expect(server.close(), completes);
+ }
+
+ _globalServer = value;
+}
+
+DescriptorServer? _globalServer;
+
+/// Creates a global [DescriptorServer] to serve [contents] as static files.
+///
+/// This server will exist only for the duration of the pub run. It's accessible
+/// via [server]. Subsequent calls to [serve] replace the previous server.
+Future serve([List<d.Descriptor> contents = const []]) async {
+ globalServer = (await DescriptorServer.start())..contents.addAll(contents);
+}
+
+class DescriptorServer {
+ /// The underlying server.
+ final shelf.Server _server;
+
+ /// A future that will complete to the port used for the server.
+ int get port => _server.url.port;
+
+ /// The list of paths that have been requested from this server.
+ final requestedPaths = <String>[];
+
+ /// The base directory descriptor of the directories served by [this].
+ final d.DirectoryDescriptor _baseDir;
+
+ /// The descriptors served by this server.
+ ///
+ /// This can safely be modified between requests.
+ List<d.Descriptor> get contents => _baseDir.contents;
+
+ /// Handlers for requests not easily described as files.
+ final Map<Pattern, shelf.Handler> extraHandlers = {};
+
+ /// Creates an HTTP server to serve [contents] as static files.
+ ///
+ /// This server exists only for the duration of the pub run. Subsequent calls
+ /// to [serve] replace the previous server.
+ static Future<DescriptorServer> start() async =>
+ DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0));
+
+ /// Creates a server that reports an error if a request is ever received.
+ static Future<DescriptorServer> errors() async =>
+ DescriptorServer._(await shelf_io.IOServer.bind('localhost', 0));
+
+ DescriptorServer._(this._server) : _baseDir = d.dir('serve-dir', []) {
+ _server.mount((request) async {
+ final pathWithInitialSlash = '/${request.url.path}';
+ final key = extraHandlers.keys.firstWhereOrNull((pattern) {
+ final match = pattern.matchAsPrefix(pathWithInitialSlash);
+ return match != null && match.end == pathWithInitialSlash.length;
+ });
+ if (key != null) return extraHandlers[key]!(request);
+
+ var path = p.posix.fromUri(request.url.path);
+ requestedPaths.add(path);
+
+ try {
+ var stream = await _validateStream(_baseDir.load(path));
+ return shelf.Response.ok(stream);
+ } catch (_) {
+ return shelf.Response.notFound('File "$path" not found.');
+ }
+ });
+ addTearDown(_server.close);
+ }
+
+ /// Closes this server.
+ Future close() => _server.close();
+}
+
+/// Ensures that [stream] can emit at least one value successfully (or close
+/// without any values).
+///
+/// For example, reading asynchronously from a non-existent file will return a
+/// stream that fails on the first chunk. In order to handle that more
+/// gracefully, you may want to check that the stream looks like it's working
+/// before you pipe the stream to something else.
+///
+/// This lets you do that. It returns a [Future] that completes to a [Stream]
+/// emitting the same values and errors as [stream], but only if at least one
+/// value can be read successfully. If an error occurs before any values are
+/// emitted, the returned Future completes to that error.
+Future<Stream<T>> _validateStream<T>(Stream<T> stream) {
+ var completer = Completer<Stream<T>>();
+ var controller = StreamController<T>(sync: true);
+
+ late StreamSubscription subscription;
+ subscription = stream.listen((value) {
+ // We got a value, so the stream is valid.
+ if (!completer.isCompleted) completer.complete(controller.stream);
+ controller.add(value);
+ }, onError: (error, [StackTrace? stackTrace]) {
+ // If the error came after values, it's OK.
+ if (completer.isCompleted) {
+ controller.addError(error, stackTrace);
+ return;
+ }
+
+ // Otherwise, the error came first and the stream is invalid.
+ completer.completeError(error, stackTrace);
+
+ // We won't be returning the stream at all in this case, so unsubscribe
+ // and swallow the error.
+ subscription.cancel();
+ }, onDone: () {
+ // It closed with no errors, so the stream is valid.
+ if (!completer.isCompleted) completer.complete(controller.stream);
+ controller.close();
+ });
+
+ return completer.future;
+}
diff --git a/test/dev_dependency_test.dart b/test/dev_dependency_test.dart
index b192444..88f321b 100644
--- a/test/dev_dependency_test.dart
+++ b/test/dev_dependency_test.dart
@@ -27,10 +27,7 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- d.packageConfigEntry(name: 'bar', path: '../bar'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo', 'bar': '../bar'}).validate();
});
test("includes dev dependency's transitive dependencies", () async {
@@ -55,10 +52,7 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- d.packageConfigEntry(name: 'bar', path: '../bar'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo', 'bar': '../bar'}).validate();
});
test("ignores transitive dependency's dev dependencies", () async {
@@ -84,8 +78,6 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
});
}
diff --git a/test/directory_option_test.dart b/test/directory_option_test.dart
index 65193bf..2865a69 100644
--- a/test/directory_option_test.dart
+++ b/test/directory_option_test.dart
@@ -14,21 +14,20 @@
Future<void> main() async {
testWithGolden('commands taking a --directory/-C parameter work',
(ctx) async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.0.0')
..serve('foo', '0.1.2')
- ..serve('bar', '1.2.3');
- await credentialsFile(globalServer, 'access token').create();
- globalServer.handle(
- RegExp('/api/packages/test_pkg/uploaders'),
- (request) {
- return shelf.Response.ok(
- jsonEncode({
- 'success': {'message': 'Good job!'}
- }),
- headers: {'content-type': 'application/json'});
- },
- );
+ ..serve('bar', '1.2.3'));
+ await credentialsFile(globalPackageServer!, 'access token').create();
+ globalPackageServer!
+ .extraHandlers[RegExp('/api/packages/test_pkg/uploaders')] = (request) {
+ return shelf.Response.ok(
+ jsonEncode({
+ 'success': {'message': 'Good job!'}
+ }),
+ headers: {'content-type': 'application/json'},
+ );
+ };
await validPackage.create();
await dir(appPath, [
diff --git a/test/downgrade/does_not_show_other_versions_test.dart b/test/downgrade/does_not_show_other_versions_test.dart
index 884bbaf..ca872c8 100644
--- a/test/downgrade/does_not_show_other_versions_test.dart
+++ b/test/downgrade/does_not_show_other_versions_test.dart
@@ -9,10 +9,11 @@
void main() {
test('does not show how many other versions are available', () async {
- await servePackages()
- ..serve('downgraded', '1.0.0')
- ..serve('downgraded', '2.0.0')
- ..serve('downgraded', '3.0.0-dev');
+ await servePackages((builder) {
+ builder.serve('downgraded', '1.0.0');
+ builder.serve('downgraded', '2.0.0');
+ builder.serve('downgraded', '3.0.0-dev');
+ });
await d.appDir({'downgraded': '3.0.0-dev'}).create();
diff --git a/test/downgrade/dry_run_does_not_apply_changes_test.dart b/test/downgrade/dry_run_does_not_apply_changes_test.dart
index 38fbebe..ebe2dbf 100644
--- a/test/downgrade/dry_run_does_not_apply_changes_test.dart
+++ b/test/downgrade/dry_run_does_not_apply_changes_test.dart
@@ -11,9 +11,10 @@
void main() {
test('--dry-run shows report but does not apply changes', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ });
// Create the first lockfile.
await d.appDir({'foo': '2.0.0'}).create();
diff --git a/test/downgrade/unlock_if_necessary_test.dart b/test/downgrade/unlock_if_necessary_test.dart
index c8b55af..eac39a8 100644
--- a/test/downgrade/unlock_if_necessary_test.dart
+++ b/test/downgrade/unlock_if_necessary_test.dart
@@ -11,27 +11,24 @@
test(
"downgrades one locked hosted package's dependencies if it's "
'necessary', () async {
- final server = await servePackages();
- server.serve('foo', '2.0.0', deps: {'foo_dep': 'any'});
- server.serve('foo_dep', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0', deps: {'foo_dep': 'any'});
+ builder.serve('foo_dep', '2.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'foo_dep', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0', 'foo_dep': '2.0.0'}).validate();
- server.serve('foo', '1.0.0', deps: {'foo_dep': '<2.0.0'});
- server.serve('foo_dep', '1.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '1.0.0', deps: {'foo_dep': '<2.0.0'});
+ builder.serve('foo_dep', '1.0.0');
+ });
await pubDowngrade(args: ['foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'foo_dep', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'foo_dep': '1.0.0'}).validate();
});
}
diff --git a/test/downgrade/unlock_single_package_test.dart b/test/downgrade/unlock_single_package_test.dart
index 1188e41..8997ba2 100644
--- a/test/downgrade/unlock_single_package_test.dart
+++ b/test/downgrade/unlock_single_package_test.dart
@@ -9,60 +9,51 @@
void main() {
test('can unlock a single package only in downgrade', () async {
- final server = await servePackages();
- server.serve('foo', '2.1.0', deps: {'bar': '>1.0.0'});
- server.serve('bar', '2.1.0');
+ await servePackages((builder) {
+ builder.serve('foo', '2.1.0', deps: {'bar': '>1.0.0'});
+ builder.serve('bar', '2.1.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.1.0'),
- d.packageConfigEntry(name: 'bar', version: '2.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.1.0'}).validate();
- server.serve('foo', '1.0.0', deps: {'bar': 'any'});
- server.serve('bar', '1.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '1.0.0');
+ });
await pubDowngrade(args: ['bar']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.1.0'),
- d.packageConfigEntry(name: 'bar', version: '2.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.1.0'}).validate();
- server.serve('foo', '2.0.0', deps: {'bar': 'any'});
- server.serve('bar', '2.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '2.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '2.0.0');
+ });
await pubDowngrade(args: ['bar']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.1.0'),
- d.packageConfigEntry(name: 'bar', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.1.0', 'bar': '2.0.0'}).validate();
await pubDowngrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
});
test('will not downgrade below constraint #2629', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '2.1.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '2.1.0');
+ });
await d.appDir({'foo': '^2.0.0'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.1.0'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '2.1.0'}).validate();
await pubDowngrade(args: ['foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0'}).validate();
});
}
diff --git a/test/embedding/embedding_test.dart b/test/embedding/embedding_test.dart
index a9795ea..20e127e 100644
--- a/test/embedding/embedding_test.dart
+++ b/test/embedding/embedding_test.dart
@@ -6,20 +6,16 @@
import 'dart:io';
import 'package:path/path.dart' as path;
-import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_process/test_process.dart';
-
import '../descriptor.dart' as d;
import '../golden_file.dart';
import '../test_pub.dart';
-const _commandRunner = 'tool/test-bin/pub_command_runner.dart';
+const _command_runner = 'tool/test-bin/pub_command_runner.dart';
late String snapshot;
-final logFile = p.join(d.sandbox, cachePath, 'log', 'pub_log.txt');
-
/// Runs `dart tool/test-bin/pub_command_runner.dart [args]` and appends the output to [buffer].
Future<void> runEmbeddingToBuffer(
List<String> args,
@@ -40,10 +36,13 @@
await process.shouldExit(exitCode);
buffer.writeln([
- '\$ $_commandRunner ${args.join(' ')}',
- ...await process.stdout.rest.map(_filter).toList(),
- ...await process.stderr.rest.map((e) => '[E] ${_filter(e)}').toList(),
+ '\$ $_command_runner ${args.join(' ')}',
+ ...await process.stdout.rest.toList(),
].join('\n'));
+ final stdErr = await process.stderr.rest.toList();
+ if (stdErr.isNotEmpty) {
+ buffer.writeln(stdErr.map((e) => '[E] $e').join('\n'));
+ }
buffer.write('\n');
}
@@ -52,7 +51,7 @@
/// next section in golden file.
Future<void> runEmbedding(
List<String> args, {
- String? workingDirectory,
+ String? workingDirextory,
Map<String, String>? environment,
dynamic exitCode = 0,
}) async {
@@ -60,7 +59,7 @@
await runEmbeddingToBuffer(
args,
buffer,
- workingDirectory: workingDirectory,
+ workingDirectory: workingDirextory,
environment: environment,
exitCode: exitCode,
);
@@ -74,7 +73,7 @@
final tempDir = Directory.systemTemp.createTempSync();
snapshot = path.join(tempDir.path, 'command_runner.dart.snapshot');
final r = Process.runSync(
- Platform.resolvedExecutable, ['--snapshot=$snapshot', _commandRunner]);
+ Platform.resolvedExecutable, ['--snapshot=$snapshot', _command_runner]);
expect(r.exitCode, 0, reason: r.stderr);
});
@@ -83,7 +82,6 @@
});
testWithGolden('run works, though hidden', (ctx) async {
- await servePackages();
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
@@ -103,60 +101,19 @@
]).create();
await ctx.runEmbedding(
['pub', 'get'],
- workingDirectory: d.path(appPath),
+ workingDirextory: d.path(appPath),
);
await ctx.runEmbedding(
['pub', 'run', 'bin/main.dart'],
exitCode: 123,
- workingDirectory: d.path(appPath),
- );
- });
-
- testWithGolden(
- 'logfile is written with --verbose and on unexpected exceptions',
- (context) async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
- await d.appDir({'foo': 'any'}).create();
-
- // TODO(sigurdm) This logs the entire verbose trace to a golden file.
- //
- // This is fragile, and can break for all sorts of small reasons. We think
- // this might be worth while having to have at least minimal testing of the
- // verbose stack trace.
- //
- // But if you, future contributor, think this test is annoying: feel free to
- // remove it, or rewrite it to filter out the stack-trace itself, only
- // testing for creation of the file.
- //
- // It is a fragile test, and we acknowledge that it's usefulness can be
- // debated...
- await context.runEmbedding(
- ['pub', '--verbose', 'get'],
- workingDirectory: d.path(appPath),
- );
- context.expectNextSection(
- _filter(
- File(logFile).readAsStringSync(),
- ),
- );
- await d.dir('empty').create();
- await context.runEmbedding(
- ['pub', 'fail'],
- workingDirectory: d.path('empty'),
- exitCode: 1,
- );
- context.expectNextSection(
- _filter(
- File(logFile).readAsStringSync(),
- ),
+ workingDirextory: d.path(appPath),
);
});
test('analytics', () async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0');
+ ..serve('bar', '1.0.0'));
await d.dir('dep', [
d.pubspec({
'name': 'dep',
@@ -218,113 +175,5 @@
}
},
});
- // Don't write the logs to file on a normal run.
- expect(File(logFile).existsSync(), isFalse);
});
-
- test('`embedding --verbose pub` is verbose', () async {
- await servePackages();
- final buffer = StringBuffer();
- await runEmbeddingToBuffer(['--verbose', 'pub', 'logout'], buffer);
- expect(buffer.toString(), contains('FINE: Pub 0.1.2+3'));
- });
-}
-
-String _filter(String input) {
- return input
- .replaceAll(p.toUri(d.sandbox).toString(), r'file://$SANDBOX')
- .replaceAll(d.sandbox, r'$SANDBOX')
- .replaceAll(Platform.pathSeparator, '/')
- .replaceAll(Platform.operatingSystem, r'$OS')
- .replaceAll(globalServer.port.toString(), r'$PORT')
- .replaceAll(
- RegExp(r'^Created:(.*)$', multiLine: true),
- r'Created: $TIME',
- )
- .replaceAll(
- RegExp(r'Generated by pub on (.*)$', multiLine: true),
- r'Generated by pub on $TIME',
- )
- .replaceAll(
- RegExp(r'X-Pub-Session-ID(.*)$', multiLine: true),
- r'X-Pub-Session-ID: $ID',
- )
- .replaceAll(
- RegExp(r'took (.*)$', multiLine: true),
- r'took: $TIME',
- )
- .replaceAll(
- RegExp(r'date: (.*)$', multiLine: true),
- r'date: $TIME',
- )
- .replaceAll(
- RegExp(r'Creating (.*) from stream\.$', multiLine: true),
- r'Creating $FILE from stream',
- )
- .replaceAll(
- RegExp(r'Created (.*) from stream\.$', multiLine: true),
- r'Created $FILE from stream',
- )
- .replaceAll(
- RegExp(r'Renaming directory $SANDBOX/cache/_temp/(.*?) to',
- multiLine: true),
- r'Renaming directory $SANDBOX/cache/_temp/',
- )
- .replaceAll(
- RegExp(r'Extracting .tar.gz stream to (.*?)$', multiLine: true),
- r'Extracting .tar.gz stream to $DIR',
- )
- .replaceAll(
- RegExp(r'Extracted .tar.gz to (.*?)$', multiLine: true),
- r'Extracted .tar.gz to $DIR',
- )
- .replaceAll(
- RegExp(r'Reading binary file (.*?)$', multiLine: true),
- r'Reading binary file $FILE.',
- )
- .replaceAll(
- RegExp(r'Deleting directory (.*)$', multiLine: true),
- r'Deleting directory $DIR',
- )
- .replaceAll(
- RegExp(r'Deleting directory (.*)$', multiLine: true),
- r'Deleting directory $DIR',
- )
- .replaceAll(
- RegExp(r'Resolving dependencies finished (.*)$', multiLine: true),
- r'Resolving dependencies finished ($TIME)',
- )
- .replaceAll(
- RegExp(r'Created temp directory (.*)$', multiLine: true),
- r'Created temp directory $DIR',
- )
- .replaceAll(
- RegExp(r'Renaming directory (.*)$', multiLine: true),
- r'Renaming directory $A to $B',
- )
- .replaceAll(
- RegExp(r'"_fetchedAt":"(.*)"}$', multiLine: true),
- r'"_fetchedAt": "$TIME"}',
- )
- .replaceAll(
- RegExp(r'"generated": "(.*)",$', multiLine: true),
- r'"generated": "$TIME",',
- )
- .replaceAll(
- RegExp(r'( |^)(/|[A-Z]:)(.*)/tool/test-bin/pub_command_runner.dart',
- multiLine: true),
- r' tool/test-bin/pub_command_runner.dart',
- )
- .replaceAll(
- RegExp(r'[ ]{4,}', multiLine: true),
- r' ',
- )
- .replaceAll(
- RegExp(r' [\d]+:[\d]+ ', multiLine: true),
- r' $LINE:$COL ',
- )
- .replaceAll(
- RegExp(r'Writing \d+ characters', multiLine: true),
- r'Writing $N characters',
- );
}
diff --git a/test/embedding/get_executable_for_command_test.dart b/test/embedding/get_executable_for_command_test.dart
index 0edfa72..611f5ef 100644
--- a/test/embedding/get_executable_for_command_test.dart
+++ b/test/embedding/get_executable_for_command_test.dart
@@ -25,7 +25,7 @@
}) async {
final _cachePath = getPubTestEnvironment()['PUB_CACHE'];
final oldVerbosity = log.verbosity;
- log.verbosity = log.Verbosity.none;
+ log.verbosity = log.Verbosity.NONE;
if (executable == null) {
expect(
() => getExecutableForCommand(
@@ -129,7 +129,7 @@
])
]).create();
- await servePackages();
+ await serveNoPackages();
// The solver uses word-wrapping in its error message, so we use \s to
// accomodate.
await testGetExecutable(
@@ -166,7 +166,7 @@
])
]).create();
- await servePackages();
+ await serveNoPackages();
// The solver uses word-wrapping in its error message, so we use \s to
// accomodate.
await testGetExecutable(
@@ -178,15 +178,15 @@
});
test('Finds files', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'environment': {'sdk': '>=$_currentVersion <3.0.0'}
- }, contents: [
- d.dir('bin', [
- d.file('foo.dart', 'main() {print(42);}'),
- d.file('tool.dart', 'main() {print(42);}')
- ])
- ]);
+ await servePackages((b) => b
+ ..serve('foo', '1.0.0', pubspec: {
+ 'environment': {'sdk': '>=$_currentVersion <3.0.0'}
+ }, contents: [
+ d.dir('bin', [
+ d.file('foo.dart', 'main() {print(42);}'),
+ d.file('tool.dart', 'main() {print(42);}')
+ ])
+ ]));
await d.dir(appPath, [
d.pubspec({
diff --git a/test/get/dry_run_does_not_apply_changes_test.dart b/test/get/dry_run_does_not_apply_changes_test.dart
index 3e44bf9..27969ae 100644
--- a/test/get/dry_run_does_not_apply_changes_test.dart
+++ b/test/get/dry_run_does_not_apply_changes_test.dart
@@ -9,8 +9,9 @@
void main() {
test('--dry-run shows but does not apply changes', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
diff --git a/test/get/git/path_test.dart b/test/get/git/path_test.dart
index a323be7..49607a1 100644
--- a/test/get/git/path_test.dart
+++ b/test/get/git/path_test.dart
@@ -37,11 +37,9 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub',
- path: pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub': pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir')
+ }).validate();
});
test('depends on a package in a deep subdirectory', () async {
@@ -73,12 +71,9 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub',
- path:
- pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir%25')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub': pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir%25')
+ }).validate();
final lockFile = LockFile.load(
p.join(d.sandbox, appPath, 'pubspec.lock'), SourceRegistry());
@@ -120,12 +115,9 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub',
- path:
- pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir%25')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub': pathInCache('git/foo-${await repo.revParse('HEAD')}/sub/dir%25')
+ }).validate();
final lockFile = LockFile.load(
p.join(d.sandbox, appPath, 'pubspec.lock'), SourceRegistry());
@@ -166,14 +158,10 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub1',
- path: pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir1')),
- d.packageConfigEntry(
- name: 'sub2',
- path: pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir2')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub1': pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir1'),
+ 'sub2': pathInCache('git/foo-${await repo.revParse('HEAD')}/subdir2')
+ }).validate();
});
test('depends on packages in the same subdirectory at different revisions',
@@ -218,11 +206,9 @@
])
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'sub1', path: pathInCache('git/foo-$oldRevision/subdir')),
- d.packageConfigEntry(
- name: 'sub2', path: pathInCache('git/foo-$newRevision/subdir')),
- ]).validate();
+ await d.appPackagesFile({
+ 'sub1': pathInCache('git/foo-$oldRevision/subdir'),
+ 'sub2': pathInCache('git/foo-$newRevision/subdir')
+ }).validate();
});
}
diff --git a/test/get/hosted/avoid_network_requests_test.dart b/test/get/hosted/avoid_network_requests_test.dart
index c62fa7c..369a187 100644
--- a/test/get/hosted/avoid_network_requests_test.dart
+++ b/test/get/hosted/avoid_network_requests_test.dart
@@ -9,13 +9,14 @@
void main() {
test('only requests versions that are needed during solving', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.1.0')
- ..serve('foo', '1.2.0')
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.1.0')
- ..serve('bar', '1.2.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.0');
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.1.0');
+ builder.serve('bar', '1.2.0');
+ });
await d.appDir({'foo': 'any'}).create();
@@ -24,22 +25,20 @@
// Clear the cache. We don't care about anything that was served during
// the initial get.
- globalServer.requestedPaths.clear();
+ globalServer!.requestedPaths.clear();
// Add "bar" to the dependencies.
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
// Run the solver again.
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.0'),
- d.packageConfigEntry(name: 'bar', version: '1.2.0'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '1.2.0', 'bar': '1.2.0'}).validate();
// The get should not have done any network requests since the lock file is
// up to date.
expect(
- globalServer.requestedPaths,
+ globalServer!.requestedPaths,
unorderedEquals([
// Bar should be requested because it's new, but not foo.
'api/packages/bar',
diff --git a/test/get/hosted/cached_pubspec_test.dart b/test/get/hosted/cached_pubspec_test.dart
index fa9decc..88551ac 100644
--- a/test/get/hosted/cached_pubspec_test.dart
+++ b/test/get/hosted/cached_pubspec_test.dart
@@ -9,8 +9,7 @@
void main() {
test('does not request a pubspec for a cached package', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({'foo': '1.2.3'}).create();
@@ -19,18 +18,16 @@
// Clear the cache. We don't care about anything that was served during
// the initial get.
- server.requestedPaths.clear();
+ globalServer!.requestedPaths.clear();
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
// Run the solver again now that it's cached.
await pubGet();
// The get should not have requested the pubspec since it's local already.
- expect(server.requestedPaths,
+ expect(globalServer!.requestedPaths,
isNot(contains('packages/foo/versions/1.2.3.yaml')));
});
}
diff --git a/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart b/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
index 44fe075..30e4a65 100644
--- a/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
+++ b/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
@@ -11,29 +11,24 @@
test(
"doesn't upgrade dependencies whose constraints have been "
'removed', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
- ..serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'})
- ..serve('shared_dep', '1.0.0')
- ..serve('shared_dep', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
+ builder.serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'});
+ builder.serve('shared_dep', '1.0.0');
+ builder.serve('shared_dep', '2.0.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '1.0.0', 'bar': '1.0.0', 'shared_dep': '1.0.0'}).validate();
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'shared_dep': '1.0.0'}).validate();
});
}
diff --git a/test/get/hosted/does_no_network_requests_when_possible_test.dart b/test/get/hosted/does_no_network_requests_when_possible_test.dart
index 4324776..3038624 100644
--- a/test/get/hosted/does_no_network_requests_when_possible_test.dart
+++ b/test/get/hosted/does_no_network_requests_when_possible_test.dart
@@ -9,10 +9,11 @@
void main() {
test('does not request versions if the lockfile is up to date', () async {
- final server = await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.1.0')
- ..serve('foo', '1.2.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.0');
+ });
await d.appDir({'foo': 'any'}).create();
@@ -21,18 +22,16 @@
// Clear the cache. We don't care about anything that was served during
// the initial get.
- server.requestedPaths.clear();
+ globalServer!.requestedPaths.clear();
// Run the solver again now that it's cached.
await pubGet();
await d.cacheDir({'foo': '1.2.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.0'}).validate();
// The get should not have done any network requests since the lock file is
// up to date.
- expect(server.requestedPaths, isEmpty);
+ expect(globalServer!.requestedPaths, isEmpty);
});
}
diff --git a/test/get/hosted/explain_bad_hosted_url_test.dart b/test/get/hosted/explain_bad_hosted_url_test.dart
index feebf67..5628ecb 100644
--- a/test/get/hosted/explain_bad_hosted_url_test.dart
+++ b/test/get/hosted/explain_bad_hosted_url_test.dart
@@ -32,12 +32,11 @@
});
test('Allows PUB_HOSTED_URL to end with a slash', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((b) => b.serve('foo', '1.0.0'));
await d.appDir({'foo': 'any'}).create();
await pubGet(
- environment: {'PUB_HOSTED_URL': '${globalServer.url}/'},
+ environment: {'PUB_HOSTED_URL': '${globalPackageServer!.url}/'},
);
});
}
diff --git a/test/get/hosted/get_stress_test.dart b/test/get/hosted/get_stress_test.dart
index 026c0c1..da45309 100644
--- a/test/get/hosted/get_stress_test.dart
+++ b/test/get/hosted/get_stress_test.dart
@@ -9,11 +9,12 @@
void main() {
test('gets more than 16 packages from a pub server', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- for (var i = 0; i < 20; i++) {
- server.serve('pkg$i', '1.$i.0');
- }
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ for (var i = 0; i < 20; i++) {
+ builder.serve('pkg$i', '1.$i.0');
+ }
+ });
await d.appDir({
'foo': '1.2.3',
@@ -26,10 +27,10 @@
'foo': '1.2.3',
for (var i = 0; i < 20; i++) 'pkg$i': '1.$i.0',
}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- for (var i = 0; i < 20; i++)
- d.packageConfigEntry(name: 'pkg$i', version: '1.$i.0')
- ]).validate();
+
+ await d.appPackagesFile({
+ 'foo': '1.2.3',
+ for (var i = 0; i < 20; i++) 'pkg$i': '1.$i.0',
+ }).validate();
});
}
diff --git a/test/get/hosted/get_test.dart b/test/get/hosted/get_test.dart
index f0270a3..31c1f2e 100644
--- a/test/get/hosted/get_test.dart
+++ b/test/get/hosted/get_test.dart
@@ -13,21 +13,18 @@
void main() {
test('gets a package from a pub server', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
});
test('URL encodes the package name', () async {
- await servePackages();
+ await serveNoPackages();
await d.appDir({'bad name!': '1.2.3'}).create();
@@ -44,10 +41,11 @@
test('gets a package from a non-default pub server', () async {
// Make the default server serve errors. Only the custom server should
// be accessed.
- (await servePackages()).serveErrors();
+ await serveErrors();
- var server = await startPackageServer();
- server.serve('foo', '1.2.3');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({
'foo': {
@@ -59,21 +57,18 @@
await pubGet();
await d.cacheDir({'foo': '1.2.3'}, port: server.port).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3', server: server),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
});
group('categorizes dependency types in the lockfile', () {
- setUp(() async {
- await servePackages()
- ..serve('foo', '1.2.3', deps: {'bar': 'any'})
- ..serve('bar', '1.2.3')
- ..serve('baz', '1.2.3', deps: {'qux': 'any'})
- ..serve('qux', '1.2.3')
- ..serve('zip', '1.2.3', deps: {'zap': 'any'})
- ..serve('zap', '1.2.3');
- });
+ setUp(() => servePackages((builder) {
+ builder.serve('foo', '1.2.3', deps: {'bar': 'any'});
+ builder.serve('bar', '1.2.3');
+ builder.serve('baz', '1.2.3', deps: {'qux': 'any'});
+ builder.serve('qux', '1.2.3');
+ builder.serve('zip', '1.2.3', deps: {'zap': 'any'});
+ builder.serve('zap', '1.2.3');
+ }));
test('for main, dev, and overridden dependencies', () async {
await d.dir(appPath, [
diff --git a/test/get/hosted/get_transitive_test.dart b/test/get/hosted/get_transitive_test.dart
index 0ae18ac..f68006a 100644
--- a/test/get/hosted/get_transitive_test.dart
+++ b/test/get/hosted/get_transitive_test.dart
@@ -9,20 +9,18 @@
void main() {
test('gets packages transitively from a pub server', () async {
- await servePackages()
- ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
- ..serve('bar', '2.0.3')
- ..serve('bar', '2.0.4')
- ..serve('bar', '2.0.5');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', deps: {'bar': '2.0.4'});
+ builder.serve('bar', '2.0.3');
+ builder.serve('bar', '2.0.4');
+ builder.serve('bar', '2.0.5');
+ });
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
await d.cacheDir({'foo': '1.2.3', 'bar': '2.0.4'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- d.packageConfigEntry(name: 'bar', version: '2.0.4'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3', 'bar': '2.0.4'}).validate();
});
}
diff --git a/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart b/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
index 585cfba..c53079c 100644
--- a/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
+++ b/test/get/hosted/gets_a_package_with_busted_dev_dependencies_test.dart
@@ -12,11 +12,12 @@
test(
'gets a dependency with broken dev dependencies from a pub '
'server', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', pubspec: {
- 'dev_dependencies': {
- 'busted': {'not a real source': null}
- }
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', pubspec: {
+ 'dev_dependencies': {
+ 'busted': {'not a real source': null}
+ }
+ });
});
await d.appDir({'foo': '1.2.3'}).create();
@@ -24,8 +25,6 @@
await pubGet();
await d.cacheDir({'foo': '1.2.3'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
});
}
diff --git a/test/get/hosted/resolve_constraints_test.dart b/test/get/hosted/resolve_constraints_test.dart
index 466902e..c515c8e 100644
--- a/test/get/hosted/resolve_constraints_test.dart
+++ b/test/get/hosted/resolve_constraints_test.dart
@@ -9,12 +9,13 @@
void main() {
test('resolves version constraints from a pub server', () async {
- await servePackages()
- ..serve('foo', '1.2.3', deps: {'baz': '>=2.0.0'})
- ..serve('bar', '2.3.4', deps: {'baz': '<3.0.0'})
- ..serve('baz', '2.0.3')
- ..serve('baz', '2.0.4')
- ..serve('baz', '3.0.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', deps: {'baz': '>=2.0.0'});
+ builder.serve('bar', '2.3.4', deps: {'baz': '<3.0.0'});
+ builder.serve('baz', '2.0.3');
+ builder.serve('baz', '2.0.4');
+ builder.serve('baz', '3.0.1');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
@@ -22,10 +23,8 @@
await d
.cacheDir({'foo': '1.2.3', 'bar': '2.3.4', 'baz': '2.0.4'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- d.packageConfigEntry(name: 'bar', version: '2.3.4'),
- d.packageConfigEntry(name: 'baz', version: '2.0.4'),
- ]).validate();
+
+ await d.appPackagesFile(
+ {'foo': '1.2.3', 'bar': '2.3.4', 'baz': '2.0.4'}).validate();
});
}
diff --git a/test/get/hosted/resolve_with_retracted_package_versions_test.dart b/test/get/hosted/resolve_with_retracted_package_versions_test.dart
index d9b33a4..033e2a6 100644
--- a/test/get/hosted/resolve_with_retracted_package_versions_test.dart
+++ b/test/get/hosted/resolve_with_retracted_package_versions_test.dart
@@ -13,29 +13,28 @@
void main() {
test('Do not consider retracted packages', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
..serve('bar', '1.0.0')
- ..serve('bar', '1.1.0');
+ ..serve('bar', '1.1.0'));
await d.appDir({'foo': '1.0.0'}).create();
- server.retractPackageVersion('bar', '1.1.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
await pubGet();
await d.cacheDir({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
});
test('Error when the only available package version is retracted', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
- ..serve('bar', '1.0.0');
+ ..serve('bar', '1.0.0'));
await d.appDir({'foo': '1.0.0'}).create();
- server.retractPackageVersion('bar', '1.0.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
await pubGet(
error:
'''Because every version of foo depends on bar ^1.0.0 which doesn't match any versions, foo is forbidden.
@@ -48,51 +47,39 @@
// In this case we expect a newer version to be published at some point which
// will then cause pub upgrade to choose that one.
test('Allow retracted version when it was already in pubspec.lock', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
..serve('bar', '1.0.0')
- ..serve('bar', '1.1.0');
+ ..serve('bar', '1.1.0'));
await d.appDir({'foo': '1.0.0'}).create();
await pubGet();
await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- server.retractPackageVersion('bar', '1.1.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
await pubUpgrade();
await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- server.serve('bar', '2.0.0');
+ globalPackageServer!.add((builder) => builder..serve('bar', '2.0.0'));
await pubUpgrade();
await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
- server.serve('bar', '1.2.0');
+ globalPackageServer!.add((builder) => builder..serve('bar', '1.2.0'));
await pubUpgrade();
await d.cacheDir({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.2.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
});
test('Offline versions of pub commands also handle retracted packages',
() async {
- final server = await servePackages();
await populateCache({
'foo': ['1.0.0'],
'bar': ['1.0.0', '1.1.0']
- }, server);
+ });
await d.cacheDir({
'foo': '1.0.0',
@@ -100,27 +87,25 @@
}).validate();
final barVersionsCache =
- p.join(globalServer.cachingPath, '.cache', 'bar-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
expect(fileExists(barVersionsCache), isTrue);
deleteEntry(barVersionsCache);
- server.retractPackageVersion('bar', '1.1.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.1.0'));
await pubGet();
await d.cacheDir({'bar': '1.1.0'}).validate();
// Now serve only errors - to validate we are truly offline.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': '1.0.0', 'bar': '^1.0.0'}).create();
await pubUpgrade(args: ['--offline']);
// We choose bar 1.1.0 since we already have it in pubspec.lock
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
// Delete lockfile so that retracted versions are not considered.
final lockFile = p.join(d.sandbox, appPath, 'pubspec.lock');
@@ -128,17 +113,15 @@
deleteEntry(lockFile);
await pubGet(args: ['--offline']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
});
test('Allow retracted version when pinned in dependency_overrides', () async {
- final server = await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -148,31 +131,31 @@
})
]).create();
- server.retractPackageVersion('foo', '2.0.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('foo', '2.0.0'));
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0'}).validate();
});
test('Prefer retracted version in dependency_overrides over pubspec.lock',
() async {
- final server = await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await pubGet();
- server.retractPackageVersion('foo', '2.0.0');
- server.retractPackageVersion('foo', '3.0.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('foo', '2.0.0'));
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('foo', '3.0.0'));
await pubUpgrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '3.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '3.0.0'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -183,8 +166,6 @@
]).create();
await pubUpgrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0'}).validate();
});
}
diff --git a/test/get/hosted/stay_locked_if_compatible_test.dart b/test/get/hosted/stay_locked_if_compatible_test.dart
index df04579..52129f2 100644
--- a/test/get/hosted/stay_locked_if_compatible_test.dart
+++ b/test/get/hosted/stay_locked_if_compatible_test.dart
@@ -11,24 +11,20 @@
test(
"doesn't upgrade a locked pub server package with a new "
'compatible constraint', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
- server.serve('foo', '1.0.1');
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
+
+ globalPackageServer!.add((builder) => builder.serve('foo', '1.0.1'));
await d.appDir({'foo': '>=1.0.0'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
});
}
diff --git a/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart b/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
index c75c435..73077b1 100644
--- a/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
+++ b/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
@@ -11,34 +11,35 @@
test(
"doesn't unlock dependencies if a new dependency is already "
'satisfied', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
- server.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
- server.serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'baz', version: '1.0.0'),
- ]).validate();
- server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
- server.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
- server.serve('baz', '2.0.0');
- server.serve('newdep', '2.0.0', deps: {'baz': '>=1.0.0'});
+ await d.appPackagesFile(
+ {'foo': '1.0.0', 'bar': '1.0.0', 'baz': '1.0.0'}).validate();
+
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+ builder.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
+ builder.serve('baz', '2.0.0');
+ builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.0.0'});
+ });
await d.appDir({'foo': 'any', 'newdep': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'baz', version: '1.0.0'),
- d.packageConfigEntry(name: 'newdep', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({
+ 'foo': '1.0.0',
+ 'bar': '1.0.0',
+ 'baz': '1.0.0',
+ 'newdep': '2.0.0'
+ }).validate();
});
}
diff --git a/test/get/hosted/stay_locked_test.dart b/test/get/hosted/stay_locked_test.dart
index 8b819ea..eb26ea8 100644
--- a/test/get/hosted/stay_locked_test.dart
+++ b/test/get/hosted/stay_locked_test.dart
@@ -13,28 +13,24 @@
test(
'keeps a hosted package locked to the version in the '
'lockfile', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await d.appDir({'foo': 'any'}).create();
// This should lock the foo dependency to version 1.0.0.
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
// Delete the .dart_tool/package_config.json file to simulate a new checkout of the application.
deleteEntry(path.join(d.sandbox, packageConfigFilePath));
// Start serving a newer package as well.
- server.serve('foo', '1.0.1');
+ globalPackageServer!.add((builder) => builder.serve('foo', '1.0.1'));
// This shouldn't upgrade the foo dependency due to the lockfile.
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
});
}
diff --git a/test/get/hosted/unlock_if_incompatible_test.dart b/test/get/hosted/unlock_if_incompatible_test.dart
index 007231e..fad5400 100644
--- a/test/get/hosted/unlock_if_incompatible_test.dart
+++ b/test/get/hosted/unlock_if_incompatible_test.dart
@@ -11,23 +11,18 @@
test(
'upgrades a locked pub server package with a new incompatible '
'constraint', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
- server.serve('foo', '1.0.1');
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
+ globalPackageServer!.add((builder) => builder.serve('foo', '1.0.1'));
await d.appDir({'foo': '>1.0.0'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.1'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.1'}).validate();
});
}
diff --git a/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart b/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
index ae6a4e6..aa45b76 100644
--- a/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -11,40 +11,42 @@
test(
'unlocks dependencies if necessary to ensure that a new '
'dependency is satisfied', () async {
- final server = await servePackages();
-
- server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
- server.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
- server.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
- server.serve('qux', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
+ builder.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
+ builder.serve('qux', '1.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'baz', version: '1.0.0'),
- d.packageConfigEntry(name: 'qux', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({
+ 'foo': '1.0.0',
+ 'bar': '1.0.0',
+ 'baz': '1.0.0',
+ 'qux': '1.0.0'
+ }).validate();
- server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
- server.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
- server.serve('baz', '2.0.0', deps: {'qux': '<3.0.0'});
- server.serve('qux', '2.0.0');
- server.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+ builder.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
+ builder.serve('baz', '2.0.0', deps: {'qux': '<3.0.0'});
+ builder.serve('qux', '2.0.0');
+ builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
+ });
await d.appDir({'foo': 'any', 'newdep': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '2.0.0'),
- d.packageConfigEntry(name: 'baz', version: '2.0.0'),
- d.packageConfigEntry(name: 'qux', version: '1.0.0'),
- d.packageConfigEntry(name: 'newdep', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({
+ 'foo': '2.0.0',
+ 'bar': '2.0.0',
+ 'baz': '2.0.0',
+ 'qux': '1.0.0',
+ 'newdep': '2.0.0'
+ }).validate();
});
}
diff --git a/test/get/hosted/unlock_if_version_doesnt_exist_test.dart b/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
index e4cc01b..328745e 100644
--- a/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
+++ b/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
@@ -12,23 +12,16 @@
void main() {
test('upgrades a locked pub server package with a nonexistent version',
() async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
deleteEntry(p.join(d.sandbox, cachePath));
- server.clearPackages();
- server.serve('foo', '1.0.1');
-
+ globalPackageServer!.replace((builder) => builder.serve('foo', '1.0.1'));
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.1'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.1'}).validate();
});
}
diff --git a/test/get/hosted/warn_about_discontinued_test.dart b/test/get/hosted/warn_about_discontinued_test.dart
index 7057f9b..6df08b8 100644
--- a/test/get/hosted/warn_about_discontinued_test.dart
+++ b/test/get/hosted/warn_about_discontinued_test.dart
@@ -6,7 +6,7 @@
import 'package:path/path.dart' as p;
import 'package:pub/src/io.dart';
-import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf.dart';
import 'package:test/test.dart';
import '../../descriptor.dart' as d;
@@ -14,22 +14,22 @@
void main() {
test('Warns about discontinued dependencies', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', deps: {'transitive': 'any'});
- server.serve('transitive', '1.0.0');
+ await servePackages((builder) => builder
+ ..serve('foo', '1.2.3', deps: {'transitive': 'any'})
+ ..serve('transitive', '1.0.0'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
- server
+ globalPackageServer!.add((builder) => builder
..discontinue('foo')
- ..discontinue('transitive');
+ ..discontinue('transitive'));
// A pub get straight away will not trigger the warning, as we cache
// responses for a while.
await pubGet();
final fooVersionsCache =
- p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
- final transitiveVersionsCache =
- p.join(globalServer.cachingPath, '.cache', 'transitive-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'foo-versions.json');
+ final transitiveVersionsCache = p.join(
+ globalPackageServer!.cachingPath, '.cache', 'transitive-versions.json');
expect(fileExists(fooVersionsCache), isTrue);
expect(fileExists(transitiveVersionsCache), isTrue);
deleteEntry(fooVersionsCache);
@@ -46,9 +46,8 @@
c['_fetchedAt'] =
DateTime.now().subtract(Duration(days: 5)).toIso8601String();
writeTextFile(fooVersionsCache, json.encode(c));
-
- server.discontinue('foo', replacementText: 'bar');
-
+ globalPackageServer!
+ .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
await pubGet(output: '''
Resolving dependencies...
foo 1.2.3 (discontinued replaced by bar)
@@ -68,7 +67,7 @@
Got dependencies!''');
// Test that --offline won't try to access the server for retrieving the
// status.
- server.serveErrors();
+ await serveErrors();
await pubGet(args: ['--offline'], output: '''
Resolving dependencies...
foo 1.2.3 (discontinued replaced by bar)
@@ -82,10 +81,9 @@
});
test('Warns about discontinued dev dependencies', () async {
- final builder = await servePackages();
- builder
+ await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': 'any'})
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -100,14 +98,14 @@
]).create();
await pubGet();
- builder
+ globalPackageServer!.add((builder) => builder
..discontinue('foo')
- ..discontinue('transitive');
+ ..discontinue('transitive'));
// A pub get straight away will not trigger the warning, as we cache
// responses for a while.
await pubGet();
final fooVersionsCache =
- p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'foo-versions.json');
expect(fileExists(fooVersionsCache), isTrue);
deleteEntry(fooVersionsCache);
// We warn only about the direct dependency here:
@@ -122,7 +120,8 @@
c['_fetchedAt'] =
DateTime.now().subtract(Duration(days: 5)).toIso8601String();
writeTextFile(fooVersionsCache, json.encode(c));
- builder.discontinue('foo', replacementText: 'bar');
+ globalPackageServer!
+ .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
await pubGet(output: '''
Resolving dependencies...
foo 1.2.3 (discontinued replaced by bar)
@@ -142,7 +141,7 @@
Got dependencies!''');
// Test that --offline won't try to access the server for retrieving the
// status.
- builder.serveErrors();
+ await serveErrors();
await pubGet(args: ['--offline'], output: '''
Resolving dependencies...
foo 1.2.3 (discontinued replaced by bar)
@@ -155,17 +154,17 @@
});
test('get does not fail when status listing fails', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder..serve('foo', '1.2.3'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
final fooVersionsCache =
- p.join(globalServer.cachingPath, '.cache', 'foo-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'foo-versions.json');
expect(fileExists(fooVersionsCache), isTrue);
deleteEntry(fooVersionsCache);
// Serve 400 on all requests.
- globalServer.handle(RegExp('.*'),
- (shelf.Request request) => shelf.Response.notFound('Not found'));
+ globalPackageServer!.extraHandlers
+ ..clear()
+ ..[RegExp('.*')] = (request) async => Response(400);
/// Even if we fail to get status we still report success if versions don't unlock.
await pubGet();
diff --git a/test/get/hosted/warn_about_retracted_package_test.dart b/test/get/hosted/warn_about_retracted_package_test.dart
index 2336c7f..5031061 100644
--- a/test/get/hosted/warn_about_retracted_package_test.dart
+++ b/test/get/hosted/warn_about_retracted_package_test.dart
@@ -11,36 +11,38 @@
void main() {
test('Report retracted packages', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0');
+ ..serve('bar', '1.0.0'));
await d.appDir({'foo': '1.0.0'}).create();
await pubGet();
- server.retractPackageVersion('bar', '1.0.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
// Delete the cache to trigger the report.
final barVersionsCache =
- p.join(server.cachingPath, '.cache', 'bar-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
expect(fileExists(barVersionsCache), isTrue);
deleteEntry(barVersionsCache);
await pubGet(output: contains('bar 1.0.0 (retracted)'));
});
test('Report retracted packages with newer version available', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
..serve('bar', '1.0.0')
..serve('bar', '2.0.0')
- ..serve('bar', '2.0.1-pre');
+ ..serve('bar', '2.0.1-pre'));
await d.appDir({'foo': '1.0.0'}).create();
await pubGet();
- server.retractPackageVersion('bar', '1.0.0');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
// Delete the cache to trigger the report.
final barVersionsCache =
- p.join(server.cachingPath, '.cache', 'bar-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
expect(fileExists(barVersionsCache), isTrue);
deleteEntry(barVersionsCache);
await pubGet(output: contains('bar 1.0.0 (retracted, 2.0.0 available)'));
@@ -48,18 +50,19 @@
test('Report retracted packages with newer prerelease version available',
() async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0-pre'})
..serve('bar', '1.0.0-pre')
- ..serve('bar', '2.0.1-pre');
+ ..serve('bar', '2.0.1-pre'));
await d.appDir({'foo': '1.0.0'}).create();
await pubGet();
- server.retractPackageVersion('bar', '1.0.0-pre');
+ globalPackageServer!
+ .add((builder) => builder..retractPackageVersion('bar', '1.0.0-pre'));
// Delete the cache to trigger the report.
final barVersionsCache =
- p.join(server.cachingPath, '.cache', 'bar-versions.json');
+ p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
expect(fileExists(barVersionsCache), isTrue);
deleteEntry(barVersionsCache);
await pubGet(
diff --git a/test/get/package_name_test.dart b/test/get/package_name_test.dart
index b1328cc..46ca386 100644
--- a/test/get/package_name_test.dart
+++ b/test/get/package_name_test.dart
@@ -56,8 +56,7 @@
await pubGet();
await d.dir(appPath, [
- d.packageConfigFile(
- [d.packageConfigEntry(name: 'foo.bar.baz', path: '.')])
+ d.packagesFile({'foo.bar.baz': '.'}),
]).validate();
});
}
diff --git a/test/get/path/absolute_path_test.dart b/test/get/path/absolute_path_test.dart
index e1897e9..0fc987a 100644
--- a/test/get/path/absolute_path_test.dart
+++ b/test/get/path/absolute_path_test.dart
@@ -21,8 +21,6 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: path.join(d.sandbox, 'foo')),
- ]).validate();
+ await d.appPackagesFile({'foo': path.join(d.sandbox, 'foo')}).validate();
});
}
diff --git a/test/get/path/absolute_symlink_test.dart b/test/get/path/absolute_symlink_test.dart
index 83d3433..1a2d912 100644
--- a/test/get/path/absolute_symlink_test.dart
+++ b/test/get/path/absolute_symlink_test.dart
@@ -24,8 +24,8 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: fooPath),
+ await d.dir(appPath, [
+ d.packagesFile({'myapp': '.', 'foo': fooPath})
]).validate();
await d.dir('moved').create();
@@ -35,9 +35,9 @@
renameInSandbox(appPath, path.join('moved', appPath));
await d.dir('moved', [
- d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: fooPath),
- ]),
+ d.dir(appPath, [
+ d.packagesFile({'myapp': '.', 'foo': fooPath})
+ ])
]).validate();
});
}
diff --git a/test/get/path/relative_path_test.dart b/test/get/path/relative_path_test.dart
index e56a453..4255d49 100644
--- a/test/get/path/relative_path_test.dart
+++ b/test/get/path/relative_path_test.dart
@@ -23,9 +23,7 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
});
test('path is relative to containing pubspec', () async {
@@ -47,10 +45,8 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../relative/foo'),
- d.packageConfigEntry(name: 'bar', path: '../relative/bar'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '../relative/foo', 'bar': '../relative/bar'}).validate();
});
test('path is relative to containing pubspec when using --directory',
@@ -76,10 +72,9 @@
workingDirectory: d.sandbox,
output: contains('Changed 2 dependencies in myapp!'));
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../relative/foo'),
- d.packageConfigEntry(name: 'bar', path: '../relative/bar'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '../relative/foo', 'bar': '../relative/bar'},
+ ).validate();
});
test('relative path preserved in the lockfile', () async {
diff --git a/test/get/path/relative_symlink_test.dart b/test/get/path/relative_symlink_test.dart
index 9136a34..af7185b 100644
--- a/test/get/path/relative_symlink_test.dart
+++ b/test/get/path/relative_symlink_test.dart
@@ -28,8 +28,8 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
+ await d.dir(appPath, [
+ d.packagesFile({'myapp': '.', 'foo': '../foo'})
]).validate();
await d.dir('moved').create();
@@ -41,8 +41,8 @@
renameInSandbox(appPath, path.join('moved', appPath));
await d.dir('moved', [
- d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
+ d.dir(appPath, [
+ d.packagesFile({'myapp': '.', 'foo': '../foo'})
])
]).validate();
});
diff --git a/test/get/path/shared_dependency_symlink_test.dart b/test/get/path/shared_dependency_symlink_test.dart
index d450838..46a78c6 100644
--- a/test/get/path/shared_dependency_symlink_test.dart
+++ b/test/get/path/shared_dependency_symlink_test.dart
@@ -40,10 +40,13 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- d.packageConfigEntry(name: 'bar', path: '../bar'),
- d.packageConfigEntry(name: 'shared', path: '../shared'),
+ await d.dir(appPath, [
+ d.packagesFile({
+ 'myapp': '.',
+ 'foo': '../foo',
+ 'bar': '../bar',
+ 'shared': '../shared'
+ })
]).validate();
});
}
diff --git a/test/get/path/shared_dependency_test.dart b/test/get/path/shared_dependency_test.dart
index 3ef91ae..7072221 100644
--- a/test/get/path/shared_dependency_test.dart
+++ b/test/get/path/shared_dependency_test.dart
@@ -35,11 +35,8 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- d.packageConfigEntry(name: 'bar', path: '../bar'),
- d.packageConfigEntry(name: 'shared', path: '../shared'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '../foo', 'bar': '../bar', 'shared': '../shared'}).validate();
});
test('shared dependency with paths that normalize the same', () async {
@@ -69,10 +66,7 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- d.packageConfigEntry(name: 'bar', path: '../bar'),
- d.packageConfigEntry(name: 'shared', path: '../shared'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '../foo', 'bar': '../bar', 'shared': '../shared'}).validate();
});
}
diff --git a/test/get/sdk_constraint_required_test.dart b/test/get/sdk_constraint_required_test.dart
index 3f1e5c0..1b6fbc5 100644
--- a/test/get/sdk_constraint_required_test.dart
+++ b/test/get/sdk_constraint_required_test.dart
@@ -25,8 +25,8 @@
d.nothing('pubspec.lock'),
// The "packages" directory should not have been generated.
d.nothing('packages'),
- // The package config file should not have been created.
- d.nothing('.dart_tool/package_config.json'),
+ // The ".packages" file should not have been created.
+ d.nothing('.packages'),
]).validate();
});
}
diff --git a/test/get/switch_source_test.dart b/test/get/switch_source_test.dart
index 7e56652..dd8c97d 100644
--- a/test/get/switch_source_test.dart
+++ b/test/get/switch_source_test.dart
@@ -9,8 +9,7 @@
void main() {
test('re-gets a package if its source has changed', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.dir('foo',
[d.libDir('foo', 'foo 0.0.1'), d.libPubspec('foo', '0.0.1')]).create();
@@ -21,15 +20,11 @@
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
});
}
diff --git a/test/get/unknown_sdk_test.dart b/test/get/unknown_sdk_test.dart
deleted file mode 100644
index d0c1de3..0000000
--- a/test/get/unknown_sdk_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:pub/src/exit_codes.dart' as exit_codes;
-import 'package:test/test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-void main() {
- test('pub get barks at unknown sdk', () async {
- await d.dir(appPath, [
- d.pubspec({
- 'environment': {'foo': '>=1.2.4 <2.0.0'}
- })
- ]).create();
-
- await pubGet(
- error: contains(
- "Error on line 1, column 40 of pubspec.yaml: pubspec.yaml refers to an unknown sdk 'foo'."),
- exitCode: exit_codes.DATA,
- );
- });
-}
diff --git a/test/get/with_empty_environment_test.dart b/test/get/with_empty_environment_test.dart
index 30768c4..9a9f9e2 100644
--- a/test/get/with_empty_environment_test.dart
+++ b/test/get/with_empty_environment_test.dart
@@ -11,8 +11,7 @@
void main() {
test(r'runs even with an empty environment (eg. no $HOME)', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({'foo': 'any'}).create();
diff --git a/test/global/activate/activate_git_after_hosted_test.dart b/test/global/activate/activate_git_after_hosted_test.dart
index c553041..75925d3 100644
--- a/test/global/activate/activate_git_after_hosted_test.dart
+++ b/test/global/activate/activate_git_after_hosted_test.dart
@@ -11,10 +11,11 @@
test('activating a Git package deactivates the hosted one', () async {
ensureGit();
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+ ]);
+ });
await d.git('foo.git', [
d.libPubspec('foo', '1.0.0'),
diff --git a/test/global/activate/activate_hosted_after_git_test.dart b/test/global/activate/activate_hosted_after_git_test.dart
index 1546280..ba267b6 100644
--- a/test/global/activate/activate_hosted_after_git_test.dart
+++ b/test/global/activate/activate_hosted_after_git_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import '../../descriptor.dart' as d;
@@ -10,10 +9,11 @@
void main() {
test('activating a hosted package deactivates the Git one', () async {
- final server = await servePackages();
- server.serve('foo', '2.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+ ]);
+ });
await d.git('foo.git', [
d.libPubspec('foo', '1.0.0'),
@@ -22,9 +22,8 @@
await runPub(args: ['global', 'activate', '-sgit', '../foo.git']);
- final locationUri = p.toUri(p.join(d.sandbox, 'foo.git'));
await runPub(args: ['global', 'activate', 'foo'], output: '''
- Package foo is currently active from Git repository "$locationUri".
+ Package foo is currently active from Git repository "../foo.git".
Resolving dependencies...
+ foo 2.0.0
Downloading foo 2.0.0...
diff --git a/test/global/activate/activate_hosted_after_path_test.dart b/test/global/activate/activate_hosted_after_path_test.dart
index 4cd753f..92985bd 100644
--- a/test/global/activate/activate_hosted_after_path_test.dart
+++ b/test/global/activate/activate_hosted_after_path_test.dart
@@ -11,10 +11,11 @@
void main() {
test('activating a hosted package deactivates the path one', () async {
- final server = await servePackages();
- server.serve('foo', '2.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+ ]);
+ });
await d.dir('foo', [
d.libPubspec('foo', '1.0.0'),
diff --git a/test/global/activate/activate_hosted_twice_test.dart b/test/global/activate/activate_hosted_twice_test.dart
index a4d1337..1923641 100644
--- a/test/global/activate/activate_hosted_twice_test.dart
+++ b/test/global/activate/activate_hosted_twice_test.dart
@@ -9,8 +9,7 @@
void main() {
test('activating a hosted package twice will not precompile', () async {
- final server = await servePackages();
- server
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {
'bar': 'any'
}, contents: [
@@ -22,9 +21,17 @@
])
..serve('bar', '1.0.0', contents: [
d.dir('lib', [d.file('bar.dart', 'final version = "1.0.0";')])
- ]);
+ ]));
- await runPub(args: ['global', 'activate', 'foo'], output: anything);
+ await runPub(args: ['global', 'activate', 'foo'], output: '''
+Resolving dependencies...
++ bar 1.0.0
++ foo 1.0.0
+Downloading foo 1.0.0...
+Downloading bar 1.0.0...
+Building package executables...
+Built foo:foo.
+Activated foo 1.0.0.''');
await runPub(args: ['global', 'activate', 'foo'], output: '''
Package foo is currently active at version 1.0.0.
@@ -39,9 +46,10 @@
await runPub(args: ['global', 'activate', 'foo']);
- server.serve('bar', '2.0.0', contents: [
- d.dir('lib', [d.file('bar.dart', 'final version = "2.0.0";')])
- ]);
+ globalPackageServer!
+ .add((builder) => builder.serve('bar', '2.0.0', contents: [
+ d.dir('lib', [d.file('bar.dart', 'final version = "2.0.0";')])
+ ]));
await runPub(args: ['global', 'activate', 'foo'], output: '''
Package foo is currently active at version 1.0.0.
diff --git a/test/global/activate/activate_path_after_hosted_test.dart b/test/global/activate/activate_path_after_hosted_test.dart
index 01d493d..f7cfa95 100644
--- a/test/global/activate/activate_path_after_hosted_test.dart
+++ b/test/global/activate/activate_path_after_hosted_test.dart
@@ -10,11 +10,12 @@
import '../../test_pub.dart';
void main() {
- test('activating a path package deactivates the hosted one', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
- ]);
+ test('activating a hosted package deactivates the path one', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', "main(args) => print('hosted');")])
+ ]);
+ });
await d.dir('foo', [
d.libPubspec('foo', '2.0.0'),
diff --git a/test/global/activate/cached_package_test.dart b/test/global/activate/cached_package_test.dart
index 98db402..2daeaad 100644
--- a/test/global/activate/cached_package_test.dart
+++ b/test/global/activate/cached_package_test.dart
@@ -9,10 +9,11 @@
void main() {
test('can activate an already cached package', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
+ ]);
+ });
await runPub(args: ['cache', 'add', 'foo']);
diff --git a/test/global/activate/constraint_test.dart b/test/global/activate/constraint_test.dart
index 23386c0..0a18257 100644
--- a/test/global/activate/constraint_test.dart
+++ b/test/global/activate/constraint_test.dart
@@ -9,11 +9,12 @@
void main() {
test('chooses the highest version that matches the constraint', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.0.1')
- ..serve('foo', '1.1.0')
- ..serve('foo', '1.2.3');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.0.1');
+ builder.serve('foo', '1.1.0');
+ builder.serve('foo', '1.2.3');
+ });
await runPub(args: ['global', 'activate', 'foo', '<1.1.0']);
diff --git a/test/global/activate/custom_hosted_url_test.dart b/test/global/activate/custom_hosted_url_test.dart
index 8b2f0fc..54ee463 100644
--- a/test/global/activate/custom_hosted_url_test.dart
+++ b/test/global/activate/custom_hosted_url_test.dart
@@ -9,21 +9,22 @@
void main() {
test('activating a package from a custom pub server', () async {
// The default pub server (i.e. pub.dartlang.org).
- final server = await servePackages();
- server.serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('baz', '1.0.0');
+ });
// The custom pub server.
- final customServer = await startPackageServer();
- Map<String, dynamic> hostedDep(String name, String constraint) => {
- 'hosted': {
- 'url': customServer.url,
- 'name': name,
- },
- 'version': constraint,
- };
-
- customServer.serve('foo', '1.0.0', deps: {'bar': hostedDep('bar', 'any')});
- customServer.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ final customServer = await PackageServer.start((builder) {
+ Map<String, dynamic> hostedDep(String name, String constraint) => {
+ 'hosted': {
+ 'url': builder.serverUrl,
+ 'name': name,
+ },
+ 'version': constraint,
+ };
+ builder.serve('foo', '1.0.0', deps: {'bar': hostedDep('bar', 'any')});
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ });
await runPub(
args: ['global', 'activate', 'foo', '-u', customServer.url],
diff --git a/test/global/activate/different_version_test.dart b/test/global/activate/different_version_test.dart
index 8406b92..dd6cca2 100644
--- a/test/global/activate/different_version_test.dart
+++ b/test/global/activate/different_version_test.dart
@@ -11,13 +11,14 @@
test(
"discards the previous active version if it doesn't match the "
'constraint', () async {
- await servePackages()
- ..serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi");')])
- ])
- ..serve('foo', '2.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi2");')])
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
]);
+ builder.serve('foo', '2.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi2"); ')])
+ ]);
+ });
// Activate 1.0.0.
await runPub(args: ['global', 'activate', 'foo', '1.0.0']);
diff --git a/test/global/activate/empty_constraint_test.dart b/test/global/activate/empty_constraint_test.dart
index d893bcd..fe0bd27 100644
--- a/test/global/activate/empty_constraint_test.dart
+++ b/test/global/activate/empty_constraint_test.dart
@@ -9,9 +9,10 @@
void main() {
test('errors if the constraint matches no versions', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.0.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.0.1');
+ });
await runPub(
args: ['global', 'activate', 'foo', '>1.1.0'],
diff --git a/test/global/activate/feature_test.dart b/test/global/activate/feature_test.dart
index 58119d1..6095aa1 100644
--- a/test/global/activate/feature_test.dart
+++ b/test/global/activate/feature_test.dart
@@ -10,8 +10,8 @@
void main() {
test('enables default-on features by default', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
@@ -21,9 +21,11 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await runPub(args: ['global', 'activate', 'foo'], output: contains('''
Resolving dependencies...
@@ -33,8 +35,8 @@
});
test('can enable default-off features', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
@@ -44,9 +46,11 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await runPub(
args: ['global', 'activate', 'foo', '--features', 'things'],
@@ -59,8 +63,8 @@
});
test('can disable default-on features', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
@@ -70,9 +74,11 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await runPub(
args: ['global', 'activate', 'foo', '--omit-features', 'stuff'],
@@ -83,8 +89,8 @@
});
test('supports multiple arguments', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
@@ -95,9 +101,11 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await runPub(
args: ['global', 'activate', 'foo', '--features', 'things,stuff'],
@@ -110,8 +118,8 @@
});
test('can both enable and disable', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
@@ -121,9 +129,11 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await runPub(args: [
'global',
diff --git a/test/global/activate/ignores_active_version_test.dart b/test/global/activate/ignores_active_version_test.dart
index 777a631..949456f 100644
--- a/test/global/activate/ignores_active_version_test.dart
+++ b/test/global/activate/ignores_active_version_test.dart
@@ -9,14 +9,15 @@
void main() {
test('ignores previously activated version', () async {
- await servePackages()
- ..serve(
+ await servePackages((builder) {
+ builder.serve(
'foo',
'1.2.3',
- )
- ..serve('foo', '1.3.0', contents: [
+ );
+ builder.serve('foo', '1.3.0', contents: [
d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
]);
+ });
// Activate 1.2.3.
await runPub(args: ['global', 'activate', 'foo', '1.2.3']);
diff --git a/test/global/activate/installs_dependencies_for_git_test.dart b/test/global/activate/installs_dependencies_for_git_test.dart
index 6018f50..e67fad4 100644
--- a/test/global/activate/installs_dependencies_for_git_test.dart
+++ b/test/global/activate/installs_dependencies_for_git_test.dart
@@ -9,9 +9,10 @@
void main() {
test('activating a Git package installs its dependencies', () async {
- await servePackages()
- ..serve('bar', '1.0.0', deps: {'baz': 'any'})
- ..serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ builder.serve('baz', '1.0.0');
+ });
await d.git('foo.git', [
d.libPubspec('foo', '1.0.0', deps: {'bar': 'any'}),
diff --git a/test/global/activate/installs_dependencies_for_path_test.dart b/test/global/activate/installs_dependencies_for_path_test.dart
index 4688f07..52f3e65 100644
--- a/test/global/activate/installs_dependencies_for_path_test.dart
+++ b/test/global/activate/installs_dependencies_for_path_test.dart
@@ -9,9 +9,10 @@
void main() {
test('activating a path package installs dependencies', () async {
- await servePackages()
- ..serve('bar', '1.0.0', deps: {'baz': 'any'})
- ..serve('baz', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ builder.serve('baz', '2.0.0');
+ });
await d.dir('foo', [
d.libPubspec('foo', '0.0.0', deps: {'bar': 'any'}),
diff --git a/test/global/activate/installs_dependencies_test.dart b/test/global/activate/installs_dependencies_test.dart
index 770ebcf..7114170 100644
--- a/test/global/activate/installs_dependencies_test.dart
+++ b/test/global/activate/installs_dependencies_test.dart
@@ -8,10 +8,11 @@
void main() {
test('activating a package installs its dependencies', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0', deps: {'baz': 'any'})
- ..serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ builder.serve('baz', '1.0.0');
+ });
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/activate/outdated_binstub_test.dart b/test/global/activate/outdated_binstub_test.dart
index 6d9e298..5a5a0e6 100644
--- a/test/global/activate/outdated_binstub_test.dart
+++ b/test/global/activate/outdated_binstub_test.dart
@@ -7,7 +7,7 @@
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
-const _outdatedBinstub = '''
+const _OUTDATED_BINSTUB = '''
#!/usr/bin/env sh
# This file was created by pub v0.1.2-3.
# Package: foo
@@ -19,17 +19,19 @@
void main() {
test('an outdated binstub is replaced', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'foo-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'foo-script': 'script'}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
await d.dir(cachePath, [
- d.dir('bin', [d.file(binStubName('foo-script'), _outdatedBinstub)])
+ d.dir('bin', [d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)])
]).create();
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/activate/path_package_test.dart b/test/global/activate/path_package_test.dart
index 514176a..6a08e9c 100644
--- a/test/global/activate/path_package_test.dart
+++ b/test/global/activate/path_package_test.dart
@@ -55,13 +55,14 @@
});
test("Doesn't precompile binaries when activating from path", () async {
- final server = await servePackages();
- server.serve(
- 'bar',
- '1.0.0',
- contents: [
- d.dir('bin', [d.file('bar.dart', "main() => print('bar');")])
- ],
+ await servePackages(
+ (builder) => builder.serve(
+ 'bar',
+ '1.0.0',
+ contents: [
+ d.dir('bin', [d.file('bar.dart', "main() => print('bar');")])
+ ],
+ ),
);
await d.dir('foo', [
diff --git a/test/global/activate/reactivating_git_upgrades_test.dart b/test/global/activate/reactivating_git_upgrades_test.dart
index 68102da..100aaea 100644
--- a/test/global/activate/reactivating_git_upgrades_test.dart
+++ b/test/global/activate/reactivating_git_upgrades_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import '../../descriptor.dart' as d;
@@ -30,12 +29,11 @@
await d.git('foo.git', [d.libPubspec('foo', '1.0.1')]).commit();
// Activating it again pulls down the latest commit.
- final locationUri = p.toUri(p.join(d.sandbox, 'foo.git'));
await runPub(
args: ['global', 'activate', '-sgit', '../foo.git'],
output: allOf(
startsWith('Package foo is currently active from Git repository '
- '"$locationUri".\n'
+ '"../foo.git".\n'
'Resolving dependencies...\n'
'+ foo 1.0.1 from git ../foo.git at '),
// Specific revision number goes here.
diff --git a/test/global/activate/removes_old_lockfile_test.dart b/test/global/activate/removes_old_lockfile_test.dart
new file mode 100644
index 0000000..a91a153
--- /dev/null
+++ b/test/global/activate/removes_old_lockfile_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+void main() {
+ test('removes the 1.6-style lockfile', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
+
+ await d.dir(cachePath, [
+ d.dir('global_packages', [
+ d.file(
+ 'foo.lock',
+ 'packages: {foo: {description: foo, source: hosted, '
+ 'version: "1.0.0"}}}')
+ ])
+ ]).create();
+
+ await runPub(args: ['global', 'activate', 'foo']);
+
+ await d.dir(cachePath, [
+ d.dir('global_packages', [
+ d.nothing('foo.lock'),
+ d.dir('foo', [d.file('pubspec.lock', contains('1.0.0'))])
+ ])
+ ]).validate();
+ });
+}
diff --git a/test/global/activate/snapshots_hosted_executables_test.dart b/test/global/activate/snapshots_hosted_executables_test.dart
index bc2b332..c400ec7 100644
--- a/test/global/activate/snapshots_hosted_executables_test.dart
+++ b/test/global/activate/snapshots_hosted_executables_test.dart
@@ -9,15 +9,16 @@
void main() {
test('snapshots the executables for a hosted package', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [
- d.file('hello.dart', "void main() => print('hello!');"),
- d.file('goodbye.dart', "void main() => print('goodbye!');"),
- d.file('shell.sh', 'echo shell'),
- d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
- ])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [
+ d.file('hello.dart', "void main() => print('hello!');"),
+ d.file('goodbye.dart', "void main() => print('goodbye!');"),
+ d.file('shell.sh', 'echo shell'),
+ d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
+ ])
+ ]);
+ });
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/activate/supports_version_solver_backtracking_test.dart b/test/global/activate/supports_version_solver_backtracking_test.dart
index c8c138d..7731bc6 100644
--- a/test/global/activate/supports_version_solver_backtracking_test.dart
+++ b/test/global/activate/supports_version_solver_backtracking_test.dart
@@ -9,13 +9,14 @@
void main() {
test('performs verison solver backtracking if necessary', () async {
- await servePackages()
- ..serve('foo', '1.1.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.1.0', pubspec: {
'environment': {'sdk': '>=0.1.2 <0.2.0'}
- })
- ..serve('foo', '1.2.0', pubspec: {
+ });
+ builder.serve('foo', '1.2.0', pubspec: {
'environment': {'sdk': '>=0.1.3 <0.2.0'}
});
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/activate/uncached_package_test.dart b/test/global/activate/uncached_package_test.dart
index 1a18d70..98b12af 100644
--- a/test/global/activate/uncached_package_test.dart
+++ b/test/global/activate/uncached_package_test.dart
@@ -9,16 +9,17 @@
void main() {
test('installs and activates the best version of a package', () async {
- await servePackages()
- ..serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi");')])
- ])
- ..serve('foo', '1.2.3', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi 1.2.3");')])
- ])
- ..serve('foo', '2.0.0-wildly.unstable', contents: [
- d.dir('bin', [d.file('foo.dart', 'main() => print("hi unstable");')])
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi"); ')])
]);
+ builder.serve('foo', '1.2.3', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi 1.2.3"); ')])
+ ]);
+ builder.serve('foo', '2.0.0-wildly.unstable', contents: [
+ d.dir('bin', [d.file('foo.dart', 'main() => print("hi unstable"); ')])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo'], output: '''
Resolving dependencies...
diff --git a/test/global/activate/unknown_package_test.dart b/test/global/activate/unknown_package_test.dart
index 271545d..93a5d3a 100644
--- a/test/global/activate/unknown_package_test.dart
+++ b/test/global/activate/unknown_package_test.dart
@@ -9,7 +9,7 @@
void main() {
test('errors if the package could not be found', () async {
- await servePackages();
+ await serveNoPackages();
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/binstub_runs_executable_test.dart b/test/global/binstubs/binstub_runs_executable_test.dart
index 98ab53b..c733f47 100644
--- a/test/global/binstubs/binstub_runs_executable_test.dart
+++ b/test/global/binstubs/binstub_runs_executable_test.dart
@@ -12,12 +12,14 @@
void main() {
test('the generated binstub runs a snapshotted executable', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'foo-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'foo-script': 'script'}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart b/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
index cd477db..f66a251 100644
--- a/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
+++ b/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
@@ -9,12 +9,13 @@
void main() {
test('the binstubs runs a built snapshot if present', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'foo-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'foo-script': 'script'}
+ }, contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/binstubs/creates_executables_in_pubspec_test.dart b/test/global/binstubs/creates_executables_in_pubspec_test.dart
index a6604ab..8fe53dc 100644
--- a/test/global/binstubs/creates_executables_in_pubspec_test.dart
+++ b/test/global/binstubs/creates_executables_in_pubspec_test.dart
@@ -9,16 +9,17 @@
void main() {
test('creates binstubs for each executable in the pubspec', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'one': null, 'two-renamed': 'second'}
- }, contents: [
- d.dir('bin', [
- d.file('one.dart', "main(args) => print('one');"),
- d.file('second.dart', "main(args) => print('two');"),
- d.file('nope.dart', "main(args) => print('nope');")
- ])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'one': null, 'two-renamed': 'second'}
+ }, contents: [
+ d.dir('bin', [
+ d.file('one.dart', "main(args) => print('one');"),
+ d.file('second.dart', "main(args) => print('two');"),
+ d.file('nope.dart', "main(args) => print('nope');")
+ ])
+ ]);
+ });
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/does_not_warn_if_no_executables_test.dart b/test/global/binstubs/does_not_warn_if_no_executables_test.dart
index 9814f15..b7ca722 100644
--- a/test/global/binstubs/does_not_warn_if_no_executables_test.dart
+++ b/test/global/binstubs/does_not_warn_if_no_executables_test.dart
@@ -9,10 +9,12 @@
void main() {
test('does not warn if the package has no executables', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/binstubs/does_not_warn_if_on_path_test.dart b/test/global/binstubs/does_not_warn_if_on_path_test.dart
index 9b11386..fd0dfa7 100644
--- a/test/global/binstubs/does_not_warn_if_on_path_test.dart
+++ b/test/global/binstubs/does_not_warn_if_on_path_test.dart
@@ -12,12 +12,14 @@
void main() {
test('does not warn if the binstub directory is on the path', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'script': null}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'script': null}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
// Add the test's cache bin directory to the path.
var binDir = p.dirname(Platform.executable);
diff --git a/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart b/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
index 442dfbc..e86757c 100644
--- a/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
+++ b/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
@@ -24,22 +24,23 @@
void main() {
test("an outdated binstub runs 'pub global run', which replaces old binstub",
() async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {
- 'foo-script': 'script',
- 'foo-script2': 'script',
- 'foo-script-not-installed': 'script',
- 'foo-another-script': 'another-script',
- 'foo-another-script-not-installed': 'another-script'
- }
- }, contents: [
- d.dir('bin', [
- d.file('script.dart', r"main(args) => print('ok $args');"),
- d.file(
- 'another-script.dart', r"main(args) => print('not so good $args');")
- ])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {
+ 'foo-script': 'script',
+ 'foo-script2': 'script',
+ 'foo-script-not-installed': 'script',
+ 'foo-another-script': 'another-script',
+ 'foo-another-script-not-installed': 'another-script'
+ }
+ }, contents: [
+ d.dir('bin', [
+ d.file('script.dart', r"main(args) => print('ok $args');"),
+ d.file('another-script.dart',
+ r"main(args) => print('not so good $args');")
+ ])
+ ]);
+ });
await runPub(args: [
'global',
diff --git a/test/global/binstubs/outdated_snapshot_test.dart b/test/global/binstubs/outdated_snapshot_test.dart
index 91bfff6..e749a5c 100644
--- a/test/global/binstubs/outdated_snapshot_test.dart
+++ b/test/global/binstubs/outdated_snapshot_test.dart
@@ -13,12 +13,14 @@
void main() {
test("a binstub runs 'pub global run' for an outdated snapshot", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'foo-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'foo-script': 'script'}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/binstubs/removes_when_deactivated_test.dart b/test/global/binstubs/removes_when_deactivated_test.dart
index 975defe..05c8413 100644
--- a/test/global/binstubs/removes_when_deactivated_test.dart
+++ b/test/global/binstubs/removes_when_deactivated_test.dart
@@ -9,15 +9,16 @@
void main() {
test('removes binstubs when the package is deactivated', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'one': null, 'two': null}
- }, contents: [
- d.dir('bin', [
- d.file('one.dart', "main(args) => print('one');"),
- d.file('two.dart', "main(args) => print('two');")
- ])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'one': null, 'two': null}
+ }, contents: [
+ d.dir('bin', [
+ d.file('one.dart', "main(args) => print('one');"),
+ d.file('two.dart', "main(args) => print('two');")
+ ])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
await runPub(args: ['global', 'deactivate', 'foo']);
diff --git a/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart b/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
index 99eeaaf..54f3932 100644
--- a/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
+++ b/test/global/binstubs/runs_once_even_when_dart_is_batch_test.dart
@@ -14,17 +14,18 @@
test(
'runs only once even when dart on path is a batch file (as in flutter/bin)',
() async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '1.0.0',
- contents: [
- d.dir('bin', [d.file('script.dart', 'main(args) => print(args);')]),
- ],
- pubspec: {
- 'executables': {'script': 'script'},
- },
- );
+ await servePackages((builder) {
+ builder.serve(
+ 'foo',
+ '1.0.0',
+ contents: [
+ d.dir('bin', [d.file('script.dart', 'main(args) => print(args);')]),
+ ],
+ pubspec: {
+ 'executables': {'script': 'script'},
+ },
+ );
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/binstubs/warns_if_not_on_path_test.dart b/test/global/binstubs/warns_if_not_on_path_test.dart
index d98bf76..d09e698 100644
--- a/test/global/binstubs/warns_if_not_on_path_test.dart
+++ b/test/global/binstubs/warns_if_not_on_path_test.dart
@@ -9,12 +9,14 @@
void main() {
test('warns if the binstub directory is not on the path', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'executables': {'some-dart-script': 'script'}
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'executables': {'some-dart-script': 'script'}
+ }, contents: [
+ d.dir(
+ 'bin', [d.file('script.dart', "main(args) => print('ok \$args');")])
+ ]);
+ });
await runPub(
args: ['global', 'activate', 'foo'],
diff --git a/test/global/deactivate/deactivate_and_reactivate_package_test.dart b/test/global/deactivate/deactivate_and_reactivate_package_test.dart
index da33486..cc7f597 100644
--- a/test/global/deactivate/deactivate_and_reactivate_package_test.dart
+++ b/test/global/deactivate/deactivate_and_reactivate_package_test.dart
@@ -8,9 +8,10 @@
void main() {
test('activates a different version after deactivating', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ });
// Activate an old version.
await runPub(args: ['global', 'activate', 'foo', '1.0.0']);
diff --git a/test/global/deactivate/git_package_test.dart b/test/global/deactivate/git_package_test.dart
index 7fc2855..f06ce53 100644
--- a/test/global/deactivate/git_package_test.dart
+++ b/test/global/deactivate/git_package_test.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import '../../descriptor.dart' as d;
@@ -19,10 +18,9 @@
await runPub(args: ['global', 'activate', '-sgit', '../foo.git']);
- final locationUri = p.toUri(p.join(d.sandbox, 'foo.git'));
await runPub(
args: ['global', 'deactivate', 'foo'],
output:
- 'Deactivated package foo 1.0.0 from Git repository "$locationUri".');
+ 'Deactivated package foo 1.0.0 from Git repository "../foo.git".');
});
}
diff --git a/test/global/deactivate/hosted_package_test.dart b/test/global/deactivate/hosted_package_test.dart
index fa91829..854d6a9 100644
--- a/test/global/deactivate/hosted_package_test.dart
+++ b/test/global/deactivate/hosted_package_test.dart
@@ -8,8 +8,7 @@
void main() {
test('deactivates an active hosted package', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/deactivate/removes_precompiled_snapshots_test.dart b/test/global/deactivate/removes_precompiled_snapshots_test.dart
index a7670e2..7ea6d58 100644
--- a/test/global/deactivate/removes_precompiled_snapshots_test.dart
+++ b/test/global/deactivate/removes_precompiled_snapshots_test.dart
@@ -9,8 +9,7 @@
void main() {
test('removes built snapshots', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) => builder.serve('foo', '1.0.0'));
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/deactivate/unknown_package_test.dart b/test/global/deactivate/unknown_package_test.dart
index 35023ad..d67460d 100644
--- a/test/global/deactivate/unknown_package_test.dart
+++ b/test/global/deactivate/unknown_package_test.dart
@@ -9,7 +9,7 @@
void main() {
test('errors if the package is not activated', () async {
- await servePackages();
+ await serveNoPackages();
await runPub(
args: ['global', 'deactivate', 'foo'],
diff --git a/test/global/list_test.dart b/test/global/list_test.dart
index 00ca22c..4b50184 100644
--- a/test/global/list_test.dart
+++ b/test/global/list_test.dart
@@ -12,8 +12,9 @@
void main() {
test('lists an activated hosted package', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await runPub(args: ['global', 'activate', 'foo']);
@@ -30,10 +31,9 @@
await runPub(args: ['global', 'activate', '-sgit', '../foo.git']);
- final locationUri = p.toUri(p.join(d.sandbox, 'foo.git'));
await runPub(
args: ['global', 'list'],
- output: 'foo 1.0.0 from Git repository "$locationUri"');
+ output: 'foo 1.0.0 from Git repository "../foo.git"');
});
test('lists an activated Path package', () async {
@@ -49,10 +49,11 @@
});
test('lists activated packages in alphabetical order', () async {
- await servePackages()
- ..serve('aaa', '1.0.0')
- ..serve('bbb', '1.0.0')
- ..serve('ccc', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('aaa', '1.0.0');
+ builder.serve('bbb', '1.0.0');
+ builder.serve('ccc', '1.0.0');
+ });
await runPub(args: ['global', 'activate', 'ccc']);
await runPub(args: ['global', 'activate', 'aaa']);
diff --git a/test/global/run/errors_if_outside_bin_test.dart b/test/global/run/errors_if_outside_bin_test.dart
index 72bcd4f..098f0bb 100644
--- a/test/global/run/errors_if_outside_bin_test.dart
+++ b/test/global/run/errors_if_outside_bin_test.dart
@@ -10,10 +10,11 @@
void main() {
test('errors if the script is in a subdirectory.', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('example', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('example', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
await runPub(
diff --git a/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart b/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
index 3bef340..08adbcc 100644
--- a/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
+++ b/test/global/run/fails_if_sdk_constraint_is_unmet_test.dart
@@ -10,10 +10,11 @@
void main() {
test("fails if the current SDK doesn't match the constraint", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
@@ -40,14 +41,15 @@
});
test('fails if SDK is downgraded below the constraints', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'environment': {
- 'sdk': '>=2.0.0 <3.0.0',
- },
- }, contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'environment': {
+ 'sdk': '>=2.0.0 <3.0.0',
+ },
+ }, contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
+ ]);
+ });
await runPub(
environment: {'_PUB_TEST_SDK_VERSION': '2.0.0'},
@@ -67,8 +69,8 @@
});
test('fails if SDK is downgraded below dependency SDK constraints', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {
'bar': '^1.0.0',
}, pubspec: {
'environment': {
@@ -76,12 +78,13 @@
},
}, contents: [
d.dir('bin', [d.file('script.dart', "main(args) => print('123-OK');")])
- ])
- ..serve('bar', '1.0.0', pubspec: {
+ ]);
+ builder.serve('bar', '1.0.0', pubspec: {
'environment': {
'sdk': '>=2.2.0 <3.0.0',
},
});
+ });
await runPub(
environment: {'_PUB_TEST_SDK_VERSION': '2.2.0'},
diff --git a/test/global/run/implicit_executable_name_test.dart b/test/global/run/implicit_executable_name_test.dart
index 9757772..fa7bf51 100644
--- a/test/global/run/implicit_executable_name_test.dart
+++ b/test/global/run/implicit_executable_name_test.dart
@@ -9,10 +9,11 @@
void main() {
test('defaults to the package name if the script is omitted', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('foo.dart', "main(args) => print('foo');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('foo.dart', "main(args) => print('foo');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/nonexistent_script_test.dart b/test/global/run/nonexistent_script_test.dart
index 8ff0a42..d4f9577 100644
--- a/test/global/run/nonexistent_script_test.dart
+++ b/test/global/run/nonexistent_script_test.dart
@@ -10,10 +10,9 @@
void main() {
test('errors if the script does not exist.', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'dev_dependencies': {'bar': '1.0.0'}
- });
+ await servePackages((builder) => builder.serve('foo', '1.0.0', pubspec: {
+ 'dev_dependencies': {'bar': '1.0.0'}
+ }));
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/package_api_test.dart b/test/global/run/package_api_test.dart
index 5db401b..4ce34ee 100644
--- a/test/global/run/package_api_test.dart
+++ b/test/global/run/package_api_test.dart
@@ -10,9 +10,10 @@
void main() {
test('an immutable application sees a file: package config', () async {
- await servePackages()
- ..serve('bar', '1.0.0')
- ..serve('foo', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+
+ builder.serve('foo', '1.0.0', deps: {
'bar': '1.0.0'
}, contents: [
d.dir('bin', [
@@ -30,6 +31,7 @@
""")
])
]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
@@ -41,12 +43,12 @@
'global_packages/foo/.dart_tool/package_config.json');
expect(pub.stdout, emits(p.toUri(packageConfigPath).toString()));
- var fooResourcePath =
- p.join(globalServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
+ var fooResourcePath = p.join(
+ globalPackageServer!.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
expect(pub.stdout, emits(p.toUri(fooResourcePath).toString()));
- var barResourcePath =
- p.join(globalServer.pathInCache('bar', '1.0.0'), 'lib/resource.txt');
+ var barResourcePath = p.join(
+ globalPackageServer!.pathInCache('bar', '1.0.0'), 'lib/resource.txt');
expect(pub.stdout, emits(p.toUri(barResourcePath).toString()));
await pub.shouldExit(0);
});
diff --git a/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart b/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
index 24e65bf..97c69f2 100644
--- a/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
+++ b/test/global/run/recompiles_if_snapshot_is_out_of_date_test.dart
@@ -11,10 +11,11 @@
void main() {
test('recompiles a script if the snapshot is out-of-date', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/runs_script_in_checked_mode_test.dart b/test/global/run/runs_script_in_checked_mode_test.dart
index d0511cf..69cd393 100644
--- a/test/global/run/runs_script_in_checked_mode_test.dart
+++ b/test/global/run/runs_script_in_checked_mode_test.dart
@@ -9,10 +9,11 @@
void main() {
test('runs a script with assertions enabled', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', 'main() { assert(false); }')])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', 'main() { assert(false); }')])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/runs_script_in_unchecked_mode_test.dart b/test/global/run/runs_script_in_unchecked_mode_test.dart
index ca752b2..d684c27 100644
--- a/test/global/run/runs_script_in_unchecked_mode_test.dart
+++ b/test/global/run/runs_script_in_unchecked_mode_test.dart
@@ -7,7 +7,7 @@
import '../../descriptor.dart' as d;
import '../../test_pub.dart';
-const _script = '''
+const SCRIPT = '''
main() {
assert(false);
print("no checks");
@@ -16,10 +16,11 @@
void main() {
test('runs a script in unchecked mode by default', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', _script)])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', SCRIPT)])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/runs_script_test.dart b/test/global/run/runs_script_test.dart
index f3f0e99..fe767ef 100644
--- a/test/global/run/runs_script_test.dart
+++ b/test/global/run/runs_script_test.dart
@@ -9,10 +9,11 @@
void main() {
test('runs a script in an activated package', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/runs_script_without_packages_file_test.dart b/test/global/run/runs_script_without_packages_file_test.dart
index dc225ba..cb63be2 100644
--- a/test/global/run/runs_script_without_packages_file_test.dart
+++ b/test/global/run/runs_script_without_packages_file_test.dart
@@ -12,10 +12,11 @@
void main() {
test('runs a snapshotted script without a .dart_tool/package_config file',
() async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', "main(args) => print('ok');")])
+ ]);
+ });
await runPub(args: ['global', 'activate', 'foo']);
diff --git a/test/global/run/unknown_package_test.dart b/test/global/run/unknown_package_test.dart
index adcb666..a5fba21 100644
--- a/test/global/run/unknown_package_test.dart
+++ b/test/global/run/unknown_package_test.dart
@@ -9,7 +9,7 @@
void main() {
test('errors if the package is not activated', () async {
- await servePackages();
+ await serveNoPackages();
await runPub(
args: ['global', 'run', 'foo:bar'],
diff --git a/test/global/run/uses_old_lockfile_test.dart b/test/global/run/uses_old_lockfile_test.dart
new file mode 100644
index 0000000..5eb8406
--- /dev/null
+++ b/test/global/run/uses_old_lockfile_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+void main() {
+ test('uses the 1.6-style lockfile if necessary', () async {
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ builder.serve('foo', '1.0.0', deps: {
+ 'bar': 'any'
+ }, contents: [
+ d.dir('bin', [
+ d.file('script.dart', """
+ import 'package:bar/bar.dart' as bar;
+
+ main(args) => print(bar.main());""")
+ ])
+ ]);
+ });
+
+ await runPub(args: ['cache', 'add', 'foo']);
+ await runPub(args: ['cache', 'add', 'bar']);
+
+ await d.dir(cachePath, [
+ d.dir('global_packages', [
+ d.file('foo.lock', '''
+packages:
+ foo:
+ description: foo
+ source: hosted
+ version: "1.0.0"
+ bar:
+ description: bar
+ source: hosted
+ version: "1.0.0"''')
+ ])
+ ]).create();
+
+ var pub = await pubRun(global: true, args: ['foo:script']);
+ expect(pub.stdout, emitsThrough('bar 1.0.0'));
+ await pub.shouldExit();
+
+ await d.dir(cachePath, [
+ d.dir('global_packages', [
+ d.nothing('foo.lock'),
+ d.dir('foo', [d.file('pubspec.lock', contains('1.0.0'))])
+ ])
+ ]).validate();
+ });
+}
diff --git a/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart b/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
index 7fb22a3..be875a2 100644
--- a/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
+++ b/test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
@@ -9,7 +9,6 @@
import 'package:test/test.dart';
import '../descriptor.dart' as d;
-import '../golden_file.dart';
import '../test_pub.dart';
void main() {
@@ -17,18 +16,15 @@
test(
'fails gracefully if the package server responds with broken package listings',
() async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect(
- 'GET',
- RegExp('/api/packages/.*'),
- expectAsync1((request) {
- return Response(200,
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- }),
- );
+ await servePackages((b) => b..serve('foo', '1.2.3'));
+ globalPackageServer!.extraHandlers[RegExp('/api/packages/.*')] =
+ expectAsync1((request) {
+ expect(request.method, 'GET');
+ return Response(200,
+ body: jsonEncode({
+ 'notTheRight': {'response': 'type'}
+ }));
+ });
await d.appDir({'foo': '1.2.3'}).create();
await pubCommand(command,
@@ -40,80 +36,4 @@
exitCode: exit_codes.DATA);
});
});
-
- testWithGolden('bad_json', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect('GET', RegExp('/api/packages/.*'), (request) {
- return Response(200,
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- });
- await d.appDir({'foo': '1.2.3'}).create();
-
- await ctx.run(['get']);
- });
-
- testWithGolden('403', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect('GET', RegExp('/api/packages/.*'), (request) {
- return Response(403,
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- });
- await d.appDir({'foo': '1.2.3'}).create();
-
- await ctx.run(['get']);
- });
-
- testWithGolden('401', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect('GET', RegExp('/api/packages/.*'), (request) {
- return Response(401,
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- });
- await d.appDir({'foo': '1.2.3'}).create();
-
- await ctx.run(['get']);
- });
-
- testWithGolden('403-with-message', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect('GET', RegExp('/api/packages/.*'), (request) {
- return Response(403,
- headers: {
- 'www-authenticate': 'Bearer realm="pub", message="<message>"',
- },
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- });
- await d.appDir({'foo': '1.2.3'}).create();
-
- await ctx.run(['get']);
- });
-
- testWithGolden('401-with-message', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- server.expect('GET', RegExp('/api/packages/.*'), (request) {
- return Response(401,
- headers: {
- 'www-authenticate': 'Bearer realm="pub", message="<message>"',
- },
- body: jsonEncode({
- 'notTheRight': {'response': 'type'}
- }));
- });
- await d.appDir({'foo': '1.2.3'}).create();
-
- await ctx.run(['get']);
- });
}
diff --git a/test/hosted/fail_gracefully_on_missing_package_test.dart b/test/hosted/fail_gracefully_on_missing_package_test.dart
index 7c6290d..1840f18 100644
--- a/test/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -11,7 +11,7 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('fails gracefully if the package does not exist', () async {
- await servePackages();
+ await serveNoPackages();
await d.appDir({'foo': '1.2.3'}).create();
diff --git a/test/hosted/fail_gracefully_with_hint_test.dart b/test/hosted/fail_gracefully_with_hint_test.dart
deleted file mode 100644
index 4f1a326..0000000
--- a/test/hosted/fail_gracefully_with_hint_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:pub/src/exit_codes.dart' as exit_codes;
-import 'package:test/test.dart';
-
-import '../descriptor.dart' as d;
-import '../golden_file.dart';
-import '../test_pub.dart';
-
-void main() {
- testWithGolden('hint: try without --offline', (ctx) async {
- // Run the server so that we know what URL to use in the system cache.
- (await servePackages()).serveErrors();
-
- await d.appDir({'foo': 'any'}).create();
-
- await pubGet(
- args: ['--offline'],
- exitCode: exit_codes.UNAVAILABLE,
- error: contains('Try again without --offline!'),
- );
- });
-
- testWithGolden('supports two hints', (ctx) async {
- // Run the server so that we know what URL to use in the system cache.
- (await servePackages()).serveErrors();
-
- await d.hostedCache([
- d.dir('foo-1.2.3', [
- d.pubspec({
- 'name': 'foo',
- 'version': '1.2.3',
- 'environment': {
- 'flutter': 'any', // generates hint -> flutter pub get
- },
- }),
- ]),
- d.dir('foo-1.2.4', [
- d.pubspec({
- 'name': 'foo',
- 'version': '1.2.4',
- 'dependencies': {
- 'bar': 'any', // generates hint -> try without --offline
- },
- }),
- ]),
- ]).create();
-
- await d.appDir({'foo': 'any'}).create();
-
- await pubGet(
- args: ['--offline'],
- exitCode: exit_codes.UNAVAILABLE,
- error: allOf(
- contains('Try again without --offline!'),
- contains('flutter pub get'), // hint that
- ),
- );
-
- await ctx.run(['get', '--offline']);
- });
-}
diff --git a/test/hosted/metadata_test.dart b/test/hosted/metadata_test.dart
index c705ac7..7554a0f 100644
--- a/test/hosted/metadata_test.dart
+++ b/test/hosted/metadata_test.dart
@@ -12,8 +12,9 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('sends metadata headers for a direct dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
@@ -32,8 +33,9 @@
});
test('sends metadata headers for a dev dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -57,8 +59,9 @@
});
test('sends metadata headers for a transitive dependency', () async {
- final server = await servePackages();
- server.serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {'path': '../foo'}
@@ -79,8 +82,9 @@
});
test("doesn't send metadata headers to a foreign server", () async {
- var server = await startPackageServer()
- ..serve('foo', '1.0.0');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -93,7 +97,9 @@
});
test("doesn't send metadata headers when CI=true", () async {
- (await servePackages()).serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
diff --git a/test/hosted/offline_test.dart b/test/hosted/offline_test.dart
index ca3dc80..713ea3f 100644
--- a/test/hosted/offline_test.dart
+++ b/test/hosted/offline_test.dart
@@ -8,13 +8,14 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-Future<void> populateCache(
- Map<String, List<String>> versions, PackageServer server) async {
- for (final entry in versions.entries) {
- for (final version in entry.value) {
- server.serve(entry.key, version);
+Future<void> populateCache(Map<String, List<String>> versions) async {
+ await servePackages((b) {
+ for (final entry in versions.entries) {
+ for (final version in entry.value) {
+ b.serve(entry.key, version);
+ }
}
- }
+ });
for (final entry in versions.entries) {
for (final version in entry.value) {
await d.appDir({entry.key: version}).create();
@@ -26,14 +27,13 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('upgrades a package using the cache', () async {
- final server = await servePackages();
await populateCache({
'foo': ['1.2.2', '1.2.3'],
'bar': ['1.2.3']
- }, server);
+ });
// Now serve only errors - to validate we are truly offline.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
@@ -44,19 +44,16 @@
}
await pubCommand(command, args: ['--offline'], warning: warning);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- d.packageConfigEntry(name: 'bar', version: '1.2.3'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '1.2.3', 'bar': '1.2.3'}).validate();
});
test('supports prerelease versions', () async {
- final server = await servePackages();
await populateCache({
'foo': ['1.2.3-alpha.1']
- }, server);
+ });
// Now serve only errors - to validate we are truly offline.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': 'any'}).create();
@@ -68,15 +65,12 @@
await pubCommand(command, args: ['--offline'], warning: warning);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3-alpha.1'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3-alpha.1'}).validate();
});
test('fails gracefully if a dependency is not cached', () async {
// Run the server so that we know what URL to use in the system cache.
- final server = await servePackages();
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': 'any'}).create();
@@ -86,19 +80,16 @@
error: equalsIgnoringWhitespace("""
Because myapp depends on foo any which doesn't exist (could not find
package foo in cache), version solving failed.
-
- Try again without --offline!
"""));
});
test('fails gracefully if no cached versions match', () async {
- final server = await servePackages();
await populateCache({
'foo': ['1.2.2', '1.2.3']
- }, server);
+ });
// Run the server so that we know what URL to use in the system cache.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': '>2.0.0'}).create();
@@ -112,10 +103,8 @@
test(
'fails gracefully if a dependency is not cached and a lockfile '
'exists', () async {
- final server = await servePackages();
-
// Run the server so that we know what URL to use in the system cache.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': 'any'}).create();
@@ -127,19 +116,15 @@
error: equalsIgnoringWhitespace("""
Because myapp depends on foo any which doesn't exist (could not find
package foo in cache), version solving failed.
-
- Try again without --offline!
"""));
});
test('downgrades to the version in the cache if necessary', () async {
- final server = await servePackages();
-
await populateCache({
'foo': ['1.2.2', '1.2.3']
- }, server);
+ });
// Run the server so that we know what URL to use in the system cache.
- server.serveErrors();
+ await serveErrors();
await d.appDir({'foo': 'any'}).create();
@@ -147,19 +132,15 @@
await pubCommand(command, args: ['--offline']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.3'}).validate();
});
test('skips invalid cached versions', () async {
- final server = await servePackages();
-
await populateCache({
'foo': ['1.2.2', '1.2.3']
- }, server);
+ });
// Run the server so that we know what URL to use in the system cache.
- server.serveErrors();
+ await serveErrors();
await d.hostedCache([
d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')]),
@@ -170,19 +151,15 @@
await pubCommand(command, args: ['--offline']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
});
test('skips invalid locked versions', () async {
- final server = await servePackages();
-
await populateCache({
'foo': ['1.2.2', '1.2.3']
- }, server);
+ });
// Run the server so that we know what URL to use in the system cache.
- server.serveErrors();
+ await serveErrors();
await d.hostedCache([
d.dir('foo-1.2.3', [d.file('pubspec.yaml', '{')])
@@ -194,9 +171,7 @@
await pubCommand(command, args: ['--offline']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.2.2'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.2.2'}).validate();
});
});
}
diff --git a/test/hosted/remove_removed_dependency_test.dart b/test/hosted/remove_removed_dependency_test.dart
index a0446c0..d326384 100644
--- a/test/hosted/remove_removed_dependency_test.dart
+++ b/test/hosted/remove_removed_dependency_test.dart
@@ -10,25 +10,22 @@
void main() {
forBothPubGetAndUpgrade((command) {
test("removes a dependency that's removed from the pubspec", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
await d.appDir({'foo': 'any'}).create();
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0'}).validate();
});
});
}
diff --git a/test/hosted/remove_removed_transitive_dependency_test.dart b/test/hosted/remove_removed_transitive_dependency_test.dart
index 182ec3f..50702d7 100644
--- a/test/hosted/remove_removed_transitive_dependency_test.dart
+++ b/test/hosted/remove_removed_transitive_dependency_test.dart
@@ -12,30 +12,31 @@
test(
"removes a transitive dependency that's no longer depended "
'on', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
- ..serve('bar', '1.0.0', deps: {'shared_dep': 'any', 'bar_dep': 'any'})
- ..serve('shared_dep', '1.0.0')
- ..serve('bar_dep', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
+ builder.serve('bar', '1.0.0',
+ deps: {'shared_dep': 'any', 'bar_dep': 'any'});
+ builder.serve('shared_dep', '1.0.0');
+ builder.serve('bar_dep', '1.0.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar_dep', version: '1.0.0'),
- ]).validate();
+
+ await d.appPackagesFile({
+ 'foo': '1.0.0',
+ 'bar': '1.0.0',
+ 'shared_dep': '1.0.0',
+ 'bar_dep': '1.0.0',
+ }).validate();
await d.appDir({'foo': 'any'}).create();
await pubCommand(command);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '1.0.0'),
- ]).validate();
+ await d
+ .appPackagesFile({'foo': '1.0.0', 'shared_dep': '1.0.0'}).validate();
});
});
}
diff --git a/test/hosted/short_syntax_test.dart b/test/hosted/short_syntax_test.dart
index 5d4cf28..70738a9 100644
--- a/test/hosted/short_syntax_test.dart
+++ b/test/hosted/short_syntax_test.dart
@@ -12,12 +12,10 @@
import '../test_pub.dart';
void main() {
- setUp(() async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', pubspec: {
- 'environment': {'sdk': '^2.0.0'}
- });
- });
+ setUp(() => servePackages((b) => b.serve('foo', '1.2.3', pubspec: {
+ 'environment': {'sdk': '^2.0.0'}
+ })));
+
forBothPubGetAndUpgrade((command) {
Future<void> testWith(dynamic dependency) async {
await d.dir(appPath, [
@@ -44,19 +42,19 @@
'source': 'hosted',
'description': {
'name': 'foo',
- 'url': globalServer.url,
+ 'url': globalPackageServer!.url,
},
'version': '1.2.3',
});
}
test('supports hosted: <url> syntax', () async {
- return testWith({'hosted': globalServer.url});
+ return testWith({'hosted': globalPackageServer!.url});
});
test('supports hosted map without name', () {
return testWith({
- 'hosted': {'url': globalServer.url},
+ 'hosted': {'url': globalPackageServer!.url},
});
});
@@ -82,8 +80,8 @@
await File(p.join(d.sandbox, appPath, 'pubspec.lock')).readAsString(),
);
- expect(
- lockFile['packages']['foo']['description']['url'], globalServer.url);
+ expect(lockFile['packages']['foo']['description']['url'],
+ globalPackageServer!.url);
});
});
}
diff --git a/test/hosted/version_negotiation_test.dart b/test/hosted/version_negotiation_test.dart
index 44dbe7a..ff491cd 100644
--- a/test/hosted/version_negotiation_test.dart
+++ b/test/hosted/version_negotiation_test.dart
@@ -16,11 +16,11 @@
await d.appDir({
'foo': {
- 'hosted': {'name': 'foo', 'url': globalServer.url}
+ 'hosted': {'name': 'foo', 'url': globalPackageServer!.url}
}
}).create();
- globalServer.expect('GET', '/api/packages/foo', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/foo', (request) {
expect(
request.headers['accept'], equals('application/vnd.pub.v2+json'));
return shelf.Response(404);
@@ -35,14 +35,14 @@
await d.appDir({
'foo': {
- 'hosted': {'name': 'foo', 'url': globalServer.url}
+ 'hosted': {'name': 'foo', 'url': globalPackageServer!.url}
}
}).create();
var pub = await startPub(args: [command.name]);
- globalServer.expect(
- 'GET', '/api/packages/foo', (request) => shelf.Response(406));
+ globalPackageServer!
+ .expect('GET', '/api/packages/foo', (request) => shelf.Response(406));
await pub.shouldExit(1);
diff --git a/test/hosted/will_normalize_hosted_url_test.dart b/test/hosted/will_normalize_hosted_url_test.dart
index 6cc3888..38bc574 100644
--- a/test/hosted/will_normalize_hosted_url_test.dart
+++ b/test/hosted/will_normalize_hosted_url_test.dart
@@ -13,50 +13,47 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('does not require slash on bare domain', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- // All the tests in this file assumes that [globalServer.url]
+ await servePackages((b) => b..serve('foo', '1.2.3'));
+ // All the tests in this file assumes that [globalPackageServer.url]
// will be on the form:
// http://localhost:<port>
// In particular, that it doesn't contain anything path segment.
- expect(Uri.parse(globalServer.url).path, isEmpty);
+ expect(Uri.parse(globalPackageServer!.url).path, isEmpty);
await d.dir(appPath, [
d.appPubspec({
'foo': {
- 'hosted': {'name': 'foo', 'url': globalServer.url},
+ 'hosted': {'name': 'foo', 'url': globalPackageServer!.url},
},
}),
]).create();
await pubCommand(
command,
- silent: contains('${globalServer.url}/api/packages/foo'),
+ silent: contains('${globalPackageServer!.url}/api/packages/foo'),
);
});
test('normalizes extra slash', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((b) => b..serve('foo', '1.2.3'));
await d.dir(appPath, [
d.appPubspec({
'foo': {
- 'hosted': {'name': 'foo', 'url': globalServer.url + '/'},
+ 'hosted': {'name': 'foo', 'url': globalPackageServer!.url + '/'},
},
}),
]).create();
await pubCommand(
command,
- silent: contains('${globalServer.url}/api/packages/foo'),
+ silent: contains('${globalPackageServer!.url}/api/packages/foo'),
);
});
test('cannot normalize double slash', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
- globalServer.expect(
+ await servePackages((b) => b..serve('foo', '1.2.3'));
+ globalPackageServer!.expect(
'GET',
'//api/packages/foo',
(request) => Response.notFound(''),
@@ -65,14 +62,15 @@
await d.dir(appPath, [
d.appPubspec({
'foo': {
- 'hosted': {'name': 'foo', 'url': globalServer.url + '//'},
+ 'hosted': {'name': 'foo', 'url': globalPackageServer!.url + '//'},
},
}),
]).create();
await pubCommand(
command,
- error: contains('could not find package foo at ${globalServer.url}//'),
+ error: contains(
+ 'could not find package foo at ${globalPackageServer!.url}//'),
exitCode: exit_codes.UNAVAILABLE,
);
});
@@ -82,31 +80,27 @@
/// This is a bit of a hack, to easily test if hosted pub URLs with a path
/// segment works and if the slashes are normalized.
void _proxyMyFolderToRoot() {
- globalServer.handle(
- RegExp('/my-folder/.*'),
- (r) async {
- if (r.method != 'GET' && r.method != 'HEAD') {
- return Response.forbidden(null);
- }
- final path = r.requestedUri.path.substring('/my-folder/'.length);
- final res = await http.get(
- Uri.parse(globalServer.url + '/$path'),
- );
- return Response(res.statusCode, body: res.bodyBytes, headers: {
- 'Content-Type': res.headers['content-type']!,
- });
- },
- );
+ globalPackageServer!.extraHandlers[RegExp('/my-folder/.*')] = (r) async {
+ if (r.method != 'GET' && r.method != 'HEAD') {
+ return Response.forbidden(null);
+ }
+ final path = r.requestedUri.path.substring('/my-folder/'.length);
+ final res = await http.get(
+ Uri.parse(globalPackageServer!.url + '/$path'),
+ );
+ return Response(res.statusCode, body: res.bodyBytes, headers: {
+ 'content-type': res.headers['content-type']!,
+ });
+ };
}
test('will use normalized url with path', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((b) => b..serve('foo', '1.2.3'));
_proxyMyFolderToRoot();
// testing with a normalized URL
- final testUrl = globalServer.url + '/my-folder/';
- final normalizedUrl = globalServer.url + '/my-folder/';
+ final testUrl = globalPackageServer!.url + '/my-folder/';
+ final normalizedUrl = globalPackageServer!.url + '/my-folder/';
await d.dir(appPath, [
d.appPubspec({
@@ -124,13 +118,12 @@
});
test('will normalize url with path by adding slash', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((b) => b..serve('foo', '1.2.3'));
_proxyMyFolderToRoot();
// Testing with a URL that is missing the slash.
- final testUrl = globalServer.url + '/my-folder';
- final normalizedUrl = globalServer.url + '/my-folder/';
+ final testUrl = globalPackageServer!.url + '/my-folder';
+ final normalizedUrl = globalPackageServer!.url + '/my-folder/';
await d.dir(appPath, [
d.appPubspec({
diff --git a/test/ignore_test.dart b/test/ignore_test.dart
index a8ab8ac..42a189a 100644
--- a/test/ignore_test.dart
+++ b/test/ignore_test.dart
@@ -977,13 +977,6 @@
'folder/a.txt': true,
}),
- TestData('folder/* does not ignore `folder` itself', {
- '.': ['folder/*', '!folder/a.txt'],
- }, {
- 'folder/a.txt': false,
- 'folder/b.txt': true,
- }),
-
// Case sensitivity
TestData(
'simple',
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index 88e4862..0fffb5a 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -19,44 +19,14 @@
test('archives and uploads a package', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
- return shelf.Response.ok(jsonEncode({
- 'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
- }));
- });
-
- expect(pub.stdout, emits(startsWith('Uploading...')));
- expect(pub.stdout, emits('Package test_pkg 1.0.0 uploaded!'));
- await pub.shouldExit(exit_codes.SUCCESS);
- });
-
- test('publishes to hosted-url with path', () async {
- await servePackages();
- await d.tokensFile({
- 'version': 1,
- 'hosted': [
- {'url': globalServer.url + '/sub/folder', 'env': 'TOKEN'},
- ]
- }).create();
- var pub = await startPublish(
- globalServer,
- path: '/sub/folder',
- authMethod: 'token',
- environment: {'TOKEN': 'access token'},
- );
-
- await confirmPublish(pub);
- handleUploadForm(globalServer, path: '/sub/folder');
- handleUpload(globalServer);
-
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
@@ -83,14 +53,14 @@
await d.dir(p.join(appPath, 'empty')).create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
index 0f792d5..e4489e4 100644
--- a/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
+++ b/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
@@ -14,13 +14,13 @@
test("cloud storage upload doesn't redirect", () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
+ handleUploadForm(globalPackageServer!);
- globalServer.expect('POST', '/upload', (request) async {
+ globalPackageServer!.expect('POST', '/upload', (request) async {
await request.read().drain();
return shelf.Response(200);
});
diff --git a/test/lish/cloud_storage_upload_provides_an_error_test.dart b/test/lish/cloud_storage_upload_provides_an_error_test.dart
index 5dec03d..ebb463a 100644
--- a/test/lish/cloud_storage_upload_provides_an_error_test.dart
+++ b/test/lish/cloud_storage_upload_provides_an_error_test.dart
@@ -14,13 +14,13 @@
test('cloud storage upload provides an error', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
+ handleUploadForm(globalPackageServer!);
- globalServer.expect('POST', '/upload', (request) {
+ globalPackageServer!.expect('POST', '/upload', (request) {
return request.read().drain().then((_) {
return shelf.Response.notFound(
'<Error><Message>Your request sucked.</Message></Error>',
diff --git a/test/lish/does_not_include_dot_file.dart b/test/lish/does_not_include_dot_file.dart
index cec8ab0..9f1b24f 100644
--- a/test/lish/does_not_include_dot_file.dart
+++ b/test/lish/does_not_include_dot_file.dart
@@ -30,14 +30,14 @@
test('Check if package doesn\'t include dot-files', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/dot_folder_name_test.dart b/test/lish/dot_folder_name_test.dart
deleted file mode 100644
index 9f64839..0000000
--- a/test/lish/dot_folder_name_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:pub/src/exit_codes.dart' as exit_codes;
-import 'package:test/test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-void main() {
- test('Can publish files in a .folder', () async {
- await d.git(appPath).create();
- await d.validPackage.create();
- await d.dir(appPath, [
- d.dir('.vscode', [d.file('a')]),
- d.file('.pubignore', '!.vscode/')
- ]).create();
-
- await runPub(
- args: ['lish', '--dry-run'],
- output: contains('''
-|-- .vscode
-| '-- a'''),
- exitCode: exit_codes.SUCCESS,
- );
- });
-}
diff --git a/test/lish/force_does_not_publish_if_there_are_errors_test.dart b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
index 481f627..58c12fa 100644
--- a/test/lish/force_does_not_publish_if_there_are_errors_test.dart
+++ b/test/lish/force_does_not_publish_if_there_are_errors_test.dart
@@ -21,7 +21,7 @@
]).create();
await servePackages();
- var pub = await startPublish(globalServer, args: ['--force']);
+ var pub = await startPublish(globalPackageServer!, args: ['--force']);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
index c5d8957..cc05354 100644
--- a/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
+++ b/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
@@ -17,13 +17,13 @@
test('--force publishes if there are no warnings or errors', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer, args: ['--force']);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!, args: ['--force']);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/force_publishes_if_there_are_warnings_test.dart b/test/lish/force_publishes_if_there_are_warnings_test.dart
index 9fb3d53..9797e9c 100644
--- a/test/lish/force_publishes_if_there_are_warnings_test.dart
+++ b/test/lish/force_publishes_if_there_are_warnings_test.dart
@@ -22,13 +22,13 @@
await d.dir(appPath, [d.pubspec(pkg)]).create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer, args: ['--force']);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!, args: ['--force']);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/many_files_test.dart b/test/lish/many_files_test.dart
index 36f4ed7..dfe13f3 100644
--- a/test/lish/many_files_test.dart
+++ b/test/lish/many_files_test.dart
@@ -73,14 +73,14 @@
}
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/package_creation_provides_a_malformed_error_test.dart b/test/lish/package_creation_provides_a_malformed_error_test.dart
index 7ab0bcd..1587165 100644
--- a/test/lish/package_creation_provides_a_malformed_error_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_error_test.dart
@@ -16,15 +16,15 @@
test('package creation provides a malformed error', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
var body = {'error': 'Your package was too boring.'};
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.notFound(jsonEncode(body));
});
diff --git a/test/lish/package_creation_provides_a_malformed_success_test.dart b/test/lish/package_creation_provides_a_malformed_success_test.dart
index 089d09e..b47461f 100644
--- a/test/lish/package_creation_provides_a_malformed_success_test.dart
+++ b/test/lish/package_creation_provides_a_malformed_success_test.dart
@@ -16,15 +16,15 @@
test('package creation provides a malformed success', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
var body = {'success': 'Your package was awesome.'};
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode(body));
});
diff --git a/test/lish/package_creation_provides_an_error_test.dart b/test/lish/package_creation_provides_an_error_test.dart
index f5ff128..a0c7153 100644
--- a/test/lish/package_creation_provides_an_error_test.dart
+++ b/test/lish/package_creation_provides_an_error_test.dart
@@ -16,14 +16,14 @@
test('package creation provides an error', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.notFound(jsonEncode({
'error': {'message': 'Your package was too boring.'}
}));
diff --git a/test/lish/package_creation_provides_invalid_json_test.dart b/test/lish/package_creation_provides_invalid_json_test.dart
index 2cd6212..025d8f9 100644
--- a/test/lish/package_creation_provides_invalid_json_test.dart
+++ b/test/lish/package_creation_provides_invalid_json_test.dart
@@ -14,14 +14,14 @@
test('package creation provides invalid JSON', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok('{not json');
});
diff --git a/test/lish/package_validation_has_a_warning_and_continues_test.dart b/test/lish/package_validation_has_a_warning_and_continues_test.dart
index c39dbc4..15e9185 100644
--- a/test/lish/package_validation_has_a_warning_and_continues_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_continues_test.dart
@@ -22,13 +22,13 @@
await d.dir(appPath, [d.pubspec(pkg)]).create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
pub.stdin.writeln('y');
- handleUploadForm(globalServer);
- handleUpload(globalServer);
+ handleUploadForm(globalPackageServer!);
+ handleUpload(globalPackageServer!);
- globalServer.expect('GET', '/create', (request) {
+ globalPackageServer!.expect('GET', '/create', (request) {
return shelf.Response.ok(jsonEncode({
'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
}));
diff --git a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
index 0d5a563..c478b05 100644
--- a/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
+++ b/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart
@@ -18,7 +18,7 @@
await d.dir(appPath, [d.pubspec(pkg)]).create();
await servePackages();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
pub.stdin.writeln('n');
await pub.shouldExit(exit_codes.DATA);
diff --git a/test/lish/package_validation_has_an_error_test.dart b/test/lish/package_validation_has_an_error_test.dart
index 14c83c0..df747c6 100644
--- a/test/lish/package_validation_has_an_error_test.dart
+++ b/test/lish/package_validation_has_an_error_test.dart
@@ -21,7 +21,7 @@
]).create();
await servePackages();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/preview_package_validation_has_a_warning_test.dart b/test/lish/preview_package_validation_has_a_warning_test.dart
index 69f59af..bbb3967 100644
--- a/test/lish/preview_package_validation_has_a_warning_test.dart
+++ b/test/lish/preview_package_validation_has_a_warning_test.dart
@@ -19,7 +19,7 @@
await d.dir(appPath, [d.pubspec(pkg)]).create();
await servePackages();
- var pub = await startPublish(globalServer, args: ['--dry-run']);
+ var pub = await startPublish(globalPackageServer!, args: ['--dry-run']);
await pub.shouldExit(exit_codes.DATA);
expect(
diff --git a/test/lish/preview_package_validation_has_no_warnings_test.dart b/test/lish/preview_package_validation_has_no_warnings_test.dart
index 179c648..a1bffaf 100644
--- a/test/lish/preview_package_validation_has_no_warnings_test.dart
+++ b/test/lish/preview_package_validation_has_no_warnings_test.dart
@@ -17,8 +17,8 @@
packageMap('test_pkg', '1.0.0', null, null, {'sdk': '>=1.8.0 <2.0.0'});
await d.dir(appPath, [d.pubspec(pkg)]).create();
- await servePackages();
- var pub = await startPublish(globalServer, args: ['--dry-run']);
+ await servePackages((_) {});
+ var pub = await startPublish(globalPackageServer!, args: ['--dry-run']);
await pub.shouldExit(exit_codes.SUCCESS);
expect(pub.stderr, emitsThrough('Package has 0 warnings.'));
diff --git a/test/lish/server_arg_overrides_publish_to_url_test.dart b/test/lish/server_arg_overrides_publish_to_url_test.dart
index 1597146..b2d4c14 100644
--- a/test/lish/server_arg_overrides_publish_to_url_test.dart
+++ b/test/lish/server_arg_overrides_publish_to_url_test.dart
@@ -13,15 +13,16 @@
test('an explicit --server argument overrides a "publish_to" url', () async {
// Create a real server that can reject requests because validators will
// try to ping it, and will use multiple retries when doing so.
- final packageServer = await startPackageServer();
+ final packageServer = await DescriptorServer.start();
+ final fakePackageServer = 'http://localhost:${packageServer.port}';
var pkg = packageMap('test_pkg', '1.0.0');
pkg['publish_to'] = 'http://pubspec.com';
await d.dir(appPath, [d.pubspec(pkg)]).create();
await runPub(
- args: ['lish', '--dry-run', '--server', packageServer.url],
- output: contains(packageServer.url),
+ args: ['lish', '--dry-run', '--server', fakePackageServer],
+ output: contains(fakePackageServer),
exitCode: exit_codes.DATA);
await packageServer.close();
diff --git a/test/lish/upload_form_fields_has_a_non_string_value_test.dart b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
index 78a54fa..3be8f4c 100644
--- a/test/lish/upload_form_fields_has_a_non_string_value_test.dart
+++ b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
@@ -14,9 +14,9 @@
setUp(d.validPackage.create);
test('upload form fields has a non-string value', () async {
- await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await servePackages((_) {});
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
@@ -24,7 +24,7 @@
'url': 'http://example.com/upload',
'fields': {'field': 12}
};
- handleUploadForm(globalServer, body: body);
+ handleUploadForm(globalPackageServer!, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_fields_is_not_a_map_test.dart b/test/lish/upload_form_fields_is_not_a_map_test.dart
index d18c1ee..53f36da 100644
--- a/test/lish/upload_form_fields_is_not_a_map_test.dart
+++ b/test/lish/upload_form_fields_is_not_a_map_test.dart
@@ -15,13 +15,13 @@
test('upload form fields is not a map', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
var body = {'url': 'http://example.com/upload', 'fields': 12};
- handleUploadForm(globalServer, body: body);
+ handleUploadForm(globalPackageServer!, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_fields_test.dart b/test/lish/upload_form_is_missing_fields_test.dart
index b0032f8..27036f6 100644
--- a/test/lish/upload_form_is_missing_fields_test.dart
+++ b/test/lish/upload_form_is_missing_fields_test.dart
@@ -15,13 +15,13 @@
test('upload form is missing fields', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
var body = {'url': 'http://example.com/upload'};
- handleUploadForm(globalServer, body: body);
+ handleUploadForm(globalPackageServer!, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_url_test.dart b/test/lish/upload_form_is_missing_url_test.dart
index eae43ea..f9f6e8b 100644
--- a/test/lish/upload_form_is_missing_url_test.dart
+++ b/test/lish/upload_form_is_missing_url_test.dart
@@ -15,8 +15,8 @@
test('upload form is missing url', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
@@ -24,7 +24,7 @@
'fields': {'field1': 'value1', 'field2': 'value2'}
};
- handleUploadForm(globalServer, body: body);
+ handleUploadForm(globalPackageServer!, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/upload_form_provides_an_error_test.dart b/test/lish/upload_form_provides_an_error_test.dart
index 35932b8..1d9b0c5 100644
--- a/test/lish/upload_form_provides_an_error_test.dart
+++ b/test/lish/upload_form_provides_an_error_test.dart
@@ -14,13 +14,15 @@
setUp(d.validPackage.create);
test('upload form provides an error', () async {
- await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await servePackages((_) {});
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- globalServer.expect('GET', '/api/packages/versions/new', (request) async {
+ globalPackageServer!.extraHandlers['/api/packages/versions/new'] =
+ expectAsync1((request) {
+ expect(request.method, 'GET');
return shelf.Response.notFound(jsonEncode({
'error': {'message': 'your request sucked'}
}));
diff --git a/test/lish/upload_form_provides_invalid_json_test.dart b/test/lish/upload_form_provides_invalid_json_test.dart
index a046755..c0996f9 100644
--- a/test/lish/upload_form_provides_invalid_json_test.dart
+++ b/test/lish/upload_form_provides_invalid_json_test.dart
@@ -13,12 +13,12 @@
test('upload form provides invalid JSON', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- globalServer.expect('GET', '/api/packages/versions/new',
+ globalPackageServer!.expect('GET', '/api/packages/versions/new',
(request) => shelf.Response.ok('{not json'));
expect(
diff --git a/test/lish/upload_form_url_is_not_a_string_test.dart b/test/lish/upload_form_url_is_not_a_string_test.dart
index f69fd1f..a999537 100644
--- a/test/lish/upload_form_url_is_not_a_string_test.dart
+++ b/test/lish/upload_form_url_is_not_a_string_test.dart
@@ -15,8 +15,8 @@
test('upload form url is not a string', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
@@ -25,7 +25,7 @@
'fields': {'field1': 'value1', 'field2': 'value2'}
};
- handleUploadForm(globalServer, body: body);
+ handleUploadForm(globalPackageServer!, body);
expect(pub.stderr, emits('Invalid server response:'));
expect(pub.stderr, emits(jsonEncode(body)));
await pub.shouldExit(1);
diff --git a/test/lish/utils.dart b/test/lish/utils.dart
index f134e4a..8e1ed5f 100644
--- a/test/lish/utils.dart
+++ b/test/lish/utils.dart
@@ -9,8 +9,8 @@
import '../test_pub.dart';
-void handleUploadForm(PackageServer server, {Map? body, String path = ''}) {
- server.expect('GET', '$path/api/packages/versions/new', (request) {
+void handleUploadForm(PackageServer server, [Map? body]) {
+ server.expect('GET', '/api/packages/versions/new', (request) {
expect(
request.headers, containsPair('authorization', 'Bearer access token'));
diff --git a/test/list_package_dirs/lists_dependency_directories_test.dart b/test/list_package_dirs/lists_dependency_directories_test.dart
index 2cd9664..af019a6 100644
--- a/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -12,8 +12,7 @@
void main() {
test('prints the local paths to all packages in the lockfile', () async {
- final server = await servePackages()
- ..serve('bar', '1.0.0');
+ await servePackages((builder) => builder.serve('bar', '1.0.0'));
await d
.dir('foo', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
@@ -38,7 +37,7 @@
'packages': {
'foo': path.join(d.sandbox, 'foo', 'lib'),
'bar': path.join(d.sandbox, cachePath, 'hosted',
- 'localhost%58${server.port}', 'bar-1.0.0', 'lib'),
+ 'localhost%58${globalServer!.port}', 'bar-1.0.0', 'lib'),
'myapp': canonicalize(path.join(d.sandbox, appPath, 'lib'))
},
'input_files': [
diff --git a/test/must_pub_get_test.dart b/test/must_pub_get_test.dart
index 71d9c16..3451fc7 100644
--- a/test/must_pub_get_test.dart
+++ b/test/must_pub_get_test.dart
@@ -14,14 +14,12 @@
import 'descriptor.dart' as d;
import 'test_pub.dart';
-late PackageServer server;
-
void main() {
setUp(() async {
- server = await servePackages();
-
- server.serve('foo', '1.0.0');
- server.serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ });
await d.dir(appPath, [
d.appPubspec(),
@@ -213,7 +211,7 @@
d.appPubspec({'foo': '1.0.0'})
]).create();
- await pubGet(args: ['--legacy-packages-file']);
+ await pubGet();
deleteEntry(p.join(d.sandbox, cachePath));
@@ -235,7 +233,7 @@
})
]).create();
- await pubGet(args: ['--legacy-packages-file']);
+ await pubGet();
await createPackagesFile(appPath);
@@ -257,7 +255,7 @@
})
]).create();
- await pubGet(args: ['--legacy-packages-file']);
+ await pubGet();
await d.dir(appPath, [
d.file('.packages', '''
@@ -284,7 +282,7 @@
})
]).create();
- await pubGet(args: ['--legacy-packages-file']);
+ await pubGet();
await createPackagesFile(appPath, dependenciesInSandBox: ['foo']);
@@ -334,8 +332,10 @@
setUp(() async {
// Avoid using a path dependency because it triggers the full validation
// logic. We want to be sure SDK-validation works without that logic.
- server.serve('foo', '3.0.0', pubspec: {
- 'environment': {'sdk': '>=1.0.0 <2.0.0'}
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '3.0.0', pubspec: {
+ 'environment': {'sdk': '>=1.0.0 <2.0.0'}
+ });
});
await d.dir(appPath, [
@@ -360,8 +360,10 @@
'current Flutter SDK', () async {
// Avoid using a path dependency because it triggers the full validation
// logic. We want to be sure SDK-validation works without that logic.
- server.serve('foo', '3.0.0', pubspec: {
- 'environment': {'flutter': '>=1.0.0 <2.0.0'}
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '3.0.0', pubspec: {
+ 'environment': {'flutter': '>=1.0.0 <2.0.0'}
+ });
});
await d.dir('flutter', [d.file('version', '1.2.3')]).create();
@@ -452,7 +454,7 @@
group("doesn't require the user to run pub get first if", () {
group(
'the pubspec is older than the lockfile which is older than the '
- 'package-config, even if the contents are wrong', () {
+ 'packages file, even if the contents are wrong', () {
setUp(() async {
await d.dir(appPath, [
d.appPubspec({'foo': '1.0.0'})
@@ -461,6 +463,7 @@
await _touch('pubspec.yaml');
await _touch('pubspec.lock');
+ await _touch('.packages');
await _touch('.dart_tool/package_config.json');
});
@@ -519,8 +522,10 @@
group("an overridden dependency's SDK constraint is unmatched", () {
setUp(() async {
- server.serve('bar', '1.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0-fake'}
+ globalPackageServer!.add((builder) {
+ builder.serve('bar', '1.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0-fake'}
+ });
});
await d.dir(appPath, [
@@ -542,8 +547,10 @@
() async {
// Avoid using a path dependency because it triggers the full validation
// logic. We want to be sure SDK-validation works without that logic.
- server.serve('foo', '3.0.0', pubspec: {
- 'environment': {'flutter': '>=1.0.0 <2.0.0'}
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '3.0.0', pubspec: {
+ 'environment': {'flutter': '>=1.0.0 <2.0.0'}
+ });
});
await d.dir('flutter', [d.file('version', '1.2.3')]).create();
@@ -599,11 +606,14 @@
File(p.join(d.sandbox, 'myapp/pubspec.yaml')).lastModifiedSync();
var lockFileModified =
File(p.join(d.sandbox, 'myapp/pubspec.lock')).lastModifiedSync();
+ var packagesModified =
+ File(p.join(d.sandbox, 'myapp/.packages')).lastModifiedSync();
var packageConfigModified =
File(p.join(d.sandbox, 'myapp/.dart_tool/package_config.json'))
.lastModifiedSync();
expect(!pubspecModified.isAfter(lockFileModified), isTrue);
+ expect(!lockFileModified.isAfter(packagesModified), isTrue);
expect(!lockFileModified.isAfter(packageConfigModified), isTrue);
});
}
diff --git a/test/oauth2/logout_test.dart b/test/oauth2/logout_test.dart
index a12a652..7398884 100644
--- a/test/oauth2/logout_test.dart
+++ b/test/oauth2/logout_test.dart
@@ -11,7 +11,7 @@
test('with an existing credentials file, deletes it.', () async {
await servePackages();
await d
- .credentialsFile(globalServer, 'access token',
+ .credentialsFile(globalPackageServer!, 'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().add(Duration(hours: 1)))
.create();
@@ -28,7 +28,7 @@
await servePackages();
await d
.credentialsFile(
- globalServer,
+ globalPackageServer!,
'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().add(Duration(hours: 1)),
@@ -37,7 +37,7 @@
await d
.legacyCredentialsFile(
- globalServer,
+ globalPackageServer!,
'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().add(Duration(hours: 1)),
diff --git a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index 75b47ab..79d89a7 100644
--- a/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -19,11 +19,11 @@
await d.dir(
configPath, [d.file('pub-credentials.json', '{bad json')]).create();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- await authorizePub(pub, globalServer, 'new access token');
+ await authorizePub(pub, globalPackageServer!, 'new access token');
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -34,6 +34,8 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(globalServer, 'new access token').validate();
+ await d
+ .credentialsFile(globalPackageServer!, 'new access token')
+ .validate();
});
}
diff --git a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index 3c22994..0ecd305 100644
--- a/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -12,8 +12,8 @@
await d.validPackage.create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
diff --git a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index 624f427..63a91d4 100644
--- a/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -21,14 +21,14 @@
await servePackages();
await d
- .credentialsFile(globalServer, 'access token',
+ .credentialsFile(globalPackageServer!, 'access token',
refreshToken: 'bad refresh token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
- globalServer.expect('POST', '/token', (request) {
+ globalPackageServer!.expect('POST', '/token', (request) {
return request.read().drain().then((_) {
return shelf.Response(400,
body: jsonEncode({'error': 'invalid_request'}),
@@ -39,10 +39,11 @@
await confirmPublish(pub);
await expectLater(pub.stdout, emits(startsWith('Uploading...')));
- await authorizePub(pub, globalServer, 'new access token');
+ await authorizePub(pub, globalPackageServer!, 'new access token');
var done = Completer();
- globalServer.expect('GET', '/api/packages/versions/new', (request) async {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new',
+ (request) async {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
diff --git a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index 7fbbb9f..3d303a5 100644
--- a/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -18,15 +18,15 @@
await servePackages();
await d
- .credentialsFile(globalServer, 'access token',
+ .credentialsFile(globalPackageServer!, 'access token',
refreshToken: 'refresh token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- globalServer.expect('POST', '/token', (request) {
+ globalPackageServer!.expect('POST', '/token', (request) {
return request.readAsString().then((body) {
expect(
body, matches(RegExp(r'(^|&)refresh_token=refresh\+token(&|$)')));
@@ -38,7 +38,7 @@
});
});
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -48,7 +48,7 @@
await pub.shouldExit();
await d
- .credentialsFile(globalServer, 'new access token',
+ .credentialsFile(globalPackageServer!, 'new access token',
refreshToken: 'refresh token')
.validate();
});
diff --git a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index 803c529..dbb4280 100644
--- a/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -17,20 +17,20 @@
await servePackages();
await d
- .credentialsFile(globalServer, 'access token',
+ .credentialsFile(globalPackageServer!, 'access token',
expiration: DateTime.now().subtract(Duration(hours: 1)))
.create();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
await expectLater(
pub.stderr,
emits("Pub's authorization to upload packages has expired and "
"can't be automatically refreshed."));
- await authorizePub(pub, globalServer, 'new access token');
+ await authorizePub(pub, globalPackageServer!, 'new access token');
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer new access token'));
@@ -41,6 +41,8 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(globalServer, 'new access token').validate();
+ await d
+ .credentialsFile(globalPackageServer!, 'new access token')
+ .validate();
});
}
diff --git a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index 961a465..fe7bc1b 100644
--- a/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -16,11 +16,11 @@
await d.validPackage.create();
await servePackages();
- var pub = await startPublish(globalServer);
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- await authorizePub(pub, globalServer);
+ await authorizePub(pub, globalPackageServer!);
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
expect(request.headers,
containsPair('authorization', 'Bearer access token'));
@@ -31,6 +31,6 @@
// do so rather than killing it so it'll write out the credentials file.
await pub.shouldExit(1);
- await d.credentialsFile(globalServer, 'access token').validate();
+ await d.credentialsFile(globalPackageServer!, 'access token').validate();
});
}
diff --git a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index 2e3b62f..433a9ed 100644
--- a/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -16,12 +16,12 @@
'credentials.json', () async {
await d.validPackage.create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPublish(globalServer);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPublish(globalPackageServer!);
await confirmPublish(pub);
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
return shelf.Response(401,
body: jsonEncode({
'error': {'message': 'your token sucks'}
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index 31113c7..f2dee0c 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -45,10 +45,10 @@
testWithGolden('no lockfile', (ctx) async {
await d.appDir({'foo': '^1.0.0', 'bar': '^1.0.0'}).create();
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.2.3')
..serve('bar', '1.2.3')
- ..serve('bar', '2.0.0');
+ ..serve('bar', '2.0.0'));
await ctx.runOutdatedTests();
});
@@ -61,8 +61,7 @@
});
testWithGolden('newer versions available', (ctx) async {
- final builder = await servePackages();
- builder
+ await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
..serve('bar', '1.0.0')
..serve('builder', '1.2.3', deps: {
@@ -70,7 +69,7 @@
'dev_trans': '^1.0.0',
})
..serve('transitive', '1.2.3')
- ..serve('dev_trans', '1.0.0');
+ ..serve('dev_trans', '1.0.0'));
await d.dir('local_package', [
d.libDir('local_package'),
@@ -89,7 +88,7 @@
})
]).create();
await pubGet();
- builder
+ globalPackageServer!.add((builder) => builder
..serve('foo', '1.3.0', deps: {'transitive': '>=1.0.0<3.0.0'})
..serve('foo', '2.0.0',
deps: {'transitive': '>=1.0.0<3.0.0', 'transitive2': '^1.0.0'})
@@ -105,13 +104,15 @@
..serve('transitive', '2.0.0')
..serve('transitive2', '1.0.0')
..serve('transitive3', '1.0.0')
- ..serve('dev_trans', '2.0.0');
+ ..serve('dev_trans', '2.0.0'));
+
await ctx.runOutdatedTests();
});
testWithGolden('circular dependency on root', (ctx) async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', deps: {'app': '^1.0.0'});
+ await servePackages(
+ (builder) => builder..serve('foo', '1.2.3', deps: {'app': '^1.0.0'}),
+ );
await d.dir(appPath, [
d.pubspec({
@@ -125,7 +126,10 @@
await pubGet();
- server.serve('foo', '1.3.0', deps: {'app': '^1.0.1'});
+ globalPackageServer!.add(
+ (builder) => builder..serve('foo', '1.3.0', deps: {'app': '^1.0.1'}),
+ );
+
await ctx.runOutdatedTests();
});
@@ -141,11 +145,11 @@
})
]).create();
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
- ..serve('bar', '2.0.0', deps: {'foo': '^1.0.0'});
+ ..serve('bar', '2.0.0', deps: {'foo': '^1.0.0'}));
await pubGet();
await ctx.runOutdatedTests();
@@ -168,60 +172,62 @@
}),
]).create();
- await servePackages()
- ..serve('foo', '1.0.0', deps: {
- 'bar': '^1.0.0'
- }, pubspec: {
- 'environment': {'sdk': '>=2.9.0 < 3.0.0'}
- })
- ..serve('bar', '1.0.0', pubspec: {
- 'environment': {'sdk': '>=2.9.0 < 3.0.0'}
- })
- ..serve('foo', '2.0.0-nullsafety.0', deps: {
- 'bar': '^2.0.0'
- }, pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'}
- })
- ..serve('foo', '2.0.0', deps: {
- 'bar': '^1.0.0'
- }, pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'}
- })
- ..serve('bar', '2.0.0', pubspec: {
- 'environment': {'sdk': '>=2.13.0 < 3.0.0'}
- })
- ..serve('file_opts_out', '1.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- }, contents: [
- d.dir('lib', [d.file('main.dart', '// @dart = 2.9\n')])
- ])
- ..serve('file_opts_out', '2.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- })
- ..serve('fails_analysis', '1.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- }, contents: [
- d.dir('lib', [d.file('main.dart', 'syntax error\n')])
- ])
- ..serve('fails_analysis', '2.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- })
- ..serve('file_in_dependency_opts_out', '1.0.0', deps: {
- 'file_opts_out': '^1.0.0'
- }, pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- })
- ..serve('file_in_dependency_opts_out', '2.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- })
- ..serve('fails_analysis_in_dependency', '1.0.0', deps: {
- 'fails_analysis': '^1.0.0'
- }, pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- })
- ..serve('fails_analysis_in_dependency', '2.0.0', pubspec: {
- 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
- });
+ await servePackages(
+ (builder) => builder
+ ..serve('foo', '1.0.0', deps: {
+ 'bar': '^1.0.0'
+ }, pubspec: {
+ 'environment': {'sdk': '>=2.9.0 < 3.0.0'}
+ })
+ ..serve('bar', '1.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.9.0 < 3.0.0'}
+ })
+ ..serve('foo', '2.0.0-nullsafety.0', deps: {
+ 'bar': '^2.0.0'
+ }, pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'}
+ })
+ ..serve('foo', '2.0.0', deps: {
+ 'bar': '^1.0.0'
+ }, pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'}
+ })
+ ..serve('bar', '2.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.13.0 < 3.0.0'}
+ })
+ ..serve('file_opts_out', '1.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ }, contents: [
+ d.dir('lib', [d.file('main.dart', '// @dart = 2.9\n')])
+ ])
+ ..serve('file_opts_out', '2.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ })
+ ..serve('fails_analysis', '1.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ }, contents: [
+ d.dir('lib', [d.file('main.dart', 'syntax error\n')])
+ ])
+ ..serve('fails_analysis', '2.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ })
+ ..serve('file_in_dependency_opts_out', '1.0.0', deps: {
+ 'file_opts_out': '^1.0.0'
+ }, pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ })
+ ..serve('file_in_dependency_opts_out', '2.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ })
+ ..serve('fails_analysis_in_dependency', '1.0.0', deps: {
+ 'fails_analysis': '^1.0.0'
+ }, pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ })
+ ..serve('fails_analysis_in_dependency', '2.0.0', pubspec: {
+ 'environment': {'sdk': '>=2.12.0 < 3.0.0'},
+ }),
+ );
await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.13.0'});
await ctx.runOutdatedTests(environment: {
@@ -230,7 +236,7 @@
});
testWithGolden('null-safety no resolution', (ctx) async {
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0 < 3.0.0'}
})
@@ -246,7 +252,7 @@
'foo': '^1.0.0'
}, pubspec: {
'environment': {'sdk': '>=2.12.0 < 3.0.0'}
- });
+ }));
await d.dir(appPath, [
d.pubspec({
@@ -268,7 +274,7 @@
});
testWithGolden('null-safety already migrated', (ctx) async {
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0 < 3.0.0'}
})
@@ -285,7 +291,7 @@
})
..serve('devTransitive', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0 < 3.0.0'}
- });
+ }));
await d.dir(appPath, [
d.pubspec({
@@ -310,13 +316,15 @@
testWithGolden('overridden dependencies', (ctx) async {
ensureGit();
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0')
- ..serve('baz', '1.0.0')
- ..serve('baz', '2.0.0');
+ await servePackages(
+ (builder) => builder
+ ..serve('foo', '1.0.0')
+ ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+ ..serve('bar', '1.0.0')
+ ..serve('bar', '2.0.0')
+ ..serve('baz', '1.0.0')
+ ..serve('baz', '2.0.0'),
+ );
await d.git('foo.git', [
d.libPubspec('foo', '1.0.1'),
@@ -352,11 +360,13 @@
testWithGolden('overridden dependencies - no resolution', (ctx) async {
ensureGit();
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
- ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
- ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
- ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'});
+ await servePackages(
+ (builder) => builder
+ ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
+ ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+ ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
+ ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}),
+ );
await d.dir(appPath, [
d.pubspec({
@@ -381,7 +391,7 @@
testWithGolden(
'latest version reported while locked on a prerelease can be a prerelease',
(ctx) async {
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '0.9.0')
..serve('foo', '1.0.0-dev.1')
..serve('foo', '1.0.0-dev.2')
@@ -390,7 +400,7 @@
..serve('bar', '1.0.0-dev.2')
..serve('mop', '0.10.0-dev')
..serve('mop', '0.10.0')
- ..serve('mop', '1.0.0-dev');
+ ..serve('mop', '1.0.0-dev'));
await d.dir(appPath, [
d.pubspec({
'name': 'app',
@@ -409,7 +419,7 @@
});
testWithGolden('Handles SDK dependencies', (ctx) async {
- await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.10.0 <3.0.0'}
})
@@ -418,7 +428,7 @@
})
..serve('foo', '2.0.0', pubspec: {
'environment': {'sdk': '>=2.12.0 <3.0.0'}
- });
+ }));
await d.dir('flutter-root', [
d.file('version', '1.2.3'),
diff --git a/test/package_config_file_test.dart b/test/package_config_file_test.dart
index 763ce42..82882ae 100644
--- a/test/package_config_file_test.dart
+++ b/test/package_config_file_test.dart
@@ -12,12 +12,13 @@
void main() {
forBothPubGetAndUpgrade((command) {
test('package_config.json file is created', () async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
- ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
- ..serve('baz', '2.2.2',
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
+ builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
+ builder.serve('baz', '2.2.2',
deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': '1.2.3'}),
@@ -53,12 +54,13 @@
});
test('package_config.json file is overwritten', () async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
- ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
- ..serve('baz', '2.2.2',
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
+ builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
+ builder.serve('baz', '2.2.2',
deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': '1.2.3'}),
@@ -115,8 +117,6 @@
args: ['--offline'], error: equalsIgnoringWhitespace("""
Because myapp depends on foo any which doesn't exist (could not find
package foo in cache), version solving failed.
-
- Try again without --offline!
"""), exitCode: exit_codes.UNAVAILABLE);
await d.dir(appPath, [
@@ -127,10 +127,11 @@
test(
'.dart_tool/package_config.json file has relative path to path dependency',
() async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': 'any'}, contents: [d.dir('lib', [])])
- ..serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': 'any'}, contents: [d.dir('lib', [])]);
+ builder.serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
+ });
await d.dir('local_baz', [
d.libDir('baz', 'baz 3.2.1'),
@@ -177,17 +178,18 @@
});
test('package_config.json has language version', () async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '1.2.3',
- pubspec: {
- 'environment': {
- 'sdk': '>=0.0.1 <=0.2.2+2', // tests runs with '0.1.2+3'
+ await servePackages((builder) {
+ builder.serve(
+ 'foo',
+ '1.2.3',
+ pubspec: {
+ 'environment': {
+ 'sdk': '>=0.0.1 <=0.2.2+2', // tests runs with '0.1.2+3'
+ },
},
- },
- contents: [d.dir('lib', [])],
- );
+ contents: [d.dir('lib', [])],
+ );
+ });
await d.dir(appPath, [
d.pubspec({
@@ -221,17 +223,18 @@
});
test('package_config.json has 2.7 default language version', () async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '1.2.3',
- pubspec: {
- 'environment': {
- 'sdk': 'any',
+ await servePackages((builder) {
+ builder.serve(
+ 'foo',
+ '1.2.3',
+ pubspec: {
+ 'environment': {
+ 'sdk': 'any',
+ },
},
- },
- contents: [d.dir('lib', [])],
- );
+ contents: [d.dir('lib', [])],
+ );
+ });
await d.dir(appPath, [
d.pubspec({
diff --git a/test/package_server.dart b/test/package_server.dart
index 952c189..12b542a 100644
--- a/test/package_server.dart
+++ b/test/package_server.dart
@@ -4,156 +4,160 @@
import 'dart:async';
import 'dart:convert';
-import 'dart:io';
import 'package:path/path.dart' as p;
-import 'package:pub/src/third_party/tar/tar.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:test/test.dart';
import 'package:test/test.dart' as test show expect;
import 'descriptor.dart' as d;
import 'test_pub.dart';
+/// The current global [PackageServer].
+PackageServer? get globalPackageServer => _globalPackageServer;
+PackageServer? _globalPackageServer;
+
+/// Creates an HTTP server that replicates the structure of pub.dartlang.org and
+/// makes it the current [globalServer].
+///
+/// Calls [callback] with a [PackageServerBuilder] that's used to specify
+/// which packages to serve.
+Future servePackages([void Function(PackageServerBuilder)? callback]) async {
+ _globalPackageServer = await PackageServer.start(callback ?? (_) {});
+ globalServer = _globalPackageServer!._inner;
+
+ addTearDown(() {
+ _globalPackageServer = null;
+ });
+}
+
+/// Like [servePackages], but instead creates an empty server with no packages
+/// registered.
+///
+/// This will always replace a previous server.
+Future serveNoPackages() => servePackages((_) {});
+
+/// Sets up the global package server to report an error on any request.
+///
+/// If no server has been set up, an empty server will be started.
+Future serveErrors() async {
+ var packageServer = globalPackageServer;
+ if (packageServer == null) {
+ await serveNoPackages();
+ } else {
+ packageServer.serveErrors();
+ }
+}
+
class PackageServer {
/// The inner [DescriptorServer] that this uses to serve its descriptors.
- final shelf.Server _inner;
+ final DescriptorServer _inner;
- /// Handlers of requests. Last matching handler will be used.
- final List<_PatternAndHandler> _handlers = [];
+ /// The [d.DirectoryDescriptor] describing the server layout of
+ /// `/api/packages` on the test server.
+ ///
+ /// This contains metadata for packages that are being served via
+ /// [servePackages].
+ final _servedApiPackageDir = d.dir('packages', []);
- // A list of all the requests recieved up till now.
- final List<String> requestedPaths = <String>[];
+ /// The [d.DirectoryDescriptor] describing the server layout of `/packages` on
+ /// the test server.
+ ///
+ /// This contains the tarballs for packages that are being served via
+ /// [servePackages].
+ final _servedPackageDir = d.dir('packages', []);
- PackageServer._(this._inner) {
- _inner.mount((request) {
- final path = request.url.path;
- requestedPaths.add(path);
+ /// The current [PackageServerBuilder] that a user uses to specify which
+ /// package to serve.
+ ///
+ /// This is preserved so that additional packages can be added.
+ late final PackageServerBuilder _builder;
- final pathWithInitialSlash = '/$path';
- for (final entry in _handlers.reversed) {
- final match = entry.pattern.matchAsPrefix(pathWithInitialSlash);
- if (match != null && match.end == pathWithInitialSlash.length) {
- final a = entry.handler(request);
- return a;
- }
- }
- return shelf.Response.notFound('Could not find ${request.url}');
- });
- }
+ /// The port used for the server.
+ int get port => _inner.port;
- static final _versionInfoPattern = RegExp(r'/api/packages/([a-zA-Z_0-9]*)');
- static final _downloadPattern =
- RegExp(r'/packages/([^/]*)/versions/([^/]*).tar.gz');
+ /// The URL for the server.
+ String get url => 'http://localhost:$port';
- static Future<PackageServer> start() async {
- final server =
- PackageServer._(await shelf_io.IOServer.bind('localhost', 0));
- server.handle(
- _versionInfoPattern,
- (shelf.Request request) {
- final parts = request.url.pathSegments;
- assert(parts[0] == 'api');
- assert(parts[1] == 'packages');
- final name = parts[2];
+ /// Handlers for requests not easily described as packages.
+ Map<Pattern, shelf.Handler> get extraHandlers => _inner.extraHandlers;
- final package = server._packages[name];
- if (package == null) {
- return shelf.Response.notFound('No package named $name');
- }
- return shelf.Response.ok(jsonEncode({
- 'name': name,
- 'uploaders': ['nweiz@google.com'],
- 'versions': package.versions.values
- .map((version) => packageVersionApiMap(
- server._inner.url.toString(),
- version.pubspec,
- retracted: version.isRetracted,
- ))
- .toList(),
- if (package.isDiscontinued) 'isDiscontinued': true,
- if (package.discontinuedReplacementText != null)
- 'replacedBy': package.discontinuedReplacementText,
- }));
- },
- );
+ /// From now on report errors on any request.
+ void serveErrors() => extraHandlers
+ ..clear()
+ ..[RegExp('.*')] = (request) {
+ fail('The HTTP server received an unexpected request:\n'
+ '${request.method} ${request.requestedUri}');
+ };
- server.handle(
- _downloadPattern,
- (shelf.Request request) {
- final parts = request.url.pathSegments;
- assert(parts[0] == 'packages');
- final name = parts[1];
- assert(parts[2] == 'versions');
- final package = server._packages[name];
- if (package == null) {
- return shelf.Response.notFound('No package $name');
- }
-
- final version = Version.parse(
- parts[3].substring(0, parts[3].length - '.tar.gz'.length));
- assert(parts[3].endsWith('.tar.gz'));
-
- for (final packageVersion in package.versions.values) {
- if (packageVersion.version == version) {
- return shelf.Response.ok(packageVersion.contents());
- }
- }
- return shelf.Response.notFound('No version $version of $name');
- },
- );
+ /// Creates an HTTP server that replicates the structure of pub.dartlang.org.
+ ///
+ /// Calls [callback] with a [PackageServerBuilder] that's used to specify
+ /// which packages to serve.
+ static Future<PackageServer> start(
+ void Function(PackageServerBuilder) callback) async {
+ var descriptorServer = await DescriptorServer.start();
+ var server = PackageServer._(descriptorServer);
+ descriptorServer.contents
+ ..add(d.dir('api', [server._servedApiPackageDir]))
+ ..add(server._servedPackageDir);
+ server.add(callback);
return server;
}
- Future<void> close() async {
- await _inner.close();
+ PackageServer._(this._inner) {
+ _builder = PackageServerBuilder._(this);
}
- /// The port used for the server.
- int get port => _inner.url.port;
+ /// Add to the current set of packages that are being served.
+ void add(void Function(PackageServerBuilder) callback) {
+ callback(_builder);
- /// The URL for the server.
- String get url => _inner.url.toString();
+ _servedApiPackageDir.contents.clear();
+ _servedPackageDir.contents.clear();
- /// From now on report errors on any request.
- void serveErrors() => _handlers
- ..clear()
- ..add(
- _PatternAndHandler(
- RegExp('.*'),
- (request) {
- fail('The HTTP server received an unexpected request:\n'
- '${request.method} ${request.requestedUri}');
- },
- ),
- );
+ _builder._packages.forEach((name, package) {
+ _servedApiPackageDir.contents.addAll([
+ d.file(
+ name,
+ jsonEncode({
+ 'name': name,
+ 'uploaders': ['nweiz@google.com'],
+ 'versions': package.versions.values
+ .map((version) => packageVersionApiMap(url, version.pubspec,
+ retracted: version.isRetracted))
+ .toList(),
+ if (package.isDiscontinued) 'isDiscontinued': true,
+ if (package.discontinuedReplacementText != null)
+ 'replacedBy': package.discontinuedReplacementText,
+ })),
+ d.dir(name, [
+ d.dir('versions', package.versions.values.map((version) {
+ return d.file(
+ version.version.toString(),
+ jsonEncode(packageVersionApiMap(url, version.pubspec,
+ retracted: version.isRetracted, full: true)));
+ }))
+ ])
+ ]);
- void handle(Pattern pattern, shelf.Handler handler) {
- _handlers.add(
- _PatternAndHandler(
- pattern,
- handler,
- ),
- );
+ _servedPackageDir.contents.add(d.dir(name, [
+ d.dir(
+ 'versions',
+ package.versions.values.map((version) =>
+ d.tar('${version.version}.tar.gz', version.contents)))
+ ]));
+ });
}
// Installs a handler at [pattern] that expects to be called exactly once with
// the given [method].
- //
- // The handler is installed as the start to give it priority over more general
- // handlers.
void expect(String method, Pattern pattern, shelf.Handler handler) {
- handle(
- pattern,
- expectAsync1(
- (request) {
- test.expect(request.method, method);
- return handler(request);
- },
- ),
- );
+ extraHandlers[pattern] = expectAsync1((request) {
+ test.expect(request.method, method);
+ return handler(request);
+ });
}
/// Returns the path of [package] at [version], installed from this server, in
@@ -165,9 +169,26 @@
String get cachingPath =>
p.join(d.sandbox, cachePath, 'hosted', 'localhost%58$port');
+ /// Replace the current set of packages that are being served.
+ void replace(void Function(PackageServerBuilder) callback) {
+ _builder._clear();
+ add(callback);
+ }
+}
+
+/// A builder for specifying which packages should be served by [servePackages].
+class PackageServerBuilder {
/// A map from package names to the concrete packages to serve.
final _packages = <String, _ServedPackage>{};
+ /// The package server that this builder is associated with.
+ final PackageServer _server;
+
+ /// The URL for the server that this builder is associated with.
+ String get serverUrl => _server.url;
+
+ PackageServerBuilder._(this._server);
+
/// Specifies that a package named [name] with [version] should be served.
///
/// If [deps] is passed, it's used as the "dependencies" field of the pubspec.
@@ -187,44 +208,7 @@
contents = [d.file('pubspec.yaml', yaml(pubspecFields)), ...contents];
var package = _packages.putIfAbsent(name, () => _ServedPackage());
- package.versions[version] = _ServedPackageVersion(
- pubspecFields,
- contents: () {
- final entries = <TarEntry>[];
-
- void addDescriptor(d.Descriptor descriptor, String path) {
- if (descriptor is d.DirectoryDescriptor) {
- for (final e in descriptor.contents) {
- addDescriptor(e, p.posix.join(path, descriptor.name));
- }
- } else {
- entries.add(
- TarEntry(
- TarHeader(
- // Ensure paths in tar files use forward slashes
- name: p.posix.join(path, descriptor.name),
- // We want to keep executable bits, but otherwise use the default
- // file mode
- mode: 420,
- // size: 100,
- modified: DateTime.now(),
- userName: 'pub',
- groupName: 'pub',
- ),
- (descriptor as d.FileDescriptor).readAsBytes(),
- ),
- );
- }
- }
-
- for (final e in contents ?? <d.Descriptor>[]) {
- addDescriptor(e, '');
- }
- return Stream.fromIterable(entries)
- .transform(tarWriterWith(format: OutputFormat.gnuLongName))
- .transform(gzip.encoder);
- },
- );
+ package.versions[version] = _ServedPackageVersion(pubspecFields, contents);
}
// Mark a package discontinued.
@@ -236,7 +220,7 @@
}
/// Clears all existing packages from this builder.
- void clearPackages() {
+ void _clear() {
_packages.clear();
}
@@ -254,17 +238,10 @@
/// A package that's intended to be served.
class _ServedPackageVersion {
final Map pubspec;
- final Stream<List<int>> Function() contents;
+ final List<d.Descriptor> contents;
bool isRetracted = false;
Version get version => Version.parse(pubspec['version']);
- _ServedPackageVersion(this.pubspec, {required this.contents});
-}
-
-class _PatternAndHandler {
- Pattern pattern;
- shelf.Handler handler;
-
- _PatternAndHandler(this.pattern, this.handler);
+ _ServedPackageVersion(this.pubspec, this.contents);
}
diff --git a/test/packages_file_test.dart b/test/packages_file_test.dart
index c245a9a..67ca572 100644
--- a/test/packages_file_test.dart
+++ b/test/packages_file_test.dart
@@ -11,20 +11,21 @@
void main() {
forBothPubGetAndUpgrade((command) {
- test('.packages file is created with flag', () async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
- ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
- ..serve('baz', '2.2.2',
+ test('.packages file is created', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
+ builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
+ builder.serve('baz', '2.2.2',
deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': '1.2.3'}),
d.dir('lib')
]).create();
- await pubCommand(command, args: ['--legacy-packages-file']);
+ await pubCommand(command);
await d.dir(appPath, [
d.packagesFile(
@@ -32,13 +33,14 @@
]).validate();
});
- test('.packages file is overwritten with flag', () async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])])
- ..serve('bar', '3.2.1', contents: [d.dir('lib', [])])
- ..serve('baz', '2.2.2',
+ test('.packages file is overwritten', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': '2.2.2'}, contents: [d.dir('lib', [])]);
+ builder.serve('bar', '3.2.1', contents: [d.dir('lib', [])]);
+ builder.serve('baz', '2.2.2',
deps: {'bar': '3.2.1'}, contents: [d.dir('lib', [])]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': '1.2.3'}),
@@ -51,7 +53,7 @@
await oldFile.create();
await oldFile.validate(); // Sanity-check that file was created correctly.
- await pubCommand(command, args: ['--legacy-packages-file']);
+ await pubCommand(command);
await d.dir(appPath, [
d.packagesFile(
@@ -59,32 +61,27 @@
]).validate();
});
- test('.packages file is not created if pub command fails with flag',
- () async {
+ test('.packages file is not created if pub command fails', () async {
await d.dir(appPath, [
d.appPubspec({'foo': '1.2.3'}),
d.dir('lib')
]).create();
await pubCommand(command,
- args: ['--offline', '--legacy-packages-file'],
- error: equalsIgnoringWhitespace("""
+ args: ['--offline'], error: equalsIgnoringWhitespace("""
Because myapp depends on foo any which doesn't exist (could not find
package foo in cache), version solving failed.
-
- Try again without --offline!
- """),
- exitCode: exit_codes.UNAVAILABLE);
+ """), exitCode: exit_codes.UNAVAILABLE);
await d.dir(appPath, [d.nothing('.packages')]).validate();
});
- test('.packages file has relative path to path dependency with flag',
- () async {
- await servePackages()
- ..serve('foo', '1.2.3',
- deps: {'baz': 'any'}, contents: [d.dir('lib', [])])
- ..serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
+ test('.packages file has relative path to path dependency', () async {
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3',
+ deps: {'baz': 'any'}, contents: [d.dir('lib', [])]);
+ builder.serve('baz', '9.9.9', deps: {}, contents: [d.dir('lib', [])]);
+ });
await d.dir('local_baz', [
d.libDir('baz', 'baz 3.2.1'),
@@ -104,7 +101,7 @@
d.dir('lib')
]).create();
- await pubCommand(command, args: ['--legacy-packages-file']);
+ await pubCommand(command);
await d.dir(appPath, [
d.packagesFile({'myapp': '.', 'baz': '../local_baz', 'foo': '1.2.3'}),
diff --git a/test/pub_get_and_upgrade_test.dart b/test/pub_get_and_upgrade_test.dart
index f64f93b..62004a4 100644
--- a/test/pub_get_and_upgrade_test.dart
+++ b/test/pub_get_and_upgrade_test.dart
@@ -45,8 +45,7 @@
await pubCommand(command);
await d.dir('myapp', [
- d.packageConfigFile(
- [d.packageConfigEntry(name: 'myapp_name', path: '.')]),
+ d.packagesFile({'myapp_name': '.'})
]).validate();
});
diff --git a/test/pub_uploader_test.dart b/test/pub_uploader_test.dart
index 47d50d3..daec6bc 100644
--- a/test/pub_uploader_test.dart
+++ b/test/pub_uploader_test.dart
@@ -40,11 +40,12 @@
test('adds an uploader', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'add', 'email']);
+ globalPackageServer!, ['--package', 'pkg', 'add', 'email']);
- globalServer.expect('POST', '/api/packages/pkg/uploaders', (request) {
+ globalPackageServer!.expect('POST', '/api/packages/pkg/uploaders',
+ (request) {
return request.readAsString().then((body) {
expect(body, equals('email=email'));
@@ -62,11 +63,11 @@
test('removes an uploader', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'remove', 'email']);
+ globalPackageServer!, ['--package', 'pkg', 'remove', 'email']);
- globalServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
+ globalPackageServer!.expect('DELETE', '/api/packages/pkg/uploaders/email',
(request) {
return shelf.Response.ok(
jsonEncode({
@@ -83,10 +84,11 @@
await d.validPackage.create();
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
- var pub = await startPubUploader(globalServer, ['add', 'email']);
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
+ var pub = await startPubUploader(globalPackageServer!, ['add', 'email']);
- globalServer.expect('POST', '/api/packages/test_pkg/uploaders', (request) {
+ globalPackageServer!.expect('POST', '/api/packages/test_pkg/uploaders',
+ (request) {
return shelf.Response.ok(
jsonEncode({
'success': {'message': 'Good job!'}
@@ -100,11 +102,12 @@
test('add provides an error', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'add', 'email']);
+ globalPackageServer!, ['--package', 'pkg', 'add', 'email']);
- globalServer.expect('POST', '/api/packages/pkg/uploaders', (request) {
+ globalPackageServer!.expect('POST', '/api/packages/pkg/uploaders',
+ (request) {
return shelf.Response(400,
body: jsonEncode({
'error': {'message': 'Bad job!'}
@@ -118,12 +121,12 @@
test('remove provides an error', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'remove', 'e/mail']);
+ globalPackageServer!, ['--package', 'pkg', 'remove', 'e/mail']);
- globalServer.expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail',
- (request) {
+ globalPackageServer!
+ .expect('DELETE', '/api/packages/pkg/uploaders/e%2Fmail', (request) {
return shelf.Response(400,
body: jsonEncode({
'error': {'message': 'Bad job!'}
@@ -137,11 +140,11 @@
test('add provides invalid JSON', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'add', 'email']);
+ globalPackageServer!, ['--package', 'pkg', 'add', 'email']);
- globalServer.expect('POST', '/api/packages/pkg/uploaders',
+ globalPackageServer!.expect('POST', '/api/packages/pkg/uploaders',
(request) => shelf.Response.ok('{not json'));
expect(
@@ -153,11 +156,11 @@
test('remove provides invalid JSON', () async {
await servePackages();
- await d.credentialsFile(globalServer, 'access token').create();
+ await d.credentialsFile(globalPackageServer!, 'access token').create();
var pub = await startPubUploader(
- globalServer, ['--package', 'pkg', 'remove', 'email']);
+ globalPackageServer!, ['--package', 'pkg', 'remove', 'email']);
- globalServer.expect('DELETE', '/api/packages/pkg/uploaders/email',
+ globalPackageServer!.expect('DELETE', '/api/packages/pkg/uploaders/email',
(request) => shelf.Response.ok('{not json'));
expect(
diff --git a/test/rate_limited_scheduler_test.dart b/test/rate_limited_scheduler_test.dart
index 8562b07..e94bbc7 100644
--- a/test/rate_limited_scheduler_test.dart
+++ b/test/rate_limited_scheduler_test.dart
@@ -4,6 +4,7 @@
import 'dart:async';
+import 'package:pedantic/pedantic.dart';
import 'package:pub/src/rate_limited_scheduler.dart';
import 'package:test/test.dart';
diff --git a/test/remove/remove_test.dart b/test/remove/remove_test.dart
index 8c82527..52194c9 100644
--- a/test/remove/remove_test.dart
+++ b/test/remove/remove_test.dart
@@ -12,8 +12,7 @@
void main() {
test('removes a package from dependencies', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
@@ -21,16 +20,17 @@
await pubRemove(args: ['foo']);
await d.cacheDir({}).validate();
- await d.appPackageConfigFile([]).validate();
+ await d.appPackagesFile({}).validate();
await d.appDir().validate();
});
test('removing a package from dependencies does not affect dev_dependencies',
() async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('foo', '1.2.2')
- ..serve('bar', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('foo', '1.2.2');
+ builder.serve('bar', '2.0.0');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -49,9 +49,7 @@
await pubRemove(args: ['foo']);
await d.cacheDir({'bar': '2.0.0'}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'bar', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'bar': '2.0.0'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -62,8 +60,7 @@
});
test('dry-run does not actually remove dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
@@ -101,8 +98,7 @@
});
test('removes a package from dev_dependencies', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3');
+ await servePackages((builder) => builder.serve('foo', '1.2.3'));
await d.dir(appPath, [
d.pubspec({
@@ -115,7 +111,7 @@
await pubRemove(args: ['foo']);
await d.cacheDir({}).validate();
- await d.appPackageConfigFile([]).validate();
+ await d.appPackagesFile({}).validate();
await d.dir(appPath, [
d.pubspec({'name': 'myapp'})
@@ -124,11 +120,12 @@
test('removes multiple packages from dependencies and dev_dependencies',
() async {
- await servePackages()
- ..serve('foo', '1.2.3')
- ..serve('bar', '2.3.4')
- ..serve('baz', '3.2.1')
- ..serve('jfj', '0.2.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3');
+ builder.serve('bar', '2.3.4');
+ builder.serve('baz', '3.2.1');
+ builder.serve('jfj', '0.2.1');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -142,10 +139,7 @@
await pubRemove(args: ['foo', 'bar', 'baz']);
await d.cacheDir({'jfj': '0.2.1'}).validate();
-
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'jfj', version: '0.2.1'),
- ]).validate();
+ await d.appPackagesFile({'jfj': '0.2.1'}).validate();
await d.dir(appPath, [
d.pubspec({
@@ -156,8 +150,7 @@
});
test('removes git dependencies', () async {
- final server = await servePackages();
- server.serve('bar', '1.2.3');
+ await servePackages((builder) => builder.serve('bar', '1.2.3'));
ensureGit();
final repo = d.git('foo.git', [
@@ -175,16 +168,12 @@
await pubGet();
await pubRemove(args: ['foo']);
-
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'bar', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'bar': '1.2.3'}).validate();
await d.appDir({'bar': '1.2.3'}).validate();
});
test('removes path dependencies', () async {
- final server = await servePackages();
- server.serve('bar', '1.2.3');
+ await servePackages((builder) => builder.serve('bar', '1.2.3'));
await d
.dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();
@@ -196,23 +185,21 @@
await pubGet();
await pubRemove(args: ['foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'bar', version: '1.2.3'),
- ]).validate();
+ await d.appPackagesFile({'bar': '1.2.3'}).validate();
await d.appDir({'bar': '1.2.3'}).validate();
});
test('removes hosted dependencies', () async {
- final server = await servePackages();
- server.serve('bar', '2.0.1');
+ await servePackages((builder) => builder.serve('bar', '2.0.1'));
- var custom = await startPackageServer();
- custom.serve('foo', '1.2.3');
+ var server = await PackageServer.start((builder) {
+ builder.serve('foo', '1.2.3');
+ });
await d.appDir({
'foo': {
'version': '1.2.3',
- 'hosted': {'name': 'foo', 'url': 'http://localhost:${custom.port}'}
+ 'hosted': {'name': 'foo', 'url': 'http://localhost:${server.port}'}
},
'bar': '2.0.1'
}).create();
@@ -220,16 +207,15 @@
await pubGet();
await pubRemove(args: ['foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'bar', version: '2.0.1'),
- ]).validate();
+ await d.appPackagesFile({'bar': '2.0.1'}).validate();
await d.appDir({'bar': '2.0.1'}).validate();
});
test('preserves comments', () async {
- await servePackages()
- ..serve('bar', '1.0.0')
- ..serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.file('pubspec.yaml', '''
diff --git a/test/run/allows_dart_extension_test.dart b/test/run/allows_dart_extension_test.dart
index 962270f..27640fc 100644
--- a/test/run/allows_dart_extension_test.dart
+++ b/test/run/allows_dart_extension_test.dart
@@ -7,7 +7,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = """
+const SCRIPT = """
import 'dart:io';
main() {
@@ -21,7 +21,7 @@
test('allows a ".dart" extension on the argument', () async {
await d.dir(appPath, [
d.appPubspec(),
- d.dir('bin', [d.file('script.dart', _script)])
+ d.dir('bin', [d.file('script.dart', SCRIPT)])
]).create();
await pubGet();
diff --git a/test/run/forwards_signal_posix_test.dart b/test/run/forwards_signal_posix_test.dart
index 5205145..1a32be8 100644
--- a/test/run/forwards_signal_posix_test.dart
+++ b/test/run/forwards_signal_posix_test.dart
@@ -23,7 +23,7 @@
ProcessSignal.sigwinch,
];
-const _script = """
+const SCRIPT = """
import 'dart:io';
main() {
@@ -41,7 +41,7 @@
test('forwards signals to the inner script', () async {
await d.dir(appPath, [
d.appPubspec(),
- d.dir('bin', [d.file('script.dart', _script)])
+ d.dir('bin', [d.file('script.dart', SCRIPT)])
]).create();
await pubGet();
diff --git a/test/run/includes_parent_directories_of_entrypoint_test.dart b/test/run/includes_parent_directories_of_entrypoint_test.dart
index 6bc4e27..d351ac4 100644
--- a/test/run/includes_parent_directories_of_entrypoint_test.dart
+++ b/test/run/includes_parent_directories_of_entrypoint_test.dart
@@ -8,7 +8,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = r"""
+const SCRIPT = r"""
import '../../a.dart';
import '../b.dart';
main() {
@@ -26,7 +26,7 @@
d.file('a.dart', "var a = 'a';"),
d.dir('a', [
d.file('b.dart', "var b = 'b';"),
- d.dir('b', [d.file('app.dart', _script)])
+ d.dir('b', [d.file('app.dart', SCRIPT)])
])
])
]).create();
diff --git a/test/run/package_api_test.dart b/test/run/package_api_test.dart
index 4d05408..161cbf9 100644
--- a/test/run/package_api_test.dart
+++ b/test/run/package_api_test.dart
@@ -49,10 +49,11 @@
});
test('a snapshotted application sees a file: package root', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', contents: [
- d.dir('bin', [d.file('script.dart', _script)])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', contents: [
+ d.dir('bin', [d.file('script.dart', _script)])
+ ]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': 'any'})
@@ -72,8 +73,8 @@
.toString()));
expect(pub.stdout,
emits(p.toUri(p.join(d.sandbox, 'myapp/lib/resource.txt')).toString()));
- var fooResourcePath =
- p.join(globalServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
+ var fooResourcePath = p.join(
+ globalPackageServer!.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
expect(pub.stdout, emits(p.toUri(fooResourcePath).toString()));
await pub.shouldExit(0);
});
diff --git a/test/run/passes_along_arguments_test.dart b/test/run/passes_along_arguments_test.dart
index 624d9f2..66a7d53 100644
--- a/test/run/passes_along_arguments_test.dart
+++ b/test/run/passes_along_arguments_test.dart
@@ -7,7 +7,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = '''
+const SCRIPT = '''
main(List<String> args) {
print(args.join(" "));
}
@@ -17,7 +17,7 @@
test('passes arguments to the spawned script', () async {
await d.dir(appPath, [
d.appPubspec(),
- d.dir('bin', [d.file('args.dart', _script)])
+ d.dir('bin', [d.file('args.dart', SCRIPT)])
]).create();
await pubGet();
diff --git a/test/run/precompile_test.dart b/test/run/precompile_test.dart
index 2d70b4c..ef8787d 100644
--- a/test/run/precompile_test.dart
+++ b/test/run/precompile_test.dart
@@ -7,7 +7,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = r'''
+const SCRIPT = r'''
import 'dart:io';
main(List<String> args) {
@@ -21,11 +21,11 @@
d.appPubspec({'test': '1.0.0'}),
]).create();
- final server = await servePackages();
- server.serve('test', '1.0.0', contents: [
- d.dir('bin',
- [d.file('test.dart', 'main(List<String> args) => print("hello");')])
- ]);
+ await servePackages((server) => server
+ ..serve('test', '1.0.0', contents: [
+ d.dir('bin',
+ [d.file('test.dart', 'main(List<String> args) => print("hello");')])
+ ]));
await pubGet(args: ['--no-precompile']);
}
@@ -57,10 +57,10 @@
d.appPubspec({'test': '1.0.0'}),
]).create();
- final server = await servePackages();
- server.serve('test', '1.0.0', contents: [
- d.dir('bin', [d.file('test.dart', _script)])
- ]);
+ await servePackages((server) => server
+ ..serve('test', '1.0.0', contents: [
+ d.dir('bin', [d.file('test.dart', SCRIPT)])
+ ]));
await pubGet(
args: ['--no-precompile'], environment: {'PUB_CACHE': '.pub_cache'});
@@ -80,10 +80,10 @@
d.appPubspec({'test': '1.0.0'}),
]).create();
- final server = await servePackages();
- server.serve('test', '1.0.0', contents: [
- d.dir('bin', [d.file('test.dart', _script)])
- ]);
+ await servePackages((server) => server
+ ..serve('test', '1.0.0', contents: [
+ d.dir('bin', [d.file('test.dart', SCRIPT)])
+ ]));
await pubGet(
args: ['--precompile'],
@@ -104,10 +104,10 @@
d.appPubspec({'test': '1.0.0'}),
]).create();
- final server = await servePackages();
- server.serve('test', '1.0.0', contents: [
- d.dir('bin', [d.file('test.dart', _script)])
- ]);
+ await servePackages((server) => server
+ ..serve('test', '1.0.0', contents: [
+ d.dir('bin', [d.file('test.dart', SCRIPT)])
+ ]));
await pubGet(
args: ['--precompile'],
diff --git a/test/run/runs_app_in_entrypoint_test.dart b/test/run/runs_app_in_entrypoint_test.dart
index 6cb932a..27a7381 100644
--- a/test/run/runs_app_in_entrypoint_test.dart
+++ b/test/run/runs_app_in_entrypoint_test.dart
@@ -7,7 +7,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = """
+const SCRIPT = """
import 'dart:io';
main() {
@@ -21,7 +21,7 @@
test('runs a Dart application in the entrypoint package', () async {
await d.dir(appPath, [
d.appPubspec(),
- d.dir('bin', [d.file('script.dart', _script)])
+ d.dir('bin', [d.file('script.dart', SCRIPT)])
]).create();
await pubGet();
diff --git a/test/run/runs_from_a_dependency_override_after_dependency_test.dart b/test/run/runs_from_a_dependency_override_after_dependency_test.dart
index c11bacb..f7e7c7a 100644
--- a/test/run/runs_from_a_dependency_override_after_dependency_test.dart
+++ b/test/run/runs_from_a_dependency_override_after_dependency_test.dart
@@ -10,13 +10,14 @@
void main() {
// Regression test for issue 23113
test('runs a named Dart application in a dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'name': 'foo',
- 'version': '1.0.0'
- }, contents: [
- d.dir('bin', [d.file('bar.dart', "main() => print('foobar');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'name': 'foo',
+ 'version': '1.0.0'
+ }, contents: [
+ d.dir('bin', [d.file('bar.dart', "main() => print('foobar');")])
+ ]);
+ });
await d.dir(appPath, [
d.appPubspec({'foo': null})
diff --git a/test/run/runs_the_script_in_unchecked_mode_test.dart b/test/run/runs_the_script_in_unchecked_mode_test.dart
index 026a748..2652706 100644
--- a/test/run/runs_the_script_in_unchecked_mode_test.dart
+++ b/test/run/runs_the_script_in_unchecked_mode_test.dart
@@ -7,7 +7,7 @@
import '../descriptor.dart' as d;
import '../test_pub.dart';
-const _script = '''
+const SCRIPT = '''
main() {
assert(false);
print("no checks");
@@ -18,7 +18,7 @@
test('runs the script without assertions by default', () async {
await d.dir(appPath, [
d.appPubspec(),
- d.dir('bin', [d.file('script.dart', _script)])
+ d.dir('bin', [d.file('script.dart', SCRIPT)])
]).create();
await pubGet();
diff --git a/test/sdk_test.dart b/test/sdk_test.dart
index 6165cd5..3f3b00b 100644
--- a/test/sdk_test.dart
+++ b/test/sdk_test.dart
@@ -13,8 +13,9 @@
void main() {
forBothPubGetAndUpgrade((command) {
setUp(() async {
- final server = await servePackages();
- server.serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('bar', '1.0.0');
+ });
await d.dir('flutter', [
d.dir('packages', [
@@ -37,10 +38,13 @@
}).create();
await pubCommand(command,
environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')});
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'foo', path: p.join(d.sandbox, 'flutter', 'packages', 'foo')),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
+
+ await d.dir(appPath, [
+ d.packagesFile({
+ 'myapp': '.',
+ 'foo': p.join(d.sandbox, 'flutter', 'packages', 'foo'),
+ 'bar': '1.0.0'
+ })
]).validate();
});
@@ -51,10 +55,11 @@
await pubCommand(command,
environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')});
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'baz',
- path: p.join(d.sandbox, 'flutter', 'bin', 'cache', 'pkg', 'baz')),
+ await d.dir(appPath, [
+ d.packagesFile({
+ 'myapp': '.',
+ 'baz': p.join(d.sandbox, 'flutter', 'bin', 'cache', 'pkg', 'baz')
+ })
]).validate();
});
@@ -89,7 +94,10 @@
deleteEntry(p.join(d.sandbox, 'flutter', 'version'));
await pubCommand(command,
environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')});
- await d.appPackageConfigFile([]).validate();
+
+ await d.dir(appPath, [
+ d.packagesFile({'myapp': '.'})
+ ]).validate();
});
group('fails if', () {
@@ -162,10 +170,13 @@
}).create();
await pubCommand(command,
environment: {'FUCHSIA_DART_SDK_ROOT': p.join(d.sandbox, 'fuchsia')});
- await d.appPackageConfigFile([
- d.packageConfigEntry(
- name: 'foo', path: p.join(d.sandbox, 'fuchsia', 'packages', 'foo')),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
+
+ await d.dir(appPath, [
+ d.packagesFile({
+ 'myapp': '.',
+ 'foo': p.join(d.sandbox, 'fuchsia', 'packages', 'foo'),
+ 'bar': '1.0.0'
+ })
]).validate();
});
});
diff --git a/test/snapshot_test.dart b/test/snapshot_test.dart
index 8143f7e..215fcdf 100644
--- a/test/snapshot_test.dart
+++ b/test/snapshot_test.dart
@@ -11,15 +11,17 @@
void main() {
group('creates a snapshot', () {
test('for an immediate dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', contents: [
- d.dir('bin', [
- d.file('hello.dart', "void main() => print('hello!');"),
- d.file('goodbye.dart', "void main() => print('goodbye!');"),
- d.file('shell.sh', 'echo shell'),
- d.dir('subdir', [d.file('sub.dart', "void main() => print('sub!');")])
- ])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', contents: [
+ d.dir('bin', [
+ d.file('hello.dart', "void main() => print('hello!');"),
+ d.file('goodbye.dart', "void main() => print('goodbye!');"),
+ d.file('shell.sh', 'echo shell'),
+ d.dir(
+ 'subdir', [d.file('sub.dart', "void main() => print('sub!');")])
+ ])
+ ]);
+ });
await d.appDir({'foo': '1.2.3'}).create();
@@ -47,8 +49,8 @@
});
test("for an immediate dependency that's also transitive", () async {
- await servePackages()
- ..serve('foo', '1.2.3', contents: [
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', contents: [
d.dir('bin', [
d.file('hello.dart', "void main() => print('hello!');"),
d.file('goodbye.dart', "void main() => print('goodbye!');"),
@@ -56,8 +58,9 @@
d.dir(
'subdir', [d.file('sub.dart', "void main() => print('sub!');")])
])
- ])
- ..serve('bar', '1.2.3', deps: {'foo': '1.2.3'});
+ ]);
+ builder.serve('bar', '1.2.3', deps: {'foo': '1.2.3'});
+ });
await d.appDir({'foo': '1.2.3'}).create();
@@ -86,11 +89,12 @@
group('again if', () {
test('its package is updated', () async {
- final server = await servePackages();
- server.serve('foo', '1.2.3', contents: [
- d.dir(
- 'bin', [d.file('hello.dart', "void main() => print('hello!');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', contents: [
+ d.dir('bin',
+ [d.file('hello.dart', "void main() => print('hello!');")])
+ ]);
+ });
await d.appDir({'foo': 'any'}).create();
@@ -101,10 +105,12 @@
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!'))
]).validate();
- server.serve('foo', '1.2.4', contents: [
- d.dir('bin',
- [d.file('hello.dart', "void main() => print('hello 2!');")])
- ]);
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '1.2.4', contents: [
+ d.dir('bin',
+ [d.file('hello.dart', "void main() => print('hello 2!');")])
+ ]);
+ });
await pubUpgrade(
args: ['--precompile'], output: contains('Built foo:hello.'));
@@ -119,22 +125,22 @@
});
test('a dependency of its package is updated', () async {
- final server = await servePackages();
-
- server.serve('foo', '1.2.3', pubspec: {
- 'dependencies': {'bar': 'any'}
- }, contents: [
- d.dir('bin', [
- d.file('hello.dart', """
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', pubspec: {
+ 'dependencies': {'bar': 'any'}
+ }, contents: [
+ d.dir('bin', [
+ d.file('hello.dart', """
import 'package:bar/bar.dart';
void main() => print(message);
""")
- ])
- ]);
- server.serve('bar', '1.2.3', contents: [
- d.dir('lib', [d.file('bar.dart', "final message = 'hello!';")])
- ]);
+ ])
+ ]);
+ builder.serve('bar', '1.2.3', contents: [
+ d.dir('lib', [d.file('bar.dart', "final message = 'hello!';")])
+ ]);
+ });
await d.appDir({'foo': 'any'}).create();
@@ -145,9 +151,11 @@
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!'))
]).validate();
- server.serve('bar', '1.2.4', contents: [
- d.dir('lib', [d.file('bar.dart', "final message = 'hello 2!';")]),
- ]);
+ globalPackageServer!.add((builder) {
+ builder.serve('bar', '1.2.4', contents: [
+ d.dir('lib', [d.file('bar.dart', "final message = 'hello 2!';")]),
+ ]);
+ });
await pubUpgrade(
args: ['--precompile'], output: contains('Built foo:hello.'));
@@ -199,11 +207,12 @@
});
test('the SDK is out of date', () async {
- final server = await servePackages();
- server.serve('foo', '5.6.7', contents: [
- d.dir(
- 'bin', [d.file('hello.dart', "void main() => print('hello!');")])
- ]);
+ await servePackages((builder) {
+ builder.serve('foo', '5.6.7', contents: [
+ d.dir('bin',
+ [d.file('hello.dart', "void main() => print('hello!');")])
+ ]);
+ });
await d.appDir({'foo': '5.6.7'}).create();
diff --git a/test/test_pub.dart b/test/test_pub.dart
index e30c590..22d8cfa 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -36,9 +36,11 @@
import 'package:test_process/test_process.dart';
import 'descriptor.dart' as d;
+import 'descriptor_server.dart';
import 'package_server.dart';
-export 'package_server.dart' show PackageServer;
+export 'descriptor_server.dart';
+export 'package_server.dart';
/// A [Matcher] that matches JavaScript generated by dart2js with minification
/// enabled.
@@ -373,12 +375,11 @@
List<String>? args,
String authMethod = 'oauth2',
Map<String, String>? environment,
- String path = '',
}) async {
var tokenEndpoint = Uri.parse(server.url).resolve('/token').toString();
args = ['lish', ...?args];
return await startPub(args: args, tokenEndpoint: tokenEndpoint, environment: {
- 'PUB_HOSTED_URL': server.url + path,
+ 'PUB_HOSTED_URL': server.url,
'_PUB_TEST_AUTH_METHOD': authMethod,
if (environment != null) ...environment,
});
@@ -411,19 +412,29 @@
String testVersion = '0.1.2+3';
/// Gets the environment variables used to run pub in a test context.
-Map<String, String> getPubTestEnvironment([String? tokenEndpoint]) => {
- 'CI': 'false', // unless explicitly given tests don't run pub in CI mode
- '_PUB_TESTING': 'true',
- '_PUB_TEST_CONFIG_DIR': _pathInSandbox(configPath),
- 'PUB_CACHE': _pathInSandbox(cachePath),
- 'PUB_ENVIRONMENT': 'test-environment',
+Map<String, String> getPubTestEnvironment([String? tokenEndpoint]) {
+ var environment = {
+ 'CI': 'false', // unless explicitly given tests don't run pub in CI mode
+ '_PUB_TESTING': 'true',
+ '_PUB_TEST_CONFIG_DIR': _pathInSandbox(configPath),
+ 'PUB_CACHE': _pathInSandbox(cachePath),
+ 'PUB_ENVIRONMENT': 'test-environment',
- // Ensure a known SDK version is set for the tests that rely on that.
- '_PUB_TEST_SDK_VERSION': testVersion,
- if (tokenEndpoint != null) '_PUB_TEST_TOKEN_ENDPOINT': tokenEndpoint,
- if (_globalServer?.port != null)
- 'PUB_HOSTED_URL': 'http://localhost:${_globalServer?.port}'
- };
+ // Ensure a known SDK version is set for the tests that rely on that.
+ '_PUB_TEST_SDK_VERSION': testVersion
+ };
+
+ if (tokenEndpoint != null) {
+ environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint;
+ }
+
+ var server = globalServer;
+ if (server != null) {
+ environment['PUB_HOSTED_URL'] = 'http://localhost:${server.port}';
+ }
+
+ return environment;
+}
/// The path to the root of pub's sources in the pub repo.
final String _pubRoot = (() {
@@ -466,7 +477,7 @@
var dartArgs = ['--packages=$dotPackagesPath', '--enable-asserts'];
dartArgs
- ..addAll([pubPath, if (!verbose) '--verbosity=normal'])
+ ..addAll([pubPath, if (verbose) '--verbose'])
..addAll(args);
final mergedEnvironment = getPubTestEnvironment(tokenEndpoint);
@@ -495,8 +506,8 @@
StreamSplitter<Pair<log.Level, String>> createLogSplitter() {
return StreamSplitter(StreamGroup.merge([
- _outputToLog(super.stdoutStream(), log.Level.message),
- _outputToLog(super.stderrStream(), log.Level.error)
+ _outputToLog(super.stdoutStream(), log.Level.MESSAGE),
+ _outputToLog(super.stderrStream(), log.Level.ERROR)
]));
}
@@ -533,12 +544,12 @@
final _logLineRegExp = RegExp(r'^([A-Z ]{4})[:|] (.*)$');
final Map<String, log.Level> _logLevels = [
- log.Level.error,
- log.Level.warning,
- log.Level.message,
- log.Level.io,
- log.Level.solver,
- log.Level.fine
+ log.Level.ERROR,
+ log.Level.WARNING,
+ log.Level.MESSAGE,
+ log.Level.IO,
+ log.Level.SOLVER,
+ log.Level.FINE
].fold({}, (levels, level) {
levels[level.name] = level;
return levels;
@@ -560,7 +571,7 @@
@override
Stream<String> stdoutStream() {
return _logSplitter.split().expand((entry) {
- if (entry.first != log.Level.message) return [];
+ if (entry.first != log.Level.MESSAGE) return [];
return [entry.last];
});
}
@@ -568,7 +579,7 @@
@override
Stream<String> stderrStream() {
return _logSplitter.split().expand((entry) {
- if (entry.first != log.Level.error && entry.first != log.Level.warning) {
+ if (entry.first != log.Level.ERROR && entry.first != log.Level.WARNING) {
return [];
}
return [entry.last];
@@ -578,9 +589,9 @@
/// A stream of log messages that are silent by default.
Stream<String> silentStream() {
return _logSplitter.split().expand((entry) {
- if (entry.first == log.Level.message) return [];
- if (entry.first == log.Level.error) return [];
- if (entry.first == log.Level.warning) return [];
+ if (entry.first == log.Level.MESSAGE) return [];
+ if (entry.first == log.Level.ERROR) return [];
+ if (entry.first == log.Level.WARNING) return [];
return [entry.last];
});
}
@@ -903,9 +914,9 @@
line = line
.replaceAll(d.sandbox, r'$SANDBOX')
.replaceAll(Platform.pathSeparator, '/');
- var port = _globalServer?.port;
- if (port != null) {
- line = line.replaceAll(port.toString(), '\$PORT');
+ var packageServer = globalPackageServer;
+ if (packageServer != null) {
+ line = line.replaceAll(packageServer.port.toString(), '\$PORT');
}
return line;
});
@@ -953,28 +964,3 @@
}
buffer.write('\n');
}
-
-/// The current global [PackageServer].
-PackageServer get globalServer => _globalServer!;
-PackageServer? _globalServer;
-
-/// Creates an HTTP server that replicates the structure of pub.dartlang.org and
-/// makes it the current [globalServer].
-Future<PackageServer> servePackages() async {
- final server = await startPackageServer();
- _globalServer = server;
-
- addTearDown(() {
- _globalServer = null;
- });
- return server;
-}
-
-Future<PackageServer> startPackageServer() async {
- final server = await PackageServer.start();
-
- addTearDown(() async {
- await server.close();
- });
- return server;
-}
diff --git a/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt b/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt
deleted file mode 100644
index fc69b03..0000000
--- a/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt
+++ /dev/null
@@ -1,308 +0,0 @@
-# GENERATED BY: test/embedding/embedding_test.dart
-
-$ tool/test-bin/pub_command_runner.dart pub --verbose get
-MSG : Resolving dependencies...
-MSG : + foo 1.0.0
-MSG : Downloading foo 1.0.0...
-MSG : Changed 1 dependency!
-MSG : Logs written to $SANDBOX/cache/log/pub_log.txt.
-[E] FINE: Pub 0.1.2+3
-[E] SLVR: fact: myapp is 0.0.0
-[E] SLVR: derived: myapp
-[E] SLVR: fact: myapp depends on foo any
-[E] SLVR: selecting myapp
-[E] SLVR: derived: foo any
-[E] IO : Get versions from http://localhost:$PORT/api/packages/foo.
-[E] IO : HTTP GET http://localhost:$PORT/api/packages/foo
-[E] | Accept: application/vnd.pub.v2+json
-[E] | X-Pub-OS: $OS
-[E] | X-Pub-Command: get
-[E] | X-Pub-Session-ID: $ID
-[E] | X-Pub-Environment: test-environment
-[E] | X-Pub-Reason: direct
-[E] | user-agent: Dart pub 0.1.2+3
-[E] IO : HTTP response 200 OK for GET http://localhost:$PORT/api/packages/foo
-[E] | took: $TIME
-[E] | date: $TIME
-[E] | content-length: 197
-[E] | x-frame-options: SAMEORIGIN
-[E] | content-type: text/plain; charset=utf-8
-[E] | x-xss-protection: 1; mode=block
-[E] | x-content-type-options: nosniff
-[E] | server: dart:io with Shelf
-[E] IO : Writing $N characters to text file $SANDBOX/cache/hosted/localhost%58$PORT/.cache/foo-versions.json.
-[E] FINE: Contents:
-[E] | {"name":"foo","uploaders":["nweiz@google.com"],"versions":[{"pubspec":{"name":"foo","version":"1.0.0"},"version":"1.0.0","archive_url":"http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz"}],"_fetchedAt": "$TIME"}
-[E] SLVR: selecting foo 1.0.0
-[E] SLVR: Version solving took: $TIME
-[E] | Tried 1 solutions.
-[E] FINE: Resolving dependencies finished ($TIME)
-[E] IO : Get package from http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz.
-[E] IO : Created temp directory $DIR
-[E] IO : HTTP GET http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz
-[E] | X-Pub-OS: $OS
-[E] | X-Pub-Command: get
-[E] | X-Pub-Session-ID: $ID
-[E] | X-Pub-Environment: test-environment
-[E] | X-Pub-Reason: direct
-[E] | user-agent: Dart pub 0.1.2+3
-[E] IO : HTTP response 200 OK for GET http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz
-[E] | took: $TIME
-[E] | transfer-encoding: chunked
-[E] | date: $TIME
-[E] | x-frame-options: SAMEORIGIN
-[E] | content-type: text/plain; charset=utf-8
-[E] | x-xss-protection: 1; mode=block
-[E] | x-content-type-options: nosniff
-[E] | server: dart:io with Shelf
-[E] IO : Creating $FILE from stream
-[E] FINE: Created $FILE from stream
-[E] IO : Created temp directory $DIR
-[E] IO : Reading binary file $FILE.
-[E] FINE: Extracting .tar.gz stream to $DIR
-[E] IO : Creating $FILE from stream
-[E] FINE: Created $FILE from stream
-[E] IO : Creating $FILE from stream
-[E] FINE: Created $FILE from stream
-[E] FINE: Extracted .tar.gz to $DIR
-[E] IO : Renaming directory $A to $B
-[E] IO : Deleting directory $DIR
-[E] IO : Writing $N characters to text file pubspec.lock.
-[E] FINE: Contents:
-[E] | # Generated by pub
-[E] | # See https://dart.dev/tools/pub/glossary#lockfile
-[E] | packages:
-[E] | foo:
-[E] | dependency: "direct main"
-[E] | description:
-[E] | name: foo
-[E] | url: "http://localhost:$PORT"
-[E] | source: hosted
-[E] | version: "1.0.0"
-[E] | sdks:
-[E] | dart: ">=0.1.2 <1.0.0"
-[E] IO : Writing $N characters to text file .dart_tool/package_config.json.
-[E] FINE: Contents:
-[E] | {
-[E] | "configVersion": 2,
-[E] | "packages": [
-[E] | {
-[E] | "name": "foo",
-[E] | "rootUri": "file://$SANDBOX/cache/hosted/localhost%2558$PORT/foo-1.0.0",
-[E] | "packageUri": "lib/",
-[E] | "languageVersion": "2.7"
-[E] | },
-[E] | {
-[E] | "name": "myapp",
-[E] | "rootUri": "../",
-[E] | "packageUri": "lib/",
-[E] | "languageVersion": "0.1"
-[E] | }
-[E] | ],
-[E] | "generated": "$TIME",
-[E] | "generator": "pub",
-[E] | "generatorVersion": "0.1.2+3"
-[E] | }
-[E] IO : Writing $N characters to text file $SANDBOX/cache/log/pub_log.txt.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-Information about the latest pub run.
-
-If you believe something is not working right, you can go to
-https://github.com/dart-lang/pub/issues/new to post a new issue and attach this file.
-
-Before making this file public, make sure to remove any sensitive information!
-
-Pub version: 0.1.2+3
-Created: $TIME
-FLUTTER_ROOT: <not set>
-PUB_HOSTED_URL: http://localhost:$PORT
-PUB_CACHE: "$SANDBOX/cache"
-Command: dart pub --verbose get
-Platform: $OS
-
----- $SANDBOX/myapp/pubspec.yaml ----
-{"name":"myapp","environment":{"sdk":">=0.1.2 <1.0.0"},"dependencies":{"foo":"any"}}
----- End pubspec.yaml ----
----- $SANDBOX/myapp/pubspec.lock ----
-# Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
-packages:
- foo:
- dependency: "direct main"
- description:
- name: foo
- url: "http://localhost:$PORT"
- source: hosted
- version: "1.0.0"
-sdks:
- dart: ">=0.1.2 <1.0.0"
-
----- End pubspec.lock ----
----- Log transcript ----
-FINE: Pub 0.1.2+3
-MSG : Resolving dependencies...
-SLVR: fact: myapp is 0.0.0
-SLVR: derived: myapp
-SLVR: fact: myapp depends on foo any
-SLVR: selecting myapp
-SLVR: derived: foo any
-IO : Get versions from http://localhost:$PORT/api/packages/foo.
-IO : HTTP GET http://localhost:$PORT/api/packages/foo
- | Accept: application/vnd.pub.v2+json
- | X-Pub-OS: $OS
- | X-Pub-Command: get
- | X-Pub-Session-ID: $ID
- | X-Pub-Environment: test-environment
- | X-Pub-Reason: direct
- | user-agent: Dart pub 0.1.2+3
-IO : HTTP response 200 OK for GET http://localhost:$PORT/api/packages/foo
- | took: $TIME
- | date: $TIME
- | content-length: 197
- | x-frame-options: SAMEORIGIN
- | content-type: text/plain; charset=utf-8
- | x-xss-protection: 1; mode=block
- | x-content-type-options: nosniff
- | server: dart:io with Shelf
-IO : Writing $N characters to text file $SANDBOX/cache/hosted/localhost%58$PORT/.cache/foo-versions.json.
-FINE: Contents:
- | {"name":"foo","uploaders":["nweiz@google.com"],"versions":[{"pubspec":{"name":"foo","version":"1.0.0"},"version":"1.0.0","archive_url":"http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz"}],"_fetchedAt": "$TIME"}
-SLVR: selecting foo 1.0.0
-SLVR: Version solving took: $TIME
- | Tried 1 solutions.
-FINE: Resolving dependencies finished ($TIME)
-MSG : + foo 1.0.0
-IO : Get package from http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz.
-MSG : Downloading foo 1.0.0...
-IO : Created temp directory $DIR
-IO : HTTP GET http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz
- | X-Pub-OS: $OS
- | X-Pub-Command: get
- | X-Pub-Session-ID: $ID
- | X-Pub-Environment: test-environment
- | X-Pub-Reason: direct
- | user-agent: Dart pub 0.1.2+3
-IO : HTTP response 200 OK for GET http://localhost:$PORT/packages/foo/versions/1.0.0.tar.gz
- | took: $TIME
- | transfer-encoding: chunked
- | date: $TIME
- | x-frame-options: SAMEORIGIN
- | content-type: text/plain; charset=utf-8
- | x-xss-protection: 1; mode=block
- | x-content-type-options: nosniff
- | server: dart:io with Shelf
-IO : Creating $FILE from stream
-FINE: Created $FILE from stream
-IO : Created temp directory $DIR
-IO : Reading binary file $FILE.
-FINE: Extracting .tar.gz stream to $DIR
-IO : Creating $FILE from stream
-FINE: Created $FILE from stream
-IO : Creating $FILE from stream
-FINE: Created $FILE from stream
-FINE: Extracted .tar.gz to $DIR
-IO : Renaming directory $A to $B
-IO : Deleting directory $DIR
-IO : Writing $N characters to text file pubspec.lock.
-FINE: Contents:
- | # Generated by pub
- | # See https://dart.dev/tools/pub/glossary#lockfile
- | packages:
- | foo:
- | dependency: "direct main"
- | description:
- | name: foo
- | url: "http://localhost:$PORT"
- | source: hosted
- | version: "1.0.0"
- | sdks:
- | dart: ">=0.1.2 <1.0.0"
-MSG : Changed 1 dependency!
-IO : Writing $N characters to text file .dart_tool/package_config.json.
-FINE: Contents:
- | {
- | "configVersion": 2,
- | "packages": [
- | {
- | "name": "foo",
- | "rootUri": "file://$SANDBOX/cache/hosted/localhost%2558$PORT/foo-1.0.0",
- | "packageUri": "lib/",
- | "languageVersion": "2.7"
- | },
- | {
- | "name": "myapp",
- | "rootUri": "../",
- | "packageUri": "lib/",
- | "languageVersion": "0.1"
- | }
- | ],
- | "generated": "$TIME",
- | "generator": "pub",
- | "generatorVersion": "0.1.2+3"
- | }
----- End log transcript ----
--------------------------------- END OF OUTPUT ---------------------------------
-
-$ tool/test-bin/pub_command_runner.dart pub fail
-[E] Bad state: Pub has crashed
-[E] tool/test-bin/pub_command_runner.dart $LINE:$COL ThrowingCommand.runProtected
-[E] package:pub/src/command.dart $LINE:$COL PubCommand.run.<fn>
-[E] package:pub/src/command.dart $LINE:$COL PubCommand.run.<fn>
-[E] dart:async new Future.sync
-[E] package:pub/src/utils.dart $LINE:$COL captureErrors.wrappedCallback
-[E] dart:async runZonedGuarded
-[E] package:pub/src/utils.dart $LINE:$COL captureErrors
-[E] package:pub/src/command.dart $LINE:$COL PubCommand.run
-[E] package:args/command_runner.dart $LINE:$COL CommandRunner.runCommand
-[E] tool/test-bin/pub_command_runner.dart $LINE:$COL Runner.runCommand
-[E] tool/test-bin/pub_command_runner.dart $LINE:$COL Runner.run
-[E] tool/test-bin/pub_command_runner.dart $LINE:$COL main
-[E] This is an unexpected error. The full log and other details are collected in:
-[E]
-[E] $SANDBOX/cache/log/pub_log.txt
-[E]
-[E] Consider creating an issue on https://github.com/dart-lang/pub/issues/new
-[E] and attaching the relevant parts of that log file.
-
--------------------------------- END OF OUTPUT ---------------------------------
-
-Information about the latest pub run.
-
-If you believe something is not working right, you can go to
-https://github.com/dart-lang/pub/issues/new to post a new issue and attach this file.
-
-Before making this file public, make sure to remove any sensitive information!
-
-Pub version: 0.1.2+3
-Created: $TIME
-FLUTTER_ROOT: <not set>
-PUB_HOSTED_URL: http://localhost:$PORT
-PUB_CACHE: "$SANDBOX/cache"
-Command: dart pub fail
-Platform: $OS
-
----- Log transcript ----
-FINE: Pub 0.1.2+3
-ERR : Bad state: Pub has crashed
-FINE: Exception type: StateError
-ERR : tool/test-bin/pub_command_runner.dart $LINE:$COL ThrowingCommand.runProtected
- | package:pub/src/command.dart $LINE:$COL PubCommand.run.<fn>
- | package:pub/src/command.dart $LINE:$COL PubCommand.run.<fn>
- | dart:async new Future.sync
- | package:pub/src/utils.dart $LINE:$COL captureErrors.wrappedCallback
- | dart:async runZonedGuarded
- | package:pub/src/utils.dart $LINE:$COL captureErrors
- | package:pub/src/command.dart $LINE:$COL PubCommand.run
- | package:args/command_runner.dart $LINE:$COL CommandRunner.runCommand
- | tool/test-bin/pub_command_runner.dart $LINE:$COL Runner.runCommand
- | tool/test-bin/pub_command_runner.dart $LINE:$COL Runner.run
- | tool/test-bin/pub_command_runner.dart $LINE:$COL main
-ERR : This is an unexpected error. The full log and other details are collected in:
- |
- | $SANDBOX/cache/log/pub_log.txt
- |
- | Consider creating an issue on https://github.com/dart-lang/pub/issues/new
- | and attaching the relevant parts of that log file.
----- End log transcript ----
diff --git a/test/testdata/goldens/help_test/pub add --help.txt b/test/testdata/goldens/help_test/pub add --help.txt
index 3d1f429..5d32e5e 100644
--- a/test/testdata/goldens/help_test/pub add --help.txt
+++ b/test/testdata/goldens/help_test/pub add --help.txt
@@ -2,25 +2,22 @@
## Section 0
$ pub add --help
-Add dependencies to pubspec.yaml.
+Add a dependency to pubspec.yaml.
-Usage: pub add <package>[:<constraint>] [<package2>[:<constraint2>]...] [options]
--h, --help Print this usage information.
--d, --dev Adds to the development dependencies instead.
- --git-url Git URL of the package
- --git-ref Git branch or commit to be retrieved
- --git-path Path of git package in repository
- --hosted-url URL of package host server
- --path Add package from local path
- --sdk=<[flutter]> add package from SDK source
- [flutter]
- --[no-]offline Use cached packages instead of accessing the
- network.
--n, --dry-run Report what dependencies would change but don't
- change any.
- --[no-]precompile Build executables in immediate dependencies.
--C, --directory=<dir> Run this in the directory <dir>.
- --legacy-packages-file Generate the legacy ".packages" file
+Usage: pub add <package>[:<constraint>] [options]
+-h, --help Print this usage information.
+-d, --dev Adds package to the development dependencies instead.
+ --git-url Git URL of the package
+ --git-ref Git branch or commit to be retrieved
+ --git-path Path of git package in repository
+ --hosted-url URL of package host server
+ --path Local path
+ --sdk SDK source for package
+ --[no-]offline Use cached packages instead of accessing the network.
+-n, --dry-run Report what dependencies would change but don't change
+ any.
+ --[no-]precompile Build executables in immediate dependencies.
+-C, --directory=<dir> Run this in the directory<dir>.
Run "pub help" to see global options.
See https://dart.dev/tools/pub/cmd/pub-add for detailed documentation.
diff --git a/test/testdata/goldens/help_test/pub downgrade --help.txt b/test/testdata/goldens/help_test/pub downgrade --help.txt
index ddf71e7..4497da2 100644
--- a/test/testdata/goldens/help_test/pub downgrade --help.txt
+++ b/test/testdata/goldens/help_test/pub downgrade --help.txt
@@ -7,13 +7,11 @@
Usage: pub downgrade [dependencies...]
--h, --help Print this usage information.
- --[no-]offline Use cached packages instead of accessing the
- network.
--n, --dry-run Report what dependencies would change but don't
- change any.
--C, --directory=<dir> Run this in the directory<dir>.
- --legacy-packages-file Generate the legacy ".packages" file
+-h, --help Print this usage information.
+ --[no-]offline Use cached packages instead of accessing the network.
+-n, --dry-run Report what dependencies would change but don't change
+ any.
+-C, --directory=<dir> Run this in the directory<dir>.
Run "pub help" to see global options.
See https://dart.dev/tools/pub/cmd/pub-downgrade for detailed documentation.
diff --git a/test/testdata/goldens/help_test/pub get --help.txt b/test/testdata/goldens/help_test/pub get --help.txt
index 104f69c..74648a2 100644
--- a/test/testdata/goldens/help_test/pub get --help.txt
+++ b/test/testdata/goldens/help_test/pub get --help.txt
@@ -5,14 +5,12 @@
Get the current package's dependencies.
Usage: pub get <subcommand> [arguments...]
--h, --help Print this usage information.
- --[no-]offline Use cached packages instead of accessing the
- network.
--n, --dry-run Report what dependencies would change but don't
- change any.
- --[no-]precompile Build executables in immediate dependencies.
- --legacy-packages-file Generate the legacy ".packages" file
--C, --directory=<dir> Run this in the directory<dir>.
+-h, --help Print this usage information.
+ --[no-]offline Use cached packages instead of accessing the network.
+-n, --dry-run Report what dependencies would change but don't change
+ any.
+ --[no-]precompile Build executables in immediate dependencies.
+-C, --directory=<dir> Run this in the directory<dir>.
Run "pub help" to see global options.
See https://dart.dev/tools/pub/cmd/pub-get for detailed documentation.
diff --git a/test/testdata/goldens/help_test/pub remove --help.txt b/test/testdata/goldens/help_test/pub remove --help.txt
index b82f9b6..7d14ed0 100644
--- a/test/testdata/goldens/help_test/pub remove --help.txt
+++ b/test/testdata/goldens/help_test/pub remove --help.txt
@@ -5,14 +5,12 @@
Removes a dependency from the current package.
Usage: pub remove <package>
--h, --help Print this usage information.
- --[no-]offline Use cached packages instead of accessing the
- network.
--n, --dry-run Report what dependencies would change but don't
- change any.
- --[no-]precompile Precompile executables in immediate dependencies.
--C, --directory=<dir> Run this in the directory<dir>.
- --legacy-packages-file Generate the legacy ".packages" file
+-h, --help Print this usage information.
+ --[no-]offline Use cached packages instead of accessing the network.
+-n, --dry-run Report what dependencies would change but don't change
+ any.
+ --[no-]precompile Precompile executables in immediate dependencies.
+-C, --directory=<dir> Run this in the directory<dir>.
Run "pub help" to see global options.
See https://dart.dev/tools/pub/cmd/pub-remove for detailed documentation.
diff --git a/test/testdata/goldens/help_test/pub upgrade --help.txt b/test/testdata/goldens/help_test/pub upgrade --help.txt
index c787951..d1a29b9 100644
--- a/test/testdata/goldens/help_test/pub upgrade --help.txt
+++ b/test/testdata/goldens/help_test/pub upgrade --help.txt
@@ -5,18 +5,16 @@
Upgrade the current package's dependencies to latest versions.
Usage: pub upgrade [dependencies...]
--h, --help Print this usage information.
- --[no-]offline Use cached packages instead of accessing the
- network.
--n, --dry-run Report what dependencies would change but don't
- change any.
- --[no-]precompile Precompile executables in immediate dependencies.
- --null-safety Upgrade constraints in pubspec.yaml to null-safety
- versions
- --legacy-packages-file Generate the legacy ".packages" file
- --major-versions Upgrades packages to their latest resolvable
- versions, and updates pubspec.yaml.
--C, --directory=<dir> Run this in the directory<dir>.
+-h, --help Print this usage information.
+ --[no-]offline Use cached packages instead of accessing the network.
+-n, --dry-run Report what dependencies would change but don't change
+ any.
+ --[no-]precompile Precompile executables in immediate dependencies.
+ --null-safety Upgrade constraints in pubspec.yaml to null-safety
+ versions
+ --major-versions Upgrades packages to their latest resolvable versions,
+ and updates pubspec.yaml.
+-C, --directory=<dir> Run this in the directory<dir>.
Run "pub help" to see global options.
See https://dart.dev/tools/pub/cmd/pub-upgrade for detailed documentation.
diff --git a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401-with-message.txt b/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401-with-message.txt
deleted file mode 100644
index 8dcaaf5..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401-with-message.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
-
-## Section 0
-$ pub get
-Resolving dependencies...
-[STDERR] Because myapp depends on foo any which doesn't exist (authentication failed), version solving failed.
-[STDERR]
-[STDERR] http://localhost:$PORT package repository requested authentication!
-[STDERR] You can provide credentials using:
-[STDERR] pub token add http://localhost:$PORT
-[STDERR] <message>
-[EXIT CODE] 69
-
diff --git a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401.txt b/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401.txt
deleted file mode 100644
index 68d5bd0..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/401.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
-
-## Section 0
-$ pub get
-Resolving dependencies...
-[STDERR] Because myapp depends on foo any which doesn't exist (authentication failed), version solving failed.
-[STDERR]
-[STDERR] http://localhost:$PORT package repository requested authentication!
-[STDERR] You can provide credentials using:
-[STDERR] pub token add http://localhost:$PORT
-[EXIT CODE] 69
-
diff --git a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403-with-message.txt b/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403-with-message.txt
deleted file mode 100644
index 882660c..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403-with-message.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
-
-## Section 0
-$ pub get
-Resolving dependencies...
-[STDERR] Because myapp depends on foo any which doesn't exist (authorization failed), version solving failed.
-[STDERR]
-[STDERR] Insufficient permissions to the resource at the http://localhost:$PORT package repository.
-[STDERR] You can modify credentials using:
-[STDERR] pub token add http://localhost:$PORT
-[STDERR] <message>
-[EXIT CODE] 69
-
diff --git a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403.txt b/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403.txt
deleted file mode 100644
index f8a5af9..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/403.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
-
-## Section 0
-$ pub get
-Resolving dependencies...
-[STDERR] Because myapp depends on foo any which doesn't exist (authorization failed), version solving failed.
-[STDERR]
-[STDERR] Insufficient permissions to the resource at the http://localhost:$PORT package repository.
-[STDERR] You can modify credentials using:
-[STDERR] pub token add http://localhost:$PORT
-[EXIT CODE] 69
-
diff --git a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/bad_json.txt b/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/bad_json.txt
deleted file mode 100644
index 8e446c2..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_on_bad_version_listing_response_test/bad_json.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_on_bad_version_listing_response_test.dart
-
-## Section 0
-$ pub get
-Resolving dependencies...
-[STDERR] Because myapp depends on foo any which doesn't exist (Got badly formatted response trying to find package foo at http://localhost:$PORT), version solving failed.
-[STDERR]
-[STDERR] Check that "http://localhost:$PORT" is a valid package repository.
-[EXIT CODE] 65
-
diff --git a/test/testdata/goldens/hosted/fail_gracefully_with_hint_test/supports two hints.txt b/test/testdata/goldens/hosted/fail_gracefully_with_hint_test/supports two hints.txt
deleted file mode 100644
index a45b0f0..0000000
--- a/test/testdata/goldens/hosted/fail_gracefully_with_hint_test/supports two hints.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# GENERATED BY: test/hosted/fail_gracefully_with_hint_test.dart
-
-## Section 0
-$ pub get --offline
-Resolving dependencies...
-[STDERR] Because foo <1.2.4 requires the Flutter SDK and foo >=1.2.4 depends on bar any, every version of foo requires bar any.
-[STDERR] So, because bar doesn't exist (could not find package bar in cache) and myapp depends on foo any, version solving failed.
-[STDERR]
-[STDERR] Flutter users should run `flutter pub get` instead of `dart pub get`.
-[STDERR]
-[STDERR] Try again without --offline!
-[EXIT CODE] 69
-
diff --git a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt
index ae304ea..2cc96c0 100644
--- a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt
+++ b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt
@@ -17,7 +17,9 @@
## Section 1
$ pub upgrade --major-versions --directory example
Resolving dependencies in example...
+ bar 2.0.0
> foo 2.0.0 (was 1.0.0)
+ myapp 0.0.0 from path .
Changed 1 dependency in example!
Changed 1 constraint in pubspec.yaml:
diff --git a/test/token/error_message_test.dart b/test/token/error_message_test.dart
index 53431a5..b7bc553 100644
--- a/test/token/error_message_test.dart
+++ b/test/token/error_message_test.dart
@@ -9,7 +9,7 @@
import '../test_pub.dart';
void respondWithWwwAuthenticate(String headerValue) {
- globalServer.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
return shelf.Response(403, headers: {'www-authenticate': headerValue});
});
}
@@ -18,7 +18,7 @@
return runPub(
args: ['lish'],
environment: {
- 'PUB_HOSTED_URL': globalServer.url,
+ 'PUB_HOSTED_URL': globalPackageServer!.url,
'_PUB_TEST_AUTH_METHOD': 'token',
},
exitCode: 65,
@@ -34,7 +34,7 @@
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': globalServer.url, 'token': 'access token'},
+ {'url': globalPackageServer!.url, 'token': 'access token'},
]
}).create();
});
diff --git a/test/token/token_authentication_test.dart b/test/token/token_authentication_test.dart
index c020ac0..667c47f 100644
--- a/test/token/token_authentication_test.dart
+++ b/test/token/token_authentication_test.dart
@@ -16,14 +16,14 @@
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': globalServer.url, 'env': 'TOKEN'},
+ {'url': globalPackageServer!.url, 'env': 'TOKEN'},
]
}).create();
- var pub = await startPublish(globalServer,
+ var pub = await startPublish(globalPackageServer!,
authMethod: 'token', environment: {'TOKEN': 'access token'});
await confirmPublish(pub);
- handleUploadForm(globalServer);
+ handleUploadForm(globalPackageServer!);
await pub.shouldExit(1);
});
@@ -33,13 +33,13 @@
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': globalServer.url, 'token': 'access token'},
+ {'url': globalPackageServer!.url, 'token': 'access token'},
]
}).create();
- var pub = await startPublish(globalServer, authMethod: 'token');
+ var pub = await startPublish(globalPackageServer!, authMethod: 'token');
await confirmPublish(pub);
- handleUploadForm(globalServer);
+ handleUploadForm(globalPackageServer!);
await pub.shouldExit(1);
});
diff --git a/test/token/when_receives_401_removes_token_test.dart b/test/token/when_receives_401_removes_token_test.dart
index 86c0559..b674597 100644
--- a/test/token/when_receives_401_removes_token_test.dart
+++ b/test/token/when_receives_401_removes_token_test.dart
@@ -12,17 +12,17 @@
setUp(d.validPackage.create);
test('when receives 401 response removes saved token', () async {
- final server = await servePackages();
+ await servePackages();
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': server.url, 'token': 'access token'},
+ {'url': globalPackageServer!.url, 'token': 'access token'},
]
}).create();
- var pub = await startPublish(server, authMethod: 'token');
+ var pub = await startPublish(globalPackageServer!, authMethod: 'token');
await confirmPublish(pub);
- server.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
return shelf.Response(401);
});
diff --git a/test/token/when_receives_403_persists_saved_token_test.dart b/test/token/when_receives_403_persists_saved_token_test.dart
index 45fc7a4..ffcbab0 100644
--- a/test/token/when_receives_403_persists_saved_token_test.dart
+++ b/test/token/when_receives_403_persists_saved_token_test.dart
@@ -12,17 +12,17 @@
setUp(d.validPackage.create);
test('when receives 403 response persists saved token', () async {
- final server = await servePackages();
+ await servePackages();
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': server.url, 'token': 'access token'},
+ {'url': globalPackageServer!.url, 'token': 'access token'},
]
}).create();
- var pub = await startPublish(server, authMethod: 'token');
+ var pub = await startPublish(globalPackageServer!, authMethod: 'token');
await confirmPublish(pub);
- server.expect('GET', '/api/packages/versions/new', (request) {
+ globalPackageServer!.expect('GET', '/api/packages/versions/new', (request) {
return shelf.Response(403);
});
@@ -31,7 +31,7 @@
await d.tokensFile({
'version': 1,
'hosted': [
- {'url': server.url, 'token': 'access token'},
+ {'url': globalPackageServer!.url, 'token': 'access token'},
]
}).validate();
});
diff --git a/test/unknown_source_test.dart b/test/unknown_source_test.dart
index 37591d0..fc53621 100644
--- a/test/unknown_source_test.dart
+++ b/test/unknown_source_test.dart
@@ -72,9 +72,7 @@
await pubCommand(command);
// Should upgrade to the new one.
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', path: '../foo'),
- ]).validate();
+ await d.appPackagesFile({'foo': '../foo'}).validate();
});
});
}
diff --git a/test/upgrade/dry_run_does_not_apply_changes_test.dart b/test/upgrade/dry_run_does_not_apply_changes_test.dart
index 8c942ca..de1e6b5 100644
--- a/test/upgrade/dry_run_does_not_apply_changes_test.dart
+++ b/test/upgrade/dry_run_does_not_apply_changes_test.dart
@@ -11,9 +11,10 @@
void main() {
test('--dry-run: shows report, changes nothing', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ });
// Create the first lockfile.
await d.appDir({'foo': '1.0.0'}).create();
@@ -49,9 +50,10 @@
});
test('--dry-run --major-versions: shows report, changes nothing', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ });
await d.appDir({'foo': '^1.0.0'}).create();
diff --git a/test/upgrade/example_warns_about_major_versions_test.dart b/test/upgrade/example_warns_about_major_versions_test.dart
index b5c9a67..a9b2965 100644
--- a/test/upgrade/example_warns_about_major_versions_test.dart
+++ b/test/upgrade/example_warns_about_major_versions_test.dart
@@ -10,11 +10,11 @@
testWithGolden(
'pub upgrade --major-versions does not update major versions in example/',
(ctx) async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.0.0')
..serve('foo', '2.0.0')
..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0');
+ ..serve('bar', '2.0.0'));
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
@@ -39,7 +39,7 @@
testWithGolden(
'pub upgrade --null-safety does not update null-safety of dependencies in example/',
(ctx) async {
- await servePackages()
+ await servePackages((b) => b
..serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.7.0 <3.0.0'},
})
@@ -51,7 +51,7 @@
})
..serve('bar', '2.0.0', pubspec: {
'environment': {'sdk': '>=2.12.0 <3.0.0'},
- });
+ }));
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
diff --git a/test/upgrade/hosted/unlock_if_necessary_test.dart b/test/upgrade/hosted/unlock_if_necessary_test.dart
index 2707100..5066727 100644
--- a/test/upgrade/hosted/unlock_if_necessary_test.dart
+++ b/test/upgrade/hosted/unlock_if_necessary_test.dart
@@ -11,28 +11,24 @@
test(
"upgrades one locked pub server package's dependencies if it's "
'necessary', () async {
- final server = await servePackages();
-
- server.serve('foo', '1.0.0', deps: {'foo_dep': 'any'});
- server.serve('foo_dep', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'foo_dep': 'any'});
+ builder.serve('foo_dep', '1.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'foo_dep', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'foo_dep': '1.0.0'}).validate();
- server.serve('foo', '2.0.0', deps: {'foo_dep': '>1.0.0'});
- server.serve('foo_dep', '2.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '2.0.0', deps: {'foo_dep': '>1.0.0'});
+ builder.serve('foo_dep', '2.0.0');
+ });
await pubUpgrade(args: ['foo']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'foo_dep', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0', 'foo_dep': '2.0.0'}).validate();
});
}
diff --git a/test/upgrade/hosted/unlock_single_package_test.dart b/test/upgrade/hosted/unlock_single_package_test.dart
index e443a6a..29dabe7 100644
--- a/test/upgrade/hosted/unlock_single_package_test.dart
+++ b/test/upgrade/hosted/unlock_single_package_test.dart
@@ -9,43 +9,37 @@
void main() {
test('can unlock a single package only in upgrade', () async {
- final server = await servePackages();
-
- server.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
- server.serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubGet();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
- server.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
- server.serve('bar', '2.0.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+ builder.serve('bar', '2.0.0');
+ });
// This can't upgrade 'bar'
await pubUpgrade(args: ['bar']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
+
// Introducing foo and bar 1.1.0, to show that only 'bar' will be upgraded
- server.serve('foo', '1.1.0', deps: {'bar': '<2.0.0'});
- server.serve('bar', '1.1.0');
+ globalPackageServer!.add((builder) {
+ builder.serve('foo', '1.1.0', deps: {'bar': '<2.0.0'});
+ builder.serve('bar', '1.1.0');
+ });
await pubUpgrade(args: ['bar']);
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
+
await pubUpgrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0', 'bar': '2.0.0'}).validate();
});
}
diff --git a/test/upgrade/hosted/upgrade_removed_constraints_test.dart b/test/upgrade/hosted/upgrade_removed_constraints_test.dart
index cf72c07..7c20816 100644
--- a/test/upgrade/hosted/upgrade_removed_constraints_test.dart
+++ b/test/upgrade/hosted/upgrade_removed_constraints_test.dart
@@ -9,29 +9,24 @@
void main() {
test('upgrades dependencies whose constraints have been removed', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared_dep': 'any'})
- ..serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'})
- ..serve('shared_dep', '1.0.0')
- ..serve('shared_dep', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared_dep': 'any'});
+ builder.serve('bar', '1.0.0', deps: {'shared_dep': '<2.0.0'});
+ builder.serve('shared_dep', '1.0.0');
+ builder.serve('shared_dep', '2.0.0');
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await pubUpgrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile(
+ {'foo': '1.0.0', 'bar': '1.0.0', 'shared_dep': '1.0.0'}).validate();
await d.appDir({'foo': 'any'}).create();
await pubUpgrade();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'shared_dep', version: '2.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'shared_dep': '2.0.0'}).validate();
});
}
diff --git a/test/upgrade/hosted/warn_about_discontinued_test.dart b/test/upgrade/hosted/warn_about_discontinued_test.dart
index ba7fc57..8444c10 100644
--- a/test/upgrade/hosted/warn_about_discontinued_test.dart
+++ b/test/upgrade/hosted/warn_about_discontinued_test.dart
@@ -9,15 +9,15 @@
void main() {
test('Warns about discontinued dependencies', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': 'any'})
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await d.appDir({'foo': '1.2.3'}).create();
await pubGet();
- server
+ globalPackageServer!.add((builder) => builder
..discontinue('foo')
- ..discontinue('transitive');
+ ..discontinue('transitive'));
// We warn only about the direct dependency here:
await pubUpgrade(output: '''
Resolving dependencies...
@@ -26,7 +26,8 @@
No dependencies changed.
1 package is discontinued.
''');
- server.discontinue('foo', replacementText: 'bar');
+ globalPackageServer!
+ .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
// We warn only about the direct dependency here:
await pubUpgrade(output: '''
Resolving dependencies...
@@ -38,9 +39,9 @@
});
test('Warns about discontinued dev_dependencies', () async {
- final server = await servePackages()
+ await servePackages((builder) => builder
..serve('foo', '1.2.3', deps: {'transitive': 'any'})
- ..serve('transitive', '1.0.0');
+ ..serve('transitive', '1.0.0'));
await d.dir(appPath, [
d.file('pubspec.yaml', '''
@@ -55,9 +56,9 @@
]).create();
await pubGet();
- server
+ globalPackageServer!.add((builder) => builder
..discontinue('foo')
- ..discontinue('transitive');
+ ..discontinue('transitive'));
// We warn only about the direct dependency here:
await pubUpgrade(output: '''
@@ -67,7 +68,8 @@
No dependencies changed.
1 package is discontinued.
''');
- server.discontinue('foo', replacementText: 'bar');
+ globalPackageServer!
+ .add((builder) => builder.discontinue('foo', replacementText: 'bar'));
// We warn only about the direct dependency here:
await pubUpgrade(output: '''
Resolving dependencies...
diff --git a/test/upgrade/renamed_package_circular_dependency.dart b/test/upgrade/renamed_package_circular_dependency.dart
index ec10b82..ca033bb 100644
--- a/test/upgrade/renamed_package_circular_dependency.dart
+++ b/test/upgrade/renamed_package_circular_dependency.dart
@@ -8,9 +8,10 @@
void main() {
test('The upgrade report handles a package becoming root', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'myapp': 'any'})
- ..serve('myapp', '1.0.0', deps: {'foo': 'any'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
+ builder.serve('myapp', '1.0.0', deps: {'foo': 'any'});
+ });
await d.dir(appPath, [
d.pubspec({
diff --git a/test/upgrade/report/describes_change_test.dart b/test/upgrade/report/describes_change_test.dart
index 96410cb..3d93541 100644
--- a/test/upgrade/report/describes_change_test.dart
+++ b/test/upgrade/report/describes_change_test.dart
@@ -9,11 +9,11 @@
void main() {
test('Shows count of discontinued packages', () async {
- final server = await servePackages();
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0');
+ });
- server.serve('foo', '2.0.0');
-
- server.discontinue('foo');
+ globalPackageServer!.add((builder) => builder..discontinue('foo'));
// Create the first lockfile.
await d.appDir({'foo': '2.0.0'}).create();
@@ -33,11 +33,12 @@
});
test('shows how package changed from previous lockfile', () async {
- await servePackages()
- ..serve('unchanged', '1.0.0')
- ..serve('version_changed', '1.0.0')
- ..serve('version_changed', '2.0.0')
- ..serve('source_changed', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('unchanged', '1.0.0');
+ builder.serve('version_changed', '1.0.0');
+ builder.serve('version_changed', '2.0.0');
+ builder.serve('source_changed', '1.0.0');
+ });
await d.dir('source_changed', [
d.libDir('source_changed'),
diff --git a/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index ef987b9..7a232d0 100644
--- a/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -11,13 +11,14 @@
test(
'Shows newer versions available for packages that are locked and not being upgraded',
() async {
- await servePackages()
- ..serve('not_upgraded', '1.0.0')
- ..serve('not_upgraded', '2.0.0')
- ..serve('not_upgraded', '3.0.0-dev')
- ..serve('upgraded', '1.0.0')
- ..serve('upgraded', '2.0.0')
- ..serve('upgraded', '3.0.0-dev');
+ await servePackages((builder) {
+ builder.serve('not_upgraded', '1.0.0');
+ builder.serve('not_upgraded', '2.0.0');
+ builder.serve('not_upgraded', '3.0.0-dev');
+ builder.serve('upgraded', '1.0.0');
+ builder.serve('upgraded', '2.0.0');
+ builder.serve('upgraded', '3.0.0-dev');
+ });
// Constraint everything to the first version.
await d.appDir({'not_upgraded': '1.0.0', 'upgraded': '1.0.0'}).create();
diff --git a/test/upgrade/report/highlights_overrides_test.dart b/test/upgrade/report/highlights_overrides_test.dart
index 93f9f3b..94608d9 100644
--- a/test/upgrade/report/highlights_overrides_test.dart
+++ b/test/upgrade/report/highlights_overrides_test.dart
@@ -9,8 +9,7 @@
void main() {
test('highlights overridden packages', () async {
- final server = await servePackages();
- server.serve('overridden', '1.0.0');
+ await servePackages((builder) => builder.serve('overridden', '1.0.0'));
await d.dir(appPath, [
d.pubspec({
diff --git a/test/upgrade/report/leading_character_shows_change_test.dart b/test/upgrade/report/leading_character_shows_change_test.dart
index 88f7ed2..d7f870c 100644
--- a/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/test/upgrade/report/leading_character_shows_change_test.dart
@@ -9,16 +9,17 @@
void main() {
test('the character before each package describes the change', () async {
- await servePackages()
- ..serve('added', '1.0.0')
- ..serve('downgraded', '1.0.0')
- ..serve('downgraded', '2.0.0')
- ..serve('overridden', '1.0.0')
- ..serve('removed', '1.0.0')
- ..serve('source_changed', '1.0.0')
- ..serve('upgraded', '1.0.0')
- ..serve('upgraded', '2.0.0')
- ..serve('unchanged', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('added', '1.0.0');
+ builder.serve('downgraded', '1.0.0');
+ builder.serve('downgraded', '2.0.0');
+ builder.serve('overridden', '1.0.0');
+ builder.serve('removed', '1.0.0');
+ builder.serve('source_changed', '1.0.0');
+ builder.serve('upgraded', '1.0.0');
+ builder.serve('upgraded', '2.0.0');
+ builder.serve('unchanged', '1.0.0');
+ });
await d.dir('description_changed_1', [
d.libDir('description_changed'),
diff --git a/test/upgrade/report/shows_newer_available_versions_test.dart b/test/upgrade/report/shows_newer_available_versions_test.dart
index 39d4e1a..4c1ca56 100644
--- a/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -9,26 +9,28 @@
void main() {
test('shows how many newer versions are available', () async {
- await servePackages()
- ..serve('multiple_newer', '1.0.0')
- ..serve('multiple_newer', '1.0.1-unstable.1')
- ..serve('multiple_newer', '1.0.1')
- ..serve('multiple_newer', '1.0.2-unstable.1')
- ..serve('multiple_newer_stable', '1.0.0')
- ..serve('multiple_newer_stable', '1.0.1')
- ..serve('multiple_newer_stable', '1.0.2')
- ..serve('multiple_newer_unstable', '1.0.0')
- ..serve('multiple_newer_unstable', '1.0.1-unstable.1')
- ..serve('multiple_newer_unstable', '1.0.1-unstable.2')
- ..serve('multiple_newer_unstable2', '1.0.1-unstable.1')
- ..serve('multiple_newer_unstable2', '1.0.1-unstable.2')
- ..serve('no_newer', '1.0.0')
- ..serve('one_newer_unstable', '1.0.0')
- ..serve('one_newer_unstable', '1.0.1-unstable.1')
- ..serve('one_newer_unstable2', '1.0.1-unstable.1')
- ..serve('one_newer_unstable2', '1.0.1-unstable.2')
- ..serve('one_newer_stable', '1.0.0')
- ..serve('one_newer_stable', '1.0.1');
+ await servePackages((builder) {
+ builder.serve('multiple_newer', '1.0.0');
+ builder.serve('multiple_newer', '1.0.1-unstable.1');
+ builder.serve('multiple_newer', '1.0.1');
+ builder.serve('multiple_newer', '1.0.2-unstable.1');
+ builder.serve('multiple_newer_stable', '1.0.0');
+ builder.serve('multiple_newer_stable', '1.0.1');
+ builder.serve('multiple_newer_stable', '1.0.2');
+ builder.serve('multiple_newer_unstable', '1.0.0');
+ builder.serve('multiple_newer_unstable', '1.0.1-unstable.1');
+ builder.serve('multiple_newer_unstable', '1.0.1-unstable.2');
+ builder.serve('multiple_newer_unstable2', '1.0.1-unstable.1');
+ builder.serve('multiple_newer_unstable2', '1.0.1-unstable.2');
+ builder.serve('multiple_newer_unstable2', '1.0.1-unstable.2');
+ builder.serve('no_newer', '1.0.0');
+ builder.serve('one_newer_unstable', '1.0.0');
+ builder.serve('one_newer_unstable', '1.0.1-unstable.1');
+ builder.serve('one_newer_unstable2', '1.0.1-unstable.1');
+ builder.serve('one_newer_unstable2', '1.0.1-unstable.2');
+ builder.serve('one_newer_stable', '1.0.0');
+ builder.serve('one_newer_stable', '1.0.1');
+ });
// Constraint everything to the first version.
await d.appDir({
diff --git a/test/upgrade/report/shows_number_of_changed_dependencies_test.dart b/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
index 91ba5aa..5ba3af6 100644
--- a/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
+++ b/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
@@ -11,10 +11,11 @@
test(
'does not show how many newer versions are available for '
'packages that are locked and not being upgraded', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0')
- ..serve('c', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0');
+ builder.serve('c', '2.0.0');
+ });
await d.appDir({'a': 'any'}).create();
diff --git a/test/upgrade/report/shows_pub_outdated_test.dart b/test/upgrade/report/shows_pub_outdated_test.dart
index 0fdb322..9c0fa3d 100644
--- a/test/upgrade/report/shows_pub_outdated_test.dart
+++ b/test/upgrade/report/shows_pub_outdated_test.dart
@@ -9,23 +9,24 @@
void main() {
test('shows pub outdated', () async {
- await servePackages()
- ..serve('multiple_newer', '1.0.0')
- ..serve('multiple_newer', '1.0.1-unstable.1')
- ..serve('multiple_newer', '1.0.1')
- ..serve('multiple_newer', '1.0.2-unstable.1')
- ..serve('multiple_newer', '1.0.2-unstable.2')
- ..serve('multiple_newer_stable', '1.0.0')
- ..serve('multiple_newer_stable', '1.0.1')
- ..serve('multiple_newer_stable', '1.0.2')
- ..serve('multiple_newer_unstable', '1.0.0')
- ..serve('multiple_newer_unstable', '1.0.1-unstable.1')
- ..serve('multiple_newer_unstable', '1.0.1-unstable.2')
- ..serve('no_newer', '1.0.0')
- ..serve('one_newer_unstable', '1.0.0')
- ..serve('one_newer_unstable', '1.0.1-unstable.1')
- ..serve('one_newer_stable', '1.0.0')
- ..serve('one_newer_stable', '1.0.1');
+ await servePackages((builder) {
+ builder.serve('multiple_newer', '1.0.0');
+ builder.serve('multiple_newer', '1.0.1-unstable.1');
+ builder.serve('multiple_newer', '1.0.1');
+ builder.serve('multiple_newer', '1.0.2-unstable.1');
+ builder.serve('multiple_newer', '1.0.2-unstable.2');
+ builder.serve('multiple_newer_stable', '1.0.0');
+ builder.serve('multiple_newer_stable', '1.0.1');
+ builder.serve('multiple_newer_stable', '1.0.2');
+ builder.serve('multiple_newer_unstable', '1.0.0');
+ builder.serve('multiple_newer_unstable', '1.0.1-unstable.1');
+ builder.serve('multiple_newer_unstable', '1.0.1-unstable.2');
+ builder.serve('no_newer', '1.0.0');
+ builder.serve('one_newer_unstable', '1.0.0');
+ builder.serve('one_newer_unstable', '1.0.1-unstable.1');
+ builder.serve('one_newer_stable', '1.0.0');
+ builder.serve('one_newer_stable', '1.0.1');
+ });
// Constraint everything to the first version.
await d.appDir({
diff --git a/test/upgrade/upgrade_major_versions_test.dart b/test/upgrade/upgrade_major_versions_test.dart
index c5f0994..c312717 100644
--- a/test/upgrade/upgrade_major_versions_test.dart
+++ b/test/upgrade/upgrade_major_versions_test.dart
@@ -10,13 +10,14 @@
void main() {
group('pub upgrade --major-versions', () {
test('bumps dependency constraints and shows summary report', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('bar', '0.1.0')
- ..serve('bar', '0.2.0')
- ..serve('baz', '1.0.0')
- ..serve('baz', '1.0.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('bar', '0.1.0');
+ builder.serve('bar', '0.2.0');
+ builder.serve('baz', '1.0.0');
+ builder.serve('baz', '1.0.1');
+ });
await d.appDir({
'foo': '^1.0.0',
@@ -41,21 +42,23 @@
'bar': '^0.2.0',
'baz': '^1.0.0',
}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '0.2.0'),
- d.packageConfigEntry(name: 'baz', version: '1.0.1'),
- ]).validate();
+
+ await d.appPackagesFile({
+ 'foo': '2.0.0',
+ 'bar': '0.2.0',
+ 'baz': '1.0.1',
+ }).validate();
});
test('bumps dev_dependency constraints and shows summary report', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('bar', '0.1.0')
- ..serve('bar', '0.2.0')
- ..serve('baz', '1.0.0')
- ..serve('baz', '1.0.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('bar', '0.1.0');
+ builder.serve('bar', '0.2.0');
+ builder.serve('baz', '1.0.0');
+ builder.serve('baz', '1.0.1');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -91,18 +94,20 @@
}),
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '0.2.0'),
- d.packageConfigEntry(name: 'baz', version: '1.0.1'),
- ]).validate();
+ await d.appPackagesFile({
+ 'foo': '2.0.0',
+ 'bar': '0.2.0',
+ 'baz': '1.0.1',
+ }).validate();
});
test('upgrades only the selected package', () async {
- final server = await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('bar', '0.1.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('bar', '0.1.0');
+ builder.serve('bar', '0.2.0');
+ });
await d.appDir({
'foo': '^1.0.0',
@@ -111,8 +116,6 @@
await pubGet();
- server.serve('bar', '0.1.1');
-
// 1 constraint should be updated
await pubUpgrade(
args: ['--major-versions', 'foo'],
@@ -127,17 +130,15 @@
'bar': '^0.1.0',
}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '2.0.0'),
- d.packageConfigEntry(name: 'bar', version: '0.1.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '2.0.0', 'bar': '0.1.0'}).validate();
});
test('chooses the latest version where possible', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ });
await d.appDir({'foo': '^1.0.0'}).create();
@@ -161,17 +162,17 @@
d.file('pubspec.lock', contains('3.0.0'))
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '3.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '3.0.0'}).validate();
});
test('overridden dependencies - no resolution', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
- ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
- ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
- ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'});
+ await servePackages(
+ (builder) => builder
+ ..serve('foo', '1.0.0', deps: {'bar': '^2.0.0'})
+ ..serve('foo', '2.0.0', deps: {'bar': '^1.0.0'})
+ ..serve('bar', '1.0.0', deps: {'foo': '^1.0.0'})
+ ..serve('bar', '2.0.0', deps: {'foo': '^2.0.0'}),
+ );
await d.dir(appPath, [
d.pubspec({
@@ -215,25 +216,23 @@
})
]).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '1.0.0'),
- ]).validate();
+ await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
});
test('upgrade should not downgrade any versions', () async {
/// The version solver solves the packages with the least number of
/// versions remaining, so we add more 'bar' packages to force 'foo' to be
/// resolved first
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0', pubspec: {
'dependencies': {'bar': '1.0.0'}
- })
- ..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0')
- ..serve('bar', '3.0.0')
- ..serve('bar', '4.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '2.0.0');
+ builder.serve('bar', '3.0.0');
+ builder.serve('bar', '4.0.0');
+ });
await d.appDir({
'foo': '^1.0.0',
@@ -256,10 +255,10 @@
'bar': '^4.0.0',
}).validate();
- await d.appPackageConfigFile([
- d.packageConfigEntry(name: 'foo', version: '1.0.0'),
- d.packageConfigEntry(name: 'bar', version: '4.0.0'),
- ]).validate();
+ await d.appPackagesFile({
+ 'foo': '1.0.0',
+ 'bar': '4.0.0',
+ }).validate();
});
});
}
diff --git a/test/upgrade/upgrade_null_safety_test.dart b/test/upgrade/upgrade_null_safety_test.dart
index 557c589..921c737 100644
--- a/test/upgrade/upgrade_null_safety_test.dart
+++ b/test/upgrade/upgrade_null_safety_test.dart
@@ -9,28 +9,29 @@
void main() {
group('pub upgrade --null-safety', () {
setUp(() async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.10.0<3.0.0'},
- })
- ..serve('foo', '2.0.0', pubspec: {
+ });
+ builder.serve('foo', '2.0.0', pubspec: {
'environment': {'sdk': '>=2.12.0<3.0.0'},
- })
- ..serve('bar', '1.0.0', pubspec: {
+ });
+ builder.serve('bar', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0<3.0.0'},
- })
- ..serve('bar', '2.0.0-nullsafety.0', pubspec: {
+ });
+ builder.serve('bar', '2.0.0-nullsafety.0', pubspec: {
'environment': {'sdk': '>=2.12.0<3.0.0'},
- })
- ..serve('baz', '1.0.0', pubspec: {
+ });
+ builder.serve('baz', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0<3.0.0'},
- })
- ..serve('has_conflict', '1.0.0', pubspec: {
+ });
+ builder.serve('has_conflict', '1.0.0', pubspec: {
'environment': {'sdk': '>=2.9.0<3.0.0'},
- })
- ..serve('has_conflict', '2.0.0', pubspec: {
+ });
+ builder.serve('has_conflict', '2.0.0', pubspec: {
'environment': {'sdk': '>=2.13.0<3.0.0'},
});
+ });
});
test('upgrades to null-safety versions', () async {
diff --git a/test/validator/gitignore_test.dart b/test/validator/gitignore_test.dart
index f7b02fe..1112934 100644
--- a/test/validator/gitignore_test.dart
+++ b/test/validator/gitignore_test.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:io';
-
import 'package:path/path.dart' as p;
import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';
@@ -84,22 +82,4 @@
exit_codes.DATA,
workingDirectory: packageRoot);
});
-
- test('Should not follow symlinks', () async {
- await d.git('myapp', [
- ...d.validPackage.contents,
- ]).create();
- final packageRoot = p.join(d.sandbox, 'myapp');
- await pubGet(
- environment: {'_PUB_TEST_SDK_VERSION': '1.12.0'},
- workingDirectory: packageRoot);
-
- Link(p.join(packageRoot, '.abc', 'itself')).createSync(
- packageRoot,
- recursive: true,
- );
-
- await expectValidation(contains('Package has 0 warnings.'), 0,
- workingDirectory: packageRoot);
- });
}
diff --git a/test/validator/null_safety_mixed_mode_test.dart b/test/validator/null_safety_mixed_mode_test.dart
index d62d051..e2a8dfb 100644
--- a/test/validator/null_safety_mixed_mode_test.dart
+++ b/test/validator/null_safety_mixed_mode_test.dart
@@ -45,13 +45,14 @@
group('should consider a package valid if it', () {
test('is not opting in to null-safety, but depends on package that is',
() async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'foo',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await setup(
@@ -60,13 +61,14 @@
});
test('is opting in to null-safety and depends on package that is',
() async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'foo',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await setup(
@@ -76,13 +78,14 @@
test('is opting in to null-safety has dev_dependency that is not',
() async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'foo',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.12.0 <3.0.0', devDependencies: {
@@ -95,13 +98,14 @@
group('should consider a package invalid if it', () {
test('is opting in to null-safety, but depends on package that is not',
() async {
- final server = await servePackages();
- server.serve(
- 'foo',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'foo',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
);
await setup(
@@ -130,16 +134,17 @@
test(
'is opting in to null-safety, but depends on package has file opting out',
() async {
- final server = await servePackages();
- server.serve('foo', '0.0.1', pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- }, contents: [
- d.dir('lib', [
- d.file('foo.dart', '''
+ await servePackages(
+ (server) => server.serve('foo', '0.0.1', pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ }, contents: [
+ d.dir('lib', [
+ d.file('foo.dart', '''
// @dart = 2.9
''')
- ])
- ]);
+ ])
+ ]),
+ );
await setup(
sdkConstraint: '>=2.12.0 <3.0.0', dependencies: {'foo': '^0.0.1'});
diff --git a/test/validator/relative_version_numbering_test.dart b/test/validator/relative_version_numbering_test.dart
index 2f3da5c..07e8dbc 100644
--- a/test/validator/relative_version_numbering_test.dart
+++ b/test/validator/relative_version_numbering_test.dart
@@ -13,7 +13,7 @@
Validator validator(Entrypoint entrypoint) => RelativeVersionNumberingValidator(
entrypoint,
- Uri.parse(globalServer.url),
+ Uri.parse(globalPackageServer!.url),
);
Future<void> setup({required String sdkConstraint}) async {
@@ -33,13 +33,14 @@
group('should consider a package valid if it', () {
test('is not opting in to null-safety with previous non-null-safe version',
() async {
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
@@ -49,21 +50,23 @@
test(
'is not opting in to null-safety with previous non-null-safe version. '
'Even with a later null-safe version', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '2.0.0',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
await expectValidation(validator);
@@ -71,13 +74,14 @@
test('is opting in to null-safety with previous null-safe version',
() async {
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
@@ -87,13 +91,14 @@
test(
'is opting in to null-safety using a pre-release of 2.12.0 '
'with previous null-safe version', () async {
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.12.0-dev <3.0.0');
@@ -103,21 +108,23 @@
test(
'is opting in to null-safety with previous null-safe version. '
'Even with a later non-null-safe version', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '2.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
await expectValidation(validator);
@@ -125,13 +132,13 @@
test('is opting in to null-safety with no existing versions', () async {
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
- await servePackages();
+ await servePackages((x) => x);
await expectValidation(validator);
});
test('is not opting in to null-safety with no existing versions', () async {
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
- await servePackages();
+ await servePackages((x) => x);
await expectValidation(validator);
});
@@ -139,21 +146,23 @@
test(
'is not opting in to null-safety with previous null-safe stable version. '
'With an in-between not null-safe prerelease', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
await expectValidation(validator);
@@ -162,21 +171,23 @@
test(
'opts in to null-safety, with previous stable version not-null-safe. '
'With an in-between non-null-safe prerelease', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
await expectValidation(validator);
@@ -186,13 +197,14 @@
group('should warn if ', () {
test('opts in to null-safety, with previous version not-null-safe',
() async {
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
@@ -203,13 +215,14 @@
'is not opting in to null-safety with no existing stable versions. '
'With a previous in-between null-safe prerelease', () async {
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await expectValidation(validator, hints: isNotEmpty);
@@ -217,21 +230,23 @@
test(
'is not opting in to null-safety with previous non-null-safe stable version. '
'With an in-between null-safe prerelease', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
await expectValidation(validator, hints: isNotEmpty);
@@ -240,21 +255,23 @@
test(
'opts in to null-safety, with previous version not-null-safe. '
'Even with a later null-safe version', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '2.0.0',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
await expectValidation(validator, hints: isNotEmpty);
@@ -262,13 +279,14 @@
test('is not opting in to null-safety with previous null-safe version',
() async {
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ ),
);
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
@@ -278,21 +296,23 @@
test(
'is not opting in to null-safety with previous null-safe version. '
'Even with a later non-null-safe version', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '2.0.0',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '2.0.0',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.9.0 <3.0.0');
await expectValidation(validator, hints: isNotEmpty);
@@ -301,21 +321,23 @@
test(
'is opting in to null-safety with previous null-safe stable version. '
'with an in-between non-null-safe prerelease', () async {
- await servePackages()
- ..serve(
- 'test_pkg',
- '0.0.1',
- pubspec: {
- 'environment': {'sdk': '>=2.12.0<3.0.0'}
- },
- )
- ..serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
- );
+ await servePackages(
+ (server) => server
+ ..serve(
+ 'test_pkg',
+ '0.0.1',
+ pubspec: {
+ 'environment': {'sdk': '>=2.12.0<3.0.0'}
+ },
+ )
+ ..serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
+ );
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
await expectValidation(validator, hints: isNotEmpty);
@@ -325,13 +347,14 @@
'is opting in to null-safety with no existing stable versions. '
'With a previous non-null-safe prerelease', () async {
await setup(sdkConstraint: '>=2.12.0 <3.0.0');
- final server = await servePackages();
- server.serve(
- 'test_pkg',
- '0.0.2-dev',
- pubspec: {
- 'environment': {'sdk': '>=2.9.0<3.0.0'}
- },
+ await servePackages(
+ (server) => server.serve(
+ 'test_pkg',
+ '0.0.2-dev',
+ pubspec: {
+ 'environment': {'sdk': '>=2.9.0<3.0.0'}
+ },
+ ),
);
await expectValidation(validator, hints: isNotEmpty);
});
diff --git a/test/version_solver_test.dart b/test/version_solver_test.dart
index d36a16f..261c493 100644
--- a/test/version_solver_test.dart
+++ b/test/version_solver_test.dart
@@ -40,13 +40,14 @@
});
test('simple dependency tree', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'aa': '1.0.0', 'ab': '1.0.0'})
- ..serve('aa', '1.0.0')
- ..serve('ab', '1.0.0')
- ..serve('b', '1.0.0', deps: {'ba': '1.0.0', 'bb': '1.0.0'})
- ..serve('ba', '1.0.0')
- ..serve('bb', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'aa': '1.0.0', 'ab': '1.0.0'});
+ builder.serve('aa', '1.0.0');
+ builder.serve('ab', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {'ba': '1.0.0', 'bb': '1.0.0'});
+ builder.serve('ba', '1.0.0');
+ builder.serve('bb', '1.0.0');
+ });
await d.appDir({'a': '1.0.0', 'b': '1.0.0'}).create();
await expectResolves(result: {
@@ -60,14 +61,15 @@
});
test('shared dependency with overlapping constraints', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'shared': '>=2.0.0 <4.0.0'})
- ..serve('b', '1.0.0', deps: {'shared': '>=3.0.0 <5.0.0'})
- ..serve('shared', '2.0.0')
- ..serve('shared', '3.0.0')
- ..serve('shared', '3.6.9')
- ..serve('shared', '4.0.0')
- ..serve('shared', '5.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'shared': '>=2.0.0 <4.0.0'});
+ builder.serve('b', '1.0.0', deps: {'shared': '>=3.0.0 <5.0.0'});
+ builder.serve('shared', '2.0.0');
+ builder.serve('shared', '3.0.0');
+ builder.serve('shared', '3.6.9');
+ builder.serve('shared', '4.0.0');
+ builder.serve('shared', '5.0.0');
+ });
await d.appDir({'a': '1.0.0', 'b': '1.0.0'}).create();
await expectResolves(
@@ -77,15 +79,16 @@
test(
'shared dependency where dependent version in turn affects other '
'dependencies', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.0.1', deps: {'bang': '1.0.0'})
- ..serve('foo', '1.0.2', deps: {'whoop': '1.0.0'})
- ..serve('foo', '1.0.3', deps: {'zoop': '1.0.0'})
- ..serve('bar', '1.0.0', deps: {'foo': '<=1.0.1'})
- ..serve('bang', '1.0.0')
- ..serve('whoop', '1.0.0')
- ..serve('zoop', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.0.1', deps: {'bang': '1.0.0'});
+ builder.serve('foo', '1.0.2', deps: {'whoop': '1.0.0'});
+ builder.serve('foo', '1.0.3', deps: {'zoop': '1.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'foo': '<=1.0.1'});
+ builder.serve('bang', '1.0.0');
+ builder.serve('whoop', '1.0.0');
+ builder.serve('zoop', '1.0.0');
+ });
await d.appDir({'foo': '<=1.0.2', 'bar': '1.0.0'}).create();
await expectResolves(
@@ -93,21 +96,23 @@
});
test('circular dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('bar', '1.0.0', deps: {'foo': '1.0.0'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'foo': '1.0.0'});
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
});
test('removed dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0', deps: {'baz': '1.0.0'})
- ..serve('baz', '1.0.0', deps: {'foo': '2.0.0'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '2.0.0', deps: {'baz': '1.0.0'});
+ builder.serve('baz', '1.0.0', deps: {'foo': '2.0.0'});
+ });
await d.appDir({'foo': '1.0.0', 'bar': 'any'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'}, tries: 2);
@@ -116,13 +121,14 @@
void withLockFile() {
test('with compatible locked dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
- ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.0.1')
- ..serve('bar', '1.0.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
+ builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.0.1');
+ builder.serve('bar', '1.0.2');
+ });
await d.appDir({'foo': '1.0.1'}).create();
await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -132,13 +138,14 @@
});
test('with incompatible locked dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
- ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.0.1')
- ..serve('bar', '1.0.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
+ builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.0.1');
+ builder.serve('bar', '1.0.2');
+ });
await d.appDir({'foo': '1.0.1'}).create();
await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -148,14 +155,15 @@
});
test('with unrelated locked dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
- ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.0.1')
- ..serve('bar', '1.0.2')
- ..serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
+ builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.0.1');
+ builder.serve('bar', '1.0.2');
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({'baz': '1.0.0'}).create();
await expectResolves(result: {'baz': '1.0.0'});
@@ -167,16 +175,17 @@
test(
'unlocks dependencies if necessary to ensure that a new '
'dependency is satisfied', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '<2.0.0'})
- ..serve('bar', '1.0.0', deps: {'baz': '<2.0.0'})
- ..serve('baz', '1.0.0', deps: {'qux': '<2.0.0'})
- ..serve('qux', '1.0.0')
- ..serve('foo', '2.0.0', deps: {'bar': '<3.0.0'})
- ..serve('bar', '2.0.0', deps: {'baz': '<3.0.0'})
- ..serve('baz', '2.0.0', deps: {'qux': '<3.0.0'})
- ..serve('qux', '2.0.0')
- ..serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '<2.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'baz': '<2.0.0'});
+ builder.serve('baz', '1.0.0', deps: {'qux': '<2.0.0'});
+ builder.serve('qux', '1.0.0');
+ builder.serve('foo', '2.0.0', deps: {'bar': '<3.0.0'});
+ builder.serve('bar', '2.0.0', deps: {'baz': '<3.0.0'});
+ builder.serve('baz', '2.0.0', deps: {'qux': '<3.0.0'});
+ builder.serve('qux', '2.0.0');
+ builder.serve('newdep', '2.0.0', deps: {'baz': '>=1.5.0'});
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {
@@ -200,10 +209,11 @@
test(
"produces a nice message for a locked dependency that's the only "
'version of its package', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '>=2.0.0'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '>=2.0.0'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '2.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '2.0.0'});
@@ -219,27 +229,30 @@
void rootDependency() {
test('with root source', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', deps: {'myapp': 'any'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0'});
});
test('with mismatched sources', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'myapp': 'any'})
- ..serve('bar', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'myapp': 'any'});
+ builder.serve('bar', '1.0.0', deps: {
'myapp': {'git': 'http://nowhere.com/'}
});
+ });
await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
});
test('with wrong version', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', deps: {'myapp': '>0.0.0'});
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'myapp': '>0.0.0'});
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -252,9 +265,10 @@
void devDependency() {
test("includes root package's dev dependencies", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -267,9 +281,10 @@
});
test("includes dev dependency's transitive dependencies", () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -282,9 +297,10 @@
});
test("ignores transitive dependency's dev dependencies", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'dev_dependencies': {'bar': '1.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'dev_dependencies': {'bar': '1.0.0'}
+ });
});
await d.appDir({'foo': '1.0.0'}).create();
@@ -293,10 +309,11 @@
group('with both a dev and regular dependency', () {
test('succeeds when both are satisfied', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -310,8 +327,9 @@
});
test("fails when main dependency isn't satisfied", () async {
- final server = await servePackages();
- server.serve('foo', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -329,8 +347,9 @@
});
test("fails when dev dependency isn't satisfied", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -348,8 +367,9 @@
});
test('fails when dev and main constraints are incompatible', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -366,8 +386,9 @@
});
test('fails when dev and main sources are incompatible', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -386,8 +407,9 @@
});
test('fails when dev and main descriptions are incompatible', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -411,9 +433,10 @@
void unsolvable() {
test('no version that matches constraint', () async {
- await servePackages()
- ..serve('foo', '2.0.0')
- ..serve('foo', '2.1.3');
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '2.1.3');
+ });
await d.appDir({'foo': '>=1.0.0 <2.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace("""
@@ -423,11 +446,12 @@
});
test('no version that matches combined constraint', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared': '>=2.0.0 <3.0.0'})
- ..serve('bar', '1.0.0', deps: {'shared': '>=2.9.0 <4.0.0'})
- ..serve('shared', '2.5.0')
- ..serve('shared', '3.5.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared': '>=2.0.0 <3.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'shared': '>=2.9.0 <4.0.0'});
+ builder.serve('shared', '2.5.0');
+ builder.serve('shared', '3.5.0');
+ });
await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -442,11 +466,12 @@
});
test('disjoint constraints', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared': '<=2.0.0'})
- ..serve('bar', '1.0.0', deps: {'shared': '>3.0.0'})
- ..serve('shared', '2.0.0')
- ..serve('shared', '4.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared': '<=2.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'shared': '>3.0.0'});
+ builder.serve('shared', '2.0.0');
+ builder.serve('shared', '4.0.0');
+ });
await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -458,18 +483,20 @@
});
test('mismatched descriptions', () async {
- var otherServer = await startPackageServer();
- otherServer.serve('shared', '1.0.0');
+ var otherServer = await PackageServer.start((builder) {
+ builder.serve('shared', '1.0.0');
+ });
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared': '1.0.0'})
- ..serve('bar', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared': '1.0.0'});
+ builder.serve('bar', '1.0.0', deps: {
'shared': {
'hosted': {'name': 'shared', 'url': otherServer.url},
'version': '1.0.0'
}
- })
- ..serve('shared', '1.0.0');
+ });
+ builder.serve('shared', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
@@ -488,12 +515,13 @@
test('mismatched sources', () async {
await d.dir('shared', [d.libPubspec('shared', '1.0.0')]).create();
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'shared': '1.0.0'})
- ..serve('bar', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'shared': '1.0.0'});
+ builder.serve('bar', '1.0.0', deps: {
'shared': {'path': p.join(d.sandbox, 'shared')}
- })
- ..serve('shared', '1.0.0');
+ });
+ builder.serve('shared', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0', 'bar': '1.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -506,11 +534,12 @@
});
test('no valid solution', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'b': '1.0.0'})
- ..serve('a', '2.0.0', deps: {'b': '2.0.0'})
- ..serve('b', '1.0.0', deps: {'a': '2.0.0'})
- ..serve('b', '2.0.0', deps: {'a': '1.0.0'});
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'b': '1.0.0'});
+ builder.serve('a', '2.0.0', deps: {'b': '2.0.0'});
+ builder.serve('b', '1.0.0', deps: {'a': '2.0.0'});
+ builder.serve('b', '2.0.0', deps: {'a': '1.0.0'});
+ });
await d.appDir({'a': 'any', 'b': 'any'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -525,9 +554,10 @@
// This is a regression test for #15550.
test('no version that matches while backtracking', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0');
+ });
await d.appDir({'a': 'any', 'b': '>1.0.0'}).create();
await expectResolves(error: equalsIgnoringWhitespace("""
@@ -538,18 +568,19 @@
// This is a regression test for #18300.
test('issue 18300', () async {
- await servePackages()
- ..serve('analyzer', '0.12.2')
- ..serve('angular', '0.10.0',
- deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
- ..serve('angular', '0.9.11',
- deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
- ..serve('angular', '0.9.10',
- deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'})
- ..serve('collection', '0.9.0')
- ..serve('collection', '0.9.1')
- ..serve('di', '0.0.37', deps: {'analyzer': '>=0.13.0 <0.14.0'})
- ..serve('di', '0.0.36', deps: {'analyzer': '>=0.13.0 <0.14.0'});
+ await servePackages((builder) {
+ builder.serve('analyzer', '0.12.2');
+ builder.serve('angular', '0.10.0',
+ deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
+ builder.serve('angular', '0.9.11',
+ deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
+ builder.serve('angular', '0.9.10',
+ deps: {'di': '>=0.0.32 <0.1.0', 'collection': '>=0.9.1 <1.0.0'});
+ builder.serve('collection', '0.9.0');
+ builder.serve('collection', '0.9.1');
+ builder.serve('di', '0.0.37', deps: {'analyzer': '>=0.13.0 <0.14.0'});
+ builder.serve('di', '0.0.36', deps: {'analyzer': '>=0.13.0 <0.14.0'});
+ });
await d.appDir({'angular': 'any', 'collection': 'any'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -589,16 +620,17 @@
});
test('fail if all versions have bad source in dep', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {
'bar': {'bad': 'any'}
- })
- ..serve('foo', '1.0.1', deps: {
+ });
+ builder.serve('foo', '1.0.1', deps: {
'baz': {'bad': 'any'}
- })
- ..serve('foo', '1.0.2', deps: {
+ });
+ builder.serve('foo', '1.0.2', deps: {
'bang': {'bad': 'any'}
});
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -614,15 +646,16 @@
});
test('ignore versions with bad source in dep', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('foo', '1.0.1', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('foo', '1.0.1', deps: {
'bar': {'bad': 'any'}
- })
- ..serve('foo', '1.0.2', deps: {
+ });
+ builder.serve('foo', '1.0.2', deps: {
'bar': {'bad': 'any'}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'}, tries: 2);
@@ -630,10 +663,11 @@
// Issue 1853
test('reports a nice error across a collapsed cause', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0', deps: {'baz': 'any'})
- ..serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ builder.serve('baz', '1.0.0');
+ });
await d.dir('baz', [d.libPubspec('baz', '1.0.0')]).create();
await d.appDir({
@@ -651,24 +685,28 @@
void backtracking() {
test('circular dependency on older version', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '2.0.0', deps: {'b': '1.0.0'})
- ..serve('b', '1.0.0', deps: {'a': '1.0.0'});
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '2.0.0', deps: {'b': '1.0.0'});
+ builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
+ });
await d.appDir({'a': '>=1.0.0'}).create();
await expectResolves(result: {'a': '1.0.0'}, tries: 2);
});
test('diamond dependency graph', () async {
- await servePackages()
- ..serve('a', '2.0.0', deps: {'c': '^1.0.0'})
- ..serve('a', '1.0.0')
- ..serve('b', '2.0.0', deps: {'c': '^3.0.0'})
- ..serve('b', '1.0.0', deps: {'c': '^2.0.0'})
- ..serve('c', '3.0.0')
- ..serve('c', '2.0.0')
- ..serve('c', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '2.0.0', deps: {'c': '^1.0.0'});
+ builder.serve('a', '1.0.0');
+
+ builder.serve('b', '2.0.0', deps: {'c': '^3.0.0'});
+ builder.serve('b', '1.0.0', deps: {'c': '^2.0.0'});
+
+ builder.serve('c', '3.0.0');
+ builder.serve('c', '2.0.0');
+ builder.serve('c', '1.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any'}).create();
await expectResolves(result: {'a': '1.0.0', 'b': '2.0.0', 'c': '3.0.0'});
@@ -678,16 +716,20 @@
// requirement only exists because of both a and b. The solver should be able
// to deduce c 2.0.0's incompatibility and select c 1.0.0 instead.
test('backjumps after a partial satisfier', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'x': '>=1.0.0'})
- ..serve('b', '1.0.0', deps: {'x': '<2.0.0'})
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0', deps: {'a': 'any', 'b': 'any'})
- ..serve('x', '0.0.0')
- ..serve('x', '1.0.0', deps: {'y': '1.0.0'})
- ..serve('x', '2.0.0')
- ..serve('y', '1.0.0')
- ..serve('y', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'x': '>=1.0.0'});
+ builder.serve('b', '1.0.0', deps: {'x': '<2.0.0'});
+
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0', deps: {'a': 'any', 'b': 'any'});
+
+ builder.serve('x', '0.0.0');
+ builder.serve('x', '1.0.0', deps: {'y': '1.0.0'});
+ builder.serve('x', '2.0.0');
+
+ builder.serve('y', '1.0.0');
+ builder.serve('y', '2.0.0');
+ });
await d.appDir({'c': 'any', 'y': '^2.0.0'}).create();
await expectResolves(result: {'c': '1.0.0', 'y': '2.0.0'}, tries: 2);
@@ -696,15 +738,16 @@
// This matches the Branching Error Reporting example in the version solver
// documentation, and tests that we display line numbers correctly.
test('branching error reporting', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'a': '^1.0.0', 'b': '^1.0.0'})
- ..serve('foo', '1.1.0', deps: {'x': '^1.0.0', 'y': '^1.0.0'})
- ..serve('a', '1.0.0', deps: {'b': '^2.0.0'})
- ..serve('b', '1.0.0')
- ..serve('b', '2.0.0')
- ..serve('x', '1.0.0', deps: {'y': '^2.0.0'})
- ..serve('y', '1.0.0')
- ..serve('y', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'a': '^1.0.0', 'b': '^1.0.0'});
+ builder.serve('foo', '1.1.0', deps: {'x': '^1.0.0', 'y': '^1.0.0'});
+ builder.serve('a', '1.0.0', deps: {'b': '^2.0.0'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '2.0.0');
+ builder.serve('x', '1.0.0', deps: {'y': '^2.0.0'});
+ builder.serve('y', '1.0.0');
+ builder.serve('y', '2.0.0');
+ });
await d.appDir({'foo': '^1.0.0'}).create();
await expectResolves(
@@ -729,13 +772,14 @@
// will resolve the problem. This test validates that b, which is farther
// in the dependency graph from myapp is downgraded first.
test('rolls back leaf versions first', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'b': 'any'})
- ..serve('a', '2.0.0', deps: {'b': 'any', 'c': '2.0.0'})
- ..serve('b', '1.0.0')
- ..serve('b', '2.0.0', deps: {'c': '1.0.0'})
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'b': 'any'});
+ builder.serve('a', '2.0.0', deps: {'b': 'any', 'c': '2.0.0'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '2.0.0', deps: {'c': '1.0.0'});
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ });
await d.appDir({'a': 'any'}).create();
await expectResolves(result: {'a': '2.0.0', 'b': '1.0.0', 'c': '2.0.0'});
@@ -744,14 +788,15 @@
// Only one version of baz, so foo and bar will have to downgrade until they
// reach it.
test('simple transitive', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '2.0.0', deps: {'bar': '2.0.0'})
- ..serve('foo', '3.0.0', deps: {'bar': '3.0.0'})
- ..serve('bar', '1.0.0', deps: {'baz': 'any'})
- ..serve('bar', '2.0.0', deps: {'baz': '2.0.0'})
- ..serve('bar', '3.0.0', deps: {'baz': '3.0.0'})
- ..serve('baz', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
+ builder.serve('foo', '3.0.0', deps: {'bar': '3.0.0'});
+ builder.serve('bar', '1.0.0', deps: {'baz': 'any'});
+ builder.serve('bar', '2.0.0', deps: {'baz': '2.0.0'});
+ builder.serve('bar', '3.0.0', deps: {'baz': '3.0.0'});
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(
@@ -763,13 +808,14 @@
// make sure b has more versions than a so that the solver tries a first
// since it sorts sibling dependencies by number of versions.
test('backjump to nearer unsatisfied package', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'c': '1.0.0'})
- ..serve('a', '2.0.0', deps: {'c': '2.0.0-nonexistent'})
- ..serve('b', '1.0.0')
- ..serve('b', '2.0.0')
- ..serve('b', '3.0.0')
- ..serve('c', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'c': '1.0.0'});
+ builder.serve('a', '2.0.0', deps: {'c': '2.0.0-nonexistent'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '2.0.0');
+ builder.serve('b', '3.0.0');
+ builder.serve('c', '1.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any'}).create();
await expectResolves(
@@ -793,17 +839,18 @@
test('successful backjump to conflicting source', () async {
await d.dir('a', [d.libPubspec('a', '1.0.0')]).create();
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0', deps: {'a': 'any'})
- ..serve('b', '2.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {'a': 'any'});
+ builder.serve('b', '2.0.0', deps: {
'a': {'path': p.join(d.sandbox, 'a')}
- })
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0')
- ..serve('c', '3.0.0')
- ..serve('c', '4.0.0')
- ..serve('c', '5.0.0');
+ });
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ builder.serve('c', '3.0.0');
+ builder.serve('c', '4.0.0');
+ builder.serve('c', '5.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
await expectResolves(result: {'a': '1.0.0', 'b': '1.0.0', 'c': '5.0.0'});
@@ -811,22 +858,24 @@
// Like the above test, but for a conflicting description.
test('successful backjump to conflicting description', () async {
- var otherServer = await startPackageServer();
- otherServer.serve('a', '1.0.0');
+ var otherServer = await PackageServer.start((builder) {
+ builder.serve('a', '1.0.0');
+ });
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0', deps: {'a': 'any'})
- ..serve('b', '2.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {'a': 'any'});
+ builder.serve('b', '2.0.0', deps: {
'a': {
'hosted': {'name': 'a', 'url': otherServer.url}
}
- })
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0')
- ..serve('c', '3.0.0')
- ..serve('c', '4.0.0')
- ..serve('c', '5.0.0');
+ });
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ builder.serve('c', '3.0.0');
+ builder.serve('c', '4.0.0');
+ builder.serve('c', '5.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
await expectResolves(result: {'a': '1.0.0', 'b': '1.0.0', 'c': '5.0.0'});
@@ -837,16 +886,17 @@
test('failing backjump to conflicting source', () async {
await d.dir('a', [d.libPubspec('a', '1.0.0')]).create();
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {
'a': {'path': p.join(d.sandbox, 'shared')}
- })
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0')
- ..serve('c', '3.0.0')
- ..serve('c', '4.0.0')
- ..serve('c', '5.0.0');
+ });
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ builder.serve('c', '3.0.0');
+ builder.serve('c', '4.0.0');
+ builder.serve('c', '5.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -857,21 +907,23 @@
});
test('failing backjump to conflicting description', () async {
- var otherServer = await startPackageServer();
- otherServer.serve('a', '1.0.0');
+ var otherServer = await PackageServer.start((builder) {
+ builder.serve('a', '1.0.0');
+ });
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {
'a': {
'hosted': {'name': 'a', 'url': otherServer.url}
}
- })
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0')
- ..serve('c', '3.0.0')
- ..serve('c', '4.0.0')
- ..serve('c', '5.0.0');
+ });
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ builder.serve('c', '3.0.0');
+ builder.serve('c', '4.0.0');
+ builder.serve('c', '5.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any', 'c': 'any'}).create();
await expectResolves(
@@ -890,37 +942,39 @@
// Since b has fewer versions, it will be traversed first, which means a will
// come later. Since later selections are revised first, a gets downgraded.
test('traverse into package with fewer versions first', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'c': 'any'})
- ..serve('a', '2.0.0', deps: {'c': 'any'})
- ..serve('a', '3.0.0', deps: {'c': 'any'})
- ..serve('a', '4.0.0', deps: {'c': 'any'})
- ..serve('a', '5.0.0', deps: {'c': '1.0.0'})
- ..serve('b', '1.0.0', deps: {'c': 'any'})
- ..serve('b', '2.0.0', deps: {'c': 'any'})
- ..serve('b', '3.0.0', deps: {'c': 'any'})
- ..serve('b', '4.0.0', deps: {'c': '2.0.0'})
- ..serve('c', '1.0.0')
- ..serve('c', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'c': 'any'});
+ builder.serve('a', '2.0.0', deps: {'c': 'any'});
+ builder.serve('a', '3.0.0', deps: {'c': 'any'});
+ builder.serve('a', '4.0.0', deps: {'c': 'any'});
+ builder.serve('a', '5.0.0', deps: {'c': '1.0.0'});
+ builder.serve('b', '1.0.0', deps: {'c': 'any'});
+ builder.serve('b', '2.0.0', deps: {'c': 'any'});
+ builder.serve('b', '3.0.0', deps: {'c': 'any'});
+ builder.serve('b', '4.0.0', deps: {'c': '2.0.0'});
+ builder.serve('c', '1.0.0');
+ builder.serve('c', '2.0.0');
+ });
await d.appDir({'a': 'any', 'b': 'any'}).create();
await expectResolves(result: {'a': '4.0.0', 'b': '4.0.0', 'c': '2.0.0'});
});
test('complex backtrack', () async {
- final server = await servePackages();
- // This sets up a hundred versions of foo and bar, 0.0.0 through 9.9.0. Each
- // version of foo depends on a baz with the same major version. Each version
- // of bar depends on a baz with the same minor version. There is only one
- // version of baz, 0.0.0, so only older versions of foo and bar will
- // satisfy it.
- server.serve('baz', '0.0.0');
- for (var i = 0; i < 10; i++) {
- for (var j = 0; j < 10; j++) {
- server.serve('foo', '$i.$j.0', deps: {'baz': '$i.0.0'});
- server.serve('bar', '$i.$j.0', deps: {'baz': '0.$j.0'});
+ await servePackages((builder) {
+ // This sets up a hundred versions of foo and bar, 0.0.0 through 9.9.0. Each
+ // version of foo depends on a baz with the same major version. Each version
+ // of bar depends on a baz with the same minor version. There is only one
+ // version of baz, 0.0.0, so only older versions of foo and bar will
+ // satisfy it.
+ builder.serve('baz', '0.0.0');
+ for (var i = 0; i < 10; i++) {
+ for (var j = 0; j < 10; j++) {
+ builder.serve('foo', '$i.$j.0', deps: {'baz': '$i.0.0'});
+ builder.serve('bar', '$i.$j.0', deps: {'baz': '0.$j.0'});
+ }
}
- }
+ });
await d.appDir({'foo': 'any', 'bar': 'any'}).create();
await expectResolves(
@@ -931,18 +985,19 @@
// versions of it is a waste of time: no possible versions can match. We need
// to jump past it to the most recent package that affected the constraint.
test('backjump past failed package on disjoint constraint', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {
'foo': 'any' // ok
- })
- ..serve('a', '2.0.0', deps: {
+ });
+ builder.serve('a', '2.0.0', deps: {
'foo': '<1.0.0' // disjoint with myapp's constraint on foo
- })
- ..serve('foo', '2.0.0')
- ..serve('foo', '2.0.1')
- ..serve('foo', '2.0.2')
- ..serve('foo', '2.0.3')
- ..serve('foo', '2.0.4');
+ });
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '2.0.1');
+ builder.serve('foo', '2.0.2');
+ builder.serve('foo', '2.0.3');
+ builder.serve('foo', '2.0.4');
+ });
await d.appDir({'a': 'any', 'foo': '>2.0.0'}).create();
await expectResolves(result: {'a': '1.0.0', 'foo': '2.0.4'});
@@ -953,13 +1008,14 @@
// would backtrack over the failed package instead of trying different
// versions of it.
test('finds solution with less strict constraint', () async {
- await servePackages()
- ..serve('a', '2.0.0')
- ..serve('a', '1.0.0')
- ..serve('b', '1.0.0', deps: {'a': '1.0.0'})
- ..serve('c', '1.0.0', deps: {'b': 'any'})
- ..serve('d', '2.0.0', deps: {'myapp': 'any'})
- ..serve('d', '1.0.0', deps: {'myapp': '<1.0.0'});
+ await servePackages((builder) {
+ builder.serve('a', '2.0.0');
+ builder.serve('a', '1.0.0');
+ builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
+ builder.serve('c', '1.0.0', deps: {'b': 'any'});
+ builder.serve('d', '2.0.0', deps: {'myapp': 'any'});
+ builder.serve('d', '1.0.0', deps: {'myapp': '<1.0.0'});
+ });
await d.appDir({'a': 'any', 'c': 'any', 'd': 'any'}).create();
await expectResolves(
@@ -995,9 +1051,10 @@
});
test('dependency does not match SDK', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0'}
+ });
});
await d.appDir({'foo': 'any'}).create();
@@ -1010,11 +1067,12 @@
});
test('transitive dependency does not match SDK', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '1.0.0', pubspec: {
'environment': {'sdk': '0.0.0'}
});
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(error: equalsIgnoringWhitespace('''
@@ -1027,39 +1085,41 @@
});
test('selects a dependency version that allows the SDK', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('foo', '2.0.0', pubspec: {
+ });
+ builder.serve('foo', '2.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('foo', '3.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0'}
- })
- ..serve('foo', '4.0.0', pubspec: {
+ });
+ builder.serve('foo', '3.0.0', pubspec: {
'environment': {'sdk': '0.0.0'}
});
+ builder.serve('foo', '4.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0'}
+ });
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '2.0.0'});
});
test('selects a transitive dependency version that allows the SDK', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': 'any'})
- ..serve('bar', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': 'any'});
+ builder.serve('bar', '1.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('bar', '2.0.0', pubspec: {
+ });
+ builder.serve('bar', '2.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('bar', '3.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0'}
- })
- ..serve('bar', '4.0.0', pubspec: {
+ });
+ builder.serve('bar', '3.0.0', pubspec: {
'environment': {'sdk': '0.0.0'}
});
+ builder.serve('bar', '4.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0'}
+ });
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '2.0.0'});
@@ -1068,23 +1128,24 @@
test(
'selects a dependency version that allows a transitive '
'dependency that allows the SDK', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '2.0.0', deps: {'bar': '2.0.0'})
- ..serve('foo', '3.0.0', deps: {'bar': '3.0.0'})
- ..serve('foo', '4.0.0', deps: {'bar': '4.0.0'})
- ..serve('bar', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '2.0.0', deps: {'bar': '2.0.0'});
+ builder.serve('foo', '3.0.0', deps: {'bar': '3.0.0'});
+ builder.serve('foo', '4.0.0', deps: {'bar': '4.0.0'});
+ builder.serve('bar', '1.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('bar', '2.0.0', pubspec: {
+ });
+ builder.serve('bar', '2.0.0', pubspec: {
'environment': {'sdk': '0.1.2+3'}
- })
- ..serve('bar', '3.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0'}
- })
- ..serve('bar', '4.0.0', pubspec: {
+ });
+ builder.serve('bar', '3.0.0', pubspec: {
'environment': {'sdk': '0.0.0'}
});
+ builder.serve('bar', '4.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0'}
+ });
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '2.0.0', 'bar': '2.0.0'}, tries: 2);
@@ -1402,9 +1463,10 @@
});
test('fails for a dependency', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'environment': {'flutter': '0.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'environment': {'flutter': '0.0.0'}
+ });
});
await d.appDir({'foo': 'any'}).create();
@@ -1417,12 +1479,13 @@
});
test("chooses a version that doesn't need Flutter", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0')
- ..serve('foo', '3.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '3.0.0', pubspec: {
'environment': {'flutter': '0.0.0'}
});
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(result: {'foo': '2.0.0'});
@@ -1549,16 +1612,17 @@
});
test('selects the latest dependency with a matching constraint', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'environment': {'flutter': '^0.0.0'}
- })
- ..serve('foo', '2.0.0', pubspec: {
+ });
+ builder.serve('foo', '2.0.0', pubspec: {
'environment': {'flutter': '^1.0.0'}
- })
- ..serve('foo', '3.0.0', pubspec: {
+ });
+ builder.serve('foo', '3.0.0', pubspec: {
'environment': {'flutter': '^2.0.0'}
});
+ });
await d.appDir({'foo': 'any'}).create();
await expectResolves(
@@ -1570,33 +1634,36 @@
void prerelease() {
test('prefer stable versions over unstable', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '1.1.0-dev')
- ..serve('a', '2.0.0-dev')
- ..serve('a', '3.0.0-dev');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '1.1.0-dev');
+ builder.serve('a', '2.0.0-dev');
+ builder.serve('a', '3.0.0-dev');
+ });
await d.appDir({'a': 'any'}).create();
await expectResolves(result: {'a': '1.0.0'});
});
test('use latest allowed prerelease if no stable versions match', () async {
- await servePackages()
- ..serve('a', '1.0.0-dev')
- ..serve('a', '1.1.0-dev')
- ..serve('a', '1.9.0-dev')
- ..serve('a', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0-dev');
+ builder.serve('a', '1.1.0-dev');
+ builder.serve('a', '1.9.0-dev');
+ builder.serve('a', '3.0.0');
+ });
await d.appDir({'a': '<2.0.0'}).create();
await expectResolves(result: {'a': '1.9.0-dev'});
});
test('use an earlier stable version on a < constraint', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '1.1.0')
- ..serve('a', '2.0.0-dev')
- ..serve('a', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '1.1.0');
+ builder.serve('a', '2.0.0-dev');
+ builder.serve('a', '2.0.0');
+ });
await d.appDir({'a': '<2.0.0'}).create();
await expectResolves(result: {'a': '1.1.0'});
@@ -1604,30 +1671,33 @@
test('prefer a stable version even if constraint mentions unstable',
() async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '1.1.0')
- ..serve('a', '2.0.0-dev')
- ..serve('a', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '1.1.0');
+ builder.serve('a', '2.0.0-dev');
+ builder.serve('a', '2.0.0');
+ });
await d.appDir({'a': '<=2.0.0-dev'}).create();
await expectResolves(result: {'a': '1.1.0'});
});
test('use pre-release when desired', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '1.1.0-dev');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '1.1.0-dev');
+ });
await d.appDir({'a': '^1.1.0-dev'}).create();
await expectResolves(result: {'a': '1.1.0-dev'});
});
test('can upgrade from pre-release', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '1.1.0-dev')
- ..serve('a', '1.1.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '1.1.0-dev');
+ builder.serve('a', '1.1.0');
+ });
await d.appDir({'a': '^1.1.0-dev'}).create();
await expectResolves(result: {'a': '1.1.0'});
@@ -1636,11 +1706,12 @@
test('will use pre-release if depended on in stable release', () async {
// This behavior is desired because a stable package has dependency on a
// pre-release.
- await servePackages()
- ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
- ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
- ..serve('b', '1.0.0')
- ..serve('b', '1.1.0-dev');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
+ builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '1.1.0-dev');
+ });
await d.appDir({'a': '^1.0.0'}).create();
await expectResolves(result: {
@@ -1650,11 +1721,12 @@
});
test('backtracks pre-release choice with direct dependency', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
- ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
- ..serve('b', '1.0.0')
- ..serve('b', '1.1.0-dev');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
+ builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '1.1.0-dev');
+ });
await d.appDir({
'a': '^1.0.0',
@@ -1669,12 +1741,13 @@
test('backtracking pre-release fails with indirect dependency', () async {
// NOTE: This behavior is not necessarily desired.
// If feasible it might worth changing this behavior in the future.
- await servePackages()
- ..serve('a', '1.0.0', deps: {'b': '^1.0.0'})
- ..serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'})
- ..serve('b', '1.0.0')
- ..serve('b', '1.1.0-dev')
- ..serve('c', '1.0.0', deps: {'b': '^1.0.0'});
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'b': '^1.0.0'});
+ builder.serve('a', '1.1.0', deps: {'b': '^1.1.0-dev'});
+ builder.serve('b', '1.0.0');
+ builder.serve('b', '1.1.0-dev');
+ builder.serve('c', '1.0.0', deps: {'b': '^1.0.0'});
+ });
await d.appDir({
'a': '^1.0.0',
@@ -1689,13 +1762,14 @@
test('https://github.com/dart-lang/pub/issues/3057 regression', () async {
// This used to cause an infinite loop.
- await servePackages()
- ..serve('a', '0.12.0', deps: {})
- ..serve('b', '0.1.0', deps: {'c': '2.0.0'})
- ..serve('b', '0.9.0-1', deps: {'c': '^1.6.0'})
- ..serve('b', '0.10.0', deps: {'a': '1.0.0'})
- ..serve('b', '0.17.0', deps: {'a': '1.0.0'})
- ..serve('c', '2.0.1', deps: {});
+ await servePackages((builder) {
+ builder.serve('a', '0.12.0', deps: {});
+ builder.serve('b', '0.1.0', deps: {'c': '2.0.0'});
+ builder.serve('b', '0.9.0-1', deps: {'c': '^1.6.0'});
+ builder.serve('b', '0.10.0', deps: {'a': '1.0.0'});
+ builder.serve('b', '0.17.0', deps: {'a': '1.0.0'});
+ builder.serve('c', '2.0.1', deps: {});
+ });
await d.appDir(
{
@@ -1710,12 +1784,13 @@
});
test('https://github.com/dart-lang/pub/pull/3038 regression', () async {
- await servePackages()
- ..serve('a', '1.1.0', deps: {'b': '^1.0.0'})
- ..serve('b', '1.0.0', deps: {'c': '^1.0.0'})
- ..serve('c', '0.9.0')
- ..serve('b', '1.1.0-alpha')
- ..serve('a', '1.0.0', deps: {'b': '^1.1.0-alpha'});
+ await servePackages((builder) {
+ builder.serve('a', '1.1.0', deps: {'b': '^1.0.0'});
+ builder.serve('b', '1.0.0', deps: {'c': '^1.0.0'});
+ builder.serve('c', '0.9.0');
+ builder.serve('b', '1.1.0-alpha');
+ builder.serve('a', '1.0.0', deps: {'b': '^1.1.0-alpha'});
+ });
await d.appDir({
'a': '^1.0.0',
@@ -1726,10 +1801,11 @@
void override() {
test('chooses best version matching override constraint', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '2.0.0')
- ..serve('a', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '2.0.0');
+ builder.serve('a', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1743,10 +1819,11 @@
});
test('uses override as dependency', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '2.0.0')
- ..serve('a', '3.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '2.0.0');
+ builder.serve('a', '3.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1759,12 +1836,13 @@
});
test('ignores other constraints on overridden package', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '2.0.0')
- ..serve('a', '3.0.0')
- ..serve('b', '1.0.0', deps: {'a': '1.0.0'})
- ..serve('c', '1.0.0', deps: {'a': '3.0.0'});
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '2.0.0');
+ builder.serve('a', '3.0.0');
+ builder.serve('b', '1.0.0', deps: {'a': '1.0.0'});
+ builder.serve('c', '1.0.0', deps: {'a': '3.0.0'});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1778,11 +1856,12 @@
});
test('backtracks on overidden package for its constraints', () async {
- await servePackages()
- ..serve('a', '1.0.0', deps: {'shared': 'any'})
- ..serve('a', '2.0.0', deps: {'shared': '1.0.0'})
- ..serve('shared', '1.0.0')
- ..serve('shared', '2.0.0');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0', deps: {'shared': 'any'});
+ builder.serve('a', '2.0.0', deps: {'shared': '1.0.0'});
+ builder.serve('shared', '1.0.0');
+ builder.serve('shared', '2.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1796,13 +1875,14 @@
});
test('override compatible with locked dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
- ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.0.1')
- ..serve('bar', '1.0.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
+ builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.0.1');
+ builder.serve('bar', '1.0.2');
+ });
await d.appDir({'foo': '1.0.1'}).create();
await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -1818,13 +1898,14 @@
});
test('override incompatible with locked dependency', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'bar': '1.0.0'})
- ..serve('foo', '1.0.1', deps: {'bar': '1.0.1'})
- ..serve('foo', '1.0.2', deps: {'bar': '1.0.2'})
- ..serve('bar', '1.0.0')
- ..serve('bar', '1.0.1')
- ..serve('bar', '1.0.2');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'bar': '1.0.0'});
+ builder.serve('foo', '1.0.1', deps: {'bar': '1.0.1'});
+ builder.serve('foo', '1.0.2', deps: {'bar': '1.0.2'});
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '1.0.1');
+ builder.serve('bar', '1.0.2');
+ });
await d.appDir({'foo': '1.0.1'}).create();
await expectResolves(result: {'foo': '1.0.1', 'bar': '1.0.1'});
@@ -1840,9 +1921,10 @@
});
test('no version that matches override', () async {
- await servePackages()
- ..serve('foo', '2.0.0')
- ..serve('foo', '2.1.3');
+ await servePackages((builder) {
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '2.1.3');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1858,8 +1940,9 @@
});
test('overrides a bad source without error', () async {
- final server = await servePackages();
- server.serve('foo', '0.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '0.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1875,9 +1958,10 @@
});
test('overrides an unmatched SDK constraint', () async {
- final server = await servePackages();
- server.serve('foo', '0.0.0', pubspec: {
- 'environment': {'sdk': '0.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '0.0.0', pubspec: {
+ 'environment': {'sdk': '0.0.0'}
+ });
});
await d.dir(appPath, [
@@ -1891,8 +1975,9 @@
});
test('overrides an unmatched root dependency', () async {
- final server = await servePackages();
- server.serve('foo', '0.0.0', deps: {'myapp': '1.0.0'});
+ await servePackages((builder) {
+ builder.serve('foo', '0.0.0', deps: {'myapp': '1.0.0'});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -1907,10 +1992,11 @@
// Regression test for #1853
test("overrides a locked package's dependency", () async {
- await servePackages()
- ..serve('foo', '1.2.3', deps: {'bar': '1.2.3'})
- ..serve('bar', '1.2.3')
- ..serve('bar', '0.0.1');
+ await servePackages((builder) {
+ builder.serve('foo', '1.2.3', deps: {'bar': '1.2.3'});
+ builder.serve('bar', '1.2.3');
+ builder.serve('bar', '0.0.1');
+ });
await d.appDir({'foo': 'any'}).create();
@@ -1930,11 +2016,12 @@
void downgrade() {
test('downgrades a dependency to the lowest matching version', () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '2.0.0-dev')
- ..serve('foo', '2.0.0')
- ..serve('foo', '2.1.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '2.0.0-dev');
+ builder.serve('foo', '2.0.0');
+ builder.serve('foo', '2.1.0');
+ });
await d.appDir({'foo': '2.1.0'}).create();
await expectResolves(result: {'foo': '2.1.0'});
@@ -1946,11 +2033,12 @@
test(
'use earliest allowed prerelease if no stable versions match '
'while downgrading', () async {
- await servePackages()
- ..serve('a', '1.0.0')
- ..serve('a', '2.0.0-dev.1')
- ..serve('a', '2.0.0-dev.2')
- ..serve('a', '2.0.0-dev.3');
+ await servePackages((builder) {
+ builder.serve('a', '1.0.0');
+ builder.serve('a', '2.0.0-dev.1');
+ builder.serve('a', '2.0.0-dev.2');
+ builder.serve('a', '2.0.0-dev.3');
+ });
await d.appDir({'a': '>=2.0.0-dev.1 <3.0.0'}).create();
await expectResolves(result: {'a': '2.0.0-dev.1'}, downgrade: true);
@@ -1959,63 +2047,67 @@
void features() {
test("doesn't enable an opt-in feature by default", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0'});
});
test('enables an opt-out feature by default', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': true,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
});
test('features are opt-out by default', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(result: {'foo': '1.0.0', 'bar': '1.0.0'});
});
test("enables an opt-in feature if it's required", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2027,15 +2119,16 @@
});
test("doesn't enable an opt-out feature if it's disabled", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2047,21 +2140,22 @@
});
test('opting in takes precedence over opting out', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0', deps: {
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0', deps: {
'foo': {
'version': '1.0.0',
'features': {'stuff': true}
}
});
+ });
await d.appDir({
'foo': {
@@ -2075,20 +2169,21 @@
});
test('implicitly opting in takes precedence over opting out', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0', deps: {
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0', deps: {
'foo': {
'version': '1.0.0',
}
});
+ });
await d.appDir({
'foo': {
@@ -2102,17 +2197,18 @@
});
test("doesn't select a version with an unavailable feature", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('foo', '1.1.0')
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('foo', '1.1.0');
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2124,25 +2220,26 @@
});
test("doesn't select a version with an incompatible feature", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('foo', '1.1.0', pubspec: {
+ });
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '2.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('bar', '2.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('bar', '2.0.0');
+ });
await d.appDir({
'foo': {
@@ -2157,8 +2254,8 @@
test(
'backtracks if a feature is transitively incompatible with another '
'feature', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
@@ -2170,24 +2267,27 @@
}
}
}
- })
- ..serve('foo', '1.1.0', pubspec: {
+ });
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0', pubspec: {
+ });
+
+ builder.serve('bar', '1.0.0', pubspec: {
'features': {
'stuff': {
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('baz', '1.0.0')
- ..serve('baz', '2.0.0');
+ });
+
+ builder.serve('baz', '1.0.0');
+ builder.serve('baz', '2.0.0');
+ });
await d.appDir({
'foo': {
@@ -2202,27 +2302,30 @@
test("backtracks if a feature's dependencies are transitively incompatible",
() async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('foo', '1.1.0', pubspec: {
+ });
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '2.0.0'}
}
}
- })
- ..serve('bar', '1.0.0', deps: {'baz': '1.0.0'})
- ..serve('bar', '2.0.0', deps: {'baz': '2.0.0'})
- ..serve('baz', '1.0.0')
- ..serve('baz', '2.0.0');
+ });
+
+ builder.serve('bar', '1.0.0', deps: {'baz': '1.0.0'});
+ builder.serve('bar', '2.0.0', deps: {'baz': '2.0.0'});
+
+ builder.serve('baz', '1.0.0');
+ builder.serve('baz', '2.0.0');
+ });
await d.appDir({
'foo': {
@@ -2236,9 +2339,9 @@
});
test('disables a feature when it backtracks', () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {'myapp': '0.0.0'})
- ..serve('foo', '1.1.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {'myapp': '0.0.0'});
+ builder.serve('foo', '1.1.0', deps: {
// This is a transitively incompatible dependency with myapp, which will
// force the solver to backtrack and unselect foo 1.1.0.
'bar': '1.0.0',
@@ -2246,11 +2349,15 @@
'version': '0.0.0',
'features': {'stuff': true}
}
- })
- ..serve('bar', '1.0.0', deps: {'baz': '2.0.0'})
- ..serve('baz', '1.0.0')
- ..serve('baz', '2.0.0')
- ..serve('qux', '1.0.0');
+ });
+
+ builder.serve('bar', '1.0.0', deps: {'baz': '2.0.0'});
+
+ builder.serve('baz', '1.0.0');
+ builder.serve('baz', '2.0.0');
+
+ builder.serve('qux', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2268,9 +2375,10 @@
});
test("the root package's features are opt-out by default", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2287,9 +2395,10 @@
});
test("the root package's features can be made opt-in", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2312,13 +2421,14 @@
// increases the total number of dependencies.
test("the root package's features can't be disabled by dependencies",
() async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {
'myapp': {
'features': {'stuff': false}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2335,13 +2445,14 @@
});
test("the root package's features can be enabled by dependencies", () async {
- await servePackages()
- ..serve('foo', '1.0.0', deps: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', deps: {
'myapp': {
'features': {'stuff': true}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2359,8 +2470,9 @@
});
test("resolution fails because a feature doesn't exist", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2380,16 +2492,17 @@
group('an "if available" dependency', () {
test('enables an opt-in feature', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2401,8 +2514,9 @@
});
test("is compatible with a feature that doesn't exist", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0');
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2421,13 +2535,14 @@
group('succeeds when', () {
test('a Dart SDK constraint is matched', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'features': {
- 'stuff': {
- 'environment': {'sdk': '^0.1.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'features': {
+ 'stuff': {
+ 'environment': {'sdk': '^0.1.0'}
+ }
}
- }
+ });
});
await d.dir(appPath, [
@@ -2441,13 +2556,14 @@
});
test('a Flutter SDK constraint is matched', () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'features': {
- 'stuff': {
- 'environment': {'flutter': '^1.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'features': {
+ 'stuff': {
+ 'environment': {'flutter': '^1.0.0'}
+ }
}
- }
+ });
});
await d.dir(appPath, [
@@ -2465,15 +2581,16 @@
group("doesn't choose a version because", () {
test("a Dart SDK constraint isn't matched", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.1.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'environment': {'sdk': '0.0.1'}
}
}
});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2486,15 +2603,16 @@
});
test("Flutter isn't available", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.1.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'environment': {'flutter': '1.0.0'}
}
}
});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2507,15 +2625,16 @@
});
test("a Flutter SDK constraint isn't matched", () async {
- await servePackages()
- ..serve('foo', '1.0.0')
- ..serve('foo', '1.1.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0');
+ builder.serve('foo', '1.1.0', pubspec: {
'features': {
'stuff': {
'environment': {'flutter': '^2.0.0'}
}
}
});
+ });
await d.dir(appPath, [
d.pubspec({
@@ -2532,13 +2651,14 @@
group('resolution fails because', () {
test("a Dart SDK constraint isn't matched", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'features': {
- 'stuff': {
- 'environment': {'sdk': '0.0.1'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'features': {
+ 'stuff': {
+ 'environment': {'sdk': '0.0.1'}
+ }
}
- }
+ });
});
await d.dir(appPath, [
@@ -2555,13 +2675,14 @@
});
test("Flutter isn't available", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'features': {
- 'stuff': {
- 'environment': {'flutter': '1.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'features': {
+ 'stuff': {
+ 'environment': {'flutter': '1.0.0'}
+ }
}
- }
+ });
});
await d.dir(appPath, [
@@ -2577,13 +2698,14 @@
});
test("a Flutter SDK constraint isn't matched", () async {
- final server = await servePackages();
- server.serve('foo', '1.0.0', pubspec: {
- 'features': {
- 'stuff': {
- 'environment': {'flutter': '^2.0.0'}
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
+ 'features': {
+ 'stuff': {
+ 'environment': {'flutter': '^2.0.0'}
+ }
}
- }
+ });
});
await d.dir(appPath, [
@@ -2603,8 +2725,8 @@
group('with overlapping dependencies', () {
test('can enable extra features', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'dependencies': {'bar': '1.0.0'},
'features': {
'stuff': {
@@ -2616,16 +2738,19 @@
}
}
}
- })
- ..serve('bar', '1.0.0', pubspec: {
+ });
+
+ builder.serve('bar', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': false,
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({
'foo': {'version': '1.0.0'}
@@ -2643,8 +2768,8 @@
});
test("can't disable features", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'dependencies': {
'bar': {
'version': '1.0.0',
@@ -2661,16 +2786,19 @@
}
}
}
- })
- ..serve('bar', '1.0.0', pubspec: {
+ });
+
+ builder.serve('bar', '1.0.0', pubspec: {
'features': {
'stuff': {
'default': true,
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('baz', '1.0.0');
+ });
+
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2685,8 +2813,8 @@
group('with required features', () {
test('enables those features', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'main': {
'default': false,
@@ -2701,9 +2829,10 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2716,8 +2845,8 @@
});
test('enables those features by default', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'main': {
'requires': ['required1', 'required2']
@@ -2731,9 +2860,10 @@
'dependencies': {'baz': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0')
- ..serve('baz', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ builder.serve('baz', '1.0.0');
+ });
await d.appDir({'foo': '1.0.0'}).create();
await expectResolves(
@@ -2741,8 +2871,8 @@
});
test("doesn't enable those features if it's disabled", () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'main': {
'requires': ['required']
@@ -2752,8 +2882,9 @@
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2766,8 +2897,8 @@
test("enables those features even if they'd otherwise be disabled",
() async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'main': {
'requires': ['required']
@@ -2777,8 +2908,9 @@
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2790,8 +2922,8 @@
});
test('enables features transitively', () async {
- await servePackages()
- ..serve('foo', '1.0.0', pubspec: {
+ await servePackages((builder) {
+ builder.serve('foo', '1.0.0', pubspec: {
'features': {
'main': {
'requires': ['required1']
@@ -2805,8 +2937,9 @@
'dependencies': {'bar': '1.0.0'}
}
}
- })
- ..serve('bar', '1.0.0');
+ });
+ builder.serve('bar', '1.0.0');
+ });
await d.appDir({
'foo': {
@@ -2874,7 +3007,7 @@
// If the dep uses the default hosted source, grab it from the test
// package server rather than pub.dartlang.org.
dep = registry.hosted
- .refFor(dep.name, url: Uri.parse(globalServer.url))
+ .refFor(dep.name, url: Uri.parse(globalPackageServer!.url))
.withConstraint(dep.constraint);
}
expect(dep.allows(id), isTrue, reason: 'Expected $id to match $dep.');
@@ -2885,12 +3018,14 @@
void regressions() {
test('reformatRanges with a build', () async {
- await servePackages()
- ..serve('integration_test', '1.0.1',
- deps: {'vm_service': '>= 4.2.0 <6.0.0'})
- ..serve('integration_test', '1.0.2+2',
- deps: {'vm_service': '>= 4.2.0 <7.0.0'})
- ..serve('vm_service', '7.3.0');
+ await servePackages((b) {
+ b.serve('integration_test', '1.0.1',
+ deps: {'vm_service': '>= 4.2.0 <6.0.0'});
+ b.serve('integration_test', '1.0.2+2',
+ deps: {'vm_service': '>= 4.2.0 <7.0.0'});
+
+ b.serve('vm_service', '7.3.0');
+ });
await d.appDir({'integration_test': '^1.0.2'}).create();
await expectResolves(
error: contains(
diff --git a/tool/test-bin/pub_command_runner.dart b/tool/test-bin/pub_command_runner.dart
index e438aae..2be51e8 100644
--- a/tool/test-bin/pub_command_runner.dart
+++ b/tool/test-bin/pub_command_runner.dart
@@ -9,30 +9,12 @@
import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:pub/pub.dart';
-import 'package:pub/src/command.dart';
import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:pub/src/log.dart' as log;
import 'package:usage/usage.dart';
final _LoggingAnalytics loggingAnalytics = _LoggingAnalytics();
-// A command for explicitly throwing an exception, to test the handling of
-// unexpected eceptions.
-class ThrowingCommand extends PubCommand {
- @override
- String get name => 'fail';
-
- @override
- String get description => 'Throws an exception';
-
- bool get hide => true;
-
- @override
- Future<int> runProtected() async {
- throw StateError('Pub has crashed');
- }
-}
-
class Runner extends CommandRunner<int> {
late ArgResults _options;
@@ -41,10 +23,7 @@
? PubAnalytics(() => loggingAnalytics,
dependencyKindCustomDimensionName: 'cd1')
: null;
- addCommand(
- pubCommand(analytics: analytics, isVerbose: () => _options['verbose'])
- ..addSubcommand(ThrowingCommand()));
- argParser.addFlag('verbose');
+ addCommand(pubCommand(analytics: analytics));
}
@override
diff --git a/tool/test.dart b/tool/test.dart
index 7d98156..e7877a2 100755
--- a/tool/test.dart
+++ b/tool/test.dart
@@ -29,7 +29,7 @@
await precompile(
executablePath: path.join('bin', 'pub.dart'),
outputPath: pubSnapshotFilename,
- incrementalDillPath: pubSnapshotIncrementalFilename,
+ incrementalDillOutputPath: pubSnapshotIncrementalFilename,
name: 'bin/pub.dart',
packageConfigPath: path.join('.dart_tool', 'package_config.json'));
testProcess = await Process.start(