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.