/// <summary> /// Creates <c>ProjectInfo</c> for project provided. /// </summary> /// <param name="project"> /// Project examined. /// </param> /// <param name="projectTypeInfo"> /// Project type info for the project. /// </param> /// <returns> /// <c>ProjectInfo</c> for the project provided. /// </returns> private ProjectInfo GetProjectInfo(Project project, string parentUiPath, ProjectTypeInfo projectTypeInfo, int level) { if (!projectTypeInfo.IsVersionable) { return(new ProjectInfo(project.Name, project.FullName, AppendBranchToPath(parentUiPath, project.Name), projectTypeInfo, level)); } // array of version streams that will be provided to ProjectInfo constructor ArrayList versionStreams = new ArrayList(); // AssemblyVersions used to find the largest one AssemblyVersions assemblyVersions = AssemblyVersions.Empty; // for a VC++ project search for resource file (which may contain version) if configured so if (projectTypeInfo == ProjectTypeInfo.VCppProject && m_numberingOptions.IncludeVCppResourceFiles) { string[] resourceFilenames = GetProjectVersionFile(project, "*.rc"); // if VC++ project contains both AssemblyInfo file and resource // file with version, compare them and get the larger value foreach (string resourceFilename in resourceFilenames) { VersionStream resourceFileStream = new ResourceFileStream(resourceFilename); AssemblyVersions resourceVersion = resourceFileStream.GetVersions(); versionStreams.Add(resourceFileStream); assemblyVersions = AssemblyVersions.Max(assemblyVersions, resourceVersion); } } string[] assemblyInfoFilenames = GetProjectVersionFile(project, projectTypeInfo.AssemblyInfoFilename); Debug.Assert(assemblyInfoFilenames.Length <= 1); if (assemblyInfoFilenames.Length > 0) { VersionStream assemblyInfoStream = new AssemblyInfoStream(assemblyInfoFilenames[0]); AssemblyVersions assemblyInfoVersions = assemblyInfoStream.GetVersions(); versionStreams.Add(assemblyInfoStream); if (assemblyVersions == AssemblyVersions.Empty) { assemblyVersions = assemblyInfoVersions; } else { assemblyVersions = AssemblyVersions.Max(assemblyVersions, assemblyInfoVersions); } } VersionStream[] vs = (VersionStream[])versionStreams.ToArray(typeof(VersionStream)); bool isProjectModified = IsProjectModified(project, vs); return(new ProjectInfo(project.Name, project.FullName, AppendBranchToPath(parentUiPath, project.Name), projectTypeInfo, isProjectModified, level, assemblyVersions, vs)); }
/// <summary> /// Creates a <c>ProjectInfoList</c> containing <c>ProjectInfo</c> /// objects that have passed the filter provided. /// </summary> /// <param name="projectInfos"> /// An array of all <c>ProjectInfo</c> objects. /// </param> /// <param name="filter"> /// A filter used to select <c>ProjectInfo</c> objects. /// </param> /// <param name="newVersionProvider"> /// <c>NewVersionProvider</c> object responsible to propose a new /// version for each <c>ProjectInfo</c> object. /// </param> /// <param name="assemblyVersionsUpdateMask"> /// Mask defining which versions (AssemblyInfo, Informational or /// Product) may be updated. /// </param> public ProjectInfoList(ProjectInfo[] projectInfos, IProjectFilter filter, NewVersionProvider newVersionProvider, AssemblyVersionType assemblyVersionsUpdateMask) { m_projectInfos = new ArrayList(projectInfos.Length); m_highestToBeAssemblyVersions = AssemblyVersions.MinValue; m_highestProposedAssemblyVersion = AssemblyVersions.MinValue; foreach (ProjectInfo projectInfo in projectInfos) { if (filter.Pass(projectInfo)) { ProjectInfo pi = projectInfo; pi.SetToBecomeVersion(newVersionProvider); if (pi.Modified) { pi.MarkAssemblyVersionsForUpdate(assemblyVersionsUpdateMask); } m_projectInfos.Add(pi); m_highestToBeAssemblyVersions = AssemblyVersions.Max(m_highestToBeAssemblyVersions, pi); m_highestProposedAssemblyVersion = AssemblyVersions.MaxProposed(m_highestProposedAssemblyVersion, pi); } } }