/// <summary> /// Recurses project item searching for a version file with a given /// name pattern. /// </summary> /// <param name="projectItem"> /// <c>ProjectItem</c> to recurse. /// </param> /// <param name="path"> /// Path to start search from. /// </param> /// <param name="filenamePattern"> /// Name of the file to search for. May contain wildcard characters. /// </param> /// <returns> /// Array of full filenames (including path) if version file has been /// found, otherwise, empty array. /// </returns> private string[] RecurseProjectForVersionInfoFile(ProjectItem projectItem, string path, string filenamePattern) { ArrayList versionFiles = new ArrayList(); if (projectItem.Object != null) { string pathFileName = AppendBranchToPath(path, projectItem.Name); if (FileUtil.FilenameMatchesPattern(projectItem.Name, filenamePattern)) { string filename = ProjectItemInfo.GetItemFullPath(projectItem); // it is not RC file (i.e. it is AssemblyInfo file), // then it is the only version file so we can return if (!filenamePattern.Equals("*.rc")) { return new string[] { filename } } ; // there could be more .rc files, so check if this one contains version info ResourceFileStream rfs = new ResourceFileStream(filename); if (!rfs.GetVersions().Equals(AssemblyVersions.Empty)) { versionFiles.Add(filename); } } if (projectItem.ProjectItems != null) { foreach (ProjectItem projectSubItem in projectItem.ProjectItems) { versionFiles.AddRange(RecurseProjectForVersionInfoFile(projectSubItem, pathFileName, filenamePattern)); } } } return((string[])versionFiles.ToArray(typeof(string))); }
/// <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)); }