Exemple #1
0
        public void Edit(
            FilePath manifest,
            PackageId packageId,
            NuGetVersion newNuGetVersion,
            ToolCommandName[] newToolCommandNames)
        {
            SerializableLocalToolsManifest deserializedManifest =
                DeserializeLocalToolsManifest(manifest);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(deserializedManifest, manifest, manifest.GetDirectoryPath());

            var existing = toolManifestPackages.Where(t => t.PackageId.Equals(packageId)).ToArray();

            if (existing.Any())
            {
                var existingPackage = existing.Single();

                if (existingPackage.PackageId.Equals(packageId))
                {
                    var toEdit = deserializedManifest.Tools.Single(t => new PackageId(t.PackageId).Equals(packageId));

                    toEdit.Version  = newNuGetVersion.ToNormalizedString();
                    toEdit.Commands = newToolCommandNames.Select(c => c.Value).ToArray();
                }
            }
            else
            {
                throw new ArgumentException($"Manifest {manifest.Value} does not contain package id '{packageId}'.");
            }

            _fileSystem.File.WriteAllText(manifest.Value, deserializedManifest.ToJson());
        }
Exemple #2
0
        public void Remove(FilePath fromFilePath, PackageId packageId)
        {
            SerializableLocalToolsManifest serializableLocalToolsManifest =
                DeserializeLocalToolsManifest(fromFilePath);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(
                    serializableLocalToolsManifest,
                    fromFilePath,
                    fromFilePath.GetDirectoryPath());

            if (!toolManifestPackages.Any(t => t.PackageId.Equals(packageId)))
            {
                throw new ToolManifestException(string.Format(
                                                    LocalizableStrings.CannotFindPackageIdInManifest, packageId));
            }

            if (serializableLocalToolsManifest.Tools == null)
            {
                throw new InvalidOperationException(
                          $"Invalid state {nameof(serializableLocalToolsManifest)} if out of sync with {nameof(toolManifestPackages)}. " +
                          $"{nameof(serializableLocalToolsManifest)} cannot be null when " +
                          $"the package id can be found in {nameof(toolManifestPackages)}.");
            }

            serializableLocalToolsManifest.Tools = serializableLocalToolsManifest.Tools
                                                   .Where(pair => !pair.Key.Equals(packageId.ToString(), StringComparison.Ordinal))
                                                   .ToDictionary(pair => pair.Key, pair => pair.Value);

            _fileSystem.File.WriteAllText(
                fromFilePath.Value,
                serializableLocalToolsManifest.ToJson());
        }
Exemple #3
0
        public void Remove(FilePath fromFilePath, PackageId packageId)
        {
            SerializableLocalToolsManifest serializableLocalToolsManifest =
                DeserializeLocalToolsManifest(fromFilePath);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(
                    serializableLocalToolsManifest,
                    fromFilePath,
                    fromFilePath.GetDirectoryPath());

            if (!toolManifestPackages.Any(t => t.PackageId.Equals(packageId)))
            {
                throw new ToolManifestException(string.Format(
                                                    LocalizableStrings.CannotFindPackageIdInManifest, packageId));
            }

            serializableLocalToolsManifest.Tools = serializableLocalToolsManifest.Tools
                                                   .Where(pair => !pair.Key.Equals(packageId.ToString(), StringComparison.Ordinal))
                                                   .ToDictionary(pair => pair.Key, pair => pair.Value);

            _fileSystem.File.WriteAllText(
                fromFilePath.Value,
                JsonConvert.SerializeObject(serializableLocalToolsManifest, Formatting.Indented));
        }
Exemple #4
0
        public bool TryFind(ToolCommandName toolCommandName, out ToolManifestPackage toolManifestPackage)
        {
            toolManifestPackage = default(ToolManifestPackage);
            foreach (FilePath possibleManifest in EnumerateDefaultAllPossibleManifests())
            {
                if (!_fileSystem.File.Exists(possibleManifest.Value))
                {
                    continue;
                }

                SerializableLocalToolsManifest deserializedManifest =
                    DeserializeLocalToolsManifest(possibleManifest);

                List <ToolManifestPackage> toolManifestPackages =
                    GetToolManifestPackageFromOneManifestFile(deserializedManifest, possibleManifest);

                foreach (var package in toolManifestPackages)
                {
                    if (package.CommandNames.Contains(toolCommandName))
                    {
                        toolManifestPackage = package;
                        return(true);
                    }
                }

                if (deserializedManifest.isRoot.Value)
                {
                    return(false);
                }
            }

            return(false);
        }
