blob: 528c51404587561a10b00b38e24ad75084f60879 [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.
import 'source.dart';
import 'source/git.dart';
import 'source/hosted.dart';
import 'source/path.dart';
import 'source/sdk.dart';
import 'source/unknown.dart';
/// A class that keeps track of [Source]s used for getting packages.
class SourceRegistry {
/// The registered sources.
/// This is initialized with the three built-in sources.
final _sources = {
"git": new GitSource(),
"hosted": new HostedSource(),
"path": new PathSource(),
"sdk": new SdkSource()
/// The default source, which is used when no source is specified.
/// This defaults to [hosted].
Source get defaultSource => _default;
Source _default;
/// The registered sources, in name order.
List<Source> get all {
var sources = _sources.values.toList();
sources.sort((a, b) =>;
return sources;
/// The built-in [GitSource].
GitSource get git => _sources["git"] as GitSource;
/// The built-in [HostedSource].
HostedSource get hosted => _sources["hosted"] as HostedSource;
/// The built-in [PathSource].
PathSource get path => _sources["path"] as PathSource;
/// The built-in [SdkSource].
SdkSource get sdk => _sources["sdk"] as SdkSource;
SourceRegistry() {
_default = hosted;
/// Sets the default source.
/// This takes a string, which must be the name of a registered source.
void setDefault(String name) {
if (!_sources.containsKey(name)) {
throw new StateError('Default source $name is not in the registry');
_default = _sources[name];
/// Registers a new source.
/// This source may not have the same name as a source that's already been
/// registered.
void register(Source source) {
if (_sources.containsKey( {
throw new StateError('Source registry already has a source named '
_sources[] = source;
/// Returns the source named [name].
/// Returns an [UnknownSource] if no source with that name has been
/// registered. If [name] is null, returns the default source.
Source operator [](String name) {
if (name == null) return _default;
if (_sources.containsKey(name)) return _sources[name];
return new UnknownSource(name);