| OLD | NEW |
| 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 Loading... |
| 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 } |
| OLD | NEW |