Exemple #5
0
        Read(FilePath manifest, DirectoryPath correspondingDirectory)
        {
            SerializableLocalToolsManifest deserializedManifest =
                DeserializeLocalToolsManifest(manifest);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(
                    deserializedManifest,
                    manifest,
                    correspondingDirectory);

            return(toolManifestPackages, deserializedManifest.isRoot.Value);
        }
Exemple #6
0
        public void Add(
            FilePath to,
            PackageId packageId,
            NuGetVersion nuGetVersion,
            ToolCommandName[] toolCommandNames)
        {
            SerializableLocalToolsManifest deserializedManifest =
                DeserializeLocalToolsManifest(to);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(deserializedManifest, to, to.GetDirectoryPath());

            var existing = toolManifestPackages.Where(t => t.PackageId.Equals(packageId)).ToArray();

            if (existing.Any())
            {
                var existingPackage = existing.Single();

                if (existingPackage.PackageId.Equals(packageId) &&
                    existingPackage.Version == nuGetVersion &&
                    CommandNamesEqual(existingPackage.CommandNames, toolCommandNames))
                {
                    return;
                }

                throw new ToolManifestException(string.Format(
                                                    LocalizableStrings.ManifestPackageIdCollision,
                                                    existingPackage.Version.ToNormalizedString(),
                                                    existingPackage.PackageId.ToString(),
                                                    to.Value,
                                                    nuGetVersion.ToNormalizedString()));
            }

            if (deserializedManifest.Tools == null)
            {
                deserializedManifest.Tools = new Dictionary <string, SerializableLocalToolSinglePackage>();
            }

            deserializedManifest.Tools.Add(
                packageId.ToString(),
                new SerializableLocalToolSinglePackage
            {
                Version  = nuGetVersion.ToNormalizedString(),
                Commands = toolCommandNames.Select(c => c.Value).ToArray()
            });

            _fileSystem.File.WriteAllText(to.Value, deserializedManifest.ToJson());
        }
Exemple #7
0
        public IReadOnlyCollection <ToolManifestPackage> Find(FilePath?filePath = null)
        {
            IEnumerable <FilePath> allPossibleManifests =
                filePath != null
                    ? new[] { filePath.Value }
                    : EnumerateDefaultAllPossibleManifests();

            bool findAnyManifest = false;
            var  result          = new List <ToolManifestPackage>();

            foreach (FilePath possibleManifest in allPossibleManifests)
            {
                if (!_fileSystem.File.Exists(possibleManifest.Value))
                {
                    continue;
                }

                findAnyManifest = true;
                SerializableLocalToolsManifest deserializedManifest =
                    DeserializeLocalToolsManifest(possibleManifest);

                List <ToolManifestPackage> toolManifestPackageFromOneManifestFile =
                    GetToolManifestPackageFromOneManifestFile(deserializedManifest, possibleManifest);

                foreach (ToolManifestPackage p in toolManifestPackageFromOneManifestFile)
                {
                    if (!result.Any(addedToolManifestPackages =>
                                    addedToolManifestPackages.PackageId.Equals(p.PackageId)))
                    {
                        result.Add(p);
                    }
                }

                if (deserializedManifest.isRoot.Value)
                {
                    return(result);
                }
            }

            if (!findAnyManifest)
            {
                throw new ToolManifestCannotBeFoundException(
                          string.Format(LocalizableStrings.CannotFindAnyManifestsFileSearched,
                                        string.Join(Environment.NewLine, allPossibleManifests.Select(f => f.Value))));
            }

            return(result);
        }
