<MakeDoCmds.Mesa>> <> DIRECTORY BasicTime, Commander, DFUtilities, FS, IO, MakeDo, Rope; MakeDoCmds: CEDAR PROGRAM IMPORTS Commander, DFUtilities, FS, IO, MakeDo, Rope = BEGIN ROPE: TYPE = Rope.ROPE; MakeDoIt: PROC [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] --Commander.CommandProc-- = BEGIN AddDF: PROC [goalPlus, goalOther, mod: BOOL] = BEGIN Consume: PROC [item: REF ANY] RETURNS [stop: BOOL _ FALSE] = BEGIN WITH item SELECT FROM di: REF DFUtilities.DirectoryItem => NULL; fi: REF DFUtilities.FileItem => { cp: FS.ComponentPositions; full, verless: ROPE; [full, cp, ] _ FS.ExpandName[fi.name]; verless _ full.Substr[start: 0, len: cp.ext.start + cp.ext.length]; IF (IF fi.verifyRoot THEN goalPlus ELSE goalOther) THEN goals _ CONS[verless, goals] ELSE IF mod THEN otherModifiable _ CONS[verless, otherModifiable]; }; ii: REF DFUtilities.ImportsItem => NULL; ii: REF DFUtilities.IncludeItem => { dfIn: IO.STREAM _ FS.StreamOpen[ii.path1]; DFUtilities.ParseFromStream[in: dfIn, proc: Consume]; dfIn.Close[]}; ci: REF DFUtilities.CommentItem => NULL; wi: REF DFUtilities.WhiteSpaceItem => NULL; ENDCASE => ERROR; END; dfName: ROPE _ NIL; dfIn: IO.STREAM _ NIL; IF mod THEN guessBoundary _ FALSE; [] _ in.SkipWhitespace[]; IF in.EndOf[] THEN {AddMsg["No DF-file name after -whatever"]; RETURN}; dfName _ in.GetTokenRope[IO.IDProc].token; IF dfName.Find["."] < 0 THEN dfName _ dfName.Cat[".DF"]; dfIn _ FS.StreamOpen[dfName]; DFUtilities.ParseFromStream[in: dfIn, proc: Consume]; dfIn.Close[]; END; AddName: PROC [goal, mod: BOOL] = { name: ROPE; IF mod THEN guessBoundary _ FALSE; [] _ in.SkipWhitespace[]; IF in.EndOf[] THEN {AddMsg["No name after -mn"]; RETURN}; name _ in.GetTokenRope[IO.IDProc].token; IF goal THEN goals _ CONS[name, goals] ELSE IF mod THEN otherModifiable _ CONS[name, otherModifiable]; }; AddMsg: PROC [more: ROPE] = {msg _ IF msg = NIL THEN more ELSE msg.Cat["\n", more]}; goals, otherModifiable: MakeDo.RopeList _ NIL; guessBoundary: BOOL _ TRUE; in: IO.STREAM _ IO.RIS[cmd.commandLine]; nFailed, nSucceeded, nSteps, nFailedSteps: NAT; failedSteps: MakeDo.CommandList; ok: BOOL _ TRUE; dontDo: BOOL _ SELECT cmd.procData.clientData FROM $MakeDo => FALSE, $MakeCommandList => TRUE, ENDCASE => ERROR; assumeAllInconsistent: BOOL _ FALSE; cmds: ROPE; [] _ in.SkipWhitespace[]; WHILE NOT in.EndOf[] DO arg: ROPE _ in.GetTokenRope[IO.IDProc].token; IF arg.Length[] = 0 OR arg.Fetch[0] # '- THEN goals _ CONS[arg, goals] ELSE IF arg.Equal["-gr"] THEN AddDF[TRUE, FALSE, FALSE] ELSE IF arg.Equal["-gm"] THEN AddDF[TRUE, TRUE, FALSE] ELSE IF arg.Equal["-dr"] THEN AddDF[TRUE, FALSE, TRUE] ELSE IF arg.Equal["-dm"] THEN AddDF[TRUE, TRUE, TRUE] ELSE IF arg.Equal["-md"] THEN AddDF[FALSE, FALSE, TRUE] ELSE IF arg.Equal["-mn"] THEN AddName[FALSE, TRUE] ELSE IF arg.Equal["-assumeAllInconsistent"] THEN assumeAllInconsistent _ TRUE ELSE AddMsg[IO.PutFR["Bad switch [%g]", IO.rope[arg]]]; [] _ in.SkipWhitespace[]; ENDLOOP; [nFailed:nFailed, nSucceeded:nSucceeded, nSteps:nSteps, failedSteps:failedSteps, cmds:cmds] _ MakeDo.Ensure[cmd, goals, otherModifiable, guessBoundary, dontDo, assumeAllInconsistent ! MakeDo.Warning => {AddMsg[message]; result _ $Failure; RESUME}; MakeDo.Error => {AddMsg[message]; result _ $Failure; ok _ FALSE; CONTINUE}]; IF ok THEN { IF dontDo THEN { cmd.out.PutRope["ToDo:\n"]; cmd.out.PutRope[cmds]; } ELSE { nFailedSteps _ 0; FOR failedSteps _ failedSteps, failedSteps.rest WHILE failedSteps # NIL DO cmd.out.PutF["%lFailed: %g%l\n", IO.rope["b"], IO.rope[failedSteps.first.PublicPartsOfCommand[].cmd], IO.rope["B"]]; nFailedSteps _ nFailedSteps + 1; ENDLOOP; IF nFailedSteps > 0 THEN cmd.out.PutF["%g failed; %g ok.\n", IO.rope[Quantify[nFailedSteps, "step"]], IO.int[nSteps - nFailedSteps]]; cmd.out.PutF["%g failed; %g ok.\n", IO.rope[Quantify[nFailed, "goal"]], IO.int[nSucceeded]]; }; }; END; Quantify: PROC [n: NAT, stuff: ROPE] RETURNS [quantity: ROPE] = {quantity _ IO.PutFR["%g %g%g", IO.int[n], IO.rope[stuff], IO.rope[IF n = 1 THEN "" ELSE "s"]]}; ExplainIt: PROC [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] --Commander.CommandProc-- = BEGIN args: MakeDo.RopeList _ NIL; in: IO.STREAM _ IO.RIS[cmd.commandLine]; [] _ in.SkipWhitespace[]; WHILE NOT in.EndOf[] DO arg: ROPE _ in.GetTokenRope[IO.IDProc].token; args _ CONS[arg, args]; [] _ in.SkipWhitespace[]; ENDLOOP; MakeDo.Explain[cmd, args]; END; Commander.Register[key: "MakeDo", proc: MakeDoIt, doc: "Ensure that derived files are up to date", clientData: $MakeDo]; Commander.Register[key: "MakeCommandList", proc: MakeDoIt, doc: "List commands that would bring derived files are up to date", clientData: $MakeCommandList]; Commander.Register[key: "Explain", proc: ExplainIt, doc: "Explain MakeDo's last action on given files"]; END.