Example #1
0
        public override int Execute()
        {
            ValidateArguments();

            DirectoryPath?toolPath = null;

            if (_toolPath != null)
            {
                toolPath = new DirectoryPath(_toolPath);
            }

            VersionRange versionRange = null;

            if (!string.IsNullOrEmpty(_packageVersion) && !VersionRange.TryParse(_packageVersion, out versionRange))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.InvalidNuGetVersionRange,
                              _packageVersion));
            }

            (IToolPackageStore toolPackageStore,
             IToolPackageStoreQuery toolPackageStoreQuery,
             IToolPackageInstaller toolPackageInstaller,
             IToolPackageUninstaller toolPackageUninstaller) = _createToolPackageStoreInstallerUninstaller(toolPath, _forwardRestoreArguments);

            IShellShimRepository shellShimRepository = _createShellShimRepository(toolPath);

            IToolPackage oldPackageNullable = GetOldPackage(toolPackageStoreQuery);

            using (var scope = new TransactionScope(
                       TransactionScopeOption.Required,
                       TimeSpan.Zero))
            {
                if (oldPackageNullable != null)
                {
                    RunWithHandlingUninstallError(() =>
                    {
                        foreach (RestoredCommand command in oldPackageNullable.Commands)
                        {
                            shellShimRepository.RemoveShim(command.Name);
                        }

                        toolPackageUninstaller.Uninstall(oldPackageNullable.PackageDirectory);
                    });
                }

                RunWithHandlingInstallError(() =>
                {
                    IToolPackage newInstalledPackage = toolPackageInstaller.InstallPackage(
                        new PackageLocation(nugetConfig: GetConfigFile(), additionalFeeds: _additionalFeeds),
                        packageId: _packageId,
                        targetFramework: _framework,
                        versionRange: versionRange,
                        verbosity: _verbosity);

                    EnsureVersionIsHigher(oldPackageNullable, newInstalledPackage);

                    foreach (RestoredCommand command in newInstalledPackage.Commands)
                    {
                        shellShimRepository.CreateShim(command.Executable, command.Name);
                    }

                    PrintSuccessMessage(oldPackageNullable, newInstalledPackage);
                });

                scope.Complete();
            }

            return(0);
        }
Example #2
0
        /// <summary>
        /// </summary>
        protected override void ProcessRecord()
        {
            source            = new CancellationTokenSource();
            cancellationToken = source.Token;



            NuGetVersion.TryParse(_version, out nugetVersion);


            if (nugetVersion == null)
            {
                VersionRange.TryParse(_version, out versionRange);
            }

            var consoleIsElevated = false;
            var isWindowsPS       = true;

#if NET472
            // WindowsPS
            var id = System.Security.Principal.WindowsIdentity.GetCurrent();
            consoleIsElevated = (id.Owner != id.User);
            isWindowsPS       = true;

            myDocumentsPath  = Path.Combine(Environment.GetFolderPath(SpecialFolder.MyDocuments), "WindowsPowerShell");
            programFilesPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.ProgramFiles), "WindowsPowerShell");
#else
            // If Windows OS (PS6+)
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                var id = System.Security.Principal.WindowsIdentity.GetCurrent();
                consoleIsElevated = (id.Owner != id.User);

                myDocumentsPath  = Path.Combine(Environment.GetFolderPath(SpecialFolder.MyDocuments), "PowerShell");
                programFilesPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.ProgramFiles), "PowerShell");
            }
            else
            {
                // Paths are the same for both Linux and MacOS
                myDocumentsPath  = Path.Combine(Environment.GetFolderPath(SpecialFolder.LocalApplicationData), "Powershell");
                programFilesPath = Path.Combine("usr", "local", "share", "Powershell");

                using (System.Management.Automation.PowerShell pwsh = System.Management.Automation.PowerShell.Create())
                {
                    var results = pwsh.AddCommand("id").AddParameter("u").Invoke();
                }
            }
#endif


            foreach (var pkgName in _name)
            {
                var successfullyUninstalledPkg = UninstallPkgHelper(pkgName, cancellationToken);
                if (successfullyUninstalledPkg)
                {
                    Console.WriteLine("Successfully uninstalled {0}", pkgName);
                }
                else
                {
                    Console.WriteLine("Did not successfully uninstall {0}", pkgName);
                }
            }
        }
Example #3
0
 public static InstalledPackage GetGlobalInstalledPackage(string packageId, string version = null, string packagesDirectory = null)
 {
     VersionRange.TryParse(version != null && version.Contains("*") ? $"{version}" : $"[{version}]", out var versionRange);
     return(GetGlobalInstalledPackage(packageId, versionRange, packagesDirectory));
 }
Example #4
0
        private static void UpdateDependencies(Dictionary <string, PackageInfo> packages, VersionTranslation translation, bool exactVersions, Func <string, string, string, bool> allowPreReleaseDependencyOpt)
        {
            var errors = new List <Exception>();

            foreach (var package in packages.Values)
            {
                var dependencies = package.SpecificationXml.
                                   Element(XName.Get("package", package.NuspecXmlns))?.
                                   Element(XName.Get("metadata", package.NuspecXmlns))?.
                                   Element(XName.Get("dependencies", package.NuspecXmlns))?.
                                   Descendants(XName.Get("dependency", package.NuspecXmlns)) ?? Array.Empty <XElement>();

                foreach (var dependency in dependencies)
                {
                    string id = dependency.Attribute("id")?.Value;
                    if (id == null)
                    {
                        throw new InvalidDataException($"'{package.Id}' has invalid format: element 'dependency' is missing 'id' attribute");
                    }

                    var versionRangeAttribute = dependency.Attribute("version");
                    if (versionRangeAttribute == null)
                    {
                        throw new InvalidDataException($"'{package.Id}' has invalid format: element 'dependency' is missing 'version' attribute");
                    }

                    if (!VersionRange.TryParse(versionRangeAttribute.Value, out var versionRange))
                    {
                        throw new InvalidDataException($"'{id}' has invalid version range: '{versionRangeAttribute.Value}'");
                    }

                    if (packages.TryGetValue(id, out var dependentPackage))
                    {
                        if (versionRange.IsFloating ||
                            versionRange.HasLowerAndUpperBounds && versionRange.MinVersion != versionRange.MaxVersion)
                        {
                            throw new InvalidDataException($"Unexpected dependency version range: '{id}, {versionRangeAttribute.Value}'");
                        }

                        var newVersion = ToNuGetVersion(dependentPackage.NewVersion);

                        var newRange = exactVersions ?
                                       new VersionRange(newVersion, includeMinVersion: true, newVersion, includeMaxVersion: true) :
                                       new VersionRange(
                            versionRange.HasLowerBound ? newVersion : null,
                            versionRange.IsMinInclusive,
                            versionRange.HasUpperBound ? newVersion : null,
                            versionRange.IsMaxInclusive);

                        // Note: metadata is not included in the range
                        versionRangeAttribute.SetValue(newRange.ToNormalizedString());
                    }
                    else if (translation == VersionTranslation.Release && (versionRange.MinVersion?.IsPrerelease == true || versionRange.MaxVersion?.IsPrerelease == true))
                    {
                        if (allowPreReleaseDependencyOpt?.Invoke(package.Id, id, versionRangeAttribute.Value) != true)
                        {
                            errors.Add(new InvalidOperationException($"Package '{package.Id}' depends on a pre-release package '{id}, {versionRangeAttribute.Value}'"));
                        }
                    }
                }
            }

            ThrowExceptions(errors);
        }
