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); }