コード例 #1
0
        /// <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)));
        }
コード例 #2
0
        /// <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));
        }