Merge branch 'release/2.2'

This commit is contained in:
Ajay Bhargav Baaskaran 2018-07-17 14:15:19 -07:00
commit bcbc760dd5
3 changed files with 47 additions and 2 deletions

View File

@ -99,7 +99,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var uniqueId = (string)context.Items[CodeRenderingContext.SuppressUniqueIds];
if (uniqueId == null)
{
uniqueId = Guid.NewGuid().ToString("N");
uniqueId = GetDeterministicId(context);
}
context.CodeWriter.WriteStringLiteral(node.TagName)
@ -637,6 +637,16 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
return builder.ToString();
}
// Internal for testing
internal static string GetDeterministicId(CodeRenderingContext context)
{
// Use the file checksum along with the absolute position in the generated code to create a unique id for each tag helper call site.
var checksum = Checksum.BytesToString(context.SourceDocument.GetChecksum());
var uniqueId = checksum + context.CodeWriter.Location.AbsoluteIndex;
return uniqueId;
}
private static string GetPropertyAccessor(DefaultTagHelperPropertyIntermediateNode node)
{
var propertyAccessor = $"{node.FieldName}.{node.PropertyName}";

View File

@ -4,7 +4,6 @@
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Testing.xunit;
@ -568,6 +567,28 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests
Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.pdb");
}
[Fact]
[InitializeTestProject("SimpleMvc")]
public async Task Build_WithDeterministicFlagSet_OutputsDeterministicViewsAssembly()
{
// Build 1
var result = await DotnetMSBuild("Build", $"/p:Deterministic=true");
Assert.BuildPassed(result);
Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.dll");
var filePath = Path.Combine(result.Project.DirectoryPath, IntermediateOutputPath, "SimpleMvc.Views.dll");
var firstAssemblyBytes = File.ReadAllBytes(filePath);
// Build 2
result = await DotnetMSBuild("Rebuild", $"/p:Deterministic=true");
Assert.BuildPassed(result);
Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.dll");
var secondAssemblyBytes = File.ReadAllBytes(filePath);
Assert.Equal(firstAssemblyBytes, secondAssemblyBytes);
}
private static DependencyContext ReadDependencyContext(string depsFilePath)
{
var reader = new DependencyContextJsonReader();

View File

@ -1118,6 +1118,20 @@ private global::Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperScopeMana
ignoreLineEndingDifferences: true);
}
[Fact]
public void GetDeterministicId_IsDeterministic()
{
// Arrange
var context = TestCodeRenderingContext.CreateRuntime(suppressUniqueIds: null);
// Act
var firstId = DefaultTagHelperTargetExtension.GetDeterministicId(context);
var secondId = DefaultTagHelperTargetExtension.GetDeterministicId(context);
// Assert
Assert.Equal(firstId, secondId);
}
private static void Push(CodeRenderingContext context, TagHelperIntermediateNode node)
{
((DefaultCodeRenderingContext)context).AncestorsInternal.Push(node);