public Default( IPackageData packageData ) { kind = IdentifierKind.Package; id = AttributeOps.GetObjectId(this); group = AttributeOps.GetObjectGroup(this); if (packageData != null) { EntityOps.MaybeSetGroup( this, packageData.Group); name = packageData.Name; description = packageData.Description; indexFileName = packageData.IndexFileName; provideFileName = packageData.ProvideFileName; flags = packageData.Flags; clientData = packageData.ClientData; loaded = packageData.Loaded; VersionStringDictionary ifNeeded = packageData.IfNeeded; if (ifNeeded != null) { this.ifNeeded = ifNeeded; // use (or "attach to") their versions. } else { this.ifNeeded = new VersionStringDictionary(); // brand new package, create new list. } token = packageData.Token; } }
public PackageData( string name, string group, string description, IClientData clientData, string indexFileName, string provideFileName, PackageFlags flags, Version loaded, VersionStringDictionary ifNeeded, long token ) { this.kind = IdentifierKind.PackageData; this.id = AttributeOps.GetObjectId(this); this.name = name; this.group = group; this.description = description; this.indexFileName = indexFileName; this.provideFileName = provideFileName; this.flags = flags; this.clientData = clientData; this.loaded = loaded; this.ifNeeded = ifNeeded; this.token = token; }
/////////////////////////////////////////////////////////////////////// #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); }
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); }