Commit 035afc2c authored by John McCutchan's avatar John McCutchan Committed by GitHub

Properly handle symlinked source files in hot mode (#5978)

parent 7ad5ec40
...@@ -30,7 +30,7 @@ class DevFSEntry { ...@@ -30,7 +30,7 @@ class DevFSEntry {
final AssetBundleEntry bundleEntry; final AssetBundleEntry bundleEntry;
String get assetPath => bundleEntry.archivePath; String get assetPath => bundleEntry.archivePath;
final File file; final FileSystemEntity file;
FileStat _fileStat; FileStat _fileStat;
// When we scanned for files, did this still exist? // When we scanned for files, did this still exist?
bool _exists = false; bool _exists = false;
...@@ -69,15 +69,29 @@ class DevFSEntry { ...@@ -69,15 +69,29 @@ class DevFSEntry {
if (_isSourceEntry) if (_isSourceEntry)
return; return;
_fileStat = file.statSync(); _fileStat = file.statSync();
if (_fileStat.type == FileSystemEntityType.LINK) {
// Stat the link target.
String resolved = file.resolveSymbolicLinksSync();
_fileStat = FileStat.statSync(resolved);
}
} }
bool get _isSourceEntry => file == null; bool get _isSourceEntry => file == null;
bool get _isAssetEntry => bundleEntry != null; bool get _isAssetEntry => bundleEntry != null;
File _getFile() {
if (file is Link) {
// The link target.
return new File(file.resolveSymbolicLinksSync());
}
return file;
}
Future<List<int>> contentsAsBytes() async { Future<List<int>> contentsAsBytes() async {
if (_isSourceEntry) if (_isSourceEntry)
return bundleEntry.contentsAsBytes(); return bundleEntry.contentsAsBytes();
final File file = _getFile();
return file.readAsBytes(); return file.readAsBytes();
} }
...@@ -86,6 +100,7 @@ class DevFSEntry { ...@@ -86,6 +100,7 @@ class DevFSEntry {
return new Stream<List<int>>.fromIterable( return new Stream<List<int>>.fromIterable(
<List<int>>[bundleEntry.contentsAsBytes()]); <List<int>>[bundleEntry.contentsAsBytes()]);
} }
final File file = _getFile();
return file.openRead(); return file.openRead();
} }
...@@ -417,7 +432,7 @@ class DevFS { ...@@ -417,7 +432,7 @@ class DevFS {
logger.flush(); logger.flush();
} }
void _scanFile(String devicePath, File file) { void _scanFile(String devicePath, FileSystemEntity file) {
DevFSEntry entry = _entries[devicePath]; DevFSEntry entry = _entries[devicePath];
if (entry == null) { if (entry == null) {
// New file. // New file.
...@@ -485,10 +500,20 @@ class DevFS { ...@@ -485,10 +500,20 @@ class DevFS {
Stream<FileSystemEntity> files = Stream<FileSystemEntity> files =
directory.list(recursive: recursive, followLinks: false); directory.list(recursive: recursive, followLinks: false);
await for (FileSystemEntity file in files) { await for (FileSystemEntity file in files) {
if (file is! File) { if (file is Link) {
final String linkPath = file.resolveSymbolicLinksSync();
final FileSystemEntityType linkType =
FileStat.statSync(linkPath).type;
if (linkType == FileSystemEntityType.DIRECTORY) {
// Skip links to directories.
continue;
}
}
if (file is Directory) {
// Skip non-files. // Skip non-files.
continue; continue;
} }
assert((file is Link) || (file is File));
if (ignoreDotFiles && path.basename(file.path).startsWith('.')) { if (ignoreDotFiles && path.basename(file.path).startsWith('.')) {
// Skip dot files. // Skip dot files.
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment