Skip to content

Commit

Permalink
fix event bubbling for NuGet restore
Browse files Browse the repository at this point in the history
  • Loading branch information
jonsequitur committed Sep 22, 2023
1 parent f0cc204 commit 4c2f069
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ namespace Microsoft.DotNet.Interactive;

public static class KernelSupportsNugetExtensions
{
public static T UseNugetDirective<T>(this T kernel, bool useResultsCache = true)
where T: Kernel, ISupportNuget
public static T UseNugetDirective<T>(this T kernel, bool useResultsCache = true)
where T : Kernel, ISupportNuget
{
kernel.AddDirective(i());
kernel.AddDirective(r());
Expand All @@ -28,6 +28,8 @@ public static T UseNugetDirective<T>(this T kernel, bool useResultsCache = true)
kernel.AddDirective(restore);

return kernel;

static KernelCommandInvocation DoNugetRestore() => async (_, context) => await context.ScheduleAsync(Restore);
}

private static Command i()
Expand Down Expand Up @@ -151,70 +153,62 @@ private static bool EndsInDirectorySeparator(string path)
return path.Length > 0 && path.EndsWith(Path.DirectorySeparatorChar);
}

internal static KernelCommandInvocation DoNugetRestore()
private static async Task Restore(KernelInvocationContext context)
{
return async (_, invocationContext) =>
if (context.HandlingKernel is not ISupportNuget kernel)
{
async Task Restore(KernelInvocationContext context)
{
if (context.HandlingKernel is not ISupportNuget kernel)
{
return;
}
return;
}

var requestedPackages = kernel.RequestedPackageReferences.Select(s => s.PackageName).OrderBy(s => s).ToList();
var requestedPackages = kernel.RequestedPackageReferences.Select(s => s.PackageName).OrderBy(s => s).ToList();

var requestedSources = kernel.RestoreSources.OrderBy(s => s).ToList();
var requestedSources = kernel.RestoreSources.OrderBy(s => s).ToList();

var installMessage = new InstallPackagesMessage(requestedSources, requestedPackages, Array.Empty<string>(), 0);
var installMessage = new InstallPackagesMessage(requestedSources, requestedPackages, Array.Empty<string>(), 0);

var displayedValue = context.Display(installMessage);
var displayedValue = context.Display(installMessage);

var restorePackagesTask = kernel.RestoreAsync();
var delay = 500;
while (await Task.WhenAny(Task.Delay(delay), restorePackagesTask) != restorePackagesTask)
{
if (context.CancellationToken.IsCancellationRequested)
{
break;
}
var restorePackagesTask = kernel.RestoreAsync();
var delay = 500;
while (await Task.WhenAny(Task.Delay(delay), restorePackagesTask) != restorePackagesTask)
{
if (context.CancellationToken.IsCancellationRequested)
{
break;
}

installMessage.Progress++;
installMessage.Progress++;

displayedValue.Update(installMessage);
}
displayedValue.Update(installMessage);
}

var result = await restorePackagesTask;
var result = await restorePackagesTask;

var resultMessage = new InstallPackagesMessage(
requestedSources,
Array.Empty<string>(),
kernel.ResolvedPackageReferences
.Where(r => requestedPackages.Contains(r.PackageName, StringComparer.OrdinalIgnoreCase))
.Select(s => $"{s.PackageName}, {s.PackageVersion}")
.OrderBy(s => s)
.ToList(),
0);
var resultMessage = new InstallPackagesMessage(
requestedSources,
Array.Empty<string>(),
kernel.ResolvedPackageReferences
.Where(r => requestedPackages.Contains(r.PackageName, StringComparer.OrdinalIgnoreCase))
.Select(s => $"{s.PackageName}, {s.PackageVersion}")
.OrderBy(s => s)
.ToList(),
0);

if (result.Succeeded)
{
kernel.RegisterResolvedPackageReferences(result.ResolvedReferences);
foreach (var resolvedReference in result.ResolvedReferences)
{
context.Publish(new PackageAdded(resolvedReference, context.Command));
}
displayedValue.Update(resultMessage);
}
else
{
var errors = string.Join(Environment.NewLine, result.Errors);
displayedValue.Update(resultMessage);
context.Fail(context.Command, message: errors);
}
if (result.Succeeded)
{
kernel.RegisterResolvedPackageReferences(result.ResolvedReferences);
foreach (var resolvedReference in result.ResolvedReferences)
{
context.Publish(new PackageAdded(resolvedReference, context.Command));
}

await invocationContext.ScheduleAsync(Restore);
};
displayedValue.Update(resultMessage);
}
else
{
var errors = string.Join(Environment.NewLine, result.Errors);
displayedValue.Update(resultMessage);
context.Fail(context.Command, message: errors);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ public async Task<PackageRestoreResult> RestoreAsync()
if (!result.Success)
{
errors.AddRange(result.StdOut);

packageRestoreResult = new PackageRestoreResult(
succeeded: false,
requestedPackages: newlyRequestedPackageReferences,
Expand Down
13 changes: 9 additions & 4 deletions src/Microsoft.DotNet.Interactive/KernelInvocationContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -399,10 +399,15 @@ internal void CancelWithSuccess()

internal DirectiveNode CurrentlyParsingDirectiveNode { get; set; }

public Task ScheduleAsync(Func<KernelInvocationContext, Task> func) =>
// FIX: (ScheduleAsync) inline this
HandlingKernel.SendAsync(new AnonymousKernelCommand((_, invocationContext) =>
func(invocationContext)));
public async Task ScheduleAsync(
Func<KernelInvocationContext, Task> func)
{
// FIX: (ScheduleAsync) make this method internal
var anonymousCommand = new AnonymousKernelCommand((_, invocationContext) => func(invocationContext));
anonymousCommand.SetParent(Command);
Command.ResultShouldIncludeEventsFrom(anonymousCommand);
await HandlingKernel.SendAsync(anonymousCommand);
}

internal class KernelCommandTokenComparer : IEqualityComparer<KernelCommand>
{
Expand Down

0 comments on commit 4c2f069

Please sign in to comment.