Module: dfmc-projects Synopsis: DFMC project manager interface Author: Andy Armstrong, Roman Budzianowski 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 /// Registry interface define constant $use-registries = #t; define constant $dylan-abstract-host = "abstract://dylan/"; define method find-project-in-registry (workspace :: , name :: ) => (project :: false-or()) if ($use-registries) let processor = workspace.workspace-processor; let os = workspace.workspace-operating-system; let (location, read-only?) = find-library-project-file(name, processor, os); location & open-project(workspace, location, read-only?: read-only?) end end method find-project-in-registry; /// Registry class define class () constant slot registry-location :: , required-init-keyword: location:; constant slot registry-root-directory :: , required-init-keyword: root-directory:; constant slot registry-personal? :: , required-init-keyword: personal?:; slot %host-info :: false-or() = #f; end class ; define function find-library-project-file (workspace :: , name :: ) => (lid-location :: false-or(), read-only? :: ) let registries = workspace.workspace-registries; let (registry-entry, registry) = find-registry-entry(name, registries); if (registry-entry) let prefix = $dylan-abstract-host; let prefix-size = prefix.size; let location = with-open-file (stream = registry-entry) read-line(stream) end; let filename = if (location.size > prefix-size & copy-sequence(location, end: prefix-size) = prefix) let root = as(, registry.registry-root); let file = as(, copy-sequence(location, start: prefix-size)); // Can't just merge them as that would produce a POSIX locator... let file-parent = locator-directory(file); let file-parent-path = file-parent & locator-path(file-parent); as(, make(, directory: make(, server: locator-server(root), path: concatenate(locator-path(root) | #[], file-parent-path | #[])), name: locator-name(file))) else location end; let read-only? = ~registry.registry-personal?; values(as(, filename), read-only?) else values(#f, #f) end end function find-library-project-file; define function find-registry-entry (name :: , registries :: ) => (lid-locator :: false-or(), registry :: false-or()) let name = as-lowercase(as(, name)); block (return) for (registry :: in registries) let locator = merge-locators(as(, name), registry.registry-location); if (file-exists?(locator)) return(locator, registry) end end; values(#f, #f) end end function find-registry-entry; define function platform-registries (processor :: , os :: ) => (registries :: ) let platform-registries :: = make(); let generic-registries :: = make(); let platform-name = platform-name(processor, os); local method add-registries (paths :: , #key personal? :: = #f) for (path :: in paths) let (platform-registry, generic-registry) = make-registry-from-path(path, platform-name, personal?: #t); add!(platform-registries, platform-registry); add!(generic-registries, generic-registry) end end method add-registries; add-registries(lookup-personal-registries(), personal?: #t); add-registries(lookup-system-registries(), personal?: #f); concatenate-as(, platform-registries, generic-registries) end function platform-registries; define function make-registry-from-path (path :: , platform-name :: , #key personal? = #f) => (platform-registry :: , generic-registry :: ) let platform-registry = subdirectory-locator(path, platform-name); let generic-registry = subdirectory-locator(path, "generic"); let root-directory = as(, path.locator-directory); values(make(, location: platform-registry, root-directory: root-directory, personal?: personal?), make(, location: generic-registry, root-directory: root-directory, personal?: personal?)) end function make-registry-from-path; define function platform-name (processor :: , os :: ) => (name :: ) concatenate(as-lowercase(as(, processor)), "-", as-lowercase(as(, os))) end function platform-name; define function lookup-system-registries () => (registries :: ) let registries = system-registry-path(); registries | vector(subdirectory-locator (system-release-path(), "sources", "registry")) end function lookup-system-registries; define function lookup-personal-registries () => (registries :: ) user-registry-path() end function lookup-personal-registries;