Navigation Menu

Skip to content

Commit

Permalink
Fixes #206
Browse files Browse the repository at this point in the history
  • Loading branch information
hvanbakel committed Oct 24, 2018
1 parent cd2624f commit a4c3b15
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Expand Up @@ -10,7 +10,7 @@
<Copyright>Copyright Hans van Bakel</Copyright>
<Description>Tool for converting a MSBuild project file to VS2017 format and beyond.</Description>
<PackageTags>dotnet csproj fsproj vbproj msbuild conversion vs2015 vs14 vs15 vs2017</PackageTags>
<Version>3.0.2</Version>
<Version>3.0.3</Version>
<AssemblyVersion>3.0.0.0</AssemblyVersion>

<!-- SourceLink -->
Expand Down
6 changes: 5 additions & 1 deletion Project2015To2017.Console/Options.cs
Expand Up @@ -24,13 +24,17 @@ public class Options
[Option('o', "output-path", Default = false, HelpText = "Will not create a subfolder with the target framework in the output path")]
public bool NoTargetFrameworkToOutputPath { get; set; } = false;

[Option('f', "force", Default = false, HelpText = "Will force an upgrade even though certain preconditions might not have been met")]
public bool Force { get; set; } = false;

public ConversionOptions ConversionOptions
=> new ConversionOptions
{
KeepAssemblyInfo = AssemblyInfo,
TargetFrameworks = TargetFrameworks?.ToList(),
AppendTargetFrameworkToOutputPath = !NoTargetFrameworkToOutputPath,
ProjectCache = new Caching.DefaultProjectCache()
ProjectCache = new Caching.DefaultProjectCache(),
Force = this.Force
};
}
}
5 changes: 5 additions & 0 deletions Project2015To2017.Core/ConversionOptions.cs
Expand Up @@ -37,5 +37,10 @@ public sealed class ConversionOptions
/// like forcing <see cref="ILegacyOnlyProjectTransformation"/> run on already converted project.
/// </summary>
public IReadOnlyList<string> ForceDefaultTransforms { get; set; } = ImmutableArray<string>.Empty;

/// <summary>
/// Force conversion ignoring any checks we might do that prevent a conversion.
/// </summary>
public bool Force { get; set; }
}
}
4 changes: 3 additions & 1 deletion Project2015To2017.Core/Reading/ProjectReader.cs
Expand Up @@ -14,6 +14,7 @@ public sealed class ProjectReader
{
private readonly Caching.IProjectCache projectCache;
private readonly NuSpecReader nuspecReader;
private readonly bool forceConversion;
private readonly AssemblyInfoReader assemblyInfoReader;
private readonly ProjectPropertiesReader projectPropertiesReader;
private readonly ILogger logger;
Expand All @@ -23,6 +24,7 @@ public ProjectReader(ILogger logger = null, ConversionOptions conversionOptions
this.logger = logger ?? NoopLogger.Instance;
this.projectCache = conversionOptions?.ProjectCache ?? Caching.NoProjectCache.Instance;
this.nuspecReader = new NuSpecReader(this.logger);
this.forceConversion = conversionOptions?.Force ?? false;
this.assemblyInfoReader = new AssemblyInfoReader(this.logger);
this.projectPropertiesReader = new ProjectPropertiesReader(this.logger);
}
Expand Down Expand Up @@ -70,7 +72,7 @@ public Project Read(FileInfo projectFile)
};

