| OLD | NEW |
| 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 library command_lish; | 5 library command_lish; |
| 6 | 6 |
| 7 import 'dart:io'; | 7 import 'dart:io'; |
| 8 import 'dart:json'; | 8 import 'dart:json'; |
| 9 import 'dart:uri'; | 9 import 'dart:uri'; |
| 10 | 10 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 /// The basenames of directories that are automatically excluded from | 130 /// The basenames of directories that are automatically excluded from |
| 131 /// archives. | 131 /// archives. |
| 132 final _BLACKLISTED_DIRECTORIES = const ['packages']; | 132 final _BLACKLISTED_DIRECTORIES = const ['packages']; |
| 133 | 133 |
| 134 /// Returns a list of files that should be included in the published package. | 134 /// Returns a list of files that should be included in the published package. |
| 135 /// If this is a Git repository, this will respect .gitignore; otherwise, it | 135 /// If this is a Git repository, this will respect .gitignore; otherwise, it |
| 136 /// will return all non-hidden files. | 136 /// will return all non-hidden files. |
| 137 Future<List<String>> get _filesToPublish { | 137 Future<List<String>> get _filesToPublish { |
| 138 var rootDir = entrypoint.root.dir; | 138 var rootDir = entrypoint.root.dir; |
| 139 | 139 |
| 140 // TODO(rnystrom): listDir() returns real file paths after symlinks are | |
| 141 // resolved. This means if libDir contains a symlink, the resulting paths | |
| 142 // won't appear to be within it, which confuses relativeTo(). Work around | |
| 143 // that here by making sure we have the real path to libDir. Remove this | |
| 144 // when #7346 is fixed. | |
| 145 rootDir = new File(rootDir).fullPathSync(); | |
| 146 | |
| 147 return Futures.wait([ | 140 return Futures.wait([ |
| 148 dirExists(join(rootDir, '.git')), | 141 dirExists(join(rootDir, '.git')), |
| 149 git.isInstalled | 142 git.isInstalled |
| 150 ]).chain((results) { | 143 ]).chain((results) { |
| 151 if (results[0] && results[1]) { | 144 if (results[0] && results[1]) { |
| 152 // List all files that aren't gitignored, including those not checked in | 145 // List all files that aren't gitignored, including those not checked in |
| 153 // to Git. | 146 // to Git. |
| 154 return git.run(["ls-files", "--cached", "--others"]); | 147 return git.run(["ls-files", "--cached", "--others"]); |
| 155 } | 148 } |
| 156 | 149 |
| 157 return listDir(rootDir, recursive: true).chain((entries) { | 150 return listDir(rootDir, recursive: true).chain((entries) { |
| 158 return Futures.wait(entries.map((entry) { | 151 return Futures.wait(entries.map((entry) { |
| 159 return fileExists(entry).transform((isFile) { | 152 return fileExists(entry).transform((isFile) { |
| 160 // Skip directories. | 153 // Skip directories. |
| 161 if (!isFile) return null; | 154 if (!isFile) return null; |
| 162 | 155 |
| 163 // TODO(rnystrom): Making these relative will break archive | 156 // TODO(rnystrom): Making these relative will break archive |
| 164 // creation if the cwd is ever *not* the package root directory. | 157 // creation if the cwd is ever *not* the package root directory. |
| 165 // Should instead only make these relative right before generating | 158 // Should instead only make these relative right before generating |
| 166 // the tree display (which is what really needs them to be). | 159 // the tree display (which is what really needs them to be). |
| 167 // Make it relative to the package root. | 160 // Make it relative to the package root. |
| 168 entry = relativeTo(entry, rootDir); | 161 return relativeTo(entry, rootDir); |
| 169 | |
| 170 // TODO(rnystrom): dir.list() will include paths with resolved | |
| 171 // symlinks. In particular, we'll get paths to symlinked files from | |
| 172 // "packages" that reach outside of this package. Since the path | |
| 173 // has already been resolved, we don't even see "packages" in that | |
| 174 // path anymore. | |
| 175 // These should not be included in the archive. As a hack, ignore | |
| 176 // any file whose relative path is backing out of the root | |
| 177 // directory. Should do something cleaner. | |
| 178 var parts = path.split(entry); | |
| 179 if (!parts.isEmpty && parts[0] == '..') return null; | |
| 180 | |
| 181 return entry; | |
| 182 }); | 162 }); |
| 183 })); | 163 })); |
| 184 }); | 164 }); |
| 185 }).transform((files) => files.filter((file) { | 165 }).transform((files) => files.filter((file) { |
| 186 if (file == null || _BLACKLISTED_FILES.contains(basename(file))) { | 166 if (file == null || _BLACKLISTED_FILES.contains(basename(file))) { |
| 187 return false; | 167 return false; |
| 188 } | 168 } |
| 189 | 169 |
| 190 return !splitPath(file).some(_BLACKLISTED_DIRECTORIES.contains); | 170 return !splitPath(file).some(_BLACKLISTED_DIRECTORIES.contains); |
| 191 })); | 171 })); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 var s = warnings.length == 1 ? '' : 's'; | 217 var s = warnings.length == 1 ? '' : 's'; |
| 238 message = "Package has ${warnings.length} warning$s. Upload anyway"; | 218 message = "Package has ${warnings.length} warning$s. Upload anyway"; |
| 239 } | 219 } |
| 240 | 220 |
| 241 return confirm(message).transform((confirmed) { | 221 return confirm(message).transform((confirmed) { |
| 242 if (!confirmed) throw "Package upload canceled."; | 222 if (!confirmed) throw "Package upload canceled."; |
| 243 }); | 223 }); |
| 244 }); | 224 }); |
| 245 } | 225 } |
| 246 } | 226 } |
| OLD | NEW |