Example #5
0
        private async Task <int> OnExecuteAsync()
        {
            var reporter = new ConsoleReporter(PhysicalConsole.Singleton)
            {
                IsVerbose = Verbose
            };

            var installDir = string.IsNullOrEmpty(OutputDirectory)
                ? Path.Combine(Directory.GetCurrentDirectory(), "packages")
                : Path.GetFullPath(OutputDirectory);

            var       tempFilePath = Path.Combine(AppContext.BaseDirectory, "projectThatNeverExists.csproj");
            ISettings settings     = Settings.LoadDefaultSettings(tempFilePath);

            VersionRange versionRange;

            if (!string.IsNullOrEmpty(Version))
            {
                if (!VersionRange.TryParse(Version, out versionRange))
                {
                    reporter.Error($"Invalid nuget version '{Version}'");
                    return(1);
                }
            }
            else
            {
                versionRange = Prerelease
                    ? VersionRange.AllFloating
                    : VersionRange.AllStableFloating;
            }

            var logger = new ConsoleNuGetLogger(reporter);

            var results = await RestoreRunnerEx.RunWithoutCommit(tempFilePath,
                                                                 installDir,
                                                                 PackageId,
                                                                 versionRange,
                                                                 settings,
                                                                 Sources,
                                                                 logger);

            var success = false;

            foreach (var result in results)
            {
                if (result.Result.Success)
                {
                    var installedVersion = result.Result.LockFile.Libraries.FirstOrDefault(l => string.Equals(PackageId, l.Name, StringComparison.OrdinalIgnoreCase));
                    if (installedVersion != null)
                    {
                        var path = installedVersion.Path;
                        reporter.Output($"Installed {installedVersion.Name} {installedVersion.Version}");
                        foreach (var file in installedVersion.Files)
                        {
                            reporter.Verbose("Package file: " + file);
                        }
                        success = true;
                        break;
                    }
                }
                else
                {
                    foreach (var unresolved in result.Result.GetAllUnresolved())
                    {
                        reporter.Warn($"Could not find a package {unresolved.Name} in the version range {unresolved.VersionRange}");
                    }
                }
            }

            if (success)
            {
                reporter.Output("Installation succeeded");
                return(0);
            }

            reporter.Error("Installation failed");

            return(success ? 1 : 0);
        }
            private static VersionRange TryParseVersionRange(string versionString)
            {
                VersionRange value;

                return(VersionRange.TryParse(versionString, out value) ? value : null);
            }
Example #7
0
 public static InstalledPackage GetGlobalInstalledPackage(string packageId, [CanBeNull] string version, [CanBeNull] string packagesConfigFile)
 {
     VersionRange.TryParse(version != null && version.Contains("*") ? $"{version}" : $"[{version}]", out var versionRange);
     return(GetGlobalInstalledPackage(packageId, versionRange, packagesConfigFile));
 }
Example #8
0
 /// <summary>
 /// Defines a validator that will fail if the value cannot be parsed as <see cref="VersionRange"/>.
 /// </summary>
 public static IRuleBuilderOptions <T, string?> IsVersionRange <T>(this IRuleBuilder <T, string?> ruleBuilder)
 {
     return(ruleBuilder
            .Must(x => VersionRange.TryParse(x, out _))
            .WithMessage("Value '{PropertyValue}' of '{PropertyName}' is not a valid version range."));
 }
Example #9
0
        /// <summary>
        /// Reads all package node entries in the config
        /// </summary>
        /// <returns></returns>
        public IEnumerable <PackageReference> GetPackages()
        {
            var packages = new List <PackageReference>();

            foreach (var package in _doc.Root.Elements(XName.Get("package")))
            {
                string id = null;
                if (!TryGetAttribute(package, "id", out id) ||
                    String.IsNullOrEmpty(id))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorNullOrEmptyPackageId));
                }

                string version = null;
                if (!TryGetAttribute(package, "version", out version) ||
                    String.IsNullOrEmpty(version))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorInvalidPackageVersion,
                                                                id,
                                                                version));
                }

                NuGetVersion semver = null;
                if (!NuGetVersion.TryParse(version, out semver))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorInvalidPackageVersion,
                                                                id,
                                                                version));
                }

                string       attributeValue  = null;
                VersionRange allowedVersions = null;
                if (TryGetAttribute(package, "allowedVersions", out attributeValue))
                {
                    if (!VersionRange.TryParse(attributeValue, out allowedVersions))
                    {
                        throw new PackagesConfigReaderException(string.Format(
                                                                    CultureInfo.CurrentCulture,
                                                                    Strings.ErrorInvalidAllowedVersions,
                                                                    id,
                                                                    attributeValue));
                    }
                }

                var targetFramework = NuGetFramework.UnsupportedFramework;
                if (TryGetAttribute(package, "targetFramework", out attributeValue))
                {
                    targetFramework = NuGetFramework.Parse(attributeValue, _frameworkMappings);
                }

                var developmentDependency = BoolAttribute(package, "developmentDependency");
                var requireReinstallation = BoolAttribute(package, "requireReinstallation");
                var userInstalled         = BoolAttribute(package, "userInstalled", true);

                var entry = new PackageReference(new PackageIdentity(id, semver), targetFramework, userInstalled, developmentDependency, requireReinstallation, allowedVersions);

                packages.Add(entry);
            }

            // check if there are duplicate entries
            var packageIds = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            var duplicates = new List <string>();

            foreach (var package in packages)
            {
                if (packageIds.Contains(package.PackageIdentity.Id))
                {
                    duplicates.Add(package.PackageIdentity.Id);
                }
                else
                {
                    packageIds.Add(package.PackageIdentity.Id);
                }
            }

            if (duplicates.Count > 0)
            {
                throw new PackagesConfigReaderException(string.Format(
                                                            CultureInfo.CurrentCulture,
                                                            Strings.ErrorDuplicatePackages,
                                                            string.Join(", ", duplicates)));
            }

            return(packages);
        }
