#!/usr/bin/env dart
// Copyright 2015 The Chromium Authors. 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';

final String binaryName = Platform.isWindows ? 'pub.bat' : 'pub';
int runPub(Directory directory, List<String> pubArgs) {
  int updateCount = 0;
  for (FileSystemEntity dir in directory.listSync()) {
    if (dir is Directory && FileSystemEntity.isFileSync(dir.path + Platform.pathSeparator + 'pubspec.yaml')) {
      updateCount++;
      Stopwatch timer = new Stopwatch()..start();
      stdout.write("Updating ${dir.path}...");
      ProcessResult result = Process.runSync(
        binaryName,
        pubArgs,
        workingDirectory: dir.path
      );
      timer.stop();
      stdout.write(" (${timer.elapsedMilliseconds} ms)");
      if (result.exitCode != 0) {
        print("... failed with exit code ${result.exitCode}.");
        print(result.stdout);
        print(result.stderr);
      } else {
        stdout.write("\n");
      }
    }
  }
  return updateCount;
}

void main(List<String> arguments) {
  Stopwatch timer = new Stopwatch()..start();
  bool upgrade = arguments.length > 0 && arguments[0] == '--upgrade';
  String FLUTTER_ROOT = new File(Platform.script.toFilePath()).parent.parent.path;
  List<String> pubArgs = [ upgrade ? 'upgrade' : 'get' ];
  int count = 0;
  count += runPub(new Directory("$FLUTTER_ROOT/packages"), pubArgs);
  count += runPub(new Directory("$FLUTTER_ROOT/examples"), pubArgs);
  String command = "$binaryName ${pubArgs.join(' ')}";
  print("Ran \"$command\" $count times in ${timer.elapsedMilliseconds} ms");
}