50 строки
1.4 KiB
C#
50 строки
1.4 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Microsoft.Build.Framework;
|
|
using Microsoft.Build.Utilities;
|
|
using Xamarin.Messaging.Build.Client;
|
|
|
|
namespace Xamarin.MacDev.Tasks {
|
|
public class Ditto : DittoTaskBase, ITaskCallback {
|
|
public override bool Execute ()
|
|
{
|
|
if (ShouldExecuteRemotely ()) {
|
|
var taskRunner = new TaskRunner (SessionId, BuildEngine4);
|
|
|
|
taskRunner.FixReferencedItems (new ITaskItem [] { Source });
|
|
|
|
return taskRunner.RunAsync (this).Result;
|
|
}
|
|
|
|
return base.Execute ();
|
|
}
|
|
|
|
public override void Cancel ()
|
|
{
|
|
base.Cancel ();
|
|
|
|
if (ShouldExecuteRemotely ())
|
|
BuildConnection.CancelAsync (BuildEngine4).Wait ();
|
|
}
|
|
|
|
public IEnumerable<ITaskItem> GetAdditionalItemsToBeCopied ()
|
|
{
|
|
if (!Directory.Exists (Source.ItemSpec))
|
|
return Enumerable.Empty<ITaskItem> ();
|
|
|
|
if (!CopyFromWindows)
|
|
return Enumerable.Empty<ITaskItem> ();
|
|
|
|
// TaskRunner doesn't know how to copy directories to Mac but `ditto` can take directories (and that's why we use ditto often).
|
|
// If Source is a directory path, let's add each file within it as an TaskItem, as TaskRunner knows how to copy files to Mac.
|
|
return Directory.GetFiles (Source.ItemSpec, "*", SearchOption.AllDirectories)
|
|
.Select (f => new TaskItem (f));
|
|
}
|
|
|
|
public bool ShouldCopyToBuildServer (ITaskItem item) => true;
|
|
|
|
public bool ShouldCreateOutputFile (ITaskItem item) => true;
|
|
}
|
|
}
|