Example #10
0
        public override int Execute()
        {
            if (_configFilePath != null && !File.Exists(_configFilePath))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.NuGetConfigurationFileDoesNotExist,
                              Path.GetFullPath(_configFilePath)));
            }

            VersionRange versionRange = null;

            if (!string.IsNullOrEmpty(_packageVersion) && !VersionRange.TryParse(_packageVersion, out versionRange))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.InvalidNuGetVersionRange,
                              _packageVersion));
            }

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            string targetFramework = BundledTargetFramework.GetTargetFrameworkMoniker();

            try
            {
                FilePath manifestFile = GetManifestFilePath();

                IToolPackage toolDownloadedPackage =
                    _toolPackageInstaller.InstallPackageToExternalManagedLocation(
                        new PackageLocation(
                            nugetConfig: configFile,
                            additionalFeeds: _sources,
                            rootConfigDirectory: manifestFile.GetDirectoryPath()),
                        _packageId,
                        versionRange,
                        targetFramework,
                        verbosity: _verbosity);

                _toolManifestEditor.Add(
                    manifestFile,
                    toolDownloadedPackage.Id,
                    toolDownloadedPackage.Version,
                    toolDownloadedPackage.Commands.Select(c => c.Name).ToArray());

                foreach (var restoredCommand in toolDownloadedPackage.Commands)
                {
                    _localToolsResolverCache.Save(
                        new Dictionary <RestoredCommandIdentifier, RestoredCommand>
                    {
                        [new RestoredCommandIdentifier(
                             toolDownloadedPackage.Id,
                             toolDownloadedPackage.Version,
                             NuGetFramework.Parse(targetFramework),
                             Constants.AnyRid,
                             restoredCommand.Name)] =
                            restoredCommand
                    });
                }

                _reporter.WriteLine(
                    string.Format(
                        LocalizableStrings.LocalToolInstallationSucceeded,
                        string.Join(", ", toolDownloadedPackage.Commands.Select(c => c.Name)),
                        toolDownloadedPackage.Id,
                        toolDownloadedPackage.Version.ToNormalizedString(),
                        manifestFile.Value).Green());

                return(0);
            }
            catch (Exception ex) when(InstallToolCommandLowLevelErrorConverter.ShouldConvertToUserFacingError(ex))
            {
                throw new GracefulException(
                          messages: InstallToolCommandLowLevelErrorConverter.GetUserFacingMessages(ex, _packageId),
                          verboseMessages: new[] { ex.ToString() },
                          isUserError: false);
            }
        }
Example #11
0
        public IPackageReferenceContextInfo?Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
        {
            if (reader.TryReadNil())
            {
                return(null);
            }

            // stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
            options.Security.DepthStep(ref reader);

            try
            {
                PackageIdentity?identity                = null;
                NuGetFramework? framework               = null;
                bool            isUserInstalled         = false;
                bool            isAutoReferenced        = false;
                bool            isDevelopmentDependency = false;
                string?         allowedVersions         = null;

                int propertyCount = reader.ReadMapHeader();
                for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++)
                {
                    switch (reader.ReadString())
                    {
                    case IdentityPropertyName:
                        identity = PackageIdentityFormatter.Instance.Deserialize(ref reader, options);
                        break;

                    case FrameworkPropertyName:
                        framework = NuGetFrameworkFormatter.Instance.Deserialize(ref reader, options);
                        break;

                    case IsUserInstalledPropertyName:
                        isUserInstalled = reader.ReadBoolean();
                        break;

                    case IsAutoReferencedPropertyName:
                        isAutoReferenced = reader.ReadBoolean();
                        break;

                    case IsDevelopmentDependencyPropertyName:
                        isDevelopmentDependency = reader.ReadBoolean();
                        break;

                    case AllowedVersionsPropertyName:
                        if (!reader.TryReadNil())     // Advances beyond the current value if the current value is nil and returns true; otherwise leaves the reader's position unchanged and returns false.
                        {
                            allowedVersions = reader.ReadString();
                        }
                        break;

                    default:
                        reader.Skip();
                        break;
                    }
                }

                Assumes.NotNull(identity);
                Assumes.NotNull(framework);

                var packageReferenceContextInfo = new PackageReferenceContextInfo(identity, framework)
                {
                    IsUserInstalled         = isUserInstalled,
                    IsAutoReferenced        = isAutoReferenced,
                    IsDevelopmentDependency = isDevelopmentDependency
                };

                if (!string.IsNullOrWhiteSpace(allowedVersions) && VersionRange.TryParse(allowedVersions, out VersionRange versionRange))
                {
                    packageReferenceContextInfo.AllowedVersions = versionRange;
                }

                return(packageReferenceContextInfo);
            }
            finally
            {
                // stack overflow mitigation - see https://github.com/neuecc/MessagePack-CSharp/security/advisories/GHSA-7q36-4xx7-xcxf
                reader.Depth--;
            }
        }
        /// <summary>
        /// </summary>
        protected override void ProcessRecord()
        {
            source            = new CancellationTokenSource();
            cancellationToken = source.Token;



            NuGetVersion.TryParse(_version, out nugetVersion);


            if (nugetVersion == null)
            {
                VersionRange.TryParse(_version, out versionRange);
            }

            var windowsIdentity = WindowsIdentity.GetCurrent();
            // identity name and authentication type.
            string          authenticationType           = windowsIdentity.AuthenticationType;
            string          userName                     = windowsIdentity.Name;
            GenericIdentity authenticatedGenericIdentity =
                new GenericIdentity(userName, authenticationType);



            var id = WindowsIdentity.GetCurrent();
            var consoleIsElevated = (id.Owner != id.User);



            // Paths
            //if (!Platform.IsCoreCLR)
            var isWindowsPS = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory().ToLower().Contains("windows") ? true : false;

            if (isWindowsPS)
            {
                programFilesPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.ProgramFiles), "WindowsPowerShell");
                // TODO: Come back to this
                //var userENVpath = Path.Join(Environment.GetEnvironmentVariable("USERPROFILE"), "Documents");


                myDocumentsPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.MyDocuments), "WindowsPowerShell");
            }
            else
            {
                programFilesPath = Path.Combine(Environment.GetFolderPath(SpecialFolder.ProgramFiles), "PowerShell");
                myDocumentsPath  = Path.Combine(Environment.GetFolderPath(SpecialFolder.MyDocuments), "PowerShell");
            }



            // TODO: uninstall scope???



            foreach (var pkgName in _name)
            {
                var successfullyUninstalledPkg = UninstallPkgHelper(pkgName, cancellationToken);
                if (successfullyUninstalledPkg)
                {
                    Console.WriteLine("Successfully uninstalled {0}", pkgName);
                }
                else
                {
                    Console.WriteLine("Did not successfully uninstall {0}", pkgName);
                }
            }
        }
        private void VerifyPackageReferences(string filePath, IReadOnlyDictionary <string, PackageVersionVariable> versionVariables)
        {
            ProjectRootElement doc;

            try
            {
                doc = ProjectRootElement.Open(filePath);
            }
            catch (InvalidProjectFileException ex)
            {
                Log.LogError(null, null, null, filePath, 0, 0, 0, 0, message: "Invalid project file: " + ex.Message);
                return;
            }

            var packageReferences = doc.Items.Where(i => i.ItemType == "PackageReference");

            foreach (var pkgRef in packageReferences)
            {
                var id = pkgRef.Include;

                if (string.IsNullOrEmpty(id))
                {
                    // this node is an Update or Remove node
                    continue;
                }

                var versionMetadata = pkgRef.Metadata.LastOrDefault(m => m.Name == "Version");
                var versionRaw      = versionMetadata?.Value;
                if (versionMetadata == null || string.IsNullOrEmpty(versionRaw))
                {
                    Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageReferenceDoesNotHaveVersion, $"PackageReference to {id} does not define a Version");
                    continue;
                }

                var versionIsVariable =
                    versionRaw != null &&
                    versionRaw.Length > 3 &&
                    versionRaw[0] == '$' &&
                    versionRaw[1] == '(' &&
                    versionRaw[versionRaw.Length - 1] == ')' &&
                    versionRaw.IndexOf(')') == versionRaw.Length - 1;

                if (!versionIsVariable)
                {
                    Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasLiteralVersion, "PackageReference must use an MSBuild variable to set the version.");
                    continue;
                }

                var versionVarName = versionRaw.Substring(2, versionRaw.Length - 3);

                if (!versionVariables.TryGetValue(versionVarName, out var variable))
                {
                    Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.VariableNotFoundInDependenciesPropsFile, $"The variable {versionRaw} could not be found in {DependenciesFile}");
                    continue;
                }

                var versionValue = variable.Version;
                if (!VersionRange.TryParse(versionValue, out var nugetVersion))
                {
                    Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.InvalidPackageVersion, $"PackageReference to {id} has an invalid version identifier: '{versionValue}'");
                    continue;
                }

                if (nugetVersion.IsFloating)
                {
                    Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasFloatingVersion, $"PackageReference to {id} uses a floating version: '{versionValue}'");
                }
            }
        }
