protected virtual int CloneConfiguration(MSBuild.Project project, string existingConfigurationName, string newConfigurationName)
{
if (project == null)
throw new ArgumentNullException("project");
if (existingConfigurationName == null)
throw new ArgumentNullException("existingConfigurationName");
if (newConfigurationName == null)
throw new ArgumentNullException("newConfigurationName");
if (string.IsNullOrEmpty(existingConfigurationName))
throw new ArgumentException("existingConfigurationName cannot be null or empty");
if (string.IsNullOrEmpty(newConfigurationName))
throw new ArgumentException("newConfigurationName cannot be null or empty");
string[] platformNames = GetPlatformsFromProject();
string existingConfigurationCondition = GetConfigurationCondition(existingConfigurationName).Trim();
string newConfigurationCondition = GetConfigurationCondition(newConfigurationName);
string[] existingConfigurationPlatformConditions = new string[platformNames.Length];
string[] newConfigurationPlatformConditions = new string[platformNames.Length];
for (int i = 0; i < existingConfigurationPlatformConditions.Length; i++)
{
existingConfigurationPlatformConditions[i] = GetConfigurationPlatformCondition(existingConfigurationName, platformNames[i]).Trim();
newConfigurationPlatformConditions[i] = GetConfigurationPlatformCondition(newConfigurationName, platformNames[i]);
}
foreach (var group in project.Xml.PropertyGroups.ToArray())
{
if (string.IsNullOrEmpty(group.Condition))
continue;
if (string.Equals(group.Condition.Trim(), existingConfigurationCondition, StringComparison.OrdinalIgnoreCase))
{
ProjectPropertyGroupElement clonedGroup = ClonePropertyGroup(project, group);
clonedGroup.Condition = newConfigurationCondition;
}
else
{
int index = Array.FindIndex(existingConfigurationPlatformConditions, i => StringComparer.OrdinalIgnoreCase.Equals(i, group.Condition.Trim()));
if (index < 0)
continue;
ProjectPropertyGroupElement clonedGroup = ClonePropertyGroup(project, group);
clonedGroup.Condition = newConfigurationPlatformConditions[index];
// update the OutputPath property if it exists and isn't conditioned on $(Configuration)
foreach (var property in clonedGroup.Properties)
{
if (!string.Equals(property.Name, "OutputPath", StringComparison.OrdinalIgnoreCase))
continue;
if (!string.IsNullOrEmpty(property.Condition))
continue;
if (property.Value.IndexOf("$(Configuration)", StringComparison.OrdinalIgnoreCase) >= 0)
continue;
// update the output path
property.Value = GetDefaultOutputPath(newConfigurationName, platformNames[index]);
}
}
}
return VSConstants.S_OK;
}