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

Side by Side Diff: lib/src/source/git.dart

Issue 2079303003: Track Source objects in PackageNames. (Closed) Base URL: git@github.com:dart-lang/pub.git@master
Patch Set: Code review changes Created 4 years, 6 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
« no previous file with comments | « lib/src/source.dart ('k') | lib/src/source/hosted.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 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:path/path.dart' as path; 7 import 'package:path/path.dart' as path;
8 import 'package:pub_semver/pub_semver.dart'; 8 import 'package:pub_semver/pub_semver.dart';
9 9
10 import '../git.dart' as git; 10 import '../git.dart' as git;
(...skipping 10 matching lines...) Expand all
21 class GitSource extends Source { 21 class GitSource extends Source {
22 final name = "git"; 22 final name = "git";
23 23
24 BoundGitSource bind(SystemCache systemCache) => 24 BoundGitSource bind(SystemCache systemCache) =>
25 new BoundGitSource(this, systemCache); 25 new BoundGitSource(this, systemCache);
26 26
27 /// Returns a reference to a git package with the given [name] and [url]. 27 /// Returns a reference to a git package with the given [name] and [url].
28 /// 28 ///
29 /// If passed, [reference] is the Git reference. It defaults to `"HEAD"`. 29 /// If passed, [reference] is the Git reference. It defaults to `"HEAD"`.
30 PackageRef refFor(String name, String url, {String reference}) => 30 PackageRef refFor(String name, String url, {String reference}) =>
31 new PackageRef(name, "git", {'url': url, 'ref': reference ?? 'HEAD'}); 31 new PackageRef(name, this, {'url': url, 'ref': reference ?? 'HEAD'});
32 32
33 /// Given a valid git package description, returns the URL of the repository 33 /// Given a valid git package description, returns the URL of the repository
34 /// it pulls from. 34 /// it pulls from.
35 String urlFromDescription(description) => description["url"]; 35 String urlFromDescription(description) => description["url"];
36 36
37 PackageRef parseRef(String name, description, {String containingPath}) { 37 PackageRef parseRef(String name, description, {String containingPath}) {
38 // TODO(rnystrom): Handle git URLs that are relative file paths (#8570). 38 // TODO(rnystrom): Handle git URLs that are relative file paths (#8570).
39 if (description is String) description = {'url': description}; 39 if (description is String) description = {'url': description};
40 40
41 if (description is! Map) { 41 if (description is! Map) {
42 throw new FormatException("The description must be a Git URL or a map " 42 throw new FormatException("The description must be a Git URL or a map "
43 "with a 'url' key."); 43 "with a 'url' key.");
44 } 44 }
45 45
46 if (description["url"] is! String) { 46 if (description["url"] is! String) {
47 throw new FormatException("The 'url' field of the description must be a " 47 throw new FormatException("The 'url' field of the description must be a "
48 "string."); 48 "string.");
49 } 49 }
50 50
51 _validateUrl(description["url"]); 51 _validateUrl(description["url"]);
52 52
53 var ref = description["ref"]; 53 var ref = description["ref"];
54 if (ref != null && ref is! String) { 54 if (ref != null && ref is! String) {
55 throw new FormatException("The 'ref' field of the description must be a " 55 throw new FormatException("The 'ref' field of the description must be a "
56 "string."); 56 "string.");
57 } 57 }
58 58
59 return new PackageRef(name, this.name, { 59 return new PackageRef(name, this, {
60 "url": description["url"], 60 "url": description["url"],
61 "ref": description["ref"] ?? "HEAD" 61 "ref": description["ref"] ?? "HEAD"
62 }); 62 });
63 } 63 }
64 64
65 PackageId parseId(String name, Version version, description) { 65 PackageId parseId(String name, Version version, description) {
66 if (description is! Map) { 66 if (description is! Map) {
67 throw new FormatException("The description must be a map with a 'url' " 67 throw new FormatException("The description must be a map with a 'url' "
68 "key."); 68 "key.");
69 } 69 }
70 70
71 if (description["url"] is! String) { 71 if (description["url"] is! String) {
72 throw new FormatException("The 'url' field of the description must be a " 72 throw new FormatException("The 'url' field of the description must be a "
73 "string."); 73 "string.");
74 } 74 }
75 75
76 _validateUrl(description["url"]); 76 _validateUrl(description["url"]);
77 77
78 var ref = description["ref"]; 78 var ref = description["ref"];
79 if (ref != null && ref is! String) { 79 if (ref != null && ref is! String) {
80 throw new FormatException("The 'ref' field of the description must be a " 80 throw new FormatException("The 'ref' field of the description must be a "
81 "string."); 81 "string.");
82 } 82 }
83 83
84 if (description["resolved-ref"] is! String) { 84 if (description["resolved-ref"] is! String) {
85 throw new FormatException("The 'resolved-ref' field of the description " 85 throw new FormatException("The 'resolved-ref' field of the description "
86 "must be a string."); 86 "must be a string.");
87 } 87 }
88 88
89 return new PackageId(name, this.name, version, { 89 return new PackageId(name, this, version, {
90 "url": description["url"], 90 "url": description["url"],
91 "ref": description["ref"] ?? "HEAD", 91 "ref": description["ref"] ?? "HEAD",
92 "resolved-ref": description["resolved-ref"] 92 "resolved-ref": description["resolved-ref"]
93 }); 93 });
94 } 94 }
95 95
96 /// Throws a [FormatException] if [url] isn't a valid Git URL. 96 /// Throws a [FormatException] if [url] isn't a valid Git URL.
97 void _validateUrl(String url) { 97 void _validateUrl(String url) {
98 // If the URL contains an @, it's probably an SSH hostname, which we don't 98 // If the URL contains an @, it's probably an SSH hostname, which we don't
99 // know how to validate. 99 // know how to validate.
(...skipping 25 matching lines...) Expand all
125 if (description1['url'] != description2['url']) return false; 125 if (description1['url'] != description2['url']) return false;
126 if (description1['ref'] != description2['ref']) return false; 126 if (description1['ref'] != description2['ref']) return false;
127 127
128 if (description1.containsKey('resolved-ref') && 128 if (description1.containsKey('resolved-ref') &&
129 description2.containsKey('resolved-ref')) { 129 description2.containsKey('resolved-ref')) {
130 return description1['resolved-ref'] == description2['resolved-ref']; 130 return description1['resolved-ref'] == description2['resolved-ref'];
131 } 131 }
132 132
133 return true; 133 return true;
134 } 134 }
135
136 int hashDescription(description) {
137 // Don't include the resolved ref in the hash code because we ignore it in
138 // [descriptionsEqual] if only one description defines it.
139 return description['url'].hashCode ^ description['ref'].hashCode;
140 }
135 } 141 }
136 142
137 /// The [BoundSource] for [GitSource]. 143 /// The [BoundSource] for [GitSource].
138 class BoundGitSource extends CachedSource { 144 class BoundGitSource extends CachedSource {
139 final GitSource source; 145 final GitSource source;
140 146
141 final SystemCache systemCache; 147 final SystemCache systemCache;
142 148
143 BoundGitSource(this.source, this.systemCache); 149 BoundGitSource(this.source, this.systemCache);
144 150
(...skipping 13 matching lines...) Expand all
158 }); 164 });
159 } 165 }
160 166
161 Future<List<PackageId>> doGetVersions(PackageRef ref) async { 167 Future<List<PackageId>> doGetVersions(PackageRef ref) async {
162 await _ensureRepoCache(ref); 168 await _ensureRepoCache(ref);
163 var path = _repoCachePath(ref); 169 var path = _repoCachePath(ref);
164 var revision = await _firstRevision(path, ref.description['ref']); 170 var revision = await _firstRevision(path, ref.description['ref']);
165 var pubspec = await _describeUncached(ref, revision); 171 var pubspec = await _describeUncached(ref, revision);
166 172
167 return [ 173 return [
168 new PackageId(ref.name, source.name, pubspec.version, { 174 new PackageId(ref.name, source, pubspec.version, {
169 'url': ref.description['url'], 175 'url': ref.description['url'],
170 'ref': ref.description['ref'], 176 'ref': ref.description['ref'],
171 'resolved-ref': revision 177 'resolved-ref': revision
172 }) 178 })
173 ]; 179 ];
174 } 180 }
175 181
176 /// Since we don't have an easy way to read from a remote Git repo, this 182 /// Since we don't have an easy way to read from a remote Git repo, this
177 /// just installs [id] into the system cache, then describes it from there. 183 /// just installs [id] into the system cache, then describes it from there.
178 Future<Pubspec> describeUncached(PackageId id) => 184 Future<Pubspec> describeUncached(PackageId id) =>
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 .where((entry) => dirExists(path.join(entry, ".git"))) 256 .where((entry) => dirExists(path.join(entry, ".git")))
251 .map((packageDir) => new Package.load( 257 .map((packageDir) => new Package.load(
252 null, packageDir, systemCache.sources)) 258 null, packageDir, systemCache.sources))
253 .toList(); 259 .toList();
254 260
255 // Note that there may be multiple packages with the same name and version 261 // Note that there may be multiple packages with the same name and version
256 // (pinned to different commits). The sort order of those is unspecified. 262 // (pinned to different commits). The sort order of those is unspecified.
257 packages.sort(Package.orderByNameAndVersion); 263 packages.sort(Package.orderByNameAndVersion);
258 264
259 for (var package in packages) { 265 for (var package in packages) {
260 var id = new PackageId(package.name, source.name, package.version, null); 266 var id = new PackageId(package.name, source, package.version, null);
261 267
262 log.message("Resetting Git repository for " 268 log.message("Resetting Git repository for "
263 "${log.bold(package.name)} ${package.version}..."); 269 "${log.bold(package.name)} ${package.version}...");
264 270
265 try { 271 try {
266 // Remove all untracked files. 272 // Remove all untracked files.
267 await git.run(["clean", "-d", "--force", "-x"], 273 await git.run(["clean", "-d", "--force", "-x"],
268 workingDir: package.dir); 274 workingDir: package.dir);
269 275
270 // Discard all changes to tracked files. 276 // Discard all changes to tracked files.
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 (result) => null); 382 (result) => null);
377 } 383 }
378 384
379 /// Returns the path to the canonical clone of the repository referred to by 385 /// Returns the path to the canonical clone of the repository referred to by
380 /// [id] (the one in `<system cache>/git/cache`). 386 /// [id] (the one in `<system cache>/git/cache`).
381 String _repoCachePath(PackageRef ref) { 387 String _repoCachePath(PackageRef ref) {
382 var repoCacheName = '${ref.name}-${sha1(ref.description['url'])}'; 388 var repoCacheName = '${ref.name}-${sha1(ref.description['url'])}';
383 return path.join(systemCacheRoot, 'cache', repoCacheName); 389 return path.join(systemCacheRoot, 'cache', repoCacheName);
384 } 390 }
385 } 391 }
OLDNEW
« no previous file with comments | « lib/src/source.dart ('k') | lib/src/source/hosted.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698