Exemple #1
0
        public static async Task <ProjectTelemetryEvent> GetProjectTelemetryEventAsync(NuGetProject nuGetProject)
        {
            // Get the project details.
            string projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);

            // Emit the project information.
            try
            {
                string           projectId    = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);
                NuGetProjectType projectType  = GetProjectType(nuGetProject);
                bool             isUpgradable = await NuGetProjectUpgradeUtility.IsNuGetProjectUpgradeableAsync(nuGetProject);

                return(new ProjectTelemetryEvent(
                           NuGetVersion.Value,
                           projectId,
                           projectType,
                           isUpgradable));
            }
            catch (Exception ex)
            {
                string message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);
                return(null);
            }
        }
Exemple #2
0
        public static async Task <ProjectTelemetryEvent> GetProjectTelemetryEventAsync(NuGetProject nuGetProject)
        {
            // Get the project details.
            var projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);

            // Emit the project information.
            try
            {
                var projectId = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);

                // Get project type.
                var projectType = NuGetProjectType.Unknown;
                if (nuGetProject is MSBuildNuGetProject)
                {
                    projectType = NuGetProjectType.PackagesConfig;
                }
#if VS15
                else if (nuGetProject is NetCorePackageReferenceProject)
                {
                    projectType = NuGetProjectType.CPSBasedPackageRefs;
                }
                else if (nuGetProject is LegacyPackageReferenceProject)
                {
                    projectType = NuGetProjectType.LegacyProjectSystemWithPackageRefs;
                }
#endif
                else if (nuGetProject is ProjectJsonNuGetProject)
                {
                    projectType = NuGetProjectType.UwpProjectJson;
                }
                else if (nuGetProject is ProjectKNuGetProjectBase)
                {
                    projectType = NuGetProjectType.XProjProjectJson;
                }

                // Get package count - don't attempt to get the project.json package count, because it fails on PCL project creation due to concurrency issue
                var installedPackagesCount =
                    projectType == NuGetProjectType.UwpProjectJson ?
                    0 :
                    (await nuGetProject.GetInstalledPackagesAsync(CancellationToken.None)).Count();

                return(new ProjectTelemetryEvent(
                           NuGetVersion.Value,
                           projectId,
                           projectType,
                           installedPackagesCount));
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);
                return(null);
            }
        }
Exemple #3
0
        private async Task EmitNuGetProjectAsync(NuGetProject nuGetProject)
        {
            // Get the project details.
            var projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);

            // Emit the project information.
            try
            {
                var projectId = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);

                // Get project type.
                var projectType = NuGetProjectType.Unknown;
                if (nuGetProject is MSBuildNuGetProject)
                {
                    projectType = NuGetProjectType.PackagesConfig;
                }
#if VS15
                else if (nuGetProject is NetCorePackageReferenceProject)
                {
                    projectType = NuGetProjectType.CPSBasedPackageRefs;
                }
                else if (nuGetProject is LegacyPackageReferenceProject)
                {
                    projectType = NuGetProjectType.LegacyProjectSystemWithPackageRefs;
                }
#endif
                else if (nuGetProject is ProjectJsonNuGetProject)
                {
                    projectType = NuGetProjectType.UwpProjectJson;
                }
                else if (nuGetProject is ProjectKNuGetProjectBase)
                {
                    projectType = NuGetProjectType.XProjProjectJson;
                }

                // Get package count.
                var installedPackages = await nuGetProject.GetInstalledPackagesAsync(CancellationToken.None);

                var installedPackagesCount = installedPackages.Count();

                var projectInformation = new ProjectTelemetryEvent(
                    NuGetVersion.Value,
                    projectId,
                    projectType,
                    installedPackagesCount);

                EmitProjectInformation(projectInformation);
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);
            }
        }
        public static async Task <ProjectTelemetryEvent> GetProjectTelemetryEventAsync(NuGetProject nuGetProject)
        {
            // Get the project details.
            var projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);

            // Emit the project information.
            try
            {
                var projectId = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);

                // Get project type.
                var projectType = NuGetProjectType.Unknown;
                if (nuGetProject is MSBuildNuGetProject)
                {
                    var msbuildProject = nuGetProject as MSBuildNuGetProject;

                    if (msbuildProject?.DoesPackagesConfigExists() == true)
                    {
                        projectType = NuGetProjectType.PackagesConfig;
                    }
                    else
                    {
                        projectType = NuGetProjectType.UnconfiguredNuGetType;
                    }
                }
                else if (nuGetProject is CpsPackageReferenceProject)
                {
                    projectType = NuGetProjectType.CPSBasedPackageRefs;
                }
                else if (nuGetProject is LegacyPackageReferenceProject)
                {
                    projectType = NuGetProjectType.LegacyProjectSystemWithPackageRefs;
                }
                else if (nuGetProject is ProjectJsonNuGetProject)
                {
                    projectType = NuGetProjectType.UwpProjectJson;
                }

                var isUpgradable = await NuGetProjectUpgradeUtility.IsNuGetProjectUpgradeableAsync(nuGetProject);

                return(new ProjectTelemetryEvent(
                           NuGetVersion.Value,
                           projectId,
                           projectType,
                           isUpgradable));
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);
                return(null);
            }
        }
Exemple #5
0
        public static ProjectModel ToProjectModel(this NuGetProject nuGetProject)
        {
            var fullPath           = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.FullPath);
            var nuGetFrameworkName = ((NuGetFramework)nuGetProject.GetMetadataOrNull(NuGetProjectMetadataKeys.TargetFramework))?.GetShortFolderName();

            return(new ProjectModel()
            {
                Name = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name),
                FullPath = fullPath,
                FolderPath = Path.GetDirectoryName(fullPath),
                FrameworkName = nuGetFrameworkName,
            });
        }
 public PackageInstallationInfo(
     NuGetProject project)
 {
     NuGetProject = project;
     _projectName = NuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);
     _isSelected  = false;
 }
 async Task ExecuteActions(
     NuGetProject project,
     IEnumerable <NuGetProjectAction> actions,
     ConsoleHostNuGetPackageManager packageManager,
     SourceCacheContext cacheContext)
 {
     if (actions.Any())
     {
         if (WhatIf.IsPresent)
         {
             // For -WhatIf, only preview the actions
             PreviewNuGetPackageActions(actions);
         }
         else
         {
             // Execute project actions by Package Manager
             await packageManager.ExecuteNuGetProjectActionsAsync(
                 project,
                 actions,
                 this,
                 cacheContext,
                 ConsoleHost.Token);
         }
     }
     else
     {
         Log(MessageLevel.Info,
             GettextCatalog.GetString("No package updates are available from the current package source for project '{0}'.",
                                      project.GetMetadata <string> (NuGetProjectMetadataKeys.Name)));
     }
 }
        /// <summary>
        /// Execute the project actions
        /// </summary>
        /// <param name="actions"></param>
        /// <returns></returns>
        private async Task ExecuteActions(NuGetProject project, IEnumerable <NuGetProjectAction> actions)
        {
            if (actions.Any())
            {
                if (!ShouldContinueDueToDotnetDeprecation(project, actions, WhatIf.IsPresent))
                {
                    return;
                }

                if (WhatIf.IsPresent)
                {
                    // For -WhatIf, only preview the actions
                    PreviewNuGetPackageActions(actions);
                }
                else
                {
                    // Execute project actions by Package Manager
                    await PackageManager.ExecuteNuGetProjectActionsAsync(project, actions, this, Token);
                }
            }
            else
            {
                Log(MessageLevel.Info, Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name));
            }
        }
        /// <summary>
        /// Get the view of PowerShellPackage. Used for Get-Package -Updates command.
        /// </summary>
        internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(IPackageSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project)
        {
            var package = new PowerShellUpdatePackage()
            {
                Id                = data.Identity.Id,
                Description       = data.Summary,
                ProjectName       = project.GetMetadata <string> (NuGetProjectMetadataKeys.Name),
                AsyncLazyVersions = new AsyncLazy <IEnumerable <NuGetVersion> > (async delegate {
                    var versions = (await data.GetVersionsAsync()) ?? Enumerable.Empty <VersionInfo> ();
                    var results  = versions.Select(v => v.Version).OrderByDescending(v => v)
                                   .Where(r => r > version)
                                   .ToArray();

                    return(results);
                }),
                LicenseUrl = data.LicenseUrl?.AbsoluteUri
            };

            switch (versionType)
            {
            case VersionType.Updates:
                package.AllVersions = true;
                break;

            case VersionType.Latest:
                package.AllVersions = false;
                break;

            default:
                Debug.Fail("Unexpected version type passed.");
                break;
            }

            return(package);
        }
