DIRECTORY BasicTime, Commander, CommandTool, Convert, FileNames, FS, IO, MakeDo, Rope, SymTab, VersionMap, VersionMapDefaults; SummonerLoadDepsImpl: CEDAR PROGRAM IMPORTS BasicTime, Commander, CommandTool, Convert, FileNames, FS, IO, MakeDo, Rope, SymTab, VersionMap, VersionMapDefaults ~ BEGIN ROPE: TYPE ~ Rope.ROPE; SummonerLoadData: TYPE ~ RECORD [ summonerInstallFile, summonerInstallRoot: ROPE ]; summonerLoadClass: MakeDo.ActionClass _ NEW[MakeDo.ActionClassRep _ [ CheckConsistency: CheckSummonerLoadConsistency, Rederive: RederiveSummonerLoad ]]; SummonerLoadFind: MakeDo.FinderProc = { summonerLoadData: REF SummonerLoadData; summonerInstallName: ROPE; cp: FS.ComponentPositions; IF ~ Rope.Match[pattern: "*.summonerLoad", object: resultName, case: FALSE] THEN GOTO Fail; --This is all we know how to build [resultName, cp,] _ FS.ExpandName[name: resultName ! FS.Error => GOTO Fail]; summonerInstallName _ WithoutVersion[FS.FileInfo[name: Rope.Substr[base: resultName, len: cp.base.start+cp.base.length].Concat[".summonerInstall"] ! FS.Error => GOTO Fail].fullFName]; foundData _ summonerLoadData _ NEW[SummonerLoadData _ [ summonerInstallFile: summonerInstallName, summonerInstallRoot: Rope.Substr[base: resultName, start: cp.base.start, len: cp.base.length] ]]; from _ DeriveFrom[summonerLoadData]; cmdFrom _ LIST[MakeDo.GetNode[someName: summonerInstallName, class: MakeDo.fileClass]]; makes _ LIST[sought _ MakeDo.GetNode[someName: resultName, class: MakeDo.fileClass]]; cmd _ DeriveCmd[summonerLoadData]; class _ summonerLoadClass; found _ TRUE; EXITS Fail => { found _ FALSE; sought _ NIL; }; }; WithoutVersion: PROC [with: ROPE] RETURNS [without: ROPE] ~ { cp: FS.ComponentPositions; [fullFName: without, cp: cp] _ FS.ExpandName[name: with]; without _ Rope.Substr[base: without, len: cp.ext.start+cp.ext.length]; }; DeriveCmd: PROC [summonerLoadData: REF SummonerLoadData] RETURNS [cmd: ROPE] ~ { RETURN [Rope.Cat["RederiveSummonerLoad ", summonerLoadData.summonerInstallRoot]]; }; DeriveFrom: PROC [summonerLoadData: REF SummonerLoadData] RETURNS [from: MakeDo.From] ~ { PutFilesInFromList: SymTab.EachPairAction = { from.mustHave _ CONS[MakeDo.GetNode[someName: key, class: MakeDo.fileClass], from.mustHave]; RETURN [FALSE] }; Install: PROC [module, file: ROPE] ~ { [] _ SymTab.Store[x: x, key: file, val: NIL]; }; s: IO.STREAM _ FS.StreamOpen[fileName: summonerLoadData.summonerInstallFile]; x: SymTab.Ref ~ SymTab.Create[case: FALSE]; from _ [mustHave: LIST[MakeDo.GetNode[someName: FS.ExpandName[name: summonerLoadData.summonerInstallFile].fullFName, class: MakeDo.fileClass]], optional: NIL]; RecurseThroughInstall[file: summonerLoadData.summonerInstallFile, install: Install, run: NIL, other: NIL, recurseVMap: FALSE ! CantFind => {Install[module: module, file: FileNames.GetShortName[path: full]]; RESUME}]; [] _ SymTab.Pairs[x: x, action: PutFilesInFromList]; }; ForceConsistencyReturn: ERROR [setConsistent: BOOL, setReason: ROPE] ~ CODE; CheckSummonerLoadConsistency: MakeDo.ConsistencyChecker = { PerIngredient: PROC [n: MakeDo.Node, which: MakeDo.ActionDep, optional: BOOL] ~ { nodeTime: BasicTime.GMT _ MakeDo.InnerGetCreated[n]; nodeName: ROPE ~ MakeDo.PublicPartsOfNode[n: n].name; SELECT TRUE FROM nodeTime = MakeDo.notExistTime => { IF ~optional THEN ERROR ForceConsistencyReturn[setConsistent: TRUE, setReason: IO.PutFR[format: "ingredient %g doesn't exist", v1: [rope[nodeName]]]]; }; resultTime = MakeDo.notExistTime => {}; --More important than anything below BasicTime.Period[from: nodeTime, to: resultTime] < 0 => ERROR ForceConsistencyReturn[setConsistent: FALSE, setReason: IO.PutFR[format: "result %g (of %g) predates ingredient %g (of %g)", v1: [rope[resultName]], v2: [time[resultTime]], v3: [rope[nodeName]], v4: [time[nodeTime]]]] ENDCASE; }; summonerLoadData: REF SummonerLoadData ~ NARROW[MakeDo.PublicPartsOfAction[a].foundData]; resultTime: MakeDo.Time = result.InnerGetCreated[]; resultName: ROPE = MakeDo.PublicPartsOfNode[n: result].name; MakeDo.InnerEnumerateSources[a: a, which: data, to: PerIngredient ! ForceConsistencyReturn => { consistent _ setConsistent; reason _ setReason; GOTO Exit; }]; IF resultTime = MakeDo.notExistTime THEN RETURN [consistent: FALSE, reason: IO.PutFR[format: "result %g doesn't exist", v1: [rope[resultName]]]] ELSE RETURN [consistent: TRUE, reason: "result dated later than any ingredient"]; EXITS Exit => {}; }; RederiveSummonerLoad: MakeDo.RederiveProc = { summonerLoadData: REF SummonerLoadData ~ NARROW[MakeDo.PublicPartsOfAction[a].foundData]; from _ DeriveFrom[summonerLoadData]; cmd _ DeriveCmd[summonerLoadData]; }; CantFind: SIGNAL [module, full: ROPE] ~ CODE; --Called by RecurseThroughInstall when it has to resort to a version map RecurseThroughInstall: PROC [file: ROPE, install: PROC [module, file: ROPE], run: PROC [package: ROPE], other: PROC [line: ROPE], checkVMap, recurseVMap: BOOL _ TRUE] ~ { stream: IO.STREAM ~ FS.StreamOpen[fileName: file]; DO line: ROPE ~ IO.GetLineRope[stream ! IO.EndOfStream => EXIT]; SELECT TRUE FROM Rope.Match[pattern: "install *", object: line, case: FALSE] => { s: IO.STREAM ~ IO.RIS[rope: line]; word: ROPE _ IO.GetTokenRope[stream: s, breakProc: IO.IDProc].token; DO attemptRecurse: BOOL _ TRUE; TryLocalDirectory: PROC [name: ROPE] RETURNS [succeeded: BOOL] ~ { file _ FS.FileInfo[name: name ! FS.Error => {file _ NIL; CONTINUE}].fullFName; RETURN [file#NIL] }; TryVersionMap: PROC [name: ROPE] RETURNS [succeeded: BOOL] ~ { IF ~checkVMap THEN RETURN [FALSE] ELSE { map: VersionMap.MapList ~ VersionMapDefaults.GetMapList[which: $Source]; manl: VersionMap.MapAndNameList ~ VersionMap.ShortNameToNames[list: map, shortName: name]; FOR each: VersionMap.MapAndNameList _ manl, each.rest UNTIL each=NIL DO file _ FS.FileInfo[name: each.first.name ! FS.Error => LOOP].fullFName; SIGNAL CantFind[word, each.first.name]; attemptRecurse _ recurseVMap; RETURN [TRUE]; ENDLOOP; RETURN [FALSE]; }; }; file: ROPE; word _ IO.GetTokenRope[stream: s, breakProc: IO.IDProc ! IO.EndOfStream => EXIT].token; SELECT TRUE FROM TryLocalDirectory[Rope.Cat[word, ".load"]] => {}; TryLocalDirectory[Rope.Cat["Load", word, ".cm"]] => {}; TryVersionMap[Rope.Cat[word, ".load"]] => {}; TryVersionMap[Rope.Cat["Load", word, ".cm"]] => {}; ENDCASE => { short: ROPE ~ Rope.Cat[word, ".load"]; SIGNAL CantFind[module: word, full: FS.ExpandName[short].fullFName]; }; IF ~ Rope.Fetch[base: word]='- AND install#NIL THEN install[module: word, file: file]; IF file#NIL AND attemptRecurse THEN RecurseThroughInstall[file: file, install: install, run: run, other: other, checkVMap: checkVMap, recurseVMap: recurseVMap]; ENDLOOP; }; Rope.Match[pattern: "run *", object: line, case: FALSE] => { s: IO.STREAM ~ IO.RIS[rope: line]; word: ROPE _ IO.GetTokenRope[stream: s, breakProc: IO.IDProc].token; DO word _ IO.GetTokenRope[stream: s, breakProc: IO.IDProc ! IO.EndOfStream => EXIT].token; IF ~ Rope.Fetch[base: word]='- AND run#NIL THEN run[word]; ENDLOOP; }; ENDCASE => { IF line.Length[] > 0 AND other#NIL THEN other[line]; }; ENDLOOP; }; RederiveSummonerLoadCmd: Commander.CommandProc = { args: CommandTool.ArgumentVector ~ CommandTool.Parse[cmd: cmd, starExpand: TRUE]; FOR k: NAT IN [1..args.argc) DO BuildGFI: PROC [loadName: ROPE] ~ { stream: IO.STREAM; stream _ FS.StreamOpen[fileName: loadName ! FS.Error => GOTO Exit]; DO line: ROPE ~ IO.GetLineRope[stream ! IO.EndOfStream => EXIT]; IF Rope.Match[pattern: "* (*)*", object: line] THEN { module: ROPE ~ Rope.Substr[base: line, len: Rope.Find[s1: line, s2: " "]]; number: ROPE _ Rope.Substr[base: line, start: Rope.Find[s1: line, s2: "("]+1]; value: NAT; number _ Rope.Substr[base: number, len: Rope.Find[s1: number, s2: ")"]]; value _ Convert.CardFromRope[r: number ! Convert.Error => LOOP]; [] _ SymTab.Store[x: gfi, key: module, val: NEW[NAT _ value]]; }; ENDLOOP; EXITS Exit => {}; }; EachPackageName: SymTab.EachPairAction = { RETURN [FALSE] }; Other: PROC [line: ROPE] ~ { s: IO.STREAM ~ IO.RIS[line]; [] _ IO.SkipWhitespace[stream: s]; IF ~ IO.EndOf[s] THEN { IO.PutF[stream: cmd.out, format: "%lUnrecognized line: \"%g\".", v1: [rope["i"]], v2: [rope[line]], v3: [rope[" "]]]; result _ $Failure; }; }; Run: PROC [package: ROPE] ~ { EstimatedGFIs: PROC [module: ROPE] RETURNS [gfis: NAT _ 1] ~ { ref: REF; IF (ref _ (SymTab.Fetch[x: gfi, key: module].val)) # NIL THEN gfis _ NARROW[ref, REF NAT]^; }; IF SymTab.Fetch[x: x, key: package].found THEN RETURN; --Don't run a package more than once IO.PutF[stream: s, format: "%g (%g)\n", v1: [rope[package]], v2: [cardinal[EstimatedGFIs[package]]]]; [] _ SymTab.Store[x: x, key: package, val: NIL]; }; x: SymTab.Ref ~ SymTab.Create[case: FALSE]; --Packages listed in the file y: SymTab.Ref ~ SymTab.Create[case: FALSE]; --Version Map warnings gfi: SymTab.Ref ~ SymTab.Create[case: FALSE]; --Version Map warnings s: IO.STREAM; loadName: ROPE ~ Rope.Cat[args[k], ".summonerLoad"]; fileName: ROPE ~ FS.ExpandName[name: Rope.Cat[args[k], ".summonerInstall"] ! FS.Error => {msg _ IO.PutFR[format: "Could not find %g.summonerInstall.\n", v1: [rope[args[k]]]]; EXIT}].fullFName; BuildGFI[loadName]; s _ FS.StreamOpen[fileName: loadName, accessOptions: create]; IO.PutF[stream: s, format: "-- %g\n-- Copyright 1986 by Xerox Corporation. All rights reserved.\n\n", v1: [rope[Rope.Cat[args[k], ".summonerLoad"]]]]; { ENABLE { CantFind => { IF SymTab.Fetch[x: y, key: full].found THEN RESUME; IO.PutF[stream: cmd.out, format: "%lNeed \"%g\".%l\n", v1: [rope["i"]], v2: [rope[full]], v3: [rope[" "]]]; [] _ SymTab.Store[x: y, key: full, val: NIL]; result _ $Failure; --Consider having to looking at the version map a flop RESUME; }; }; RecurseThroughInstall[file: fileName, install: NIL, run: Run, other: Other, recurseVMap: FALSE]; }; IO.Close[self: s]; ENDLOOP; }; Commander.Register[key: "///Commands/RederiveSummonerLoad", proc: RederiveSummonerLoadCmd]; MakeDo.AddFinder[finder: [name: "SummonerLoad", finderProc: SummonerLoadFind], end: front]; END. 2SummonerLoadDepsImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Eric Nickell, September 30, 1986 4:22:14 pm PDT Mike Spreitzer June 23, 1986 12:06:51 pm PDT [resultName: ROPE, finderData: REF ANY] RETURNS [found: BOOLEAN, sought: MakeDo.Node, makes: MakeDo.NodeList, cmdFrom: MakeDo.NodeList, from: MakeDo.From, cmd: ROPE, class: MakeDo.ActionClass, foundData: REF ANY] [key: SymTab.Key, val: SymTab.Val] RETURNS [quit: BOOL] from.mustHave _ CONS[MakeDo.GetNode[someName: file, class: MakeDo.fileClass], from.mustHave]; [a: MakeDo.Action, result: MakeDo.Node] RETURNS [consistent: BOOL, reason: ROPE] [a: MakeDo.Action] RETURNS [from: MakeDo.From, cmd: ROPE] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [key: SymTab.Key, val: SymTab.Val] RETURNS [quit: BOOL] Κ 3˜™Icodešœ Οmœ1™K–*[which: VersionMapDefaults.WhichMapList]šžœ žœžœžœ˜!šžœ˜K˜HK–/[list: VersionMap.MapList, shortName: ROPE]˜Zšžœ3žœžœž˜GK–b[name: ROPE, wantedCreatedTime: GMT _ nullGMT, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL]šœžœ"žœ žœ ˜GKšžœ!˜'Kšœ˜Kšžœžœ˜Kšžœ˜—Kšžœžœ˜Kšœ˜—K˜—Kšœžœ˜ K–-[stream: STREAM, breakProc: IO.BreakProc]š œžœ$žœ žœžœ˜W–b[name: ROPE, wantedCreatedTime: GMT _ nullGMT, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL]šžœžœž˜Kšœ1˜1Kšœ7˜7Kšœ-˜-Kšœ3˜3šžœ˜ Kšœžœ˜&K–"[name: ROPE, wDir: ROPE _ NIL]šžœžœ˜DKšœ˜——K– [base: ROPE, index: INT _ 0]šžœžœ žœžœ#˜VKšžœžœžœ}˜ Kšžœ˜—Kšœ˜—–6[pattern: ROPE, object: ROPE, case: BOOL _ TRUE]šœ₯œžœ˜[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]šœžœ>˜JK–>[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]šœžœB˜NKšœžœ˜ K–>[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]˜HKšœ:žœ˜@K–-[r: ROPE, defaultBase: Convert.Base _ 10]šœ,žœžœ ˜>Kšœ˜—Kšžœ˜—Kšžœ ˜K˜—˜*Kš’7™7Kšžœžœ˜K˜—š œžœžœ˜Kš œžœžœžœžœ˜K–0[stream: STREAM, flushComments: BOOL _ TRUE]šœžœ˜"šžœžœ žœ˜K–―[stream: STREAM, format: ROPE _ NIL, v1: IO.Value _ [null[]], v2: IO.Value _ [null[]], v3: IO.Value _ [null[]], v4: IO.Value _ [null[]], v5: IO.Value _ [null[]]]šžœm₯œ˜vKšœ˜Kšœ˜—K˜—š œžœ žœ˜–8[mod: SymTab.SeqIndex _ 21B (17), case: BOOL _ TRUE]š   œžœ žœžœžœ ˜>K–$[x: SymTab.Ref, key: SymTab.Key]šœžœ˜ Kš žœ3žœžœžœžœžœ˜[K˜—Kšžœ(žœžœ£$˜[K–―[stream: STREAM, format: ROPE _ NIL, v1: IO.Value _ [null[]], v2: IO.Value _ [null[]], v3: IO.Value _ [null[]], v4: IO.Value _ [null[]], v5: IO.Value _ [null[]]]šžœc˜eKšœ+žœ˜0K˜—Kšœ$žœ£˜IK–8[mod: SymTab.SeqIndex _ 21B (17), case: BOOL _ TRUE]šœ$žœ£˜BK–8[mod: SymTab.SeqIndex _ 21B (17), case: BOOL _ TRUE]šœ&žœ£˜DKšœžœžœ˜ Kšœ žœ&˜4Kšœ žœžœ₯œ(žœžœMžœ₯ ˜ΐK–“[fileName: ROPE, accessOptions: FS.AccessOptions _ read, streamOptions: FS.StreamOptions _ (5)[TRUE, TRUE, TRUE, TRUE, TRUE], keep: CARDINAL _ 1B (1), createByteCount: FS.ByteCount _ 2560, streamBufferParms: FS.StreamBufferParms _ [vmPagesPerBuffer: 8, nBuffers: 2], extendFileProc: FS.ExtendFileProc, wantedCreatedTime: GMT _ nullGMT, remoteCheck: BOOL _ TRUE, wDir: ROPE _ NIL]˜Kšœžœ7˜=K–―[stream: STREAM, format: ROPE _ NIL, v1: IO.Value _ [null[]], v2: IO.Value _ [null[]], v3: IO.Value _ [null[]], v4: IO.Value _ [null[]], v5: IO.Value _ [null[]]]šžœ•˜—šœ˜–I[cmd: Commander.Handle, starExpand: BOOL _ FALSE, switchChar: CHAR]šžœ˜šœ ˜ K–$[x: SymTab.Ref, key: SymTab.Key]šžœ%žœžœ˜3KšžœP₯œ₯œ˜kK–7[x: SymTab.Ref, key: SymTab.Key, val: SymTab.Val]šœ(žœ˜-Kšœ£6˜IKšžœ˜Kšœ˜—Kšœ˜—Kšœ/žœ'žœ˜`Kšœ˜—K–'[self: STREAM, abort: BOOL _ FALSE]šžœ˜Kšžœ˜—L˜—L–x[key: ROPE, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL, interpreted: BOOL _ TRUE]˜[Lšœ[˜[—K˜Kšžœ˜—…—&πJU