// 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.

/// Operations relative to the user's installed Dart SDK.
library sdk;

import 'dart:io';

import '../../pkg/pathos/lib/path.dart' as path;

import 'io.dart';
import 'log.dart' as log;
import 'version.dart';

/// Matches an Eclipse-style SDK version number. This is four dotted numbers
/// (major, minor, patch, build) with an optional suffix attached to the build
/// number.
final _versionPattern = new RegExp(r'^(\d+)\.(\d+)\.(\d+)\.(\d+.*)$');

/// Gets the path to the root directory of the SDK.
String get rootDirectory {
  // If the environment variable was provided, use it. This is mainly used for
  // the pub tests.
  var dir = Platform.environment["DART_SDK"];
  if (dir != null) {
    log.fine("Using DART_SDK to find SDK at $dir");
    return dir;
  }

  var pubDir = path.dirname(new Options().script);
  dir = path.normalize(path.join(pubDir, "../../"));
  log.fine("Located SDK at $dir");
  return dir;
}

/// Gets the SDK's revision number formatted to be a semantic version.
Version version = _getVersion();

/// Determine the SDK's version number.
Version _getVersion() {
  var revisionPath = path.join(rootDirectory, "version");
  var version = readTextFile(revisionPath).trim();

  // Given a version file like: 0.1.2.0_r17495
  // We create a semver like:   0.1.2+0.r17495
  var match = _versionPattern.firstMatch(version);
  if (match == null) {
    throw new FormatException("The Dart SDK's 'version' file was not in a "
        "format pub could recognize. Found: $version");
  }

  // Semantic versions cannot use "_".
  var build = match[4].replaceAll('_', '.');

  return new Version(
      int.parse(match[1]), int.parse(match[2]), int.parse(match[3]),
      build: build);
}