Exemple #10
0
        public static async Task <ProjectTelemetryEvent> GetProjectTelemetryEventAsync(NuGetProject nuGetProject)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException(nameof(nuGetProject));
            }
            string projectUniqueName          = string.Empty;
            ProjectTelemetryEvent returnValue = null;

            try
            {
                // Get the project details.
                projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);
                string           projectId    = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);
                NuGetProjectType projectType  = GetProjectType(nuGetProject);
                bool             isUpgradable = await NuGetProjectUpgradeUtility.IsNuGetProjectUpgradeableAsync(nuGetProject);

                string fullPath = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.FullPath);

                returnValue = new ProjectTelemetryEvent(
                    NuGetVersion.Value,
                    projectId,
                    projectType,
                    isUpgradable,
                    fullPath);
            }
            catch (Exception ex)
            {
                // ArgumentException means project metadata is empty
                // DTE exceptions could mean VS process has a severe failure
                string message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);

                await TelemetryUtility.PostFaultAsync(ex, nameof(VSTelemetryServiceUtility), nameof(GetProjectTelemetryEventAsync));
            }

            return(returnValue);
        }
        public PackageInstallationInfo(NuGetProject project, NuGetVersion version, bool enabled)
        {
            NuGetProject = project;
            _name        = NuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);
            _selected    = enabled;
            Version      = version;
            Enabled      = enabled;

            UpdateDisplayText();
        }
Exemple #12
0
        public async Task <string> GetNuGetProjectSafeNameAsync(NuGetProject nuGetProject)
        {
            string name = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);

            if (await GetNuGetProjectAsync(name) == nuGetProject)
            {
                return(name);
            }
            return(NuGetProject.GetUniqueNameOrName(nuGetProject));
        }
        private string GetName(NuGetProject nuGetProject)
        {
            string nuGetProjectName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);

            if (!String.IsNullOrEmpty(nuGetProjectName))
            {
                throw new ArgumentException(String.Format(Strings.NuGetProjectDoesNotHaveName, nuGetProjectName));
            }

            return(nuGetProjectName);
        }
 /// <summary>
 /// Get project's target frameworks
 /// </summary>
 /// <param name="project"></param>
 /// <returns></returns>
 public static IEnumerable<string> GetProjectTargetFrameworks(NuGetProject project)
 {
     List<string> frameworks = new List<string>();
     NuGetFramework nugetFramework = project.GetMetadata<NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);
     if (nugetFramework != null)
     {
         string framework = nugetFramework.ToString();
         frameworks.Add(framework);
     }
     return frameworks;
 }
Exemple #15
0
        /// <summary>
        /// Get project's target frameworks
        /// </summary>
        /// <param name="project"></param>
        /// <returns></returns>
        public static IEnumerable <string> GetProjectTargetFrameworks(NuGetProject project)
        {
            List <string>  frameworks     = new List <string>();
            NuGetFramework nugetFramework = project.GetMetadata <NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);

            if (nugetFramework != null)
            {
                string framework = nugetFramework.ToString();
                frameworks.Add(framework);
            }
            return(frameworks);
        }
        /// <summary>
        /// Marks the packages to be reinstalled on the projects' packages.config
        /// </summary>
        public static async Task MarkPackagesForReinstallation(NuGetProject project, IList <PackageIdentity> packagesToBeReinstalled)
        {
            Debug.Assert(project != null);
            Debug.Assert(packagesToBeReinstalled != null);

            var installedPackageReferences         = (await project.GetInstalledPackagesAsync(CancellationToken.None)).ToList();
            var packageReferencesToUpdateReinstall = new Dictionary <Packaging.PackageReference, Packaging.PackageReference>();

            if (installedPackageReferences != null && installedPackageReferences.Any())
            {
                foreach (var packageReference in installedPackageReferences)
                {
                    bool markForReinstall = packagesToBeReinstalled.Any(p => p.Equals(packageReference.PackageIdentity));

                    // Determine if requireReinstallation attribute needs to be updated.
                    if (packageReference.RequireReinstallation ^ markForReinstall)
                    {
                        var newPackageReference = new Packaging.PackageReference(packageReference.PackageIdentity, packageReference.TargetFramework,
                                                                                 packageReference.IsUserInstalled, packageReference.IsDevelopmentDependency, markForReinstall);

                        packageReferencesToUpdateReinstall.Add(packageReference, newPackageReference);
                    }
                }

                var projectFullPath        = project.GetMetadata <string>(NuGetProjectMetadataKeys.FullPath);
                var packagesConfigFullPath = Path.Combine(projectFullPath ?? string.Empty, ProjectManagement.Constants.PackageReferenceFile);

                // Create new file or overwrite existing file
                if (File.Exists(packagesConfigFullPath))
                {
                    try
                    {
                        using (var writer = new PackagesConfigWriter(packagesConfigFullPath, createNew: false))
                        {
                            foreach (var entry in packageReferencesToUpdateReinstall)
                            {
                                writer.UpdatePackageEntry(entry.Key, entry.Value);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        ExceptionHelper.WriteErrorToActivityLog(ex);
                    }
                }
            }
        }
        /// <summary>
        ///  Get the list of packages to be reinstalled in the project. This can be run right after a project is retargeted or during every build
        /// </summary>
        /// <param name="project">NuGet project that the packages were installed to</param>
        /// <returns>List of package identities to be reinstalled</returns>
        public static async Task <IList <PackageIdentity> > GetPackagesToBeReinstalled(NuGetProject project)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            var sortedPackages = new List <PackageIdentity>();
            var installedRefs  = await project.GetInstalledPackagesAsync(CancellationToken.None);

            if (installedRefs != null && installedRefs.Any())
            {
                var targetFramework = project.GetMetadata <NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);
                return(await GetPackagesToBeReinstalledAsync(targetFramework, installedRefs));
            }

            return(new List <PackageIdentity>());
        }
Exemple #18
0
        public string GetNuGetProjectSafeName(NuGetProject nuGetProject)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            Init();

            // Try searching for simple names first
            string            name = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);
            EnvDTEProjectName envDTEProjectName;

            _nuGetAndEnvDTEProjectCache.TryGetNuGetProjectName(name, out envDTEProjectName);
            Debug.Assert(envDTEProjectName != null);

            return(envDTEProjectName.CustomUniqueName);
        }
