Index: sdk/lib/_internal/pub_generated/lib/src/source/git.dart |
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart |
index c36ecf4f31eed4aa090da93759d72654ec0f65ef..b8cabb24cd4ff8b66cc260172e0e965f48765e47 100644 |
--- a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart |
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart |
@@ -148,47 +148,99 @@ class GitSource extends CachedSource { |
/// Resets all cached packages back to the pristine state of the Git |
/// repository at the revision they are pinned to. |
Future<Pair<int, int>> repairCachedPackages() { |
- if (!dirExists(systemCacheRoot)) return new Future.value(new Pair(0, 0)); |
- |
- var successes = 0; |
- var failures = 0; |
- |
- var packages = listDir( |
- systemCacheRoot).where( |
- (entry) => |
- dirExists( |
- path.join( |
- entry, |
- ".git"))).map( |
- (packageDir) => |
- new Package.load(null, packageDir, systemCache.sources)).toList(); |
- |
- // Note that there may be multiple packages with the same name and version |
- // (pinned to different commits). The sort order of those is unspecified. |
- packages.sort(Package.orderByNameAndVersion); |
- |
- return Future.wait(packages.map((package) { |
- log.message( |
- "Resetting Git repository for " |
- "${log.bold(package.name)} ${package.version}..."); |
- |
- // Remove all untracked files. |
- return git.run( |
- ["clean", "-d", "--force", "-x"], |
- workingDir: package.dir).then((_) { |
- // Discard all changes to tracked files. |
- return git.run(["reset", "--hard", "HEAD"], workingDir: package.dir); |
- }).then((_) { |
- successes++; |
- }).catchError((error, stackTrace) { |
- failures++; |
- log.error( |
- "Failed to reset ${log.bold(package.name)} " |
- "${package.version}. Error:\n$error"); |
- log.fine(stackTrace); |
- failures++; |
- }, test: (error) => error is git.GitException); |
- })).then((_) => new Pair(successes, failures)); |
+ final completer0 = new Completer(); |
+ scheduleMicrotask(() { |
+ try { |
+ join0() { |
+ var successes = 0; |
+ var failures = 0; |
+ var packages = listDir(systemCacheRoot).where(((entry) { |
+ return dirExists(path.join(entry, ".git")); |
+ })).map(((packageDir) { |
+ return new Package.load(null, packageDir, systemCache.sources); |
+ })).toList(); |
+ packages.sort(Package.orderByNameAndVersion); |
+ var it0 = packages.iterator; |
+ break0() { |
+ completer0.complete(new Pair(successes, failures)); |
+ } |
+ var trampoline0; |
+ continue0() { |
+ trampoline0 = null; |
+ if (it0.moveNext()) { |
+ var package = it0.current; |
+ log.message( |
+ "Resetting Git repository for " |
+ "${log.bold(package.name)} ${package.version}..."); |
+ join1() { |
+ trampoline0 = continue0; |
+ } |
+ catch0(error, stackTrace) { |
+ try { |
+ if (error is git.GitException) { |
+ log.error( |
+ "Failed to reset ${log.bold(package.name)} " |
+ "${package.version}. Error:\n${error}"); |
+ log.fine(stackTrace); |
+ failures++; |
+ tryDeleteEntry(package.dir); |
+ join1(); |
+ } else { |
+ throw error; |
+ } |
+ } catch (error, stackTrace) { |
+ completer0.completeError(error, stackTrace); |
+ } |
+ } |
+ try { |
+ git.run( |
+ ["clean", "-d", "--force", "-x"], |
+ workingDir: package.dir).then((x0) { |
+ trampoline0 = () { |
+ trampoline0 = null; |
+ try { |
+ x0; |
+ git.run( |
+ ["reset", "--hard", "HEAD"], |
+ workingDir: package.dir).then((x1) { |
+ trampoline0 = () { |
+ trampoline0 = null; |
+ try { |
+ x1; |
+ successes++; |
+ join1(); |
+ } catch (e0, s0) { |
+ catch0(e0, s0); |
+ } |
+ }; |
+ do trampoline0(); while (trampoline0 != null); |
+ }, onError: catch0); |
+ } catch (e1, s1) { |
+ catch0(e1, s1); |
+ } |
+ }; |
+ do trampoline0(); while (trampoline0 != null); |
+ }, onError: catch0); |
+ } catch (e2, s2) { |
+ catch0(e2, s2); |
+ } |
+ } else { |
+ break0(); |
+ } |
+ } |
+ trampoline0 = continue0; |
+ do trampoline0(); while (trampoline0 != null); |
+ } |
+ if (!dirExists(systemCacheRoot)) { |
+ completer0.complete(new Pair(0, 0)); |
+ } else { |
+ join0(); |
+ } |
+ } catch (e, s) { |
+ completer0.completeError(e, s); |
+ } |
+ }); |
+ return completer0.future; |
} |
/// Ensure that the canonical clone of the repository referred to by [id] (the |