Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Side by Side Diff: utils/pub/io.dart

Issue 10905202: Look for git.cmd on Windows. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « utils/pub/git_source.dart ('k') | utils/tests/pub/test_pub.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * Helper functionality to make working with IO easier. 6 * Helper functionality to make working with IO easier.
7 */ 7 */
8 #library('io'); 8 #library('io');
9 9
10 #import('dart:io'); 10 #import('dart:io');
11 #import('dart:isolate'); 11 #import('dart:isolate');
12 #import('dart:uri'); 12 #import('dart:uri');
13 #import('utils.dart');
13 14
14 /** Gets the current working directory. */ 15 /** Gets the current working directory. */
15 String get workingDir => new File('.').fullPathSync(); 16 String get workingDir => new File('.').fullPathSync();
16 17
17 /** 18 /**
18 * Prints the given string to `stderr` on its own line. 19 * Prints the given string to `stderr` on its own line.
19 */ 20 */
20 void printError(value) { 21 void printError(value) {
21 stderr.writeString(value.toString()); 22 stderr.writeString(value.toString());
22 stderr.writeString('\n'); 23 stderr.writeString('\n');
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 return true; 467 return true;
467 }); 468 });
468 input.then((value) { 469 input.then((value) {
469 if (completer.future.isComplete) return; 470 if (completer.future.isComplete) return;
470 timer.cancel(); 471 timer.cancel();
471 completer.complete(value); 472 completer.complete(value);
472 }); 473 });
473 return completer.future; 474 return completer.future;
474 } 475 }
475 476
476 /** 477 /// The cached Git command.
477 * Tests whether or not the git command-line app is available for use. 478 String __gitCommand;
Bob Nystrom 2012/09/11 19:53:55 "_gitCommandCache"
478 */
479 Future<bool> get isGitInstalled {
480 // TODO(rnystrom): We could cache this after the first check. We aren't right
481 // now because Future.immediate() will invoke its callback synchronously.
482 // That does bad things in cases where the caller expects futures to always
483 // be async. In particular, withGit() in the pub tests which calls
484 // expectAsync() will fail horribly if the test isn't actually async.
485 479
480 /// Tests whether or not the git command-line app is available for use.
481 Future<bool> get isGitInstalled => _gitCommand.transform((git) => git != null);
482
483 /// Run a git process with [args] from [workingDir].
484 Future<PubProcessResult> runGit(List<String> args, [String workingDir]) =>
485 _gitCommand.chain((git) => runProcess(git, args, workingDir));
486
487 /// Returns the name of the git command-line app, or null if Git could not be
488 /// found on the user's PATH.
489 Future<String> get _gitCommand {
490 // TODO(nweiz): Just use Future.immediate once issue 3356 is fixed.
491 if (__gitCommand != null) return sleep(0).transform((_) => __gitCommand);
492
493 return _tryGitCommand("git").chain((success) {
494 if (success) return new Future.immediate("git");
495
496 // Git is sometimes installed on Windows as `git.cmd`
497 return _tryGitCommand("git.cmd").transform((success) {
498 if (success) return "git.cmd";
499 return null;
500 });
501 }).transform((command) {
502 __gitCommand = command;
503 return command;
504 });
505 }
506
507 /// Checks whether [command] is the Git command for this computer.
508 Future<bool> _tryGitCommand(String command) {
486 var completer = new Completer<bool>(); 509 var completer = new Completer<bool>();
487 510
488 // If "git --version" prints something familiar, git is working. 511 // If "git --version" prints something familiar, git is working.
489 var future = runProcess("git", ["--version"]); 512 var future = runProcess(command, ["--version"]);
490 513
491 future.then((results) { 514 future.then((results) {
492 var regex = new RegExp("^git version"); 515 var regex = new RegExp("^git version");
493 completer.complete(results.stdout.length == 1 && 516 completer.complete(results.stdout.length == 1 &&
494 regex.hasMatch(results.stdout[0])); 517 regex.hasMatch(results.stdout[0]));
495 }); 518 });
496 519
497 future.handleException((err) { 520 future.handleException((err) {
498 // If the process failed, they probably don't have it. 521 // If the process failed, they probably don't have it.
499 completer.complete(false); 522 completer.complete(false);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 return new Directory(entry); 597 return new Directory(entry);
575 } 598 }
576 599
577 /** 600 /**
578 * Gets a [Uri] for [uri], which can either already be one, or be a [String]. 601 * Gets a [Uri] for [uri], which can either already be one, or be a [String].
579 */ 602 */
580 Uri _getUri(uri) { 603 Uri _getUri(uri) {
581 if (uri is Uri) return uri; 604 if (uri is Uri) return uri;
582 return new Uri.fromString(uri); 605 return new Uri.fromString(uri);
583 } 606 }
OLDNEW
« no previous file with comments | « utils/pub/git_source.dart ('k') | utils/tests/pub/test_pub.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698