apm_read_package_info_file pathWhat it does:
Reads a .info file, returning an array containing the following items:Defined in: /web/philip/packages/acs-core/apm-procs.tclThis routine will typically be called like so:
path: a path to the file readmtime: the mtime of the file readprovidesand$requires: lists of dependency information, containing elements of the form[list $url $version]owners: a list of owners containing elements of the form[list $url $name]files: a list of files in the package, containing elements of the form[list $path $type]includes: a list of included packages- Element and attribute values directly from the XML specification:
package.key,package.url,name(the version name, e.g.,3.3a1,url(the version URL),package-name,option,summary,description,distribution,release-date,vendor,group,vendor.url, anddescription.format.to populate thearray set version_properties [apm_read_package_info_file $path]version_propertiesarray.If the .info file cannot be read or parsed, this routine throws a descriptive error.
Source code:
global ad_conn
# If the .info file hasn't changed since last read (i.e., has the same
# mtime), return the cached info list.
set mtime [file mtime $path]
if { [nsv_exists apm_version_properties $path] } {
set cached_version [nsv_get apm_version_properties $path]
if { [lindex $cached_version 0] == $mtime } {
return [lindex $cached_version 1]
}
}
# Set the path and mtime in the array.
set properties(path) $path
set properties(mtime) $mtime
apm_load_xml_packages
ns_log "Notice" "Reading specification file at $path"
set file [open $path]
set xml_data [read $file]
close $file
set tree [dom::DOMImplementation parse $xml_data]
set package [dom::node cget $tree -firstChild]
if { ![string equal [dom::node cget $package -nodeName] "package"] } {
error "Expected <package> as root node"
}
set properties(package.key) [apm_required_attribute_value $package key]
set properties(package.url) [apm_required_attribute_value $package url]
set versions [dom::element getElementsByTagName $package version]
if { [llength $versions] != 1 } {
error "Package must contain exactly one <version> node"
}
set version [lindex $versions 0]
set properties(name) [apm_required_attribute_value $version name]
set properties(url) [apm_required_attribute_value $version url]
# Set an entry in the properties array for each of these tags.
foreach property_name { package-name option summary description distribution release-date vendor group } {
set node [lindex [dom::element getElementsByTagName $version $property_name] 0]
if { ![empty_string_p $node] } {
set properties($property_name) [dom::node cget [dom::node cget $node -firstChild] -nodeValue]
} else {
set properties($property_name) ""
}
}
# Set an entry in the properties array for each of these attributes:
#
# <vendor url="..."> -> vendor.url
# <description format="..."> -> description.format
foreach { property_name attribute_name } {
vendor url
description format
} {
set node [lindex [dom::element getElementsByTagName $version $property_name] 0]
if { ![empty_string_p $node] } {
set properties($property_name.$attribute_name) [dom::element getAttribute $node $attribute_name]
} else {
set properties($property_name.$attribute_name) ""
}
}
# We're done constructing the properties array - save the properties into the
# moby array which we're going to return.
set properties(properties) [array get properties]
# Build lists of the services provided by and required by the package.
set properties(provides) [list]
set properties(requires) [list]
foreach dependency_type { provides requires } {
foreach node [dom::element getElementsByTagName $version $dependency_type] {
set service_url [apm_required_attribute_value $node url]
set service_version [apm_required_attribute_value $node version]
lappend properties($dependency_type) [list $service_url $service_version]
}
}
# Build a list of the files contained in the package.
set properties(files) [list]
foreach node [dom::element getElementsByTagName $version "files"] {
foreach file_node [dom::element getElementsByTagName $node "file"] {
set file_path [apm_required_attribute_value $file_node path]
set type [dom::element getAttribute $file_node type]
# Validate the file type: it must be null (unknown type) or
# some value in [apm_file_type_keys].
if { ![empty_string_p $type] && [lsearch -exact [apm_file_type_keys] $type] < 0 } {
error "Invalid file type \"$type\""
}
lappend properties(files) [list $file_path $type]
}
}
# Build a list of the package's owners (if any).
set properties(owners) [list]
foreach node [dom::element getElementsByTagName $version "owner"] {
set url [dom::element getAttribute $node url]
set name [dom::node cget [dom::node cget $node -firstChild] -nodeValue]
lappend properties(owners) [list $url $name]
}
# Build a list of the packages included by this package (if any).
set properties(includes) [list]
foreach node [dom::element getElementsByTagName $version "include"] {
lappend properties(includes) [dom::element getAttribute $node url]
}
# Serialize the array into a list.
set return_value [array get properties]
# Cache the property info based on $mtime.
nsv_set apm_version_properties $path [list $mtime $return_value]
return $return_value