Index: utils/pub/command_lish.dart |
diff --git a/utils/pub/command_lish.dart b/utils/pub/command_lish.dart |
index 5cd75a038ac15ab3b735b1ad3c4df161c1a49983..d3a2cb4bf67aca21851b9a193626036be19a6081 100644 |
--- a/utils/pub/command_lish.dart |
+++ b/utils/pub/command_lish.dart |
@@ -13,6 +13,7 @@ import '../../pkg/args/lib/args.dart'; |
import '../../pkg/http/lib/http.dart' as http; |
import '../../pkg/path/lib/path.dart' as path; |
import 'directory_tree.dart'; |
+import 'exit_codes.dart' as exit_codes; |
import 'git.dart' as git; |
import 'http.dart'; |
import 'io.dart'; |
@@ -34,6 +35,8 @@ class LishCommand extends PubCommand { |
// dart:io for HTTPS requests. |
parser.addFlag('dry-run', abbr: 'n', negatable: false, |
help: 'Validate but do not publish the package'); |
+ parser.addFlag('force', abbr: 'f', negatable: false, |
+ help: 'Publish without confirmation if there are no errors'); |
parser.addOption('server', defaultsTo: 'https://pub.dartlang.org', |
help: 'The package server to which to upload this package'); |
return parser; |
@@ -42,6 +45,12 @@ class LishCommand extends PubCommand { |
/// The URL of the server to which to upload the package. |
Uri get server => Uri.parse(commandOptions['server']); |
+ /// Whether the publish is just a preview. |
+ bool get dryRun => commandOptions['dry-run']; |
+ |
+ /// Whether the publish requires confirmation. |
+ bool get force => commandOptions['force']; |
+ |
Future _publish(packageBytes) { |
var cloudStorageUrl; |
return oauth2.withClient(cache, (client) { |
@@ -88,6 +97,12 @@ class LishCommand extends PubCommand { |
} |
Future onRun() { |
+ if (force && dryRun) { |
+ log.error('Cannot use both --force and --dry-run.'); |
+ this.printUsage(); |
+ exit(exit_codes.USAGE); |
+ } |
+ |
var packageBytesFuture = _filesToPublish.then((files) { |
log.fine('Archiving and publishing ${entrypoint.root}.'); |
@@ -106,7 +121,7 @@ class LishCommand extends PubCommand { |
if (isValid) return packageBytesFuture.then(_publish); |
}); |
} |
- |
+ |
/// The basenames of files that are automatically excluded from archives. |
final _BLACKLISTED_FILES = const ['pubspec.lock']; |
@@ -149,7 +164,8 @@ class LishCommand extends PubCommand { |
invalidServerResponse(response); |
} |
- /// Validates the package. Throws an exception if it's invalid. |
+ /// Validates the package. Completes to false if the upload should not |
+ /// proceed. |
Future<bool> _validate(Future<int> packageSize) { |
return Validator.runAll(entrypoint, packageSize).then((pair) { |
var errors = pair.first; |
@@ -163,12 +179,14 @@ class LishCommand extends PubCommand { |
return false; |
} |
- if (commandOptions['dry-run']){ |
+ if (force) return true; |
+ |
+ if (dryRun) { |
var s = warnings.length == 1 ? '' : 's'; |
log.warning("Package has ${warnings.length} warning$s."); |
return false; |
} |
- |
+ |
var message = 'Looks great! Are you ready to upload your package'; |
if (!warnings.isEmpty) { |