Exemple #8
0
        Read(FilePath manifest, DirectoryPath correspondingDirectory)
        {
            if (_dangerousFileDetector.IsDangerous(manifest.Value))
            {
                throw new ToolManifestException(
                          string.Format(LocalizableStrings.ManifestHasMarkOfTheWeb, manifest.Value));
            }

            SerializableLocalToolsManifest deserializedManifest =
                DeserializeLocalToolsManifest(manifest);

            List <ToolManifestPackage> toolManifestPackages =
                GetToolManifestPackageFromOneManifestFile(
                    deserializedManifest,
                    manifest,
                    correspondingDirectory);

            return(toolManifestPackages, deserializedManifest.IsRoot.Value);
        }
Exemple #9
0
        private static void ValidateVersion(SerializableLocalToolsManifest deserializedManifest,
                                            List <string> errors)
        {
            var deserializedManifestVersion = deserializedManifest.Version;

            if (deserializedManifestVersion == null)
            {
                deserializedManifestVersion = DefaultToolManifestFileVersion;
            }

            if (deserializedManifestVersion == 0)
            {
                errors.Add(LocalizableStrings.ManifestVersion0);
            }

            if (deserializedManifestVersion > SupportedToolManifestFileVersion)
            {
                errors.Add(
                    string.Format(
                        LocalizableStrings.ManifestVersionHigherThanSupported,
                        deserializedManifestVersion, SupportedToolManifestFileVersion));
            }
        }
Exemple #10
0
        private List <ToolManifestPackage> GetToolManifestPackageFromOneManifestFile(
            SerializableLocalToolsManifest deserializedManifest, FilePath path)
        {
            List <ToolManifestPackage> result = new List <ToolManifestPackage>();
            var errors = new List <string>();

            if (deserializedManifest.version == 0)
            {
                errors.Add(string.Format(LocalizableStrings.ManifestVersion0, path.Value));
            }

            if (deserializedManifest.version > SupportedVersion)
            {
                errors.Add(
                    string.Format(
                        LocalizableStrings.ManifestVersionHigherThanSupported,
                        deserializedManifest.version, SupportedVersion, path.Value));
            }

            foreach (KeyValuePair <string, SerializableLocalToolSinglePackage> tools in deserializedManifest.tools)
            {
                var packageLevelErrors = new List <string>();
                var packageIdString    = tools.Key;
                var packageId          = new PackageId(packageIdString);

                string       versionString = tools.Value.version;
                NuGetVersion version       = null;
                if (versionString is null)
                {
                    packageLevelErrors.Add(LocalizableStrings.ToolMissingVersion);
                }
                else
                {
                    if (!NuGetVersion.TryParse(versionString, out version))
                    {
                        packageLevelErrors.Add(string.Format(LocalizableStrings.VersionIsInvalid, versionString));
                    }
                }

                NuGetFramework targetFramework       = null;
                var            targetFrameworkString = tools.Value.targetFramework;
                if (targetFrameworkString != null)
                {
                    targetFramework = NuGetFramework.Parse(
                        targetFrameworkString);

                    if (targetFramework.IsUnsupported)
                    {
                        packageLevelErrors.Add(
                            string.Format(LocalizableStrings.TargetFrameworkIsUnsupported,
                                          targetFrameworkString));
                    }
                }

                if (tools.Value.commands == null ||
                    (tools.Value.commands != null && tools.Value.commands.Length == 0))
                {
                    packageLevelErrors.Add(LocalizableStrings.FieldCommandsIsMissing);
                }

                if (packageLevelErrors.Any())
                {
                    var joinedWithIndentation = string.Join(Environment.NewLine,
                                                            packageLevelErrors.Select(e => "\t\t" + e));
                    errors.Add(string.Format(LocalizableStrings.InPackage, packageId.ToString(), joinedWithIndentation));
                }
                else
                {
                    result.Add(new ToolManifestPackage(
                                   packageId,
                                   version,
                                   ToolCommandName.Convert(tools.Value.commands)));
                }
            }

            if (errors.Any())
            {
                throw new ToolManifestException(
                          string.Format(LocalizableStrings.InvalidManifestFilePrefix,
                                        string.Join(Environment.NewLine, errors.Select(e => "\t" + e))));
            }

            return(result);
        }
