// 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/path/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);
}