Example #14
0
        /// <summary>
        /// Read package dependencies for all frameworks
        /// </summary>
        public IEnumerable <PackageDependencyGroup> GetDependencyGroups()
        {
            var ns = MetadataNode.GetDefaultNamespace().NamespaceName;

            var groupFound = false;

            foreach (var depGroup in MetadataNode.Elements(XName.Get(Dependencies, ns)).Elements(XName.Get(Group, ns)))
            {
                groupFound = true;

                var groupFramework = GetAttributeValue(depGroup, TargetFramework);

                var packages = new List <PackageDependency>();

                foreach (var depNode in depGroup.Elements(XName.Get(Dependency, ns)))
                {
                    VersionRange range = null;

                    var rangeNode = GetAttributeValue(depNode, Version);

                    if (!String.IsNullOrEmpty(rangeNode))
                    {
                        VersionRange.TryParse(rangeNode, out range);

                        Debug.Assert(range != null, "Unable to parse range: " + rangeNode);
                    }

                    var includeFlags = GetFlags(GetAttributeValue(depNode, IncludeFlags));
                    var excludeFlags = GetFlags(GetAttributeValue(depNode, ExcludeFlags));

                    var dependency = new PackageDependency(
                        GetAttributeValue(depNode, Id),
                        range,
                        includeFlags,
                        excludeFlags);

                    packages.Add(dependency);
                }

                var framework = String.IsNullOrEmpty(groupFramework)
                    ? NuGetFramework.AnyFramework
                    : NuGetFramework.Parse(groupFramework, _frameworkProvider);

                yield return(new PackageDependencyGroup(framework, packages));
            }

            // legacy behavior
            if (!groupFound)
            {
                var depNodes = MetadataNode.Elements(XName.Get(Dependencies, ns))
                               .Elements(XName.Get(Dependency, ns));

                var packages = new List <PackageDependency>();

                foreach (var depNode in depNodes)
                {
                    VersionRange range = null;

                    var rangeNode = GetAttributeValue(depNode, Version);

                    if (!String.IsNullOrEmpty(rangeNode))
                    {
                        VersionRange.TryParse(rangeNode, out range);

                        Debug.Assert(range != null, "Unable to parse range: " + rangeNode);
                    }

                    packages.Add(new PackageDependency(GetAttributeValue(depNode, Id), range));
                }

                if (packages.Any())
                {
                    yield return(new PackageDependencyGroup(NuGetFramework.AnyFramework, packages));
                }
            }

            yield break;
        }
        public void VersionRangeFloatParsing_Valid(string rangeString)
        {
            VersionRange range = null;

            Assert.True(VersionRange.TryParse(rangeString, out range));
        }
