// Copyright (c) 2015, 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:io'; import 'package:path/path.dart'; import 'main.dart' as performance; // Local driver for performance measurement void main(List args) { /* * Parse arguments */ if (args.length < 3) printHelp('Expected 3 arguments'); var gitDir = Directory(args[0]); if (!gitDir.existsSync()) printHelp('${gitDir.path} does not exist'); if (!Directory(join(gitDir.path, '.git')).existsSync()) { printHelp('${gitDir.path} does not appear to be a local git repository'); } var branch = args[1]; var inputFile = File(args[2]); if (!inputFile.existsSync()) printHelp('${inputFile.path} does not exist'); /* * Create a new temp directory */ var tmpDir = Directory(join(Directory.systemTemp.path, 'analysis_server_perf_target')); if (!tmpDir.path.contains('tmp')) throw 'invalid tmp directory\n $tmpDir'; print('Extracting target analysis environment into\n ${tmpDir.path}'); if (tmpDir.existsSync()) tmpDir.deleteSync(recursive: true); tmpDir.createSync(recursive: true); /* * Setup the initial target source in the temp directory */ var tarFilePath = join(tmpDir.path, 'targetSrc.tar'); var result = Process.runSync('git', ['archive', branch, '-o', tarFilePath], workingDirectory: gitDir.path); if (result.exitCode != 0) throw 'failed to obtain target source: $result'; var tmpSrcDirPath = join(tmpDir.path, 'targetSrc'); Directory(tmpSrcDirPath).createSync(); result = Process.runSync('tar', ['-xf', tarFilePath], workingDirectory: tmpSrcDirPath); if (result.exitCode != 0) throw 'failed to extract target source: $result'; /* * Symlink the out or xcodebuild directory */ var outDirName = 'out'; if (!Directory(join(gitDir.path, outDirName)).existsSync()) { outDirName = 'xcodebuild'; } if (!Directory(join(gitDir.path, outDirName)).existsSync()) { throw 'failed to find out or xcodebuild directory'; } result = Process.runSync('ln', ['-s', join(gitDir.path, outDirName), join(tmpSrcDirPath, outDirName)]); if (result.exitCode != 0) throw 'failed to link out or xcodebuild: $result'; /* * Collect arguments */ var perfArgs = [ '-i${inputFile.path}', '-t$tmpSrcDirPath', ]; for (var index = 3; index < args.length; ++index) { perfArgs.add(args[index].replaceAll('@tmpSrcDir@', tmpSrcDirPath)); } perfArgs.add('-m${gitDir.path},$tmpSrcDirPath'); /* * Launch the performance analysis tool */ performance.main(perfArgs); } /// Print help and exit void printHelp([String? errMsg]) { if (errMsg != null) { print(''); print('Error: $errMsg'); print(''); } print('''Required arguments: gitDir = a path to the git repository containing the initial target source branch = the branch containing the initial target source inputFile = the instrumentation or log file Optional arguments:'''); print(performance.argParser.usage); exit(1); }