in src/Tasks/Common/ConflictResolution/ConflictResolver.cs [174:359]
private TConflictItem ResolveConflict(TConflictItem item1, TConflictItem item2, bool logUnresolvedConflicts)
{
var winner = _packageOverrideResolver.Resolve(item1, item2);
if (winner != null)
{
return winner;
}
string conflictMessage = string.Format(CultureInfo.CurrentCulture, Strings.EncounteredConflict,
item1.DisplayName,
item2.DisplayName);
var exists1 = item1.Exists;
var exists2 = item2.Exists;
if (!exists1 && !exists2)
{
// If neither file exists, then don't report a conflict, as both items should be resolved (or not) to the same reference assembly
return null;
}
if (!exists1 || !exists2)
{
if (logUnresolvedConflicts)
{
string fileMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.CouldNotDetermineWinner_DoesntExist,
!exists1 ? item1.DisplayName : item2.DisplayName);
_log.LogMessage(fileMessage);
}
return null;
}
var assemblyVersion1 = item1.AssemblyVersion;
var assemblyVersion2 = item2.AssemblyVersion;
// if only one is missing version stop: something is wrong when we have a conflict between assembly and non-assembly
if (assemblyVersion1 == null ^ assemblyVersion2 == null)
{
if (logUnresolvedConflicts)
{
var nonAssembly = assemblyVersion1 == null ? item1.DisplayName : item2.DisplayName;
string assemblyMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.CouldNotDetermineWinner_NotAnAssembly,
nonAssembly);
_log.LogMessage(assemblyMessage);
}
return null;
}
// only handle cases where assembly version is different, and not null (implicit here due to xor above)
if (assemblyVersion1 != assemblyVersion2)
{
string winningDisplayName;
Version winningVersion;
Version losingVersion;
if (assemblyVersion1 > assemblyVersion2)
{
winningDisplayName = item1.DisplayName;
winningVersion = assemblyVersion1;
losingVersion = assemblyVersion2;
}
else
{
winningDisplayName = item2.DisplayName;
winningVersion = assemblyVersion2;
losingVersion = assemblyVersion1;
}
string assemblyMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingAssemblyVersion,
winningDisplayName,
winningVersion,
losingVersion);
_log.LogMessage(assemblyMessage);
if (assemblyVersion1 > assemblyVersion2)
{
return item1;
}
if (assemblyVersion2 > assemblyVersion1)
{
return item2;
}
}
var fileVersion1 = item1.FileVersion;
var fileVersion2 = item2.FileVersion;
// if only one is missing version
if (fileVersion1 == null ^ fileVersion2 == null)
{
if (logUnresolvedConflicts)
{
var nonVersion = fileVersion1 == null ? item1.DisplayName : item2.DisplayName;
string fileVersionMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.CouldNotDetermineWinner_FileVersion,
nonVersion);
}
return null;
}
if (fileVersion1 != fileVersion2)
{
string winningDisplayName;
Version winningVersion;
Version losingVersion;
if (fileVersion1 > fileVersion2)
{
winningDisplayName = item1.DisplayName;
winningVersion = fileVersion1;
losingVersion = fileVersion2;
}
else
{
winningDisplayName = item2.DisplayName;
winningVersion = fileVersion2;
losingVersion = fileVersion1;
}
string fileVersionMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingFileVersion,
winningDisplayName,
winningVersion,
losingVersion);
_log.LogMessage(fileVersionMessage);
if (fileVersion1 > fileVersion2)
{
return item1;
}
if (fileVersion2 > fileVersion1)
{
return item2;
}
}
var packageRank1 = _packageRank.GetPackageRank(item1.PackageId);
var packageRank2 = _packageRank.GetPackageRank(item2.PackageId);
if (packageRank1 < packageRank2)
{
string packageRankMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingPreferredPackage,
item1.DisplayName);
_log.LogMessage(packageRankMessage);
return item1;
}
if (packageRank2 < packageRank1)
{
string packageRankMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingPreferredPackage,
item2.DisplayName);
return item2;
}
var isPlatform1 = item1.ItemType == ConflictItemType.Platform;
var isPlatform2 = item2.ItemType == ConflictItemType.Platform;
if (isPlatform1 && !isPlatform2)
{
string platformMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingPlatformItem,
item1.DisplayName);
_log.LogMessage(platformMessage);
return item1;
}
if (!isPlatform1 && isPlatform2)
{
string platformMessage = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ChoosingPlatformItem,
item2.DisplayName);
_log.LogMessage(platformMessage);
return item2;
}
if (logUnresolvedConflicts)
{
string message = conflictMessage + SENTENCE_SPACING + string.Format(CultureInfo.CurrentCulture, Strings.ConflictCouldNotDetermineWinner);
_log.LogMessage(message);
}
return null;
}