Example #16
0
        public override int Execute()
        {
            if (string.IsNullOrWhiteSpace(_toolPath) && !_global)
            {
                throw new GracefulException(LocalizableStrings.InstallToolCommandNeedGlobalOrToolPath);
            }

            if (!string.IsNullOrWhiteSpace(_toolPath) && _global)
            {
                throw new GracefulException(LocalizableStrings.InstallToolCommandInvalidGlobalAndToolPath);
            }

            if (_configFilePath != null && !File.Exists(_configFilePath))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.NuGetConfigurationFileDoesNotExist,
                              Path.GetFullPath(_configFilePath)));
            }


            VersionRange versionRange = null;

            if (!string.IsNullOrEmpty(_packageVersion) && !VersionRange.TryParse(_packageVersion, out versionRange))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.InvalidNuGetVersionRange,
                              _packageVersion));
            }

            DirectoryPath?toolPath = null;

            if (_toolPath != null)
            {
                toolPath = new DirectoryPath(_toolPath);
            }

            (IToolPackageStore toolPackageStore, IToolPackageInstaller toolPackageInstaller) =
                _createToolPackageStoreAndInstaller(toolPath);
            IShellShimRepository shellShimRepository = _createShellShimRepository(toolPath);

            // Prevent installation if any version of the package is installed
            if (toolPackageStore.EnumeratePackageVersions(_packageId).FirstOrDefault() != null)
            {
                _errorReporter.WriteLine(string.Format(LocalizableStrings.ToolAlreadyInstalled, _packageId).Red());
                return(1);
            }

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            try
            {
                IToolPackage package = null;
                using (var scope = new TransactionScope(
                           TransactionScopeOption.Required,
                           TimeSpan.Zero))
                {
                    package = toolPackageInstaller.InstallPackage(
                        packageId: _packageId,
                        versionRange: versionRange,
                        targetFramework: _framework,
                        nugetConfig: configFile,
                        source: _source,
                        verbosity: _verbosity);

                    foreach (var command in package.Commands)
                    {
                        shellShimRepository.CreateShim(command.Executable, command.Name);
                    }

                    scope.Complete();
                }

                if (_global)
                {
                    _environmentPathInstruction.PrintAddPathInstructionIfPathDoesNotExist();
                }

                _reporter.WriteLine(
                    string.Format(
                        LocalizableStrings.InstallationSucceeded,
                        string.Join(", ", package.Commands.Select(c => c.Name)),
                        package.Id,
                        package.Version.ToNormalizedString()).Green());
                return(0);
            }
            catch (ToolPackageException ex)
            {
                if (Reporter.IsVerbose)
                {
                    Reporter.Verbose.WriteLine(ex.ToString().Red());
                }

                _errorReporter.WriteLine(ex.Message.Red());
                _errorReporter.WriteLine(string.Format(LocalizableStrings.ToolInstallationFailed, _packageId).Red());
                return(1);
            }
            catch (ToolConfigurationException ex)
            {
                if (Reporter.IsVerbose)
                {
                    Reporter.Verbose.WriteLine(ex.ToString().Red());
                }

                _errorReporter.WriteLine(
                    string.Format(
                        LocalizableStrings.InvalidToolConfiguration,
                        ex.Message).Red());
                _errorReporter.WriteLine(string.Format(LocalizableStrings.ToolInstallationFailedContactAuthor, _packageId).Red());
                return(1);
            }
            catch (ShellShimException ex)
            {
                if (Reporter.IsVerbose)
                {
                    Reporter.Verbose.WriteLine(ex.ToString().Red());
                }

                _errorReporter.WriteLine(
                    string.Format(
                        LocalizableStrings.FailedToCreateToolShim,
                        _packageId,
                        ex.Message).Red());
                _errorReporter.WriteLine(string.Format(LocalizableStrings.ToolInstallationFailed, _packageId).Red());
                return(1);
            }
        }