Exemple #19
0
        // Return short name if it's non-ambiguous.
        // Return CustomUniqueName for projects that have ambigous names (such as same project name under different solution folder)
        // Example: return Folder1/ProjectA if there are both ProjectA under Folder1 and Folder2
        public string GetNuGetProjectSafeName(NuGetProject nuGetProject)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            Init();

            // Try searching for simple names first
            string name = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);

            if (GetNuGetProject(name) == nuGetProject)
            {
                return(name);
            }

            return(NuGetProject.GetUniqueNameOrName(nuGetProject));
        }
        // Return short name if it's non-ambiguous.
        // Return CustomUniqueName for projects that have ambigous names (such as same project name under different solution folder)
        // Example: return Folder1/ProjectA if there are both ProjectA under Folder1 and Folder2
        public async Task <string> GetNuGetProjectSafeNameAsync(NuGetProject nuGetProject)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            await EnsureInitializeAsync();

            // Try searching for simple names first
            var name = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);

            if ((await GetNuGetProjectAsync(name)) == nuGetProject)
            {
                return(name);
            }

            return(NuGetProject.GetUniqueNameOrName(nuGetProject));
        }
Exemple #21
0
        /// <summary>
        /// Get the view of PowerShellPackage. Used for Get-Package -Updates command.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="version"></param>
        /// <param name="versionType"></param>
        /// <returns></returns>
        internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(PSSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project)
        {
            PowerShellUpdatePackage package = new PowerShellUpdatePackage();

            package.Id          = data.Identity.Id;
            package.Description = data.Summary;
            package.ProjectName = project.GetMetadata <string>(NuGetProjectMetadataKeys.Name);
            switch (versionType)
            {
            case VersionType.updates:
            {
                package.Versions = data.Versions.Where(p => p > version).OrderByDescending(v => v);
                if (package.Versions != null && package.Versions.Any())
                {
                    LegacyNuGet.SemanticVersion sVersion;
                    LegacyNuGet.SemanticVersion.TryParse(package.Versions.FirstOrDefault().ToNormalizedString(), out sVersion);
                    package.Version = sVersion;
                }
            }
            break;

            case VersionType.latest:
            {
                NuGetVersion nVersion = data.Versions.Where(p => p > version).OrderByDescending(v => v).FirstOrDefault();
                if (nVersion != null)
                {
                    package.Versions = new List <NuGetVersion>()
                    {
                        nVersion
                    };
                    LegacyNuGet.SemanticVersion sVersion;
                    LegacyNuGet.SemanticVersion.TryParse(nVersion.ToNormalizedString(), out sVersion);
                    package.Version = sVersion;
                }
            }
            break;
            }

            return(package);
        }
        /// <summary>
        /// Returns a list of package references that were marked for reinstallation in packages.config of the project
        /// </summary>
        public static IList <Packaging.PackageReference> GetPackageReferencesMarkedForReinstallation(NuGetProject project)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            var projectFullPath        = project.GetMetadata <string>(NuGetProjectMetadataKeys.FullPath);
            var packagesConfigFullPath = Path.Combine(projectFullPath ?? string.Empty, NuGet.ProjectManagement.Constants.PackageReferenceFile);

            if (File.Exists(packagesConfigFullPath))
            {
                using (var stream = File.OpenRead(packagesConfigFullPath))
                {
                    var reader = new PackagesConfigReader(stream);
                    IEnumerable <Packaging.PackageReference> packageReferences = reader?.GetPackages();
                    return(packageReferences.Where(p => p.RequireReinstallation).ToList());
                }
            }

            return(new List <Packaging.PackageReference>());
        }
        /// <summary>
        /// Get default project in the type of EnvDTE.Project, to keep PowerShell scripts backward-compatbility.
        /// </summary>
        /// <returns></returns>
        protected Project GetDefaultProject()
        {
            string  customUniqueName  = string.Empty;
            Project defaultDTEProject = null;

            NuGetProject defaultNuGetProject = VsSolutionManager.DefaultNuGetProject;

            // Solution may be open without a project in it. Then defaultNuGetProject is null.
            if (defaultNuGetProject != null)
            {
                customUniqueName = defaultNuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);
            }

            // Get all DTE projects in the solution and compare by CustomUnique names, especially for projects under solution folders.
            IEnumerable <Project> allDTEProjects = EnvDTESolutionUtility.GetAllEnvDTEProjects(DTE);

            if (allDTEProjects != null)
            {
                defaultDTEProject = allDTEProjects.Where(p => StringComparer.OrdinalIgnoreCase.Equals(EnvDTEProjectUtility.GetCustomUniqueName(p), customUniqueName)).FirstOrDefault();
            }

            return(defaultDTEProject);
        }
Exemple #24
0
        private async System.Threading.Tasks.Task RestorePackagesInProject(NuGetProject nuGetProject, CancellationToken token)
        {
            if (token.IsCancellationRequested)
            {
                return;
            }

            var  projectName        = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name);
            bool hasMissingPackages = false;

            try
            {
                hasMissingPackages = await PackageRestoreManager.RestoreMissingPackagesAsync(nuGetProject, token);

                WriteLine(hasMissingPackages, error: false);
            }
            catch (Exception ex)
            {
                var exceptionMessage = _msBuildOutputVerbosity >= (int)VerbosityLevel.Detailed ?
                                       ex.ToString() :
                                       ex.Message;
                var message = String.Format(
                    CultureInfo.CurrentCulture,
                    Resources.PackageRestoreFailedForProject, projectName,
                    exceptionMessage);
                WriteLine(VerbosityLevel.Quiet, message);
                ActivityLog.LogError(LogEntrySource, message);
                ShowError(_errorListProvider, TaskErrorCategory.Error,
                          TaskPriority.High, message, hierarchyItem: null);
                WriteLine(hasMissingPackages, error: true);
            }
            finally
            {
                WriteLine(VerbosityLevel.Normal, Resources.PackageRestoreFinishedForProject, projectName);
            }
        }
        /// <summary>
        /// Output package updates to current project(s) found from the current remote source
        /// </summary>
        /// <param name="packagesToDisplay"></param>
        private async Task WriteUpdatePackagesFromRemoteSourceAsync(NuGetProject project)
        {
            var installedPackages = await project.GetInstalledPackagesAsync(Token);

            installedPackages = installedPackages.Where(p => !IsAutoReferenced(p));

            VersionType versionType;

            if (CollapseVersions)
            {
                versionType = VersionType.Latest;
            }
            else
            {
                versionType = VersionType.Updates;
            }

            var projectHasUpdates = false;

            var metadataTasks = installedPackages.Select(installedPackage =>
                                                         Task.Run(async() =>
            {
                var metadata = await GetLatestPackageFromRemoteSourceAsync(installedPackage.PackageIdentity, IncludePrerelease.IsPresent);
                if (metadata != null)
                {
                    await metadata.GetVersionsAsync();
                }
                return(metadata);
            }));

            foreach (var task in installedPackages.Zip(metadataTasks, (p, t) => Tuple.Create(t, p)))
            {
                var metadata = await task.Item1;

                if (metadata != null)
                {
                    var package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(metadata, task.Item2.PackageIdentity.Version, versionType, project);

                    var versions = package.Versions ?? Enumerable.Empty <NuGetVersion>();
                    if (versions.Any())
                    {
                        projectHasUpdates = true;
                        WriteObject(package);
                    }
                }
            }

            if (!projectHasUpdates)
            {
                LogCore(MessageLevel.Info, string.Format(CultureInfo.CurrentCulture, Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name)));
            }
        }
        /// <summary>
        /// Preview update actions for all packages
        /// </summary>
        /// <param name="project"></param>
        /// <returns></returns>
        private async Task PreviewAndExecuteUpdateActionsforAllPackages(NuGetProject project)
        {
            var token = CancellationToken.None;
            IEnumerable<NuGetProjectAction> actions = Enumerable.Empty<NuGetProjectAction>();

            // Get the list of package ids or identities to be updated for PackageManager
            if (Reinstall.IsPresent)
            {
                // Update-Package -Reinstall -> get list of installed package identities
                IEnumerable<PackageIdentity> identitiesToUpdate = Enumerable.Empty<PackageIdentity>();
                identitiesToUpdate = (await project.GetInstalledPackagesAsync(token)).Select(v => v.PackageIdentity);
                // Preview Update-Package -Reinstall actions
                actions = await PackageManager.PreviewReinstallPackagesAsync(identitiesToUpdate, project, ResolutionContext,
                this, ActiveSourceRepository, null, token);
            }
            else
            {
                // Update-Package -> get list of installed package ids
                IEnumerable<string> idsToUpdate = Enumerable.Empty<string>();
                idsToUpdate = await GeneratePackageIdListForUpdate(project, token);
                // Preview Update-Package actions
                actions = await PackageManager.PreviewUpdatePackagesAsync(idsToUpdate, project, ResolutionContext,
                this, ActiveSourceRepository, null, token);
            }

            if (actions.Any())
            {
                if (WhatIf.IsPresent)
                {
                    // For -WhatIf, only preview the actions
                    PreviewNuGetPackageActions(actions);
                }
                else
                {
                    if (Reinstall.IsPresent)
                    {
                        var uninstallActions = actions.Where(a => a.NuGetProjectActionType == NuGetProjectActionType.Uninstall);
                        var installActions = actions.Where(a => a.NuGetProjectActionType == NuGetProjectActionType.Install);

                        // Execute uninstall actions first to ensure that the package is completely uninstalled even from packages folder
                        await PackageManager.ExecuteNuGetProjectActionsAsync(project, uninstallActions, this, CancellationToken.None);

                        // Execute install actions now
                        await PackageManager.ExecuteNuGetProjectActionsAsync(project, installActions, this, CancellationToken.None);
                    }
                    else
                    {
                        // Execute project actions by Package Manager
                        await PackageManager.ExecuteNuGetProjectActionsAsync(project, actions, this, CancellationToken.None);
                    }
                }
            }
            else
            {
                Log(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata<string>(NuGetProjectMetadataKeys.Name)));
            }
        }
