Skip to content

Commit f6918d5

Browse files
authored
Merge pull request #1345 from zooba/issue-1333
Fixes #1333 Error in DB view while analysis DB is changing
2 parents 9ccda66 + dd4cc8a commit f6918d5

File tree

10 files changed

+38
-47
lines changed

10 files changed

+38
-47
lines changed

Python/Product/Analysis/Interpreter/PythonInterpreterFactoryWithDatabase.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public virtual PythonTypeDatabase MakeTypeDatabase(string databasePath, bool inc
174174
var paths = new List<string>();
175175
paths.Add(databasePath);
176176
if (includeSitePackages) {
177-
paths.AddRange(Directory.EnumerateDirectories(databasePath));
177+
paths.AddRange(PathUtils.EnumerateDirectories(databasePath, recurse: false));
178178
}
179179

180180
try {
@@ -448,8 +448,7 @@ public virtual void RefreshIsCurrent() {
448448

449449
private static HashSet<string> GetExistingDatabase(string databasePath) {
450450
return new HashSet<string>(
451-
Directory.EnumerateFiles(databasePath, "*.idb", SearchOption.AllDirectories)
452-
.Select(f => Path.GetFileNameWithoutExtension(f)),
451+
PathUtils.EnumerateFiles(databasePath, "*.idb").Select(f => Path.GetFileNameWithoutExtension(f)),
453452
StringComparer.InvariantCultureIgnoreCase
454453
);
455454
}
@@ -622,7 +621,7 @@ public IEnumerable<string> GetUpToDateModules() {
622621
// Currently we assume that if the file exists, it's up to date.
623622
// PyLibAnalyzer will perform timestamp checks if the user manually
624623
// refreshes.
625-
return Directory.EnumerateFiles(DatabasePath, "*.idb", SearchOption.AllDirectories)
624+
return PathUtils.EnumerateFiles(DatabasePath, "*.idb")
626625
.Select(f => Path.GetFileNameWithoutExtension(f));
627626
}
628627

Python/Product/Analysis/ModulePath.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ bool requireInitPy
151151
}
152152

153153
if (!skipFiles) {
154-
foreach (var file in Directory.EnumerateFiles(path)) {
155-
var filename = Path.GetFileName(file);
154+
foreach (var file in PathUtils.EnumerateFiles(path, recurse: false)) {
155+
var filename = PathUtils.GetFileOrDirectoryName(file);
156156
var match = PythonFileRegex.Match(filename);
157157
if (!match.Success) {
158158
match = PythonBinaryRegex.Match(filename);
@@ -168,8 +168,8 @@ bool requireInitPy
168168
}
169169

170170
if (recurse) {
171-
foreach (var dir in Directory.EnumerateDirectories(path)) {
172-
var dirname = Path.GetFileName(dir);
171+
foreach (var dir in PathUtils.EnumerateDirectories(path, recurse: false)) {
172+
var dirname = PathUtils.GetFileOrDirectoryName(dir);
173173
var match = PythonPackageRegex.Match(dirname);
174174
if (match.Success && (!requireInitPy || File.Exists(Path.Combine(dir, "__init__.py")))) {
175175
foreach (var entry in GetModuleNamesFromPathHelper(
@@ -238,7 +238,7 @@ public static IEnumerable<ModulePath> GetModulesInPath(
238238
public static IEnumerable<string> ExpandPathFiles(IEnumerable<string> paths) {
239239
foreach (var path in paths) {
240240
if (Directory.Exists(path)) {
241-
foreach (var file in Directory.EnumerateFiles(path, "*.pth")) {
241+
foreach (var file in PathUtils.EnumerateFiles(path, "*.pth", recurse: false)) {
242242
using (var reader = new StreamReader(file)) {
243243
string line;
244244
while ((line = reader.ReadLine()) != null) {

Python/Product/Analyzer/PyLibAnalyzer.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,8 @@ internal async Task<bool> Prepare(bool firstRun) {
649649
// If the top level does not contain any .idb files, we won't
650650
// bother recursing.
651651
if (Directory.Exists(_outDir) &&
652-
Directory.EnumerateFiles(_outDir, "*.idb", SearchOption.TopDirectoryOnly).Any()) {
653-
filesInDatabase.UnionWith(Directory.EnumerateFiles(_outDir, "*.idb", SearchOption.AllDirectories));
652+
PathUtils.EnumerateFiles(_outDir, "*.idb", recurse: false).Any()) {
653+
filesInDatabase.UnionWith(PathUtils.EnumerateFiles(_outDir, "*.idb"));
654654
}
655655
} else if (firstRun) {
656656
Directory.CreateDirectory(_outDir);
@@ -704,7 +704,7 @@ internal async Task<bool> Prepare(bool firstRun) {
704704
}
705705

706706
if (!_dryRun) {
707-
filesInDatabase.UnionWith(Directory.EnumerateFiles(_outDir, "*.idb", SearchOption.AllDirectories));
707+
filesInDatabase.UnionWith(PathUtils.EnumerateFiles(_outDir, "*.idb"));
708708
}
709709

710710
// Store the files we want to keep separately, in case we decide to
@@ -728,9 +728,7 @@ internal async Task<bool> Prepare(bool firstRun) {
728728
} else {
729729
// Failed to get builtin names, so don't delete anything
730730
// from the main output directory.
731-
filesToKeep.UnionWith(
732-
Directory.EnumerateFiles(_outDir, "*.idb", SearchOption.TopDirectoryOnly)
733-
);
731+
filesToKeep.UnionWith(PathUtils.EnumerateFiles(_outDir, "*.idb", recurse: false));
734732
}
735733
}
736734

Python/Product/Common/Infrastructure/PathUtils.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -558,11 +558,11 @@ public static string FindFile(
558558
}
559559
continue;
560560
}
561-
var result = Directory.EnumerateFiles(dir, file, SearchOption.TopDirectoryOnly).FirstOrDefault();
561+
var result = EnumerateFiles(dir, file, recurse: false).FirstOrDefault();
562562
if (result != null) {
563563
return result;
564564
}
565-
foreach (var subDir in Directory.EnumerateDirectories(dir)) {
565+
foreach (var subDir in EnumerateDirectories(dir, recurse: false)) {
566566
dirQueue.Enqueue(subDir);
567567
}
568568
dirQueue.Enqueue("<EOD>");

Python/Product/PythonTools/PythonTools/Project/Conda.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ IInterpreterRegistryService service
4444

4545
string metaFile;
4646
try {
47-
metaFile = Directory.EnumerateFiles(condaMetaPath, "*.json").FirstOrDefault();
47+
metaFile = PathUtils.EnumerateFiles(condaMetaPath, "*.json", recurse: false).FirstOrDefault();
4848
} catch (Exception ex) {
4949
if (ex.IsCriticalException()) {
5050
throw;

Python/Product/PythonTools/PythonTools/Project/ImportWizard/ImportSettings.cs

+4-7
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,13 @@ string filters
231231
) {
232232
if (Directory.Exists(sourcePath)) {
233233
return await Task.Run(() => {
234-
var files = Directory.EnumerateFiles(sourcePath, "*.py", SearchOption.TopDirectoryOnly);
234+
var files = PathUtils.EnumerateFiles(sourcePath, "*.py", recurse: false);
235235
// Also include *.pyw files if they were in the filter list
236236
foreach (var pywFilters in filters
237237
.Split(';')
238238
.Where(filter => filter.TrimEnd().EndsWith(".pyw", StringComparison.OrdinalIgnoreCase))
239239
) {
240-
files = files.Concat(Directory.EnumerateFiles(sourcePath, pywFilters, SearchOption.TopDirectoryOnly));
240+
files = files.Concat(PathUtils.EnumerateFiles(sourcePath, pywFilters, recurse: false));
241241
}
242242
return files.Select(f => Path.GetFileName(f)).ToList();
243243
});
@@ -490,10 +490,7 @@ List<string> virtualEnvPaths
490490
var directories = new List<string>() { source };
491491
var skipDirectories = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
492492

493-
try {
494-
directories.AddRange(Directory.EnumerateDirectories(source, "*", SearchOption.AllDirectories));
495-
} catch (UnauthorizedAccessException) {
496-
}
493+
directories.AddRange(PathUtils.EnumerateDirectories(source));
497494

498495
foreach (var dir in directories) {
499496
if (UnwindDirectory(dir).Any(skipDirectories.Contains)) {
@@ -511,7 +508,7 @@ List<string> virtualEnvPaths
511508
}
512509

513510
foreach (var filter in patterns) {
514-
files.UnionWith(Directory.EnumerateFiles(dir, filter));
511+
files.UnionWith(PathUtils.EnumerateFiles(dir, filter, recurse: false));
515512
}
516513
} catch (UnauthorizedAccessException) {
517514
}

Python/Product/PythonTools/PythonTools/Project/Pip.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ public static async Task<HashSet<string>> List(IPythonInterpreterFactory factory
8484
var packagesPath = Path.Combine(factory.Configuration.LibraryPath, "site-packages");
8585
HashSet<string> result = null;
8686
if (Directory.Exists(packagesPath)) {
87-
result = await Task.Run(() => new HashSet<string>(Directory.EnumerateDirectories(packagesPath)
88-
.Select(path => Path.GetFileName(path))
89-
.Select(name => PackageNameRegex.Match(name))
90-
.Where(match => match.Success)
91-
.Select(match => match.Groups["name"].Value)
92-
))
93-
.SilenceException<IOException, HashSet<string>>()
94-
.SilenceException<UnauthorizedAccessException, HashSet<string>>()
87+
result = await Task.Run(() => new HashSet<string>(
88+
PathUtils.EnumerateDirectories(packagesPath, recurse: false)
89+
.Select(path => Path.GetFileName(path))
90+
.Select(name => PackageNameRegex.Match(name))
91+
.Where(match => match.Success)
92+
.Select(match => match.Groups["name"].Value)
93+
)
94+
)
9595
.HandleAllExceptions(null, typeof(Pip));
9696
}
9797

Python/Product/PythonTools/PythonTools/Project/PythonProjectNode.cs

+4-8
Original file line numberDiff line numberDiff line change
@@ -1966,14 +1966,10 @@ public override bool Publish(PublishProjectOptions publishOptions, bool async) {
19661966
publishOptions = TaskDialog.CallWithRetry(
19671967
_ => new PublishProjectOptions(
19681968
publishOptions.AdditionalFiles.Concat(
1969-
Directory.EnumerateFiles(
1970-
factory.Configuration.PrefixPath,
1971-
"*",
1972-
SearchOption.AllDirectories
1973-
)
1974-
// Exclude the completion DB
1975-
.Where(f => !f.Contains("\\.ptvs\\"))
1976-
.Select(f => new PublishFile(f, PathUtils.GetRelativeFilePath(ProjectHome, f)))
1969+
PathUtils.EnumerateFiles(factory.Configuration.PrefixPath)
1970+
// Exclude the completion DB
1971+
.Where(f => !f.Contains("\\.ptvs\\"))
1972+
.Select(f => new PublishFile(f, PathUtils.GetRelativeFilePath(ProjectHome, f)))
19771973
).ToArray(),
19781974
publishOptions.DestinationUrl
19791975
),

Python/Product/VSInterpreters/DerivedInterpreterFactory.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,7 @@ public override PythonTypeDatabase MakeTypeDatabase(string databasePath, bool in
121121

122122
var paths = new List<string> { databasePath };
123123
if (includeSitePackages) {
124-
try {
125-
paths.AddRange(Directory.EnumerateDirectories(databasePath));
126-
} catch (IOException) {
127-
} catch (UnauthorizedAccessException) {
128-
}
124+
paths.AddRange(PathUtils.EnumerateDirectories(databasePath));
129125
}
130126
return new PythonTypeDatabase(this, paths, _baseDb);
131127
}

Python/Tests/Core/EnvironmentListTests.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ public void HasInterpreters() {
9696
Assert.AreEqual(6, environments.Count);
9797
AssertUtil.ContainsExactly(
9898
wpf.Invoke(() => environments.Select(ev => ev.Description).ToList()),
99-
Enumerable.Range(1, 6).Select(i => string.Format("Test Factory {0}", i))
99+
"Test Factory 1 2.7",
100+
"Test Factory 2 3.0",
101+
"Test Factory 3 3.3",
102+
"Test Factory 4 2.7",
103+
"Test Factory 5 3.0",
104+
"Test Factory 6 3.3"
100105
);
101106
}
102107
}

0 commit comments

Comments
 (0)