Skip to content
This repository was archived by the owner on Dec 18, 2017. It is now read-only.

Commit 0dda8bf

Browse files
committed
Prevent dnu restore logic from diving in nested project folder
1 parent be2d968 commit 0dda8bf

File tree

6 files changed

+92
-27
lines changed

6 files changed

+92
-27
lines changed
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"projects": ["src"]
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"frameworks": {
3+
"dnx451": { }
4+
},
5+
"dependencies": {
6+
"Newtonsoft.Json": "6.0.8"
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"frameworks": {
3+
"dnx451": { }
4+
},
5+
"dependencies": {
6+
"Newtonsoft.Json": "6.0.8"
7+
}
8+
}

src/Microsoft.Dnx.Tooling/Restore/RestoreCommand.cs

+2-27
Original file line numberDiff line numberDiff line change
@@ -92,33 +92,8 @@ private async Task<bool> Execute(string restoreDirectory, PackageFeedCache packa
9292
{
9393
var sw = Stopwatch.StartNew();
9494

95-
var projectJsonFiles = new List<string>();
96-
97-
if (string.Equals(
98-
Runtime.Project.ProjectFileName,
99-
Path.GetFileName(restoreDirectory),
100-
StringComparison.OrdinalIgnoreCase) && File.Exists(restoreDirectory))
101-
{
102-
// If the path is a project.json file we don't do recursive search in subfolders
103-
projectJsonFiles.Add(restoreDirectory);
104-
}
105-
else if (Directory.Exists(restoreDirectory))
106-
{
107-
var projectJsonFile = Path.Combine(restoreDirectory, Runtime.Project.ProjectFileName);
108-
if (File.Exists(projectJsonFile))
109-
{
110-
// If the path contains a project.json file we don't do recursive search in subfolders
111-
projectJsonFiles.Add(projectJsonFile);
112-
}
113-
else
114-
{
115-
projectJsonFiles.AddRange(Directory.EnumerateFiles(
116-
restoreDirectory,
117-
Runtime.Project.ProjectFileName,
118-
SearchOption.AllDirectories));
119-
}
120-
}
121-
else
95+
IEnumerable<string> projectJsonFiles;
96+
if (!RestoreProjectsCollector.Find(restoreDirectory, out projectJsonFiles))
12297
{
12398
var errorMessage = $"The given root {restoreDirectory.Red().Bold()} is invalid.";
12499
summary.ErrorMessages.GetOrAdd(restoreDirectory, _ => new List<string>()).Add(errorMessage);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Linq;
8+
9+
namespace Microsoft.Dnx.Tooling
10+
{
11+
internal class RestoreProjectsCollector
12+
{
13+
public static bool Find(string restoreDirectory, out IEnumerable<string> projectJsonFiles)
14+
{
15+
if (string.Equals(Runtime.Project.ProjectFileName,
16+
Path.GetFileName(restoreDirectory),
17+
StringComparison.OrdinalIgnoreCase) && File.Exists(restoreDirectory))
18+
{
19+
// If the path is a project.json file we don't do recursive search in subfolders
20+
projectJsonFiles = new List<string> { restoreDirectory };
21+
22+
return true;
23+
}
24+
25+
if (!Directory.Exists(restoreDirectory))
26+
{
27+
projectJsonFiles = Enumerable.Empty<string>();
28+
return false;
29+
}
30+
31+
var result = new List<string>();
32+
CollectProjectFiles(restoreDirectory, result);
33+
34+
projectJsonFiles = result;
35+
return true;
36+
}
37+
38+
private static void CollectProjectFiles(string directory, List<string> results)
39+
{
40+
var candidate = Path.Combine(directory, Runtime.Project.ProjectFileName);
41+
if (File.Exists(candidate))
42+
{
43+
results.Add(candidate);
44+
}
45+
else
46+
{
47+
foreach (var subdirectory in Directory.EnumerateDirectories(directory))
48+
{
49+
CollectProjectFiles(subdirectory, results);
50+
}
51+
}
52+
}
53+
}
54+
}

test/Microsoft.Dnx.Tooling.FunctionalTests/DnuRestoreTests.cs

+17
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,22 @@ public void Restore_ProjectOverPackageTarget(DnxSdk sdk)
7070

7171
TestUtils.CleanUpTestDir<DnuPublishTests>(sdk);
7272
}
73+
74+
[Theory, TraceTest]
75+
[MemberData(nameof(DnxSdks))]
76+
public void Restore_DoNotRestoreNestProjects(DnxSdk sdk)
77+
{
78+
var solution = TestUtils.GetSolution<DnuRestoreTests>(sdk, "NestProjectRestoreModel");
79+
80+
// ensure there is no lock file before restore
81+
Assert.Empty(Directory.GetFiles(solution.RootPath, "project.lock.json", SearchOption.AllDirectories));
82+
83+
sdk.Dnu.Restore(solution.GetProject("Main")).EnsureSuccess();
84+
85+
// only the project.json under Main folder is expected to be restored
86+
var lockFiles = Directory.GetFiles(solution.RootPath, "project.lock.json", SearchOption.AllDirectories);
87+
Assert.Equal(1, lockFiles.Length);
88+
Assert.Equal("Main", Path.GetFileName(Path.GetDirectoryName(lockFiles[0])));
89+
}
7390
}
7491
}

0 commit comments

Comments
 (0)