Exemple #11
0
        private List <ToolManifestPackage> GetToolManifestPackageFromOneManifestFile(
            SerializableLocalToolsManifest deserializedManifest,
            FilePath path,
            DirectoryPath correspondingDirectory)
        {
            List <ToolManifestPackage> result = new List <ToolManifestPackage>();
            var errors = new List <string>();

            ValidateVersion(deserializedManifest, errors);

            if (!deserializedManifest.IsRoot.HasValue)
            {
                errors.Add(string.Format(LocalizableStrings.ManifestMissingIsRoot, path.Value));
            }

            foreach (KeyValuePair <string, SerializableLocalToolSinglePackage> tools
                     in (deserializedManifest.Tools ?? new Dictionary <string, SerializableLocalToolSinglePackage>()))
            {
                var packageLevelErrors = new List <string>();
                var packageIdString    = tools.Key;
                var packageId          = new PackageId(packageIdString);

                string       versionString = tools.Value.Version;
                NuGetVersion version       = null;
                if (versionString is null)
                {
                    packageLevelErrors.Add(LocalizableStrings.ToolMissingVersion);
                }
                else
                {
                    if (!NuGetVersion.TryParse(versionString, out version))
                    {
                        packageLevelErrors.Add(string.Format(LocalizableStrings.VersionIsInvalid, versionString));
                    }
                }

                if (tools.Value.Commands == null ||
                    (tools.Value.Commands != null && tools.Value.Commands.Length == 0))
                {
                    packageLevelErrors.Add(LocalizableStrings.FieldCommandsIsMissing);
                }

                if (packageLevelErrors.Any())
                {
                    var joinedWithIndentation = string.Join(Environment.NewLine,
                                                            packageLevelErrors.Select(e => "\t\t" + e));
                    errors.Add(string.Format(LocalizableStrings.InPackage, packageId.ToString(),
                                             joinedWithIndentation));
                }
                else
                {
                    result.Add(new ToolManifestPackage(
                                   packageId,
                                   version,
                                   ToolCommandName.Convert(tools.Value.Commands),
                                   correspondingDirectory));
                }
            }

            if (errors.Any())
            {
                throw new ToolManifestException(
                          string.Format(LocalizableStrings.InvalidManifestFilePrefix,
                                        path.Value,
                                        string.Join(Environment.NewLine, errors.Select(e => "\t" + e))));
            }

            return(result);
        }
Exemple #12
0
        private SerializableLocalToolsManifest DeserializeLocalToolsManifest(FilePath possibleManifest)
        {
            var serializableLocalToolsManifest = new SerializableLocalToolsManifest();

            try
            {
                using (Stream jsonStream = _fileSystem.File.OpenRead(possibleManifest.Value))
                    using (JsonDocument doc = JsonDocument.Parse(jsonStream))
                    {
                        JsonElement root = doc.RootElement;

                        if (root.TryGetInt32Value(JsonPropertyVersion, out var version))
                        {
                            serializableLocalToolsManifest.Version = version;
                        }

                        if (root.TryGetBooleanValue(JsonPropertyIsRoot, out var isRoot))
                        {
                            serializableLocalToolsManifest.IsRoot = isRoot;
                        }

                        if (root.TryGetProperty(JsonPropertyTools, out var tools))
                        {
                            serializableLocalToolsManifest.Tools =
                                new Dictionary <string, SerializableLocalToolSinglePackage>();

                            if (tools.Type != JsonValueType.Object)
                            {
                                throw new ToolManifestException(
                                          string.Format(LocalizableStrings.UnexpectedTypeInJson,
                                                        JsonValueType.Object.ToString(),
                                                        JsonPropertyTools));
                            }

                            foreach (var toolJson in tools.EnumerateObject())
                            {
                                var serializableLocalToolSinglePackage = new SerializableLocalToolSinglePackage();
                                if (toolJson.Value.TryGetStringValue(JsonPropertyVersion, out var versionJson))
                                {
                                    serializableLocalToolSinglePackage.Version = versionJson;
                                }

                                var commands = new List <string>();
                                if (toolJson.Value.TryGetProperty(JsonPropertyCommands, out var commandsJson))
                                {
                                    if (commandsJson.Type != JsonValueType.Array)
                                    {
                                        throw new ToolManifestException(
                                                  string.Format(LocalizableStrings.UnexpectedTypeInJson,
                                                                JsonValueType.Array.ToString(),
                                                                JsonPropertyCommands));
                                    }

                                    foreach (var command in commandsJson.EnumerateArray())
                                    {
                                        if (command.Type != JsonValueType.String)
                                        {
                                            throw new ToolManifestException(
                                                      string.Format(LocalizableStrings.UnexpectedTypeInJson,
                                                                    JsonValueType.String.ToString(),
                                                                    "command"));
                                        }

                                        commands.Add(command.GetString());
                                    }

                                    serializableLocalToolSinglePackage.Commands = commands.ToArray();
                                }

                                serializableLocalToolsManifest.Tools.Add(toolJson.Name, serializableLocalToolSinglePackage);
                            }
                        }
                    }

                return(serializableLocalToolsManifest);
            }
            catch (Exception e) when(
                e is JsonReaderException ||
                e is ArgumentException) // "duplicated key"
            {
                throw new ToolManifestException(string.Format(LocalizableStrings.JsonParsingError,
                                                              possibleManifest.Value, e.Message));
            }
        }