Exemple #27
0
        async Task WriteUpdatePackagesFromRemoteSourceAsync(NuGetProject project)
        {
            var frameworks        = PowerShellCmdletsUtility.GetProjectTargetFrameworks(project);
            var installedPackages = await project.GetInstalledPackagesAsync(ConsoleHost.Token);

            VersionType versionType;

            if (collapseVersions)
            {
                versionType = VersionType.Latest;
            }
            else
            {
                versionType = VersionType.Updates;
            }

            bool projectHasUpdates = false;

            var metadataTasks = installedPackages.Select(
                installedPackage =>
                Task.Run(async() => {
                var metadata = await GetLatestPackageFromRemoteSourceAsync(project, installedPackage.PackageIdentity, IncludePrerelease.IsPresent);
                if (metadata != null)
                {
                    await metadata.GetVersionsAsync();
                }
                return(metadata);
            }));

            foreach (var task in installedPackages.Zip(metadataTasks, (p, t) => Tuple.Create(t, p)))
            {
                var metadata = await task.Item1;

                if (metadata != null)
                {
                    var package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(metadata, task.Item2.PackageIdentity.Version, versionType, project);

                    var versions = package.Versions ?? Enumerable.Empty <NuGet.Versioning.NuGetVersion> ();
                    if (versions.Any())
                    {
                        projectHasUpdates = true;
                        WriteObject(package);
                    }
                }
            }

            if (!projectHasUpdates)
            {
                Log(MessageLevel.Info,
                    GettextCatalog.GetString("No package updates are available from the current package source for project '{0}'.", project.GetMetadata <string> (NuGetProjectMetadataKeys.Name)));
            }
        }
        /// <summary>
        /// Executes the list of <param name="nuGetProjectActions"></param> on <param name="nuGetProject"></param>, which is likely obtained by calling into PreviewInstallPackageAsync
        /// <param name="nuGetProjectContext"></param> is used in the process
        /// </summary>
        public async Task ExecuteNuGetProjectActionsAsync(NuGetProject nuGetProject, IEnumerable<NuGetProjectAction> nuGetProjectActions,
            INuGetProjectContext nuGetProjectContext, CancellationToken token)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            if (nuGetProjectActions == null)
            {
                throw new ArgumentNullException("nuGetProjectActions");
            }

            if (nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            Exception executeNuGetProjectActionsException = null;
            Stack<NuGetProjectAction> executedNuGetProjectActions = new Stack<NuGetProjectAction>();
            HashSet<PackageIdentity> packageWithDirectoriesToBeDeleted = new HashSet<PackageIdentity>(PackageIdentity.Comparer);
            try
            {
                await nuGetProject.PreProcessAsync(nuGetProjectContext, token);
                foreach (NuGetProjectAction nuGetProjectAction in nuGetProjectActions)
                {
                    executedNuGetProjectActions.Push(nuGetProjectAction);
                    if (nuGetProjectAction.NuGetProjectActionType == NuGetProjectActionType.Uninstall)
                    {
                        await ExecuteUninstallAsync(nuGetProject, nuGetProjectAction.PackageIdentity, packageWithDirectoriesToBeDeleted, nuGetProjectContext, token);
                    }
                    else
                    {
                        using (var targetPackageStream = new MemoryStream())
                        {
                            await PackageDownloader.GetPackageStream(nuGetProjectAction.SourceRepository, nuGetProjectAction.PackageIdentity, targetPackageStream, token);
                            await ExecuteInstallAsync(nuGetProject, nuGetProjectAction.PackageIdentity, targetPackageStream, packageWithDirectoriesToBeDeleted, nuGetProjectContext, token);
                        }
                    }

                    string toFromString = nuGetProjectAction.NuGetProjectActionType == NuGetProjectActionType.Install ? Strings.To : Strings.From;
                    nuGetProjectContext.Log(MessageLevel.Info, Strings.SuccessfullyExecutedPackageAction,
                        nuGetProjectAction.NuGetProjectActionType.ToString().ToLowerInvariant(), nuGetProjectAction.PackageIdentity.ToString(), toFromString + " " + nuGetProject.GetMetadata<string>(NuGetProjectMetadataKeys.Name));
                }
                await nuGetProject.PostProcessAsync(nuGetProjectContext, token);

                await OpenReadmeFile(nuGetProjectContext, token);
            }
            catch (Exception ex)
            {
                executeNuGetProjectActionsException = ex;
            }

            if(executeNuGetProjectActionsException != null)
            {
                await Rollback(nuGetProject, executedNuGetProjectActions, packageWithDirectoriesToBeDeleted, nuGetProjectContext, token);
            }

            // Delete the package directories as the last step, so that, if an uninstall had to be rolled back, we can just use the package file on the directory
            // Also, always perform deletion of package directories, even in a rollback, so that there are no stale package directories
            foreach(var packageWithDirectoryToBeDeleted in packageWithDirectoriesToBeDeleted)
            {
                await DeletePackage(packageWithDirectoryToBeDeleted, nuGetProjectContext, token);
            }

            // Clear direct install
            SetDirectInstall(null, nuGetProjectContext);

            if(executeNuGetProjectActionsException != null)
            {
                throw executeNuGetProjectActionsException;
            }
        }
        private void WritePackages(Dictionary<PSSearchMetadata, NuGetVersion> remoteUpdates, VersionType versionType, NuGetProject project)
        {
            List<PowerShellUpdatePackage> view = new List<PowerShellUpdatePackage>();
            foreach (KeyValuePair<PSSearchMetadata, NuGetVersion> pair in remoteUpdates)
            {
                PowerShellUpdatePackage package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(pair.Key, pair.Value, versionType, project);
                if (package.Versions != null && package.Versions.Any())
                {
                    view.Add(package);
                }
            }

            if (view.Any())
            {
                WriteObject(view, enumerateCollection: true);
            }
            else
            {
                LogCore(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata<string>(NuGetProjectMetadataKeys.Name)));
            }
        }
        public async Task<IEnumerable<NuGetProjectAction>> PreviewInstallPackageAsync(NuGetProject nuGetProject, PackageIdentity packageIdentity,
            ResolutionContext resolutionContext, INuGetProjectContext nuGetProjectContext,
            IEnumerable<SourceRepository> primarySources, IEnumerable<SourceRepository> secondarySources,
            CancellationToken token)
        {
            if(nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            if (packageIdentity == null)
            {
                throw new ArgumentNullException("packageIdentity");
            }

            if(resolutionContext == null)
            {
                throw new ArgumentNullException("resolutionContext");
            }

            if(nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            if (primarySources == null)
            {
                throw new ArgumentNullException("primarySources");
            }

            if (secondarySources == null)
            {
                secondarySources = SourceRepositoryProvider.GetRepositories().Where(e => e.PackageSource.IsEnabled);
            }

            if(!primarySources.Any())
            {
                throw new ArgumentException("primarySources");
            }

            if(packageIdentity.Version == null)
            {
                throw new ArgumentNullException("packageIdentity.Version");
            }

            // TODO: BUGBUG: HACK: Multiple primary repositories is mainly intended for nuget.exe at the moment
            // The following special case for ProjectK is not correct, if they used nuget.exe
            // and multiple repositories in the -Source switch
            if (nuGetProject is ProjectManagement.Projects.ProjectKNuGetProjectBase)
            {
                var action = NuGetProjectAction.CreateInstallProjectAction(packageIdentity, primarySources.First());
                return new NuGetProjectAction[] { action };
            }

            var projectInstalledPackageReferences = await nuGetProject.GetInstalledPackagesAsync(token);
            var oldListOfInstalledPackages = projectInstalledPackageReferences.Select(p => p.PackageIdentity);
            if(oldListOfInstalledPackages.Any(p => p.Equals(packageIdentity)))
            {
                string projectName;
                nuGetProject.TryGetMetadata<string>(NuGetProjectMetadataKeys.Name, out projectName);
                throw new InvalidOperationException(String.Format(NuGet.ProjectManagement.Strings.PackageAlreadyExistsInProject, packageIdentity, projectName ?? String.Empty));
            }

            List<NuGetProjectAction> nuGetProjectActions = new List<NuGetProjectAction>();
            // TODO: these sources should be ordered
            // TODO: search in only the active source but allow dependencies to come from other sources?

            var effectiveSources = GetEffectiveSources(primarySources, secondarySources);
            
            if (resolutionContext.DependencyBehavior != DependencyBehavior.Ignore)
            {
                try
                {
                    bool downgradeAllowed = false;
                    var packageTargetsForResolver = new HashSet<PackageIdentity>(oldListOfInstalledPackages, PackageIdentity.Comparer);
                    // Note: resolver needs all the installed packages as targets too. And, metadata should be gathered for the installed packages as well
                    var installedPackageWithSameId = packageTargetsForResolver.Where(p => p.Id.Equals(packageIdentity.Id, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                    if(installedPackageWithSameId != null)
                    {
                        packageTargetsForResolver.Remove(installedPackageWithSameId);
                        if(installedPackageWithSameId.Version > packageIdentity.Version)
                        {
                            // Looks like the installed package is of higher version than one being installed. So, we take it that downgrade is allowed
                            downgradeAllowed = true;
                        }
                    }
                    packageTargetsForResolver.Add(packageIdentity);

                    // Step-1 : Get metadata resources using gatherer
                    var targetFramework = nuGetProject.GetMetadata<NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);
                    nuGetProjectContext.Log(MessageLevel.Info, Strings.AttemptingToGatherDependencyInfo, packageIdentity, targetFramework);

                    var primaryPackages = new List<PackageIdentity>() { packageIdentity };

                    // If any targets are prerelease we should gather with prerelease on and filter afterwards
                    bool includePrereleaseInGather = resolutionContext.IncludePrerelease || (packageTargetsForResolver.Any(p => (p.HasVersion && p.Version.IsPrerelease)));
                    ResolutionContext contextForGather = new ResolutionContext(resolutionContext.DependencyBehavior, includePrereleaseInGather, resolutionContext.IncludeUnlisted);

                    var availablePackageDependencyInfoWithSourceSet = await ResolverGather.GatherPackageDependencyInfo(contextForGather,
                        primaryPackages,
                        packageTargetsForResolver,
                        targetFramework,
                        primarySources,
                        effectiveSources,
                        token);

                    if (!availablePackageDependencyInfoWithSourceSet.Any())
                    {
                        throw new InvalidOperationException(String.Format(Strings.UnableToGatherDependencyInfo, packageIdentity));
                    }

                    // Prune the results down to only what we would allow to be installed

                    // Keep only the target package we are trying to install for that Id
                    IEnumerable<SourceDependencyInfo> prunedAvailablePackages = PrunePackageTree.RemoveAllVersionsForIdExcept(availablePackageDependencyInfoWithSourceSet, packageIdentity);

                    if (!resolutionContext.IncludePrerelease)
                    {
                        prunedAvailablePackages = PrunePackageTree.PrunePreleaseForStableTargets(prunedAvailablePackages, packageTargetsForResolver);
                    }

                    // Remove versions that do not satisfy 'allowedVersions' attribute in packages.config, if any
                    prunedAvailablePackages = PrunePackageTree.PruneDisallowedVersions(prunedAvailablePackages, projectInstalledPackageReferences);

                    // TODO: prune down level packages?

                    // Step-2 : Call IPackageResolver.Resolve to get new list of installed packages
                    // TODO: Consider using IPackageResolver once it is extensible
                    var packageResolver = new PackageResolver(resolutionContext.DependencyBehavior);
                    nuGetProjectContext.Log(MessageLevel.Info, Strings.AttemptingToResolveDependencies, packageIdentity, resolutionContext.DependencyBehavior);

                    // Note: resolver prefers installed package versions if the satisfy the dependency version constraints
                    // So, since we want an exact version of a package, create a new list of installed packages where the packageIdentity being installed
                    // is present after removing the one with the same id
                    var preferredPackageReferences = new List<PackageReference>(projectInstalledPackageReferences.Where(pr =>
                        !pr.PackageIdentity.Id.Equals(packageIdentity.Id, StringComparison.OrdinalIgnoreCase)));
                    preferredPackageReferences.Add(new PackageReference(packageIdentity, targetFramework));

                    IEnumerable<PackageIdentity> newListOfInstalledPackages = packageResolver.Resolve(packageTargetsForResolver,
                        prunedAvailablePackages,
                        preferredPackageReferences,
                        token);
                    if (newListOfInstalledPackages == null)
                    {
                        throw new InvalidOperationException(String.Format(Strings.UnableToResolveDependencyInfo, packageIdentity, resolutionContext.DependencyBehavior));
                    }

                    // Step-3 : Get the list of nuGetProjectActions to perform, install/uninstall on the nugetproject
                    // based on newPackages obtained in Step-2 and project.GetInstalledPackages                    

                    nuGetProjectContext.Log(MessageLevel.Info, Strings.ResolvingActionsToInstallPackage, packageIdentity);
                    var newPackagesToUninstall = new List<PackageIdentity>();
                    foreach(var oldInstalledPackage in oldListOfInstalledPackages)
                    {
                        var newPackageWithSameId = newListOfInstalledPackages
                            .Where(np => oldInstalledPackage.Id.Equals(np.Id, StringComparison.OrdinalIgnoreCase) &&
                            !oldInstalledPackage.Version.Equals(np.Version)).FirstOrDefault();

                        if(newPackageWithSameId != null)
                        {
                            if(!downgradeAllowed && oldInstalledPackage.Version > newPackageWithSameId.Version)
                            {
                                throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Strings.NewerVersionAlreadyReferenced, newPackageWithSameId.Id));
                            }
                            newPackagesToUninstall.Add(oldInstalledPackage);
                        }
                    }
                    var newPackagesToInstall = newListOfInstalledPackages.Where(p => !oldListOfInstalledPackages.Contains(p));

                    foreach (PackageIdentity newPackageToUninstall in newPackagesToUninstall)
                    {
                        nuGetProjectActions.Add(NuGetProjectAction.CreateUninstallProjectAction(newPackageToUninstall));
                    }

                    var comparer = PackageIdentity.Comparer;

                    foreach (PackageIdentity newPackageToInstall in newPackagesToInstall)
                    {
                        // find the package match based on identity
                        SourceDependencyInfo sourceDepInfo = prunedAvailablePackages.Where(p => comparer.Equals(p, newPackageToInstall)).SingleOrDefault();

                        if (sourceDepInfo == null)
                        {
                            // this really should never happen
                            throw new InvalidOperationException(String.Format(Strings.PackageNotFound, packageIdentity));
                        }

                        nuGetProjectActions.Add(NuGetProjectAction.CreateInstallProjectAction(newPackageToInstall, sourceDepInfo.Source));
                    }
                }
                catch (InvalidOperationException)
                {
                    throw;
                }
                catch (AggregateException aggregateEx)
                {
                    throw new InvalidOperationException(aggregateEx.Message, aggregateEx);
                }
                catch (Exception ex)
                {
                    if (String.IsNullOrEmpty(ex.Message))
                    {
                        throw new InvalidOperationException(String.Format(Strings.PackageCouldNotBeInstalled, packageIdentity), ex);
                    }
                    else
                    {
                        throw new InvalidOperationException(ex.Message, ex);
                    }
                }
            }
            else
            {
                var sourceRepository = await GetSourceRepository(packageIdentity, effectiveSources);
                nuGetProjectActions.Add(NuGetProjectAction.CreateInstallProjectAction(packageIdentity, sourceRepository));
            }

            nuGetProjectContext.Log(MessageLevel.Info, Strings.ResolvedActionsToInstallPackage, packageIdentity);
            return nuGetProjectActions;
        }
        /// <summary>
        /// Gives the preview as a list of NuGetProjectActions that will be performed to uninstall <param name="packageId"></param> into <param name="nuGetProject"></param>
        /// <param name="uninstallationContext"></param> and <param name="nuGetProjectContext"></param> are used in the process
        /// </summary>
        public async Task<IEnumerable<NuGetProjectAction>> PreviewUninstallPackageAsync(NuGetProject nuGetProject, PackageIdentity packageIdentity,
            UninstallationContext uninstallationContext, INuGetProjectContext nuGetProjectContext, CancellationToken token)
        {
            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            if (packageIdentity == null)
            {
                throw new ArgumentNullException("packageIdentity");
            }

            if (uninstallationContext == null)
            {
                throw new ArgumentNullException("uninstallationContext");
            }

            if (nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            // Step-1: Get the packageIdentity corresponding to packageId and check if it exists to be uninstalled
            var installedPackages = await nuGetProject.GetInstalledPackagesAsync(token);
            PackageReference packageReference = installedPackages
                .Where(pr => pr.PackageIdentity.Equals(packageIdentity)).FirstOrDefault();
            if (packageReference == null || packageReference.PackageIdentity == null)
            {
                throw new ArgumentException(String.Format(Strings.PackageToBeUninstalledCouldNotBeFound,
                    packageIdentity.Id, nuGetProject.GetMetadata<string>(NuGetProjectMetadataKeys.Name)));
            }

            return await PreviewUninstallPackageAsyncPrivate(nuGetProject, packageReference, uninstallationContext, nuGetProjectContext, token);
        }
        public async Task<IEnumerable<PackageIdentity>> GetInstalledPackagesInDependencyOrder(NuGetProject nuGetProject,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            var targetFramework = nuGetProject.GetMetadata<NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);
            var installedPackages = await nuGetProject.GetInstalledPackagesAsync(token);
            var installedPackageIdentities = installedPackages.Select(pr => pr.PackageIdentity);
            var dependencyInfoFromPackagesFolder = await GetDependencyInfoFromPackagesFolder(installedPackageIdentities,
                targetFramework, includePrerelease: true);

            var packageResolver = new PackageResolver(DependencyBehavior.Lowest);
            return packageResolver.Resolve(installedPackageIdentities, dependencyInfoFromPackagesFolder, installedPackages, token);
        }
Exemple #33
0
        private async Task EmitNuGetProjectAsync(EnvDTEProject vsProject, NuGetProject nuGetProject)
        {
            // Get the project details.
            var projectUniqueName = nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.UniqueName);
            var projectId         = Guid.Empty;

            try
            {
                projectId = await ThreadHelper.JoinableTaskFactory.RunAsync(async delegate
                {
                    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                    // Get the project ID.
                    var vsHierarchyItem = VsHierarchyUtility.GetHierarchyItemForProject(vsProject);
                    Guid id;
                    if (!vsHierarchyItem.TryGetProjectId(out id))
                    {
                        id = Guid.Empty;
                    }

                    return(id);
                });
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to get project name or project ID. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);

                return;
            }

            // Emit the project information.
            try
            {
                var projectType = NuGetProjectType.Unknown;
                if (nuGetProject is MSBuildNuGetProject)
                {
                    projectType = NuGetProjectType.PackagesConfig;
                }
                else if (nuGetProject is BuildIntegratedNuGetProject)
                {
                    projectType = NuGetProjectType.UwpProjectJson;
                }
                else if (nuGetProject is ProjectKNuGetProjectBase)
                {
                    projectType = NuGetProjectType.XProjProjectJson;
                }

                var projectInformation = new ProjectInformation(
                    NuGetVersion.Value,
                    projectId,
                    projectType);

                _nuGetTelemetryService.EmitProjectInformation(projectInformation);
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to emit project information for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(ExceptionHelper.LogEntrySource, message);
                Debug.Fail(message);
            }

            // Emit the project dependency statistics.
            try
            {
                var installedPackages = await nuGetProject.GetInstalledPackagesAsync(CancellationToken.None);

                var installedPackagesCount = installedPackages.Count();

                var projectDependencyStatistics = new ProjectDependencyStatistics(
                    NuGetVersion.Value,
                    projectId,
                    installedPackagesCount);

                _nuGetTelemetryService.EmitProjectDependencyStatistics(projectDependencyStatistics);
            }
            catch (Exception ex)
            {
                var message =
                    $"Failed to emit project dependency statistics for project '{projectUniqueName}'. Exception:" +
                    Environment.NewLine +
                    ex.ToString();

                ActivityLog.LogWarning(message, ExceptionHelper.LogEntrySource);
                Debug.Fail(message);
            }
        }
