public virtual bool Initialize(string text)
        {
            var parts = text.Split(' ', StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length != 3)
            {
                Logger.Error($"Couldn't parse assembly constraint '{text}'");

                return(false);
            }

            if (!VersionedText.TryParseSemanticVersion(parts[2], out var version, Logger))
            {
                return(false);
            }

            Assembly   = parts[0];
            Version    = version;
            Constraint = parts[1] switch
            {
                "==" => VersionConstraint.EqualTo,
                "<=" => VersionConstraint.Maximum,
                ">=" => VersionConstraint.Minimum,
                ">" => VersionConstraint.GreaterThan,
                "<" => VersionConstraint.LessThan,
                _ => VersionConstraint.Undefined
            };

            return(true);
        }
Exemplo n.º 2
0
        public bool Initialize(string rawName, ExpandoObject container, ProjectAssetsContext context)
        {
            if (!ValidateInitializationArguments(rawName, container, context))
            {
                return(false);
            }

            if (!VersionedText.CreateVersionedText(rawName, out var verText, Logger))
            {
                return(false);
            }

            Assembly     = verText.TextComponent;
            Version      = verText.Version;
            Dependencies = new List <DependencyInfo>();

            var asDict = (IDictionary <string, object>)container;

            // dependencies are optional
            if (!asDict.ContainsKey("dependencies"))
            {
                return(true);
            }

            var depDict = asDict["dependencies"] as ExpandoObject;

            if (depDict == null)
            {
                Logger.Error(
                    $"{nameof( container )} does not have a 'dependencies' property which is an {nameof( ExpandoObject )}");

                return(false);
            }

            var retVal = true;

            foreach (var kvp in depDict)
            {
                if (kvp.Value is string versionText)
                {
                    if (VersionedText.TryParseSemanticVersion(versionText, out var version, Logger))
                    {
                        var newItem = _diCreator();

                        newItem.Assembly = kvp.Key;
                        newItem.Version  = version;

                        Dependencies.Add(newItem);
                    }
                    else
                    {
                        retVal = false;
                    }
                }
            }
Exemplo n.º 3
0
        public bool Initialize(ExpandoObject container, ProjectAssetsContext context)
        {
            if (!ValidateInitializationArguments(container, context))
            {
                return(false);
            }

            var okay = GetProperty <string>(container, "version", context, out var versionText);

            okay &= GetProperty <ExpandoObject>(container, "restore", context, out var restoreContainer);
            okay &= GetProperty <ExpandoObject>(container, "frameworks", context, out var frameContainer);
            okay &= GetProperty <ExpandoObject>(container, "warningProperties", context, out var warnContainer,
                                                optional: true);

            if (!okay)
            {
                return(false);
            }

            if (!VersionedText.TryParseSemanticVersion(versionText, out var version, Logger))
            {
                return(false);
            }

            var restore = _restoreCreator();

            if (!restore.Initialize(restoreContainer, context))
            {
                return(false);
            }

            if (!LoadFromContainer <FrameworkReferences, ExpandoObject>(frameContainer, _fwCreator, context,
                                                                        out var fwList))
            {
                return(false);
            }

            LoadFromContainer <WarningProperty, List <string> >(warnContainer, _wpCreator, context, out var warnList,
                                                                containerCanBeNull: true);

            Version           = version;
            Restore           = restore;
            Frameworks        = fwList;
            WarningProperties = warnList;

            return(true);
        }
Exemplo n.º 4
0
        public virtual bool Initialize(string rawName, ExpandoObject container, ProjectAssetsContext context)
        {
            if (!ValidateInitializationArguments(rawName, container, context))
            {
                return(false);
            }

            if (!VersionedText.CreateVersionedText(rawName, out var verText, Logger))
            {
                return(false);
            }

            if (!GetProperty <string>(container, "type", context, out var libTypeText))
            {
                return(false);
            }

            if (!Enum.TryParse <ReferenceType>(libTypeText, true, out var libType))
            {
                Logger.Error(
                    $"Property 'type' ('{libTypeText}') isn't parseable to a {nameof( ReferenceType )}");

                return(false);
            }

            if (libType != Type)
            {
                Logger.Error($"Expected a {Type} library, encountered a {libType} instead");

                return(false);
            }

            if (!GetProperty <string>(container, "path", context, out var path))
            {
                return(false);
            }

            Assembly = verText.TextComponent;
            Version  = verText.Version;
            Path     = path;

            return(true);
        }
Exemplo n.º 5
0
        public virtual bool Initialize(string rawName, ExpandoObject container, ProjectAssetsContext context)
        {
            if (!ValidateInitializationArguments(rawName, container, context))
            {
                return(false);
            }

            if (!GetProperty <string>(container, "target", context, out var tgtTypeText))
            {
                return(false);
            }

            if (!Enum.TryParse <ReferenceType>(tgtTypeText, true, out var tgtType))
            {
                Logger.Error($"Couldn't parse '{tgtTypeText}' to a {nameof(ReferenceType)}");

                return(false);
            }

            Assembly   = rawName;
            TargetType = tgtType;

            // parse into individual version strings
            rawName = rawName.Replace("[", "")
                      .Replace(")", "")
                      .Replace(" ", "");

            var versionTexts = rawName.Split(',', StringSplitOptions.RemoveEmptyEntries);

            Versions = new List <SemanticVersion>();

            var retVal = true;

            foreach (var versionText in versionTexts)
            {
                if (VersionedText.TryParseSemanticVersion(versionText, out var version, Logger))
                {
                    Versions.Add(version);
                }
Exemplo n.º 6
0
        public virtual string GetAbsolutePath(IEnumerable <string> repositoryPaths, TargetFramework tgtFramework)
        {
            if (repositoryPaths == null)
            {
                Logger.Error($"Undefined {nameof(repositoryPaths)}");
                return(null);
            }

            if (tgtFramework == null)
            {
                Logger.Error($"Undefined {nameof(tgtFramework)}");
                return(null);
            }

            foreach (var repositoryPath in repositoryPaths)
            {
                var pkgDir = System.IO.Path.GetFullPath(System.IO.Path.Combine(repositoryPath, Path));

                if (!Directory.Exists(pkgDir))
                {
                    continue;
                }

                // look for best match re: version
                pkgDir = System.IO.Path.Combine(pkgDir, "lib");

                if (!Directory.Exists(pkgDir))
                {
                    continue;
                }

                var fwDirectories = Directory.GetDirectories(pkgDir, tgtFramework.Framework + "*")
                                    .Where(dir =>
                                           VersionedText.CreateVersionedText(System.IO.Path.GetFileName(dir), out var result, Logger))
                                    .Select(dir =>
                {
                    VersionedText.CreateVersionedText(System.IO.Path.GetFileName(dir), out var verText, Logger);

                    return(new
                    {
                        path = dir,
                        version = verText.Version
                    });
                })
                                    .OrderByDescending(x => x.version)
                                    .ToList();

                var match = fwDirectories.FirstOrDefault(x => x.version == tgtFramework.Version)
                            ?? fwDirectories.FirstOrDefault();

                if (match == null)
                {
                    continue;
                }

                var filePath = System.IO.Path.Combine(match.path, $"{Assembly}.dll");

                if (File.Exists(filePath))
                {
                    return(filePath);
                }

                // check to see if the "it's already included from elsewhere" marker file is there
                // in which case return null but don't issue a warning
                filePath = System.IO.Path.Combine(match.path, "_._");

                if (File.Exists(filePath))
                {
                    return(null);
                }
            }

            // nuget appears to use directories starting with "runtime" to indicate runtime-only libraries,
            // typically for other operating systems...suppress warnings associated with such
            if (Path.IndexOf("runtime", StringComparison.Ordinal) != 0)
            {
                Logger.Warning($"Couldn't find '{Path}' in provided repositories");
            }

            return(null);
        }