Exemple #13
0
        public IReadOnlyCollection <ToolManifestPackage> Find(FilePath?filePath = null)
        {
            var result = new List <ToolManifestPackage>();

            IEnumerable <FilePath> allPossibleManifests =
                filePath != null
                    ? new[] { filePath.Value }
                    : EnumerateDefaultAllPossibleManifests();

            foreach (FilePath possibleManifest in allPossibleManifests)
            {
                if (_fileSystem.File.Exists(possibleManifest.Value))
                {
                    SerializableLocalToolsManifest deserializedManifest = JsonConvert.DeserializeObject <SerializableLocalToolsManifest>(
                        _fileSystem.File.ReadAllText(possibleManifest.Value), new JsonSerializerSettings
                    {
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    });

                    var errors = new List <string>();

                    if (!deserializedManifest.isRoot)
                    {
                        errors.Add("isRoot is false is not supported.");
                    }

                    if (deserializedManifest.version != 1)
                    {
                        errors.Add(string.Format("Tools manifest format version {0} is not supported.",
                                                 deserializedManifest.version));
                    }

                    foreach (var tools in deserializedManifest.tools)
                    {
                        var packageLevelErrors = new List <string>();
                        var packageIdString    = tools.Key;
                        var packageId          = new PackageId(packageIdString);

                        string       versionString = tools.Value.version;
                        NuGetVersion version       = null;
                        if (versionString is null)
                        {
                            packageLevelErrors.Add(LocalizableStrings.MissingVersion);
                        }
                        else
                        {
                            var versionParseResult = NuGetVersion.TryParse(
                                versionString, out version);

                            if (!versionParseResult)
                            {
                                packageLevelErrors.Add(string.Format(LocalizableStrings.VersionIsInvalid, versionString));
                            }
                        }

                        if (tools.Value.commands == null ||
                            (tools.Value.commands != null && tools.Value.commands.Length == 0))
                        {
                            packageLevelErrors.Add(LocalizableStrings.FieldCommandsIsMissing);
                        }

                        if (packageLevelErrors.Any())
                        {
                            var joined = string.Join(string.Empty, packageLevelErrors.Select(e => Environment.NewLine + "    " + e));
                            errors.Add(string.Format(LocalizableStrings.InPackage, packageId.ToString()) + joined);
                        }
                        else
                        {
                            result.Add(new ToolManifestPackage(
                                           packageId,
                                           version,
                                           ToolCommandName.Convert(tools.Value.commands)));
                        }
                    }

                    if (errors.Any())
                    {
                        throw new ToolManifestException(LocalizableStrings.InvalidManifestFilePrefix +
                                                        string.Join(string.Empty, errors.Select(e => Environment.NewLine + "  " + e)));
                    }

                    return(result);
                }
            }

            throw new ToolManifestCannotFindException(
                      string.Format(LocalizableStrings.CannotFindAnyManifestsFileSearched,
                                    string.Join(Environment.NewLine, allPossibleManifests.Select(f => f.Value))));
        }