Example #17
0
        protected override ITransitivePackageReferenceContextInfo?DeserializeCore(ref MessagePackReader reader, MessagePackSerializerOptions options)
        {
            PackageIdentity?identity                = null;
            NuGetFramework? framework               = null;
            bool            isUserInstalled         = false;
            bool            isAutoReferenced        = false;
            bool            isDevelopmentDependency = false;
            string?         allowedVersions         = null;

            var transitiveOrigins = new List <IPackageReferenceContextInfo>();

            int propertyCount = reader.ReadMapHeader();

            for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++)
            {
                switch (reader.ReadString())
                {
                case IdentityPropertyName:
                    identity = PackageIdentityFormatter.Instance.Deserialize(ref reader, options);
                    break;

                case FrameworkPropertyName:
                    framework = NuGetFrameworkFormatter.Instance.Deserialize(ref reader, options);
                    break;

                case IsUserInstalledPropertyName:
                    isUserInstalled = reader.ReadBoolean();
                    break;

                case IsAutoReferencedPropertyName:
                    isAutoReferenced = reader.ReadBoolean();
                    break;

                case IsDevelopmentDependencyPropertyName:
                    isDevelopmentDependency = reader.ReadBoolean();
                    break;

                case AllowedVersionsPropertyName:
                    if (!reader.TryReadNil())     // Advances beyond the current value if the current value is nil and returns true; otherwise leaves the reader's position unchanged and returns false.
                    {
                        allowedVersions = reader.ReadString();
                    }
                    break;

                case TransitiveOriginsPropertyName:
                    var elems = reader.ReadArrayHeader();
                    for (int i = 0; i < elems; i++)
                    {
                        var result = IPackageReferenceContextInfoFormatter.Instance.Deserialize(ref reader, options);
                        if (result != null)
                        {
                            transitiveOrigins.Add(result);
                        }
                    }
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            Assumes.NotNull(identity);

            var packageReferenceContextInfo = new TransitivePackageReferenceContextInfo(identity, framework)
            {
                IsUserInstalled         = isUserInstalled,
                IsAutoReferenced        = isAutoReferenced,
                IsDevelopmentDependency = isDevelopmentDependency
            };

            if (!string.IsNullOrWhiteSpace(allowedVersions) && VersionRange.TryParse(allowedVersions, out VersionRange versionRange))
            {
                packageReferenceContextInfo.AllowedVersions = versionRange;
            }
            packageReferenceContextInfo.TransitiveOrigins = transitiveOrigins;

            return(packageReferenceContextInfo);
        }
Example #18
0
        private bool TryResolveNugetPackageVersion(
            Dictionary <string, INugetPackage> packagesOnConfig,
            INugetPackage requestorPackage,
            string id,
            string version,
            bool doNotEnforceDependencyVersions,
            out INugetPackage nugetPackage,
            out string errorMessage)
        {
            Contract.Assert(id != null);

            // First, the requestedId must exist in the list specified in the config file
            if (!packagesOnConfig.ContainsKey(id))
            {
                nugetPackage = null;
                if (requestorPackage.DependentPackageIdsToIgnore.Contains(id) || requestorPackage.DependentPackageIdsToIgnore.Contains("*"))
                {
                    errorMessage = null;
                    return(true);
                }

                errorMessage = string.Format(
                    CultureInfo.InvariantCulture,
                    "The requested dependency with id '{0}' and version '{1}' is not explicitly listed in the configuration file.", id, version);
                return(false);
            }

            // Now we deal with the version. The candidate package is what we found above, but we have to validate the version is valid wrt the request
            var candidatePackage = packagesOnConfig[id];

            // If the version is not specified, we use the one listed in the config
            if (version == null)
            {
                nugetPackage = candidatePackage;
                errorMessage = null;

                // This is just informative. We succeeded already.
                Logger.Log.NugetDependencyVersionWasNotSpecifiedButConfigOneWasChosen(
                    m_context.LoggingContext,
                    nugetPackage.Id,
                    nugetPackage.Version);

                return(true);
            }

            // Now we parse the requested version to validate it is compatible with the one specified in the config
            if (!NuGetVersion.TryParse(candidatePackage.Version, out var packageOnConfigVersion))
            {
                nugetPackage = null;
                errorMessage = string.Format(
                    CultureInfo.InvariantCulture,
                    "Version '{1}' on package '{0}' is malformed.", candidatePackage.Id, packagesOnConfig[id].Version);
                return(false);
            }

            if (VersionRange.TryParse(version, out var versionRange))
            {
                if (versionRange.Satisfies(packageOnConfigVersion))
                {
                    nugetPackage = candidatePackage;
                    errorMessage = null;

                    // This is just informative. We succeeded already.
                    Logger.Log.NugetDependencyVersionWasPickedWithinRange(
                        m_context.LoggingContext,
                        nugetPackage.Id,
                        nugetPackage.Version,
                        version);

                    return(true);
                }

                if (doNotEnforceDependencyVersions)
                {
                    nugetPackage = candidatePackage;
                    errorMessage = null;

                    // This is a warning, but we suceeded since versions are configured to not be enforced
                    Logger.Log.NugetDependencyVersionDoesNotMatch(
                        m_context.LoggingContext,
                        requestorPackage.Id,
                        requestorPackage.Version,
                        nugetPackage.Id,
                        nugetPackage.Version,
                        version);

                    return(true);
                }

                nugetPackage = null;
                errorMessage = string.Format(
                    CultureInfo.InvariantCulture,
                    "Package '{0}' is specified with version '{1}', but that is not contained in the interval '{2}'.",
                    id, candidatePackage.Version, version);
                return(false);
            }

            nugetPackage = null;
            errorMessage = string.Format(CultureInfo.InvariantCulture, "Could not parse version '{0}'.", version);
            return(false);
        }
Example #19
0
        public IHttpActionResult GetUpdates(
            ODataQueryOptions <V2FeedPackage> options,
            [FromODataUri] string packageIds,
            [FromODataUri] string versions,
            [FromODataUri] bool includePrerelease,
            [FromODataUri] bool includeAllVersions,
            [FromODataUri] string targetFrameworks   = "",
            [FromODataUri] string versionConstraints = "")
        {
            if (string.IsNullOrEmpty(packageIds) || string.IsNullOrEmpty(versions))
            {
                return(Ok(Enumerable.Empty <V2FeedPackage>().AsQueryable()));
            }

            if (!ODataQueryVerifier.AreODataOptionsAllowed(options, ODataQueryVerifier.V2GetUpdates,
                                                           _configurationService.Current.IsODataFilterEnabled, nameof(GetUpdates)))
            {
                return(BadRequest(ODataQueryVerifier.GetValidationFailedMessage(options)));
            }

            // Workaround https://github.com/NuGet/NuGetGallery/issues/674 for NuGet 2.1 client.
            // Can probably eventually be retired (when nobody uses 2.1 anymore...)
            // Note - it was URI un-escaping converting + to ' ', undoing that is actually a pretty conservative substitution because
            // space characters are never accepted as valid by VersionUtility.ParseFrameworkName.
            if (!string.IsNullOrEmpty(targetFrameworks))
            {
                targetFrameworks = targetFrameworks.Replace(' ', '+');
            }

            var idValues              = packageIds.Trim().ToLowerInvariant().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            var versionValues         = versions.Trim().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            var targetFrameworkValues = string.IsNullOrEmpty(targetFrameworks)
                                            ? null
                                            : targetFrameworks.Split('|').Select(tfx => NuGetFramework.Parse(tfx)).ToList();
            var versionConstraintValues = string.IsNullOrEmpty(versionConstraints)
                                            ? new string[idValues.Length]
                                            : versionConstraints.Split('|');

            if (idValues.Length == 0 || idValues.Length != versionValues.Length || idValues.Length != versionConstraintValues.Length)
            {
                // Exit early if the request looks invalid
                return(Ok(Enumerable.Empty <V2FeedPackage>().AsQueryable()));
            }

            var versionLookup = idValues.Select((id, i) =>
            {
                NuGetVersion currentVersion;
                if (NuGetVersion.TryParse(versionValues[i], out currentVersion))
                {
                    VersionRange versionConstraint = null;
                    if (versionConstraintValues[i] != null)
                    {
                        if (!VersionRange.TryParse(versionConstraintValues[i], out versionConstraint))
                        {
                            versionConstraint = null;
                        }
                    }
                    return(Tuple.Create(id, Tuple.Create(currentVersion, versionConstraint)));
                }
                return(null);
            })
                                .Where(t => t != null)
                                .ToLookup(t => t.Item1, t => t.Item2, StringComparer.OrdinalIgnoreCase);

            var packages = _packagesRepository.GetAll()
                           .Include(p => p.PackageRegistration)
                           .Include(p => p.SupportedFrameworks)
                           .Where(p =>
                                  p.Listed && (includePrerelease || !p.IsPrerelease) && !p.Deleted &&
                                  idValues.Contains(p.PackageRegistration.Id.ToLower()))
                           .OrderBy(p => p.PackageRegistration.Id);

            var queryable = GetUpdates(packages, versionLookup, targetFrameworkValues, includeAllVersions)
                            .AsQueryable()
                            .ToV2FeedPackageQuery(GetSiteRoot(), _configurationService.Features.FriendlyLicenses);

            return(QueryResult(options, queryable, MaxPageSize));
        }
Example #20
0
        /// <summary>
        /// Reads all package node entries in the config.
        /// </summary>
        /// <param name="allowDuplicatePackageIds">If True validation will be performed to ensure that
        /// only one entry exists for each unique package id.</param>
        public IEnumerable <PackageReference> GetPackages(bool allowDuplicatePackageIds)
        {
            var packages = new List <PackageReference>();

            foreach (var package in _doc.Root.Elements(XName.Get(PackagesConfig.PackageNodeName)))
            {
                string id = null;
                if (!PackagesConfig.TryGetAttribute(package, "id", out id) ||
                    String.IsNullOrEmpty(id))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorNullOrEmptyPackageId));
                }

                string version = null;
                if (!PackagesConfig.TryGetAttribute(package, PackagesConfig.VersionAttributeName, out version) ||
                    String.IsNullOrEmpty(version))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorInvalidPackageVersion,
                                                                id,
                                                                version));
                }

                NuGetVersion semver = null;
                if (!NuGetVersion.TryParse(version, out semver))
                {
                    throw new PackagesConfigReaderException(string.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.ErrorInvalidPackageVersion,
                                                                id,
                                                                version));
                }

                string       attributeValue  = null;
                VersionRange allowedVersions = null;
                if (PackagesConfig.TryGetAttribute(package, PackagesConfig.allowedVersionsAttributeName, out attributeValue))
                {
                    if (!VersionRange.TryParse(attributeValue, out allowedVersions))
                    {
                        throw new PackagesConfigReaderException(string.Format(
                                                                    CultureInfo.CurrentCulture,
                                                                    Strings.ErrorInvalidAllowedVersions,
                                                                    id,
                                                                    attributeValue));
                    }
                }

                var targetFramework = NuGetFramework.UnsupportedFramework;
                if (PackagesConfig.TryGetAttribute(package, PackagesConfig.TargetFrameworkAttributeName, out attributeValue))
                {
                    targetFramework = NuGetFramework.Parse(attributeValue, _frameworkMappings);
                }

                var developmentDependency = PackagesConfig.BoolAttribute(package, PackagesConfig.developmentDependencyAttributeName);
                var requireReinstallation = PackagesConfig.BoolAttribute(package, PackagesConfig.RequireInstallAttributeName);
                var userInstalled         = PackagesConfig.BoolAttribute(package, PackagesConfig.UserInstalledAttributeName, true);

                var entry = new PackageReference(new PackageIdentity(id, semver), targetFramework, userInstalled, developmentDependency, requireReinstallation, allowedVersions);

                packages.Add(entry);
            }

            // check if there are duplicate entries
            var             duplicates   = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            PackageIdentity lastIdentity = null;
            var             comparer     = PackageIdentity.Comparer;

            // Sort the list of packages and check for duplicates
            foreach (var package in packages.OrderBy(p => p.PackageIdentity, comparer))
            {
                if (lastIdentity != null)
                {
                    if (allowDuplicatePackageIds)
                    {
                        // Full compare
                        if (comparer.Equals(package.PackageIdentity, lastIdentity))
                        {
                            duplicates.Add(lastIdentity.ToString());
                        }
                    }
                    else if (string.Equals(
                                 package.PackageIdentity.Id,
                                 lastIdentity.Id,
                                 StringComparison.OrdinalIgnoreCase))
                    {
                        // Id only compare
                        duplicates.Add(lastIdentity.Id);
                    }
                }

                lastIdentity = package.PackageIdentity;
            }

            if (duplicates.Count > 0)
            {
                throw new PackagesConfigReaderException(string.Format(
                                                            CultureInfo.CurrentCulture,
                                                            Strings.ErrorDuplicatePackages,
                                                            string.Join(", ", duplicates)));
            }

            return(packages);
        }
