public virtual int DoUpgradeProject_CheckOnly(string projectFileName, IVsUpgradeLogger upgradeLogger, out __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS upgradeRequired, out Guid newProjectFactory, out uint upgradeCapabilityFlags) { newProjectFactory = GetType().GUID; var project = ProjectRootElement.Open(projectFileName); // enable Side-by-Side and CopyBackup support upgradeCapabilityFlags = (uint)(__VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_BACKUPSUPPORTED | __VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_COPYBACKUP | __VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_SXSBACKUP); #if FX_ATLEAST_45 if (this.buildEngine.GetLoadedProjects(projectFileName).Count > 0) { // project has already been loaded upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return(VSConstants.S_OK); } var projectInspector = new ProjectInspector(projectFileName); if (projectInspector.IsPoisoned(Site)) { // poisoned project cannot be opened (does not require upgrade) upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return(VSConstants.S_OK); } #endif // only upgrade known tool versions. #if FX_ATLEAST_45 if (string.Equals("4.0", project.ToolsVersion, StringComparison.Ordinal)) { // For 4.0, we need to take a deeper look. The logic is in // vsproject\xmake\XMakeConversion\ProjectFileConverter.cs var projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; if (projectConverter.FSharpSpecificConversions(false)) { upgradeRequired = projectInspector.IsLikeDev10MinusProject() ? __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_ONEWAYUPGRADE : __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_SAFEREPAIR; return(VSConstants.S_OK); } else { upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return(VSConstants.S_OK); } } else #endif if (string.Equals("3.5", project.ToolsVersion, StringComparison.Ordinal) || string.Equals("2.0", project.ToolsVersion, StringComparison.Ordinal)) { // For 3.5 or 2.0, we always need to upgrade. upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_ONEWAYUPGRADE; return(VSConstants.S_OK); } upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return(VSConstants.S_OK); }
/// <summary> /// Performs in-memory conversion of the project with a given path /// </summary> /// <returns>Root element of the converted project or <c>null</c> if conversion failed.</returns> private ProjectRootElement ConvertProject(string projectFileName, ProjectUpgradeLogger logger) { var projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; ProjectRootElement convertedProject = null; try { convertedProject = projectConverter.ConvertInMemory(); } catch (Exception ex) { logger.LogInfo(ex.Message); } return(convertedProject); }
/// <summary> /// Performs in-memory conversion of the project with a given path /// </summary> /// <returns>Root element of the converted project or <c>null</c> if conversion failed.</returns> private ProjectRootElement ConvertProject(string projectFileName, ProjectUpgradeLogger logger) { var projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; ProjectRootElement convertedProject = null; try { convertedProject = projectConverter.ConvertInMemory(); } catch (Exception ex) { logger.LogInfo(ex.Message); } return convertedProject; }
public virtual int DoUpgradeProject_CheckOnly(string projectFileName, IVsUpgradeLogger upgradeLogger, out __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS upgradeRequired, out Guid newProjectFactory, out uint upgradeCapabilityFlags) { newProjectFactory = GetType().GUID; var project = ProjectRootElement.Open(projectFileName); // enable Side-by-Side and CopyBackup support upgradeCapabilityFlags = (uint)(__VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_BACKUPSUPPORTED | __VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_COPYBACKUP | __VSPPROJECTUPGRADEVIAFACTORYFLAGS.PUVFF_SXSBACKUP); #if FX_ATLEAST_45 if (this.buildEngine.GetLoadedProjects(projectFileName).Count > 0) { // project has already been loaded upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return VSConstants.S_OK; } var projectInspector = new ProjectInspector(projectFileName); if (projectInspector.IsPoisoned(Site)) { // poisoned project cannot be opened (does not require upgrade) upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return VSConstants.S_OK; } #endif // only upgrade known tool versions. #if FX_ATLEAST_45 if (string.Equals("4.0", project.ToolsVersion, StringComparison.Ordinal)) { // For 4.0, we need to take a deeper look. The logic is in // vsproject\xmake\XMakeConversion\ProjectFileConverter.cs var projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; if (projectConverter.FSharpSpecificConversions(false)) { upgradeRequired = projectInspector.IsLikeDev10MinusProject() ? __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_ONEWAYUPGRADE : __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_SAFEREPAIR; return VSConstants.S_OK; } else { upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return VSConstants.S_OK; } } else #endif if (string.Equals("3.5", project.ToolsVersion, StringComparison.Ordinal) || string.Equals("2.0", project.ToolsVersion, StringComparison.Ordinal)) { // For 3.5 or 2.0, we always need to upgrade. upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_ONEWAYUPGRADE; return VSConstants.S_OK; } upgradeRequired = __VSPPROJECTUPGRADEVIAFACTORYREPAIRFLAGS.VSPUVF_PROJECT_NOREPAIR; return VSConstants.S_OK; }
public virtual int UpgradeProject(string projectFileName, uint upgradeFlag, string copyLocation, out string upgradeFullyQualifiedFileName, IVsUpgradeLogger logger, out int upgradeRequired, out Guid newProjectFactory) { uint ignore; this.UpgradeProject_CheckOnly(projectFileName, logger, out upgradeRequired, out newProjectFactory, out ignore); if (upgradeRequired == 0) { upgradeFullyQualifiedFileName = projectFileName; return(VSConstants.S_OK); } string projectName = Path.GetFileNameWithoutExtension(projectFileName); upgradeFullyQualifiedFileName = projectFileName; // Query for edit IVsQueryEditQuerySave2 queryEdit = site.GetService(typeof(SVsQueryEditQuerySave)) as IVsQueryEditQuerySave2; if (queryEdit != null) { uint editVerdict; uint queryEditMoreInfo; const tagVSQueryEditFlags tagVSQueryEditFlags_QEF_AllowUnopenedProjects = (tagVSQueryEditFlags)0x80; int hr = queryEdit.QueryEditFiles( (uint)(tagVSQueryEditFlags.QEF_ForceEdit_NoPrompting | tagVSQueryEditFlags.QEF_DisallowInMemoryEdits | tagVSQueryEditFlags_QEF_AllowUnopenedProjects), 1, new[] { projectFileName }, null, null, out editVerdict, out queryEditMoreInfo); if (ErrorHandler.Failed(hr)) { return(VSConstants.E_FAIL); } if (editVerdict != (uint)tagVSQueryEditResult.QER_EditOK) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, SR.GetString(SR.UpgradeCannotOpenProjectFileForEdit)); } return(VSConstants.E_FAIL); } // If file was modified during the checkout, maybe upgrade is not needed if ((queryEditMoreInfo & (uint)tagVSQueryEditResultFlags.QER_MaybeChanged) != 0) { this.UpgradeProject_CheckOnly(projectFileName, logger, out upgradeRequired, out newProjectFactory, out ignore); if (upgradeRequired == 0) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_INFORMATIONAL, projectName, projectFileName, SR.GetString(SR.UpgradeNoNeedToUpgradeAfterCheckout)); } return(VSConstants.S_OK); } } } // Convert the project Microsoft.Build.Conversion.ProjectFileConverter projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; ProjectRootElement convertedProject = null; try { convertedProject = projectConverter.ConvertInMemory(); } catch (Exception ex) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, ex.Message); } } if (convertedProject != null) { this.m_lastUpgradedProjectFile = projectFileName; foreach (ProjectPropertyElement property in convertedProject.Properties) { switch (property.Name) { case SCC_LOCAL_PATH: this.m_sccLocalPath = property.Value; break; case SCC_AUX_PATH: this.m_sccAuxPath = property.Value; break; case SCC_PROVIDER: this.m_sccProvider = property.Value; break; case SCC_PROJECT_NAME: this.m_sccProjectName = property.Value; break; default: break; } } try { convertedProject.Save(projectFileName); } catch (Exception ex) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, ex.Message); } return(VSConstants.E_FAIL); } if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_STATUSMSG, projectName, projectFileName, SR.GetString(SR.UpgradeSuccessful)); } return(VSConstants.S_OK); } this.m_lastUpgradedProjectFile = null; upgradeFullyQualifiedFileName = ""; return(VSConstants.E_FAIL); }
public virtual int UpgradeProject(string projectFileName, uint upgradeFlag, string copyLocation, out string upgradeFullyQualifiedFileName, IVsUpgradeLogger logger, out int upgradeRequired, out Guid newProjectFactory) { uint ignore; this.UpgradeProject_CheckOnly(projectFileName, logger, out upgradeRequired, out newProjectFactory, out ignore); if (upgradeRequired == 0) { upgradeFullyQualifiedFileName = projectFileName; return VSConstants.S_OK; } string projectName = Path.GetFileNameWithoutExtension(projectFileName); upgradeFullyQualifiedFileName = projectFileName; // Query for edit IVsQueryEditQuerySave2 queryEdit = site.GetService(typeof(SVsQueryEditQuerySave)) as IVsQueryEditQuerySave2; if (queryEdit != null) { uint editVerdict; uint queryEditMoreInfo; const tagVSQueryEditFlags tagVSQueryEditFlags_QEF_AllowUnopenedProjects = (tagVSQueryEditFlags)0x80; int hr = queryEdit.QueryEditFiles( (uint)(tagVSQueryEditFlags.QEF_ForceEdit_NoPrompting | tagVSQueryEditFlags.QEF_DisallowInMemoryEdits | tagVSQueryEditFlags_QEF_AllowUnopenedProjects), 1, new[] { projectFileName }, null, null, out editVerdict, out queryEditMoreInfo); if (ErrorHandler.Failed(hr)) { return VSConstants.E_FAIL; } if (editVerdict != (uint)tagVSQueryEditResult.QER_EditOK) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, SR.GetString(SR.UpgradeCannotOpenProjectFileForEdit)); } return VSConstants.E_FAIL; } // If file was modified during the checkout, maybe upgrade is not needed if ((queryEditMoreInfo & (uint)tagVSQueryEditResultFlags.QER_MaybeChanged) != 0) { this.UpgradeProject_CheckOnly(projectFileName, logger, out upgradeRequired, out newProjectFactory, out ignore); if (upgradeRequired == 0) { if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_INFORMATIONAL, projectName, projectFileName, SR.GetString(SR.UpgradeNoNeedToUpgradeAfterCheckout)); } return VSConstants.S_OK; } } } // Convert the project Microsoft.Build.Conversion.ProjectFileConverter projectConverter = new Microsoft.Build.Conversion.ProjectFileConverter(); projectConverter.OldProjectFile = projectFileName; projectConverter.NewProjectFile = projectFileName; ProjectRootElement convertedProject = null; try { convertedProject = projectConverter.ConvertInMemory(); } catch (Exception ex) { if (logger != null) logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, ex.Message); } if (convertedProject != null) { this.m_lastUpgradedProjectFile = projectFileName; foreach (ProjectPropertyElement property in convertedProject.Properties) { switch (property.Name) { case SCC_LOCAL_PATH: this.m_sccLocalPath = property.Value; break; case SCC_AUX_PATH: this.m_sccAuxPath = property.Value; break; case SCC_PROVIDER: this.m_sccProvider = property.Value; break; case SCC_PROJECT_NAME: this.m_sccProjectName = property.Value; break; default: break; } } try { convertedProject.Save(projectFileName); } catch (Exception ex) { if (logger != null) logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_ERROR, projectName, projectFileName, ex.Message); return VSConstants.E_FAIL; } if (logger != null) { logger.LogMessage((uint)__VSUL_ERRORLEVEL.VSUL_STATUSMSG, projectName, projectFileName, SR.GetString(SR.UpgradeSuccessful)); } return VSConstants.S_OK; } this.m_lastUpgradedProjectFile = null; upgradeFullyQualifiedFileName = ""; return VSConstants.E_FAIL; }