DIRECTORY Booting, Commander, CommandTool, FS, IO, List, MessageWindow, ProcessProps, Rope, UserCredentials, ViewerClasses, ViewerOps; RollbackAndAnything: CEDAR MONITOR IMPORTS Booting, Commander, CommandTool, FS, IO, List, MessageWindow, ProcessProps, Rope, UserCredentials, ViewerOps = BEGIN ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; enabled: BOOL _ TRUE; Able: ENTRY PROC RETURNS [able: BOOL] = { able _ enabled; enabled _ FALSE}; AnythingWork: PROC [ctv: Viewer] = { looking: BOOL; from: IO.STREAM _ NIL; cmd: ROPE; sourceFileName: ROPE _ CmdFileName[]; copyFileName: ROPE _ CopyFileName[]; FindOne: PROC [v: Viewer] RETURNS [BOOL _ TRUE] --ViewerOps.EnumProc-- = BEGIN IF v.name.Find["CommandTool: "] = 0 AND v.class.flavor = $Typescript THEN {ctv _ v; looking _ FALSE}; RETURN [looking]; END; IF NOT Able[] THEN RETURN; from _ FS.StreamOpen[sourceFileName !FS.Error => {from _ NIL; CONTINUE}]; IF from = NIL THEN RETURN; cmd _ from.GetTokenRope[AllOther].token; from.Close[]; FS.Rename[from: sourceFileName, to: copyFileName]; IF cmd.Length[] = 0 THEN RETURN; looking _ ctv = NIL OR ctv.destroyed; IF looking THEN ViewerOps.EnumerateViewers[FindOne]; IF looking THEN MessageWindow.Append[" RollbackAndAnything couldn't find a CommandTool"] ELSE ctv.class.notify[ctv, LIST[cmd]]; }; AllOther: PROC [char: CHAR] RETURNS [cc: IO.CharClass] --IO.BreakProc-- = {cc _ other}; CmdFileName: PROC RETURNS [fileName: ROPE] = { userName: ROPE _ UserCredentials.Get[].name; fileName _ Rope.Cat["///Users/", userName, "/ToDoWhenRollback"]}; CopyFileName: PROC RETURNS [fileName: ROPE] = { userName: ROPE _ UserCredentials.Get[].name; fileName _ Rope.Cat["///Users/", userName, "/DidWhenRollbacked"]}; UponRollback: PROC [clientData: REF ANY] --Booting.RollbackProc-- = {AnythingWork[NIL]}; DoRollbackStuff: PROC [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] --Commander.CommandProc-- = {AnythingWork[CommandTool.GetViewer[cmd]]}; RollbackAnd: PROC [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] --Commander.CommandProc-- = { to: IO.STREAM = FS.StreamOpen[CmdFileName[], create]; wDir: REF ANY = List.Assoc[$WorkingDirectory, ProcessProps.GetPropList[]]; IF wDir # NIL THEN { WITH wDir SELECT FROM x: ROPE => to.PutF["cd %g; ", [rope[x]]]; x: REF TEXT => to.PutF["cd %g; ", [text[x]]]; ENDCASE => to.PutF["abort because wDir (%g) isn't a ROPE or REF TEXT; ", [refAny[wDir]]]; } ELSE to.PutRope["cdr; "]; to.PutRope[cmd.commandLine]; to.Close[]; RETURN[$Failure, Booting.Boot[[self[]], [r: TRUE]]]; }; Booting.RegisterProcs[r: UponRollback]; Commander.Register[key: "DoRollbackStuff", proc: DoRollbackStuff, doc: "Execute commands saved for execution upon rollback"]; Commander.Register[key: "RollbackAnd", proc: RollbackAnd, doc: "Rollback, then execute rest of command line", interpreted: FALSE]; END. ΐRollbackAndAnything.Mesa Last Edited by: Spreitzer, May 24, 1985 1:48:55 pm PDT Mike Spreitzer November 3, 1986 11:11:03 pm PST Copied from CommandToolFix.InitialCommandsImpl.Rollback: Κγ– "cedar" style˜Icode™šœ3Οk™6K™/—K˜Kš œ"œœU˜†K˜šΡbnxœœ˜"Kšœ"œœE˜tKšœ˜—K˜Kš˜K˜Kšœœœ˜Kšœœ˜$K˜Kšœ œœ˜K˜š Οnœœœœœ˜)K˜Kšœ œ˜—K˜šŸ œœ˜$Kšœ œ˜Kšœœœœ˜Kšœœ˜ Kšœœ˜%Kšœœ˜$š Ÿœœ œœœΟcœ˜HKš˜šœ"œ˜DKšœœ˜ —Kšœ ˜Kšœ˜—Kšœœœœ˜Kš œœœœœ˜IKšœœœœ˜K˜(K˜ Kšœ0˜2Kšœœœ˜ Kšœœœ˜%Kšœ œ%˜4Kšœ œI˜XKšœœ˜&K˜—K˜š Ÿœœœœœ  œ˜IK˜ —K˜šŸ œœœ œ˜.Kšœ œ˜,KšœA˜A—K˜šŸ œœœ œ˜/Kšœ œ˜,KšœB˜B—K˜š Ÿ œœœœ œ˜CKšœœ˜—K˜šŸœœœ œœœœœ œ˜zKšœ+˜+—K˜šŸ œœœ œœœœœ œ˜xKšœœœœ#˜5Kšœœœ=˜Jšœœœ˜šœœ˜Kšœœ"˜)Kšœœœ"˜-KšœR˜Y—Kšœ˜—Kšœ˜K˜K˜ šœ8™8Kšœ&œ˜4—K˜—K˜Kšœ'˜'K˜}Kšœ{œ˜‚K˜Kšœ˜—…— Dη