Example #21
0
        public IEnumerable <PackageDependencyGroup> GetDependencyGroups()
        {
            string ns = MetadataNode.GetDefaultNamespace().NamespaceName;

            bool groupFound = false;

            foreach (var depGroup in MetadataNode.Elements(XName.Get(Dependencies, ns)).Elements(XName.Get(Group, ns)))
            {
                groupFound = true;

                string groupFramework = GetAttributeValue(depGroup, TargetFramework);

                List <PackageDependency> packages = new List <PackageDependency>();

                foreach (var depNode in depGroup.Elements(XName.Get(Dependency, ns)))
                {
                    VersionRange range = null;

                    var rangeNode = GetAttributeValue(depNode, Version);

                    if (!String.IsNullOrEmpty(rangeNode))
                    {
                        if (!VersionRange.TryParse(rangeNode, out range))
                        {
                            // TODO: error handling
                        }
                    }

                    packages.Add(new PackageDependency(GetAttributeValue(depNode, Id), range));
                }

                yield return(new PackageDependencyGroup(groupFramework, packages));
            }

            // legacy behavior
            if (!groupFound)
            {
                var depNodes = MetadataNode.Elements(XName.Get(Dependencies, ns))
                               .Elements(XName.Get(Dependency, ns));

                var packages = new List <PackageDependency>();

                foreach (var depNode in depNodes)
                {
                    VersionRange range = null;

                    var rangeNode = GetAttributeValue(depNode, Version);

                    if (!String.IsNullOrEmpty(rangeNode))
                    {
                        if (!VersionRange.TryParse(rangeNode, out range))
                        {
                            // TODO: error handling
                        }
                    }

                    packages.Add(new PackageDependency(GetAttributeValue(depNode, Id), range));
                }

                if (packages.Any())
                {
                    yield return(new PackageDependencyGroup(NuGetFramework.AnyFramework, packages));
                }
            }

            yield break;
        }
Example #22
0
        /// <summary>
        /// Replaces the single dependency with the updated version, if it matches any of the
        /// dependencies that need to be updated. Stops on the first updated value found.
        /// </summary>
        /// <returns>The BuildInfo used to change the value, or null if there was no change.</returns>
        private DependencyChange ReplaceDependencyVersion(
            string projectJsonFile,
            JProperty dependencyProperty,
            IEnumerable <BuildDependencyInfo> parsedBuildInfos)
        {
            string id = dependencyProperty.Name;

            foreach (BuildDependencyInfo info in parsedBuildInfos)
            {
                foreach (PackageIdentity packageInfo in info.Packages)
                {
                    if (id != packageInfo.Id)
                    {
                        continue;
                    }

                    string oldVersion;
                    if (dependencyProperty.Value is JObject)
                    {
                        oldVersion = (string)dependencyProperty.Value["version"];
                    }
                    else
                    {
                        oldVersion = (string)dependencyProperty.Value;
                    }
                    VersionRange parsedOldVersionRange;
                    if (!VersionRange.TryParse(oldVersion, out parsedOldVersionRange))
                    {
                        Trace.TraceWarning($"Couldn't parse '{oldVersion}' for package '{id}' in '{projectJsonFile}'. Skipping.");
                        continue;
                    }
                    NuGetVersion oldNuGetVersion = parsedOldVersionRange.MinVersion;

                    if (oldNuGetVersion == packageInfo.Version)
                    {
                        // Versions match, no update to make.
                        continue;
                    }

                    if (oldNuGetVersion.IsPrerelease || info.UpgradeStableVersions)
                    {
                        string newVersion = packageInfo.Version.ToNormalizedString();
                        if (dependencyProperty.Value is JObject)
                        {
                            dependencyProperty.Value["version"] = newVersion;
                        }
                        else
                        {
                            dependencyProperty.Value = newVersion;
                        }

                        return(new DependencyChange
                        {
                            Info = info,
                            PackageId = id,
                            Before = oldNuGetVersion,
                            After = packageInfo.Version
                        });
                    }
                }
            }
            return(null);
        }
