blob: 8f258a954e56abdd60ef284d366289111267c2fc [file] [log] [blame]
// Copyright (c) 2013, 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 'dart:math' as math;
import '../entrypoint.dart';
import '../io.dart';
import '../validator.dart';
/// The maximum size of the package to upload (100 MB).
const _MAX_SIZE = 100 * 1024 * 1024;
/// A validator that validates that a package isn't too big.
class SizeValidator extends Validator {
final Future<int> packageSize;
SizeValidator(Entrypoint entrypoint, this.packageSize) : super(entrypoint);
Future validate() {
return packageSize.then((size) {
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'));
var error = StringBuffer('Your package is $sizeInMb MB. Hosted '
'packages must be smaller than 100 MB.');
if (ignoreExists && !entrypoint.root.inGitRepo) {
error.write(' Your .gitignore has no effect since your project '
'does not appear to be in version control.');
} else if (!ignoreExists && entrypoint.root.inGitRepo) {
error.write(' Consider adding a .gitignore to avoid including '
'temporary files.');