blob: 654165312f7aef8f6b83fd46264a22744b71737f [file] [log] [blame]
// 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.
library command_uploader;
import 'dart:async';
import 'dart:io';
import 'dart:uri';
import '../../pkg/args/lib/args.dart';
import '../../pkg/pathos/lib/path.dart' as path;
import 'entrypoint.dart';
import 'exit_codes.dart' as exit_codes;
import 'http.dart';
import 'io.dart';
import 'log.dart' as log;
import 'oauth2.dart' as oauth2;
import 'pub.dart';
import 'utils.dart';
/// Handles the `uploader` pub command.
class UploaderCommand extends PubCommand {
final description = "Manage uploaders for a package on pub.dartlang.org.";
final usage = "pub uploader [options] {add/remove} <email>";
final requiresEntrypoint = false;
ArgParser get commandParser {
var parser = new ArgParser();
// TODO(nweiz): Use HostedSource.defaultUrl as the default value once we use
// dart:io for HTTPS requests.
parser.addOption('server', defaultsTo: 'https://pub.dartlang.org',
help: 'The package server on which the package is hosted');
parser.addOption('package', help: 'The package whose uploaders will be '
'modified\n'
'(defaults to the current package)');
return parser;
}
/// The URL of the package hosting server.
Uri get server => Uri.parse(commandOptions['server']);
Future onRun() {
if (commandOptions.rest.isEmpty) {
log.error('No uploader command given.');
this.printUsage();
exit(exit_codes.USAGE);
}
var command = commandOptions.rest.removeAt(0);
if (!['add', 'remove'].contains(command)) {
log.error('Unknown uploader command "$command".');
this.printUsage();
exit(exit_codes.USAGE);
} else if (commandOptions.rest.isEmpty) {
log.error('No uploader given for "pub uploader $command".');
this.printUsage();
exit(exit_codes.USAGE);
}
return defer(() {
var package = commandOptions['package'];
if (package != null) return package;
return new Entrypoint(path.current, cache).root.name;
}).then((package) {
var uploader = commandOptions.rest[0];
return oauth2.withClient(cache, (client) {
if (command == 'add') {
var url = server.resolve("/packages/${encodeUriComponent(package)}"
"/uploaders.json");
return client.post(url, fields: {"email": uploader});
} else { // command == 'remove'
var url = server.resolve("/packages/${encodeUriComponent(package)}"
"/uploaders/${encodeUriComponent(uploader)}.json");
return client.delete(url);
}
});
}).then(handleJsonSuccess).catchError((asyncError) {
if (asyncError.error is! PubHttpException) throw asyncError;
handleJsonError(asyncError.error.response);
});
}
}