Skip to content

Commit

Permalink
Revert IBuildEngine.ProjectFileOfTaskNode use. (#201)
Browse files Browse the repository at this point in the history
Reverts: 47f95ab
Reverts: 76c076f

Context: xamarin/xamarin-android#7685 (comment)

The problem is that we misunderstood
[`IBuildEngine.ProjectFileOfTaskNode`][0]: we *thought* (hoped?) that
it would return `$(MSBuildProjectFullPath)`, the path to the
`.csproj` being built.

In actuality it returns `$(MSBuildThisFileFullPath)` for the file
containing the Task invocation.  Meaning if e.g.
`Xamarin.Android.Common.targets` contains the Task invocation, then
IBuildEngine.ProjectFileOfTaskNode` would be the path to
`Xamarin.Android.Common.targets`, *not* the path of the `.csproj`.

This in turn means it doesn't actually solve the problem we had.

We will instead need to audit all use of
`IBuildEngine4.RegisterTaskObject()` & related to ensure that the
keys provided *also* contain paths to project-specific files,
if necessary.

Revert 47f95ab and 76c076f, as the changes are not needed.

[0]: https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.framework.ibuildengine.projectfileoftasknode?view=msbuild-17-netcore
  • Loading branch information
jonpryor committed Jan 13, 2023
1 parent 47f95ab commit ac9ea09
Showing 1 changed file with 6 additions and 59 deletions.
65 changes: 6 additions & 59 deletions src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs
Expand Up @@ -13,12 +13,6 @@

namespace Microsoft.Android.Build.Tasks
{
[Flags]
public enum RegisterTaskObjectKeyFlags {
None = 0,
IncludeProjectFile = 1 << 0,
}

public static class MSBuildExtensions
{
public static void LogDebugMessage (this TaskLoggingHelper log, string message, params object[] messageArgs)
Expand Down Expand Up @@ -259,80 +253,33 @@ public static void SetDestinationSubPath (this ITaskItem assembly)
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static void RegisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, object value, RegisteredTaskObjectLifetime lifetime, bool allowEarlyCollection = false) =>
RegisterTaskObjectAssemblyLocal (engine, key, value, lifetime, allowEarlyCollection: false, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static void RegisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, object value, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags) =>
engine.RegisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), value, lifetime, allowEarlyCollection: false);

/// <summary>
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static void RegisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, object value, RegisteredTaskObjectLifetime lifetime, bool allowEarlyCollection, RegisterTaskObjectKeyFlags flags) =>
engine.RegisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), value, lifetime, allowEarlyCollection);
engine.RegisterTaskObject ((AssemblyLocation, key), value, lifetime, allowEarlyCollection);

/// <summary>
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static object GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) =>
GetRegisteredTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static object GetRegisteredTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags) =>
engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime);

engine.GetRegisteredTaskObject ((AssemblyLocation, key), lifetime);

/// <summary>
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static T GetRegisteredTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime)
where T : class => GetRegisteredTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
/// </summary>
public static T GetRegisteredTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags)
where T : class =>
engine.GetRegisteredTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime) as T;
engine.GetRegisteredTaskObject ((AssemblyLocation, key), lifetime) as T;

/// <summary>
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) =>
UnregisterTaskObjectAssemblyLocal (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags) =>
engine.UnregisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime);
public static object UnregisterTaskObjectAssemblyLocal (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime) =>
engine.UnregisterTaskObject ((AssemblyLocation, key), lifetime);

/// <summary>
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static T UnregisterTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime)
where T : class => UnregisterTaskObjectAssemblyLocal<T> (engine, key, lifetime, flags: RegisterTaskObjectKeyFlags.IncludeProjectFile);

/// <summary>
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
/// </summary>
public static T UnregisterTaskObjectAssemblyLocal<T> (this IBuildEngine4 engine, object key, RegisteredTaskObjectLifetime lifetime, RegisterTaskObjectKeyFlags flags)
where T : class =>
engine.UnregisterTaskObject (engine.GetKey (AssemblyLocation, key, flags), lifetime) as T;

/// <summary>
/// Method to calculate the key for the RegisterTaskObject. This is based on the
/// RegisterTaskObjectKeyFlags which are passed.
/// </summary>
static object GetKey (this IBuildEngine4 engine, string location, object key, RegisterTaskObjectKeyFlags flags)
{
return ((flags & RegisterTaskObjectKeyFlags.IncludeProjectFile) != 0)
? (location, key, engine.ProjectFileOfTaskNode)
: (location, key, string.Empty);
}
engine.UnregisterTaskObject ((AssemblyLocation, key), lifetime) as T;
}
}

0 comments on commit ac9ea09

Please sign in to comment.