Example #1
0
        ///////////////////////////////////////////////////////////////////////

        #region IPackage Members
        public override ReturnCode Select(
            PackagePreference preference,
            ref Version version,
            ref Result error
            )
        {
            if (preference == PackagePreference.Default)
            {
                string name = this.Name;
                VersionStringDictionary ifNeeded = this.IfNeeded;

                if (ifNeeded != null)
                {
                    //
                    // NOTE: *HACK* For now, always select the latest version
                    //       from the list of candidate versions.
                    //
                    Version latest = null;

                    foreach (Version candidate in ifNeeded.Keys)
                    {
                        if (PackageOps.VersionCompare(candidate, latest) > 0)
                        {
                            latest = candidate;
                        }
                    }

                    //
                    // NOTE: Were we able to find the latest (i.e. any)
                    //       version?
                    //
                    if (latest != null)
                    {
                        version = latest;
                        return(ReturnCode.Ok);
                    }
                    else
                    {
                        error = String.Format(
                            "can't find package \"{0}\"",
                            FormatOps.PackageName(name, null));
                    }
                }
                else
                {
                    error = String.Format(
                        "package \"{0}\" ifneeded scripts not available",
                        name);
                }
            }
            else
            {
                error = String.Format(
                    "unsupported package preference \"{0}\"",
                    preference);
            }

            return(ReturnCode.Error);
        }
Example #2
0
        private Version loading; // which version are we actively loading?

        ///////////////////////////////////////////////////////////////////////

        public override ReturnCode Load(
            Interpreter interpreter,
            Version version,
            ref Result result
            )
        {
            if (interpreter != null)
            {
                if (version != null)
                {
                    string name = this.Name;
                    VersionStringDictionary ifNeeded = this.IfNeeded;

                    if (ifNeeded != null)
                    {
                        string text;

                        if (ifNeeded.TryGetValue(version, out text))
                        {
                            if (!FlagOps.HasFlags(Flags, PackageFlags.Loading, true))
                            {
                                Flags  |= PackageFlags.Loading;
                                loading = version;

                                try
                                {
                                    return(interpreter.EvaluateGlobalScript(
                                               text, ref result));
                                }
                                catch (Exception e)
                                {
                                    result = String.Format(
                                        "caught exception while evaluating ifneeded script: {0}",
                                        e);
                                }
                                finally
                                {
                                    loading = null;
                                    Flags  &= ~PackageFlags.Loading;
                                }
                            }
                            else
                            {
                                result = String.Format(
                                    "circular package dependency: " +
                                    "attempt to provide \"{0}\" requires \"{1}\"",
                                    FormatOps.PackageName(name, version),
                                    FormatOps.PackageName(name, loading));
                            }
                        }
                        else
                        {
                            result = String.Format(
                                "can't find package \"{0}\"",
                                FormatOps.PackageName(name, version));
                        }
                    }
                    else
                    {
                        result = String.Format(
                            "package \"{0}\" ifneeded scripts not available",
                            name);
                    }
                }
                else
                {
                    result = "invalid package version";
                }
            }
            else
            {
                result = "invalid interpreter";
            }

            return(ReturnCode.Error);
        }