Module: source-control-manager-internals Synopsis: Environment-Source Control Interface Author: Scott McKay Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// Source control systems define variable *all-source-control-systems* :: = make(); // 'sccs' = "source code control system" define open abstract primary class () sealed constant slot sccs-name :: , required-init-keyword: name:; sealed constant slot sccs-label :: , required-init-keyword: label:; sealed constant slot sccs-title :: , required-init-keyword: title:; end class ; define method find-source-control-system-named (name :: ) => (sccs :: false-or()) find-value(*all-source-control-systems*, method (sccs) sccs-name(sccs) == name end) end method find-source-control-system-named; define method register-source-control-class (class :: subclass(), #rest initargs) => (sccs :: ) let sccs = find-value(*all-source-control-systems*, method (e) object-class(e) == class end); if (sccs) sccs else let sccs = apply(make, class, initargs); add!(*all-source-control-systems*, sccs); sccs end end method register-source-control-class; define method unregister-source-control-class (class :: subclass()) => () let sccs = find-value(*all-source-control-systems*, method (e) object-class(e) == class end); when (sccs) remove!(*all-source-control-systems*, sccs) end end method unregister-source-control-class; define settings () key-name "Source Control"; slot default-sccs :: = #"none"; end settings ; define constant $source-control-user-settings = make(); define function default-source-control-system () => (sccs :: false-or()) let sccs = $source-control-user-settings.default-sccs; sccs ~= #"none" & find-source-control-system-named(sccs) end function default-source-control-system; define variable *current-source-control-system* :: false-or() = #f; define variable *cscs-initialized?* :: = #f; ///---*** TODO: Need a better mechanism to pick a default SCCS ... define function current-source-control-system () => (sccs :: false-or()) unless (*cscs-initialized?*) let edition = release-edition-type(); when (edition == #"enhanced" | edition == #"internal") let default-sccs = default-source-control-system(); case default-sccs => *current-source-control-system* := default-sccs; edition == #"enhanced" => *current-source-control-system* := find-source-control-system-named(#"SourceSafe"); edition == #"internal" => *current-source-control-system* := find-source-control-system-named(#"HOPE") | find-source-control-system-named(#"SourceSafe"); otherwise => *current-source-control-system* := #f; end end; *cscs-initialized?* := #t end; *current-source-control-system* end function current-source-control-system; define function current-source-control-system-setter (sccs :: ) => (sccs :: ) *current-source-control-system* := sccs; *cscs-initialized?* := #t; note-source-control-system-selected(sccs); sccs end function current-source-control-system-setter; define open generic note-source-control-system-selected (sccs :: ) => (); define method note-source-control-system-selected (sccs :: ) => () #f end method note-source-control-system-selected; /// Error classes define open abstract class () end class ; define open abstract class (, ) end class ; define open abstract class (, ) end class ; // Nobody has selected a source control system to use define sealed class () end class ; define abstract class () sealed constant slot %source-control, required-init-keyword: source-control:; sealed constant slot %command, required-init-keyword: command:; end class ; // The selected source control system doesn't support this command define sealed class (, ) end class ; // The command didn't successfully run define sealed class (, ) end class ;