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

Side by Side Diff: pkg/analysis_server/lib/src/package_map_provider.dart

Issue 367453003: Handle relative paths in the output of "pub list-package-dirs". (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library package.map.provider; 5 library package.map.provider;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:io' as io; 9 import 'dart:io' as io;
10 10
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 } on io.ProcessException catch (exception, stackTrace) { 83 } on io.ProcessException catch (exception, stackTrace) {
84 AnalysisEngine.instance.logger.logInformation( 84 AnalysisEngine.instance.logger.logInformation(
85 "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}"); 85 "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
86 } 86 }
87 if (result.exitCode != 0) { 87 if (result.exitCode != 0) {
88 AnalysisEngine.instance.logger.logInformation( 88 AnalysisEngine.instance.logger.logInformation(
89 "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}"); 89 "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
90 return _error(folder); 90 return _error(folder);
91 } 91 }
92 try { 92 try {
93 return parsePackageMap(result.stdout); 93 return parsePackageMap(result.stdout, folder);
94 } catch (exception, stackTrace) { 94 } catch (exception, stackTrace) {
95 AnalysisEngine.instance.logger.logError( 95 AnalysisEngine.instance.logger.logError(
96 "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTra ce}"); 96 "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTra ce}");
97 } 97 }
98 98
99 return _error(folder); 99 return _error(folder);
100 } 100 }
101 101
102 /** 102 /**
103 * Create a PackageMapInfo object representing an error condition. 103 * Create a PackageMapInfo object representing an error condition.
104 */ 104 */
105 PackageMapInfo _error(Folder folder) { 105 PackageMapInfo _error(Folder folder) {
106 // Even if an error occurs, we still need to know the dependencies, so that 106 // Even if an error occurs, we still need to know the dependencies, so that
107 // we'll know when to try running "pub list-package-dirs" again. 107 // we'll know when to try running "pub list-package-dirs" again.
108 // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when 108 // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
109 // an error occurs, so just assume there is one dependency, "pubspec.lock". 109 // an error occurs, so just assume there is one dependency, "pubspec.lock".
110 List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)]; 110 List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)];
111 return new PackageMapInfo(null, dependencies.toSet()); 111 return new PackageMapInfo(null, dependencies.toSet());
112 } 112 }
113 113
114 /** 114 /**
115 * Decode the JSON output from pub into a package map. 115 * Decode the JSON output from pub into a package map. Paths in the
116 * output are considered relative to [folder].
116 */ 117 */
117 PackageMapInfo parsePackageMap(String jsonText) { 118 PackageMapInfo parsePackageMap(String jsonText, Folder folder) {
118 // The output of pub looks like this: 119 // The output of pub looks like this:
119 // { 120 // {
120 // "packages": { 121 // "packages": {
121 // "foo": "path/to/foo", 122 // "foo": "path/to/foo",
122 // "bar": ["path/to/bar1", "path/to/bar2"], 123 // "bar": ["path/to/bar1", "path/to/bar2"],
123 // "myapp": "path/to/myapp", // self link is included 124 // "myapp": "path/to/myapp", // self link is included
124 // }, 125 // },
125 // "input_files": [ 126 // "input_files": [
126 // "path/to/myapp/pubspec.lock" 127 // "path/to/myapp/pubspec.lock"
127 // ] 128 // ]
128 // } 129 // }
129 HashMap<String, List<Folder>> packageMap = new HashMap<String, List<Folder>> (); 130 HashMap<String, List<Folder>> packageMap = new HashMap<String, List<Folder>> ();
130 HashMap obj = JSON.decode(jsonText); 131 HashMap obj = JSON.decode(jsonText);
131 HashMap packages = obj['packages']; 132 HashMap packages = obj['packages'];
132 processPaths(String packageName, List paths) { 133 processPaths(String packageName, List paths) {
133 List<Folder> folders = <Folder>[]; 134 List<Folder> folders = <Folder>[];
134 for (var path in paths) { 135 for (var path in paths) {
135 if (path is String) { 136 if (path is String) {
136 Resource resource = resourceProvider.getResource(path); 137 Resource resource = folder.getChild(path);
137 if (resource is Folder) { 138 if (resource is Folder) {
138 folders.add(resource); 139 folders.add(resource);
139 } 140 }
140 } 141 }
141 } 142 }
142 if (folders.isNotEmpty) { 143 if (folders.isNotEmpty) {
143 packageMap[packageName] = folders; 144 packageMap[packageName] = folders;
144 } 145 }
145 } 146 }
146 packages.forEach((key, value) { 147 packages.forEach((key, value) {
147 if (value is String) { 148 if (value is String) {
148 processPaths(key, [value]); 149 processPaths(key, [value]);
149 } else if (value is List) { 150 } else if (value is List) {
150 processPaths(key, value); 151 processPaths(key, value);
151 } 152 }
152 }); 153 });
153 Set<String> dependencies = new Set<String>(); 154 Set<String> dependencies = new Set<String>();
154 List inputFiles = obj['input_files']; 155 List inputFiles = obj['input_files'];
155 if (inputFiles != null) { 156 if (inputFiles != null) {
156 for (var path in inputFiles) { 157 for (var path in inputFiles) {
157 if (path is String) { 158 if (path is String) {
158 dependencies.add(path); 159 dependencies.add(folder.canonicalizePath(path));
159 } 160 }
160 } 161 }
161 } 162 }
162 return new PackageMapInfo(packageMap, dependencies); 163 return new PackageMapInfo(packageMap, dependencies);
163 } 164 }
164 } 165 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698