122 строки
3.5 KiB
C#
122 строки
3.5 KiB
C#
using Microsoft.Build.Framework;
|
|
using Microsoft.Build.Utilities;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Xamarin.Localization.MSBuild;
|
|
using Xamarin.Messaging.Build.Client;
|
|
using Xamarin.Messaging.Build.Contracts;
|
|
|
|
namespace Xamarin.iOS.Tasks {
|
|
public class ResolveUniversalTypeIdentifiers : Task {
|
|
[Required]
|
|
public ITaskItem [] ImageAssets { get; set; }
|
|
|
|
[Required]
|
|
public string ProjectDir { get; set; }
|
|
|
|
[Required]
|
|
public string SessionId { get; set; }
|
|
|
|
public override bool Execute ()
|
|
{
|
|
try {
|
|
LogTaskProperty ("ImageAssets", ImageAssets);
|
|
LogTaskProperty ("ProjectDir", ProjectDir);
|
|
LogTaskProperty ("SessionId", SessionId);
|
|
|
|
var connection = BuildConnection.GetAsync (SessionId, BuildEngine4).Result;
|
|
var buildClient = connection.Client as BuildClient;
|
|
|
|
if (!connection.IsConnected || buildClient == null) {
|
|
Log.LogWarning (MSBStrings.E0179, nameof (ResolveUniversalTypeIdentifiers));
|
|
|
|
return true;
|
|
}
|
|
|
|
var contentFiles = ImageAssets
|
|
.Where (asset => Path.GetFileName (asset.ItemSpec) == "Contents.json" &&
|
|
Path.GetDirectoryName (asset.ItemSpec).EndsWith (".dataset"))
|
|
.Select (x => x.ItemSpec);
|
|
|
|
foreach (var filePath in contentFiles) {
|
|
string content;
|
|
DataSet dataset = null;
|
|
|
|
if (File.Exists (filePath)) {
|
|
content = File.ReadAllText (filePath);
|
|
dataset = JsonConvert.DeserializeObject<DataSet> (content);
|
|
}
|
|
|
|
if (dataset == null) {
|
|
Log.LogError (MSBStrings.E0180, Path.GetDirectoryName (filePath));
|
|
continue;
|
|
}
|
|
|
|
var dataItemsToComplete = dataset
|
|
.DataItems
|
|
.Where (item => string.IsNullOrEmpty (item.UniversalTypeIdentifier) &&
|
|
!string.IsNullOrEmpty (item.Filename)).ToList ();
|
|
|
|
foreach (var data in dataItemsToComplete) {
|
|
var file = ImageAssets.FirstOrDefault (x => Path.GetFileName (x.ItemSpec) == data.Filename);
|
|
|
|
if (file == null) {
|
|
Log.LogWarning (MSBStrings.E0181, data.Filename);
|
|
|
|
continue;
|
|
}
|
|
|
|
var message = new GetUniversalTypeIdentifierMessage {
|
|
Payload = File.ReadAllBytes (file.ItemSpec),
|
|
FileName = Path.GetFileName (data.Filename)
|
|
};
|
|
|
|
var response = buildClient
|
|
.RunMessagingAsync<GetUniversalTypeIdentifierMessage, GetUniversalTypeIdentifierResult> (message, timeoutSecs: 10)
|
|
.Result;
|
|
|
|
if (string.IsNullOrEmpty (response.UniversalTypeIdentifier))
|
|
Log.LogError (string.Format (MSBStrings.E0182, data.Filename, Path.GetDirectoryName (filePath)));
|
|
|
|
data.UniversalTypeIdentifier = response.UniversalTypeIdentifier;
|
|
}
|
|
|
|
if (dataItemsToComplete.Any ()) {
|
|
content = JsonConvert.SerializeObject (dataset, Formatting.Indented);
|
|
File.WriteAllText (filePath, content);
|
|
}
|
|
}
|
|
|
|
return !Log.HasLoggedErrors;
|
|
} catch (Exception ex) {
|
|
Log.LogErrorFromException (ex);
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//TODO: Ideally we should get this from the LoggingExtensions in Xamarin.MacDev.Tasks. We would need the reference for that
|
|
|
|
void LogTaskProperty (string propertyName, ITaskItem [] items)
|
|
{
|
|
if (items == null) {
|
|
Log.LogMessage (MessageImportance.Normal, " {0}: <null>", propertyName);
|
|
|
|
return;
|
|
}
|
|
|
|
Log.LogMessage (MessageImportance.Normal, " {0}:", propertyName);
|
|
|
|
for (int i = 0; i < items.Length; i++)
|
|
Log.LogMessage (MessageImportance.Normal, " {0}", items [i].ItemSpec);
|
|
}
|
|
|
|
void LogTaskProperty (string propertyName, string value)
|
|
{
|
|
Log.LogMessage (MessageImportance.Normal, " {0}: {1}", propertyName, value ?? "<null>");
|
|
}
|
|
}
|
|
}
|