2021-06-24 16:36:04 -05:00
|
|
|
// Licensed to the .NET Foundation under one or more agreements.
|
|
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
using Microsoft.Build.Framework;
|
|
|
|
using Microsoft.Build.Utilities;
|
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Build.Tasks
|
|
|
|
{
|
|
|
|
// Takes a path to a path to a json file and a
|
|
|
|
// string that represents a dotted path to an attribute
|
|
|
|
// and updates that attribute with the new value provided.
|
|
|
|
public class UpdateJson : Task
|
|
|
|
{
|
|
|
|
[Required]
|
|
|
|
public string JsonFilePath { get; set; }
|
|
|
|
|
|
|
|
[Required]
|
|
|
|
public string PathToAttribute { get; set; }
|
|
|
|
|
|
|
|
[Required]
|
|
|
|
public string NewAttributeValue { get; set; }
|
|
|
|
|
|
|
|
public bool SkipUpdateIfMissingKey { get; set; }
|
|
|
|
|
|
|
|
public override bool Execute()
|
|
|
|
{
|
2021-06-30 22:30:51 -05:00
|
|
|
string json = File.ReadAllText(JsonFilePath);
|
|
|
|
string newLineChars = FileUtilities.DetectNewLineChars(json);
|
|
|
|
JObject jsonObj = JObject.Parse(json);
|
2021-06-24 16:36:04 -05:00
|
|
|
|
|
|
|
string[] escapedPathToAttributeParts = PathToAttribute.Replace("\\.", "\x1F").Split('.');
|
|
|
|
for (int i = 0; i < escapedPathToAttributeParts.Length; ++i)
|
|
|
|
{
|
|
|
|
escapedPathToAttributeParts[i] = escapedPathToAttributeParts[i].Replace("\x1F", ".");
|
|
|
|
}
|
|
|
|
UpdateAttribute(jsonObj, escapedPathToAttributeParts, NewAttributeValue);
|
|
|
|
|
2021-06-30 22:30:51 -05:00
|
|
|
File.WriteAllText(JsonFilePath, FileUtilities.NormalizeNewLineChars(jsonObj.ToString(), newLineChars));
|
2021-06-24 16:36:04 -05:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void UpdateAttribute(JToken jsonObj, string[] path, string newValue)
|
|
|
|
{
|
|
|
|
string pathItem = path[0];
|
|
|
|
if (jsonObj[pathItem] == null)
|
|
|
|
{
|
|
|
|
string message = $"Path item [{nameof(PathToAttribute)}] not found in json file.";
|
|
|
|
if (SkipUpdateIfMissingKey)
|
|
|
|
{
|
|
|
|
Log.LogMessage(MessageImportance.Low, $"Skipping update: {message} {pathItem}");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
throw new ArgumentException(message, pathItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (path.Length == 1)
|
|
|
|
{
|
|
|
|
jsonObj[pathItem] = newValue;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
UpdateAttribute(jsonObj[pathItem], path.Skip(1).ToArray(), newValue);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|