예제 #1
0
        protected override (bool isSuccess, SError error) HandleProject(Config config, string repoPath, string projectPath)
        {
            ProjectFileHelper.GetProjectFileParentDirName(projectPath, out string absoluteProjectFileParentDirPath);
            var projName = ProjectFileHelper.GetProjectFileName(projectPath);

            var packageRefs  = GetPackageReferencesFromProjectFile(projectPath);
            var packagesConf = GetPackagesFromPackagesDotConfig(projectPath);

            if (ShouldLookForPackagesMissingFromProjectFile)
            {
                var missingPackages = packagesConf.Where(p => !packageRefs.Any(r => r.Name == p.Name));
                if (missingPackages?.Any() == true)
                {
                    Log($"'{projName}' project file missing references:");
                    foreach (var missingPackage in missingPackages)
                    {
                        Log($"\t{missingPackage.Name}.{missingPackage.Version}");
                        NumMissing++;
                    }
                    NL();
                }
            }

            var primaryDependencies = packageRefs.Where(p => packagesConf.Any(c => c.Name == p.Name));

            if (ShouldPrintPotentialHintPathDiscrepancies)
            {
                foreach (var primaryDep in primaryDependencies)
                {
                    var  relevantConf      = packagesConf.First(c => c.Name == primaryDep.Name);
                    var  projectedHintPath = relevantConf.ProjectHintPath(config);
                    var  hintPath          = primaryDep.HintPath?.Path;
                    bool hasHintPath       = hintPath != null;

                    if (hasHintPath && ShouldCheckPackagesOnDisk)
                    {
                        // HintPaths are relative, so we need to make the path absolute . . .
                        string absoluteHintPath = Path.GetFullPath(hintPath, absoluteProjectFileParentDirPath);
                        if (!File.Exists(absoluteHintPath))
                        {
                            AddMissingPackageOccurrence(absoluteHintPath, projName);
                        }
                    }

                    bool isFine = true;
                    if (hasHintPath && !string.Equals(hintPath, projectedHintPath, StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (ShouldIgnoreTargetFrameworks)
                        {
                            var agnosticHintPath      = MakeAgnosticHintPath(hintPath, primaryDep.Name);
                            var agnosticProjectedPath = MakeAgnosticHintPath(projectedHintPath, relevantConf.Name);

                            if (string.Equals(agnosticHintPath, agnosticProjectedPath, StringComparison.InvariantCultureIgnoreCase))
                            {
                                goto isFineHandler;
                            }
                        }
                        isFine = false;
                        NumDiscrepancies++;
                        Log($"{projName}'s '{primaryDep.Name}':");
                        Log("HP:\t" + hintPath);
                        Log("GP:\t" + projectedHintPath);
                        NL();
                    }
                    else if (!hasHintPath)
                    {
                        isFine = false;
                        Log($"{projName}'s '{primaryDep.Name}' has no hint path");
                        NL();
                        NumNoHPs++;
                    }

isFineHandler:
                    if (isFine)
                    {
                        NumFine++;
                    }
                }
            }

            return(Success);
        }