Example #23
0
        public override int Execute()
        {
            if (_configFilePath != null && !File.Exists(_configFilePath))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.NuGetConfigurationFileDoesNotExist,
                              Path.GetFullPath(_configFilePath)));
            }

            VersionRange versionRange = null;

            if (!string.IsNullOrEmpty(_packageVersion) && !VersionRange.TryParse(_packageVersion, out versionRange))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.InvalidNuGetVersionRange,
                              _packageVersion));
            }

            DirectoryPath?toolPath = null;

            if (_toolPath != null)
            {
                toolPath = new DirectoryPath(_toolPath);
            }

            (IToolPackageStore toolPackageStore, IToolPackageStoreQuery toolPackageStoreQuery, IToolPackageInstaller toolPackageInstaller) =
                _createToolPackageStoresAndInstaller(toolPath, _forwardRestoreArguments);
            IShellShimRepository shellShimRepository = _createShellShimRepository(toolPath);

            // Prevent installation if any version of the package is installed
            if (toolPackageStoreQuery.EnumeratePackageVersions(_packageId).FirstOrDefault() != null)
            {
                _errorReporter.WriteLine(string.Format(LocalizableStrings.ToolAlreadyInstalled, _packageId).Red());
                return(1);
            }

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            try
            {
                IToolPackage package = null;
                using (var scope = new TransactionScope(
                           TransactionScopeOption.Required,
                           TimeSpan.Zero))
                {
                    package = toolPackageInstaller.InstallPackage(
                        new PackageLocation(nugetConfig: configFile, additionalFeeds: _source),
                        packageId: _packageId,
                        versionRange: versionRange,
                        targetFramework: _framework, verbosity: _verbosity);

                    foreach (var command in package.Commands)
                    {
                        shellShimRepository.CreateShim(command.Executable, command.Name, package.PackagedShims);
                    }

                    scope.Complete();
                }

                foreach (string w in package.Warnings)
                {
                    _reporter.WriteLine(w.Yellow());
                }

                if (_global)
                {
                    _environmentPathInstruction.PrintAddPathInstructionIfPathDoesNotExist();
                }

                _reporter.WriteLine(
                    string.Format(
                        LocalizableStrings.InstallationSucceeded,
                        string.Join(", ", package.Commands.Select(c => c.Name)),
                        package.Id,
                        package.Version.ToNormalizedString()).Green());
                return(0);
            }
            catch (Exception ex) when(InstallToolCommandLowLevelErrorConverter.ShouldConvertToUserFacingError(ex))
            {
                throw new GracefulException(
                          messages: InstallToolCommandLowLevelErrorConverter.GetUserFacingMessages(ex, _packageId),
                          verboseMessages: new[] { ex.ToString() },
                          isUserError: false);
            }
        }
Example #24
0
        private static Dependency[] GetDependencies(ArrayList dependencyInfos)
        {
            List <Dependency> dependenciesFound = new List <Dependency>();

            if (dependencyInfos == null)
            {
                return(dependenciesFound.ToArray());
            }


            foreach (PSObject dependencyObj in dependencyInfos)
            {
                // The dependency object can be a string or a hashtable
                // eg:
                // RequiredModules = @('PSGetTestDependency1')
                // RequiredModules = @(@{ModuleName='PackageManagement';ModuleVersion='1.0.0.1'})
                if (dependencyObj.BaseObject is Hashtable dependencyInfo)
                {
                    if (!dependencyInfo.ContainsKey("Name"))
                    {
                        Dbg.Assert(false, "Derived dependencies Hashtable must contain a Name key");
                        continue;
                    }

                    string dependencyName = (string)dependencyInfo["Name"];
                    if (String.IsNullOrEmpty(dependencyName))
                    {
                        Dbg.Assert(false, "Dependency Name must not be null or empty");
                        continue;
                    }

                    if (dependencyInfo.ContainsKey("RequiredVersion"))
                    {
                        if (!Utils.TryParseVersionOrVersionRange((string)dependencyInfo["RequiredVersion"], out VersionRange dependencyVersion))
                        {
                            dependencyVersion = VersionRange.All;
                        }

                        dependenciesFound.Add(new Dependency(dependencyName, dependencyVersion));
                        continue;
                    }

                    if (dependencyInfo.ContainsKey("MinimumVersion") || dependencyInfo.ContainsKey("MaximumVersion"))
                    {
                        NuGetVersion minimumVersion = null;
                        NuGetVersion maximumVersion = null;
                        bool         includeMin     = false;
                        bool         includeMax     = false;

                        if (dependencyInfo.ContainsKey("MinimumVersion") &&
                            !NuGetVersion.TryParse((string)dependencyInfo["MinimumVersion"], out minimumVersion))
                        {
                            VersionRange dependencyAll = VersionRange.All;
                            dependenciesFound.Add(new Dependency(dependencyName, dependencyAll));
                            continue;
                        }

                        if (dependencyInfo.ContainsKey("MaximumVersion") &&
                            !NuGetVersion.TryParse((string)dependencyInfo["MaximumVersion"], out maximumVersion))
                        {
                            VersionRange dependencyAll = VersionRange.All;
                            dependenciesFound.Add(new Dependency(dependencyName, dependencyAll));
                            continue;
                        }

                        if (minimumVersion != null)
                        {
                            includeMin = true;
                        }

                        if (maximumVersion != null)
                        {
                            includeMax = true;
                        }

                        VersionRange dependencyVersionRange = new VersionRange(
                            minVersion: minimumVersion,
                            includeMinVersion: includeMin,
                            maxVersion: maximumVersion,
                            includeMaxVersion: includeMax);

                        dependenciesFound.Add(new Dependency(dependencyName, dependencyVersionRange));
                        continue;
                    }

                    // neither Required, Minimum or Maximum Version provided
                    VersionRange dependencyVersionRangeAll = VersionRange.All;
                    dependenciesFound.Add(new Dependency(dependencyName, dependencyVersionRangeAll));
                }
                else if (dependencyObj.Properties["Name"] != null)
                {
                    string name = dependencyObj.Properties["Name"].Value.ToString();

                    string       version      = string.Empty;
                    VersionRange versionRange = VersionRange.All;

                    if (dependencyObj.Properties["VersionRange"] != null)
                    {
                        version = dependencyObj.Properties["VersionRange"].Value.ToString();
                        VersionRange.TryParse(version, out versionRange);
                    }

                    dependenciesFound.Add(new Dependency(name, versionRange));
                }
            }

            return(dependenciesFound.ToArray());
        }