Exemple #34
0
 public string GetNuGetProjectSafeName(NuGetProject nuGetProject)
 {
     return(nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name));
 }
 public string GetNuGetProjectSafeName(NuGetProject nuGetProject)
 {
     return nuGetProject.GetMetadata<string>(NuGetProjectMetadataKeys.Name);
 }
Exemple #36
0
 public Task <string> GetNuGetProjectSafeNameAsync(NuGetProject nuGetProject)
 {
     return(Task.FromResult(nuGetProject.GetMetadata <string>(NuGetProjectMetadataKeys.Name)));
 }
        /// <summary>
        /// Preview update actions for single package
        /// </summary>
        /// <param name="project"></param>
        /// <returns></returns>
        private async Task PreviewAndExecuteUpdateActionsforSinglePackage(NuGetProject project)
        {
            var token = CancellationToken.None;
            PackageReference installedPackage = (await project.GetInstalledPackagesAsync(token))
                .Where(p => string.Equals(p.PackageIdentity.Id, Id, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();

            // If package Id exists in Packages folder but is not actually installed to the current project, throw.
            if (installedPackage == null)
            {
                Log(MessageLevel.Error, string.Format(Resources.PackageNotInstalledInAnyProject, Id));
            }
            else
            {
                // If -Version switch is specified
                if (!string.IsNullOrEmpty(Version))
                {
                    PackageIdentity update = GetUpdatePackageIdentityWhenVersionSpecified(project, installedPackage);
                    if (update != null)
                    {
                        // Update by package identity
                        await InstallPackageByIdentityAsync(project, update, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                    }
                    else
                    {
                        Log(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata<string>(NuGetProjectMetadataKeys.Name)));
                    }
                }
                else
                {
                    if (Reinstall.IsPresent)
                    {
                        // Update-Package Id -Reinstall
                        PackageIdentity identity = installedPackage.PackageIdentity;
                        await InstallPackageByIdentityAsync(project, identity, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                    }
                    else
                    {
                        // Update-Package Id
                        NormalizePackageId(project);
                        NuGetVersion latestVersion = PowerShellCmdletsUtility.GetLastestVersionForPackageId(ActiveSourceRepository, Id, project, _allowPrerelease);
                        if (latestVersion > installedPackage.PackageIdentity.Version)
                        {
                            await InstallPackageByIdAsync(project, Id, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                        }
                        else
                        {
                            Log(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata<string>(NuGetProjectMetadataKeys.Name)));
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Get the view of PowerShellPackage. Used for Get-Package -Updates command. 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="version"></param>
        /// <param name="versionType"></param>
        /// <returns></returns>
        internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(PSSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project)
        {
            PowerShellUpdatePackage package = new PowerShellUpdatePackage();
            package.Id = data.Identity.Id;
            package.Description = data.Summary;
            package.ProjectName = project.GetMetadata<string>(NuGetProjectMetadataKeys.Name);
            switch (versionType)
            {
                case VersionType.updates:
                    {
                        package.Versions = data.Versions.Where(p => p > version).OrderByDescending(v => v);
                        if (package.Versions != null && package.Versions.Any())
                        {
                            LegacyNuGet.SemanticVersion sVersion;
                            LegacyNuGet.SemanticVersion.TryParse(package.Versions.FirstOrDefault().ToNormalizedString(), out sVersion);
                            package.Version = sVersion;
                        }
                    }
                    break;
                case VersionType.latest:
                    {
                        NuGetVersion nVersion = data.Versions.Where(p => p > version).OrderByDescending(v => v).FirstOrDefault();
                        if (nVersion != null)
                        {
                            package.Versions = new List<NuGetVersion>() { nVersion };
                            LegacyNuGet.SemanticVersion sVersion;
                            LegacyNuGet.SemanticVersion.TryParse(nVersion.ToNormalizedString(), out sVersion);
                            package.Version = sVersion;
                        }
                    }
                    break;
            }

            return package;
        }
Exemple #39
0
        public async ValueTask <IReadOnlyCollection <IPackageReferenceContextInfo> > GetInstalledPackagesAsync(
            IReadOnlyCollection <string> projectIds,
            CancellationToken cancellationToken)
        {
            Assumes.NotNullOrEmpty(projectIds);

            cancellationToken.ThrowIfCancellationRequested();

            IReadOnlyList <NuGetProject> projects = await GetProjectsAsync(projectIds, cancellationToken);

            List <Task <IEnumerable <PackageReference> > > tasks = projects
                                                                   .Select(project => project.GetInstalledPackagesAsync(cancellationToken))
                                                                   .ToList();

            IEnumerable <PackageReference>[] results = await Task.WhenAll(tasks);

            var installedPackages = new List <PackageReferenceContextInfo>();
            GetInstalledPackagesAsyncTelemetryEvent?telemetryEvent = null;

            for (var i = 0; i < results.Length; ++i)
            {
                IEnumerable <PackageReference> packageReferences = results[i];
                int totalCount = 0;
                int nullCount  = 0;

                foreach (PackageReference?packageReference in packageReferences)
                {
                    ++totalCount;

                    if (packageReference is null)
                    {
                        ++nullCount;

                        continue;
                    }

                    PackageReferenceContextInfo installedPackage = PackageReferenceContextInfo.Create(packageReference);

                    installedPackages.Add(installedPackage);
                }

                if (nullCount > 0)
                {
                    telemetryEvent ??= new GetInstalledPackagesAsyncTelemetryEvent();

                    NuGetProject project = projects[i];

                    string           projectId   = project.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);
                    NuGetProjectType projectType = VSTelemetryServiceUtility.GetProjectType(project);

                    telemetryEvent.AddProject(projectType, projectId, nullCount, totalCount);
                }
            }

            if (telemetryEvent is object)
            {
                TelemetryActivity.EmitTelemetryEvent(telemetryEvent);
            }

            return(installedPackages);
        }
        private string GetName(NuGetProject nuGetProject)
        {
            string nuGetProjectName = nuGetProject.GetMetadata<string>(NuGetProjectMetadataKeys.Name);
            if(!String.IsNullOrEmpty(nuGetProjectName))
            {
                throw new ArgumentException(String.Format(Strings.NuGetProjectDoesNotHaveName, nuGetProjectName));
            }

            return nuGetProjectName;
        }
        public async Task<IEnumerable<NuGetProjectAction>> PreviewReinstallPackagesAsync(IEnumerable<PackageIdentity> packagesToInstall, NuGetProject nuGetProject,
            ResolutionContext resolutionContext, INuGetProjectContext nuGetProjectContext,
            SourceRepository primarySourceRepository, IEnumerable<SourceRepository> secondarySources,
            CancellationToken token)
        {
            if(packagesToInstall == null)
            {
                throw new ArgumentNullException("packagesToInstall");
            }

            if (nuGetProject == null)
            {
                throw new ArgumentNullException("nuGetProject");
            }

            if (resolutionContext == null)
            {
                throw new ArgumentNullException("resolutionContext");
            }

            if (nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            if(packagesToInstall.Any(p => p.Version == null))
            {
                throw new ArgumentException("packagesToInstall");
            }

            if (primarySourceRepository == null)
            {
                throw new ArgumentNullException("primarySourceRepository");
            }
            var primarySources = new List<SourceRepository>() { primarySourceRepository };

            if (secondarySources == null)
            {
                secondarySources = SourceRepositoryProvider.GetRepositories().Where(e => e.PackageSource.IsEnabled);
            }

            var projectInstalledPackageReferences = await nuGetProject.GetInstalledPackagesAsync(token);
            var oldListOfInstalledPackages = projectInstalledPackageReferences.Select(p => p.PackageIdentity);

            // Note: resolver needs all the installed packages as targets too. And, metadata should be gathered for the installed packages as well
            var packageTargetsForResolver = new HashSet<PackageIdentity>(oldListOfInstalledPackages, PackageIdentity.Comparer);
            foreach(var packageToInstall in packagesToInstall)
            {
                packageTargetsForResolver.Add(packageToInstall);
            }

            List<NuGetProjectAction> nuGetProjectActions = new List<NuGetProjectAction>();
            // TODO: these sources should be ordered
            // TODO: search in only the active source but allow dependencies to come from other sources?

            var effectiveSources = GetEffectiveSources(primarySources, secondarySources);

            try
            {
                // If any targets are prerelease we should gather with prerelease on and filter afterwards
                bool includePrereleaseInGather = resolutionContext.IncludePrerelease || (packageTargetsForResolver.Any(p => (p.HasVersion && p.Version.IsPrerelease)));
                ResolutionContext contextForGather = new ResolutionContext(resolutionContext.DependencyBehavior, includePrereleaseInGather, resolutionContext.IncludeUnlisted);

                // Step-1 : Get metadata resources using gatherer
                var targetFramework = nuGetProject.GetMetadata<NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework);
                nuGetProjectContext.Log(MessageLevel.Info, Strings.AttemptingToGatherDependencyInfoForMultiplePackages, targetFramework);
                var availablePackageDependencyInfoWithSourceSet = await ResolverGather.GatherPackageDependencyInfo(contextForGather,
                    packagesToInstall,
                    packageTargetsForResolver,
                    targetFramework,
                    primarySources,
                    effectiveSources,
                    token);

                if (!availablePackageDependencyInfoWithSourceSet.Any())
                {
                    throw new InvalidOperationException(Strings.UnableToGatherDependencyInfoForMultiplePackages);
                }

                // Prune the results down to only what we would allow to be installed
                IEnumerable<SourceDependencyInfo> prunedAvailablePackages = availablePackageDependencyInfoWithSourceSet;

                // Keep only the target package we are trying to install for that Id
                foreach (var packageIdentity in packagesToInstall)
                {
                    prunedAvailablePackages = PrunePackageTree.RemoveAllVersionsForIdExcept(prunedAvailablePackages, packageIdentity);
                }

                if (!resolutionContext.IncludePrerelease)
                {
                    prunedAvailablePackages = PrunePackageTree.PrunePreleaseForStableTargets(prunedAvailablePackages, packageTargetsForResolver);
                }

                // TODO: prune down level packages?

                // Remove versions that do not satisfy 'allowedVersions' attribute in packages.config, if any
                prunedAvailablePackages = PrunePackageTree.PruneDisallowedVersions(prunedAvailablePackages, projectInstalledPackageReferences);

                // Step-2 : Call IPackageResolver.Resolve to get new list of installed packages                
                // TODO: Consider using IPackageResolver once it is extensible
                var packageResolver = new PackageResolver(resolutionContext.DependencyBehavior);
                nuGetProjectContext.Log(MessageLevel.Info, Strings.AttemptingToResolveDependenciesForMultiplePackages);

                IEnumerable<PackageIdentity> newListOfInstalledPackages = packageResolver.Resolve(packageTargetsForResolver,
                    prunedAvailablePackages,
                    projectInstalledPackageReferences,
                    token);
                if (newListOfInstalledPackages == null)
                {
                    throw new InvalidOperationException(Strings.UnableToResolveDependencyInfoForMultiplePackages);
                }

                var packagesInDependencyOrder = (await GetInstalledPackagesInDependencyOrder(nuGetProject,
                    nuGetProjectContext, token)).Reverse();

                foreach(var package in packagesInDependencyOrder)
                {
                    nuGetProjectActions.Add(NuGetProjectAction.CreateUninstallProjectAction(package));
                }

                var comparer = PackageIdentity.Comparer;
                foreach (PackageIdentity newPackageToInstall in newListOfInstalledPackages)
                {
                    // find the package match based on identity
                    SourceDependencyInfo sourceDepInfo = availablePackageDependencyInfoWithSourceSet.Where(p => comparer.Equals(p, newPackageToInstall)).SingleOrDefault();

                    if (sourceDepInfo == null)
                    {
                        // this really should never happen
                        throw new InvalidOperationException(String.Format(Strings.PackageNotFound, newPackageToInstall));
                    }

                    nuGetProjectActions.Add(NuGetProjectAction.CreateInstallProjectAction(newPackageToInstall, sourceDepInfo.Source));
                }
            }
            catch(InvalidOperationException)
            {
                throw;
            }
            catch (AggregateException aggregateEx)
            {
                throw new InvalidOperationException(aggregateEx.Message, aggregateEx);
            }
            catch (Exception ex)
            {
                if(String.IsNullOrEmpty(ex.Message))
                {
                    throw new InvalidOperationException(Strings.PackagesCouldNotBeInstalled, ex);
                }
                else
                {
                    throw new InvalidOperationException(ex.Message, ex);
                }                
            }
            return nuGetProjectActions;
        }
Exemple #42
0
        /// <summary>
        /// Preview update actions for single package
        /// </summary>
        /// <param name="project"></param>
        /// <returns></returns>
        private async Task PreviewAndExecuteUpdateActionsforSinglePackage(NuGetProject project)
        {
            var token = CancellationToken.None;
            PackageReference installedPackage = (await project.GetInstalledPackagesAsync(token))
                                                .Where(p => string.Equals(p.PackageIdentity.Id, Id, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();

            // If package Id exists in Packages folder but is not actually installed to the current project, throw.
            if (installedPackage == null)
            {
                Log(MessageLevel.Error, string.Format(Resources.PackageNotInstalledInAnyProject, Id));
            }
            else
            {
                // If -Version switch is specified
                if (!string.IsNullOrEmpty(Version))
                {
                    PackageIdentity update = GetUpdatePackageIdentityWhenVersionSpecified(project, installedPackage);
                    if (update != null)
                    {
                        // Update by package identity
                        await InstallPackageByIdentityAsync(project, update, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                    }
                    else
                    {
                        Log(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name)));
                    }
                }
                else
                {
                    if (Reinstall.IsPresent)
                    {
                        // Update-Package Id -Reinstall
                        PackageIdentity identity = installedPackage.PackageIdentity;
                        await InstallPackageByIdentityAsync(project, identity, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                    }
                    else
                    {
                        // Update-Package Id
                        NormalizePackageId(project);
                        NuGetVersion latestVersion = PowerShellCmdletsUtility.GetLastestVersionForPackageId(ActiveSourceRepository, Id, project, _allowPrerelease);
                        if (latestVersion > installedPackage.PackageIdentity.Version)
                        {
                            await InstallPackageByIdAsync(project, Id, ResolutionContext, this, WhatIf.IsPresent, Reinstall.IsPresent, UninstallContext);
                        }
                        else
                        {
                            Log(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name)));
                        }
                    }
                }
            }
        }