// get ProjectTypeGuids and check for unsupported types
if (UnsupportedProjectTypes.IsUnsupportedProjectType(projectDefinition))
if (!this.forceConversion && UnsupportedProjectTypes.IsUnsupportedProjectType(projectDefinition))
{
this.logger.LogError("This project type is not supported for conversion.");
return null;
Expand Down
8 changes: 5 additions & 3 deletions Project2015To2017.Migrate2017.Tool/Program.cs
Expand Up @@ -110,8 +110,8 @@ private static int ProcessArgs(ParseResult result)
logic.ExecuteEvaluate(items, conversionOptions);
break;
case "migrate":
conversionOptions.AppendTargetFrameworkToOutputPath =
!command.ValueOrDefault<bool>("old-output-path");
conversionOptions.AppendTargetFrameworkToOutputPath = !command.ValueOrDefault<bool>("old-output-path");
conversionOptions.Force = command.ValueOrDefault<bool>("force");
conversionOptions.KeepAssemblyInfo = command.ValueOrDefault<bool>("keep-assembly-info");

logic.ExecuteMigrate(items, command.ValueOrDefault<bool>("no-backup"), conversionOptions);
Expand Down Expand Up @@ -150,7 +150,7 @@ private static int ProcessArgs(ParseResult result)
.With("Target frameworks to be used instead of the ones in source projects", "frameworks"));

private static Option ForceTransformationsOption => Option(
"-f|--force-transformations",
"-ft|--force-transformations",
"Force execution of transformations despite project conversion state by their specified names.",
OneOrMoreArguments()
.With("Transformation names to enforce execution", "names"));
Expand All @@ -168,6 +168,8 @@ private static int ProcessArgs(ParseResult result)
ItemsArgument,
Option("-n|--no-backup",
"Skip moving project.json, global.json, and *.xproj to a `Backup` directory after successful migration."),
Option("-f|--force",
"Force a conversion even if not all preconditions are met."),
Option("-a|--keep-assembly-info",
"Keep assembly attributes in AssemblyInfo file instead of moving them to project file."),
TargetFrameworksOption,
Expand Down
73 changes: 71 additions & 2 deletions Project2015To2017.Tests/ProjectPropertiesReadTest.cs
Expand Up @@ -49,6 +49,74 @@ public async Task ReadsTestProject()
Assert.AreEqual("net46", project.TargetFrameworks[0]);
}

[TestMethod]
public async Task ReadsUnsupportedProjectTypeWhenForced()
{
var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project ToolsVersion=""14.0"" DefaultTargets=""Build"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
</Project>";

var project = await ParseAndTransform(xml, nameof(ReadsUnsupportedProjectTypeWhenForced), new ConversionOptions { Force = true }).ConfigureAwait(false);

Assert.AreEqual(ApplicationType.ClassLibrary, project.Type);
}

[TestMethod]
public async Task DoesNotReadUnsupportedProjectTypeWhenNotForced()
{
var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project ToolsVersion=""14.0"" DefaultTargets=""Build"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
</Project>";

var project = await ParseAndTransform(xml).ConfigureAwait(false);

Assert.IsNull(project);
}

[TestMethod]
public async Task ReadsTestProjectGuid()
{
Expand Down Expand Up @@ -565,14 +633,15 @@ public async Task ReadsProjectGuid()
private static async Task<Project> ParseAndTransform(
string xml,
[System.Runtime.CompilerServices.CallerMemberName]
string memberName = ""
string memberName = "",
ConversionOptions options = null
)
{
var testCsProjFile = $"{memberName}_test.csproj";

await File.WriteAllTextAsync(testCsProjFile, xml, Encoding.UTF8);

var project = new ProjectReader().Read(testCsProjFile);
var project = new ProjectReader(null, options).Read(testCsProjFile);

return project;
}
Expand Down
9 changes: 7 additions & 2 deletions Project2015To2017/Facility.cs
Expand Up @@ -132,12 +132,17 @@ void ProcessSingleItem(FileInfo file, string extension)
{
var solution = SolutionReader.Instance.Read(file, logger);
convertedSolutions.Add(solution);
convertedProjects.AddRange(converter.ProcessSolutionFile(solution));
convertedProjects.AddRange(converter.ProcessSolutionFile(solution).Where(x => x != null));
break;
}
default:
{
convertedProjects.Add(converter.ProcessProjectFile(file, null));
var converted = converter.ProcessProjectFile(file, null);
if (converted != null)
{
convertedProjects.Add(converted);
}

break;
}
}
Expand Down

1 comment on commit a4c3b15

@hlaueriksson
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks ❤️

Please sign in to comment.