A SupFileRec.T represents one record (i.e., line) from a supfile. 
INTERFACETheSupFileRec ; IMPORT ExecRecSeq, FileAttr, GlobTree, Pathname, RCSKeyword, TextSeq, Time, TokScan; CONST Brand = "SupFileRec"; TYPE T <: Public; Public = MUTEX OBJECT collection: TEXT; release: TEXT; serverHost: TEXT; (* Hostname of server machine. *) clientBase: Pathname.T; (* Root of client's sup database. *) serverBase: Pathname.T; (* Root of host's sup database. *) clientCollDir: Pathname.T; (* Client base subdirectory for collections. *) serverCollDirs: TEXT; (* Server base subdirectory search path for collections. *) clientPrefix: Pathname.T; (* Root of tree on client side. *) serverPrefix: Pathname.T; (* Root of tree on server side. *) keywordPrefix: Pathname.T; (* Logical root for RCS keyword expansion. *) serverListFile: Pathname.T; (* Path of "list" file on server. *) serverScanFile: Pathname.T; (* Path of scan file on server. *) superCollection: TEXT; (* Name of immediate superset collection. *) checkoutTag: TEXT; (* Desired symbolic tag for checkout mode. *) checkoutDate: TEXT; (* Desired date for checkout mode, RCS format. *) listSuffix: TEXT; (* List file suffix for checkout mode. *) options: Options; (* See below. *) scanTime: Time.T; (* When server began its tree walk. *) accepts: TextSeq.T; (* Client-side acceptance list. *) refusals: TextSeq.T; (* Client-side refusal list. *) executes: ExecRecSeq.T; (* Commands to execute for specific files. *) fileFilter: GlobTree.T; (* File acceptance filter. *) dirFilter: GlobTree.T; (* Directory acceptance filter. *) symlink: GlobTree.T; (* Filter for transferring symlinks *) noRsync: GlobTree.T; (* Filter for suppressing rsync mode *) attrIgnore: FileAttr.AttrTypes; (* Attributes that should be ignored. *) umask: INTEGER; (* Client's assumed umask for this collection, or -1 if unknown. *) expander: RCSKeyword.T; (* RCS keyword expander. *) bytesIn, bytesOut := 0.0d0; (* Network I/O statistics. *) METHODS init(default: T := NIL): T; overrideFrom(v: T; mask := Options{}); END;
init method initializes all fields to reasonable starting
   values.  If the default parameter is specified, the
   client-controlled fields are initialized from it.
   The overrideFrom method overrides some client-controlled fields
   of self with values taken from v.  Only the non-default
   fields of v are used to override the corresponding fields of
   self.  One exception:  the accepts and refusals sequences
   are concatenated.
   Only the options present in mask are overridden; the
   others remain the same. 
Options = SET OF Option;Note: Add new options only at the end. Do not reorder or delete existing options. If you do, you'll break compatibility with earlier versions of the protocol.
Option = {
    Backup,         (* Create a backup of each upgraded file (not impl.) *)
    Delete,         (* Delete files no longer present on server *)
    Keep,           (* Don't update files newer on client (not impl.) *)
    Old,            (* Check all files instead of just new ones (not impl.) *)
    UnlinkBusy,     (* Unlink ETXTBSY files before upgrading (not impl.) *)
    NoUpdate,       (* Don't update file if modtime is unchanged (not impl.) *)
    Compress,       (* Use compressed transfers. *)
    UseRelSuffix,   (* Suffix "checkouts" files with release and tag. *)
    ExactRCS,       (* Keep RCS files exactly as on server -- no local mods. *)
    CheckRCS,       (* Checksum RCS files to make sure they're correct. *)
    Skip,           (* Skip this collection, because of errors. *)
    CheckoutMode,   (* Using checkout mode. *)
    NoRsync,        (* Don't use rsync algorithm to update regular files. *)
    KeepBadFiles,   (* Keep the bad files when fixups are required. *)
    Execute,        (* Allow client execution of commands from server *)
    SetOwner,       (* Propagate owner/group of files. *)
    SetMode,        (* Propagate permissions of files. *)
    SetFlags,       (* Propagate flags of files. *)
    NoRCS,          (* Treat RCS files the same as all other files. *)
    StrictCheckRCS, (* Checksum RCS files byte-for-byte instead of logically. *)
    TrustStatusFile,(* Don't stat client files to check them against the
		       status file. *)
    DoDeletesOnly,  (* Omit all updates except file deletions. *)
    DetailAllRCSFiles (* Detail all RCS files even if file attributes are equal *)
  };
CONST AllOptions = Options{FIRST(Option)..LAST(Option)};
PROCEDURE Compare(a, b: T): [-1..1];
Compares by collection name, then by release name.
PROCEDURE Equal(a, b: T): BOOLEAN;
 Tests whether two T's represent the same collection and release. PROCEDURE EncodeOptions(o: Options): TEXT;
Produces a printable representation of the given options.
PROCEDURE DecodeOptions(t: TEXT): Options RAISES {TokScan.Error};
Converts a printable representation into options.
PROCEDURE Check(sfr: T; coll, rel: TEXT) RAISES {TokScan.Error};
Raises an exception if the supfile record does not match the given collection and release.
END SupFileRec.