public List <ICodebaseAlert> GenerateAlerts(Codebase codebase)
        {
            var alerts = new List <CodebaseAlert>();

            foreach (var projectDirectory in codebase.ProjectDirectories)
            {
                if (projectDirectory.ProjectFiles.Count > 1)
                {
                    var alert = new CodebaseAlert("MultipleProjectAlert", CodebaseAlertPriority.Warning, projectDirectory)
                                .AddDetail("Multiple project files detected in directory");
                }
            }
            return(alerts.ToList <ICodebaseAlert>());
        }
示例#2
0
        public List <ICodebaseAlert> GenerateAlerts(Codebase codebase)
        {
            var alerts = new List <CodebaseAlert>();

            foreach (var projectDirectory in codebase.ProjectDirectories)
            {
                foreach (var projectFile in projectDirectory.ProjectFiles)
                {
                    foreach (var dllReference in projectFile.ReferencedDlls)
                    {
                        //We only care about NuGet packages here
                        if (!dllReference.IsNuGetDllReference())
                        {
                            continue;
                        }

                        //TODO - we need to make this configurable a bit somehow
                        var expectedPackageName = dllReference.FileReferenced.NameWithoutExtension().Normalised();

                        if (projectDirectory.PackagesFile == null)
                        {
                            var alert = new CodebaseAlert("Missing Packages.config Alert", CodebaseAlertPriority.Bad, projectDirectory)
                                        .AddDetail("Packages.config file missing - expected for dll reference {0}", dllReference.HintPath);
                            alerts.Add(alert);
                        }
                        else
                        {
                            var packageReference = projectDirectory.PackagesFile.PackageReferences.FirstOrDefault(p => p.PackageNameNormalised == expectedPackageName);
                            if (packageReference == null)
                            {
                                var alert = new CodebaseAlert("Missing Packages.config Reference Alert", CodebaseAlertPriority.Bad, projectDirectory)
                                            .AddDetail("Reference to NuGet package {0} should be in packages.config for dll refernece {1}", expectedPackageName, dllReference.HintPath);
                                alerts.Add(alert);
                            }
                        }
                    }
                }
            }
            return(alerts.ToList <ICodebaseAlert>());
        }
示例#3
0
        public List <ICodebaseAlert> GenerateAlerts(Codebase codebase)
        {
            var alerts = new List <CodebaseAlert>();

            foreach (var projectDirectory in codebase.ProjectDirectories)
            {
                Dictionary <string, List <ProjectDirectory> > qaOnlyPackages          = new Dictionary <string, List <ProjectDirectory> >();
                Dictionary <string, List <ProjectDirectory> > versionMismatchPackages = new Dictionary <string, List <ProjectDirectory> >();
                Dictionary <string, string> packagesUsingProdVersion = new Dictionary <string, string>();
                Dictionary <string, string> notFoundPackages         = new Dictionary <string, string>();

                if (projectDirectory.PackagesFile == null)
                {
                    continue;
                }

                foreach (var packageReference in projectDirectory.PackagesFile.PackageReferences)
                {
                    if (packageReference.PackageName == null)
                    {
                        continue;
                    }

                    var packageNameNormalised           = packageReference.PackageName.Normalised();
                    var packageNameAndVersionNormalised = packageNameNormalised + "_" + packageReference.Version;


                    //Already checked as in prod - OK
                    if (packagesUsingProdVersion.ContainsKey(packageNameAndVersionNormalised))
                    {
                        continue;
                    }
                    if (notFoundPackages.ContainsKey(packageNameAndVersionNormalised))
                    {
                        continue;
                    }


                    //We are not the first project directory to use this QA package
                    List <ProjectDirectory> directoriesWithQaPackageAlready = new List <ProjectDirectory>();
                    if (qaOnlyPackages.TryGetValue(packageNameAndVersionNormalised, out directoriesWithQaPackageAlready))
                    {
                        directoriesWithQaPackageAlready.Add(projectDirectory);
                        continue;
                    }

                    //We are the first to check this package essentially
                    NuGetPackage latestInProd;
                    NuGetPackage latestInQa;
                    codebase.NuGetSourceProduction.LatestVersionLookup.TryGetValue(packageNameNormalised, out latestInProd);
                    codebase.NuGetSourceQa.LatestVersionLookup.TryGetValue(packageNameNormalised, out latestInQa);

                    //Not in either feed! Better log this
                    if (latestInProd == null && latestInQa == null)
                    {
                        notFoundPackages.Add(packageNameAndVersionNormalised, packageNameAndVersionNormalised);
                        continue;
                    }

                    //If it is in prod - add to that index
                    if (latestInProd != null && packageReference.Version <= latestInProd.Version)
                    {
                        if (!packagesUsingProdVersion.ContainsKey(packageNameAndVersionNormalised))
                        {
                            packagesUsingProdVersion.Add(packageNameAndVersionNormalised, packageNameAndVersionNormalised);
                        }
                        continue;
                    }

                    directoriesWithQaPackageAlready.Add(projectDirectory);
                    qaOnlyPackages.Add(packageNameAndVersionNormalised, directoriesWithQaPackageAlready);
                }

                foreach (var notFoundPackage in notFoundPackages.Keys.OrderBy(k => k))
                {
                    var alert = new CodebaseAlert("Phantom NuGet Package Reference Alert", CodebaseAlertPriority.Critical, null)
                                .AddDetail("Package {0} is not found in either QA or Production Feeds", notFoundPackage);
                    alerts.Add(alert);
                }

                foreach (var qaOnlyPackage in qaOnlyPackages.Keys.OrderBy(k => k))
                {
                    var alert = new CodebaseAlert("QA NuGet Package Reference Alert", CodebaseAlertPriority.Warning, null)
                                .AddDetail("Package {0} is currently only found in QA feed", qaOnlyPackage);
                    alerts.Add(alert);
                }

                foreach (var versionMismatchPackage in versionMismatchPackages.Keys.OrderBy(k => k))
                {
                    PackageVersion expectedVersion = null;
                    var            alert           = new CodebaseAlert("NuGet Package Version Anomaly Alert", CodebaseAlertPriority.Critical, null)
                                                     .AddDetail("Package {0} is referenced instead of the standard version {1}", versionMismatchPackage, expectedVersion.ToString());

                    var affectedProjects = versionMismatchPackages[versionMismatchPackage];
                    foreach (var project in affectedProjects)
                    {
                        alert.AddDetail(" - {0}", project.DisplayPath(codebase.RootSourceDirectory));
                    }

                    alerts.Add(alert);
                }
            }


            return(alerts.ToList <ICodebaseAlert>());
        }