[29172] trunk/base/src/port/port.tcl
source_changes at macosforge.org
source_changes at macosforge.org
Sun Sep 16 20:40:30 PDT 2007
Revision: 29172
http://trac.macosforge.org/projects/macports/changeset/29172
Author: jmpp at macports.org
Date: 2007-09-16 20:40:29 -0700 (Sun, 16 Sep 2007)
Log Message:
-----------
Whitespaces changes only.
Modified Paths:
--------------
trunk/base/src/port/port.tcl
Modified: trunk/base/src/port/port.tcl
===================================================================
--- trunk/base/src/port/port.tcl 2007-09-16 22:36:18 UTC (rev 29171)
+++ trunk/base/src/port/port.tcl 2007-09-17 03:40:29 UTC (rev 29172)
@@ -1,5 +1,5 @@
#!/bin/sh
-#\
+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:et:sw=4:ts=4:sts=4 \
exec @TCLSH@ "$0" "$@"
# port.tcl
# $Id$
@@ -34,11 +34,11 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-# TODO:
+# TODO:
#
catch {source \
- [file join "@TCL_PACKAGE_DIR@" macports1.0 macports_fastload.tcl]}
+ [file join "@TCL_PACKAGE_DIR@" macports1.0 macports_fastload.tcl]}
package require macports
# UI Instantiations
@@ -48,40 +48,40 @@
# ui_options accessor
proc ui_isset {val} {
- global ui_options
- if {[info exists ui_options($val)]} {
- if {$ui_options($val) == "yes"} {
- return 1
- }
- }
- return 0
+ global ui_options
+ if {[info exists ui_options($val)]} {
+ if {$ui_options($val) == "yes"} {
+ return 1
+ }
+ }
+ return 0
}
# global_options accessor
proc global_option_isset {val} {
- global global_options
- if {[info exists global_options($val)]} {
- if {$global_options($val) == "yes"} {
- return 1
- }
- }
- return 0
+ global global_options
+ if {[info exists global_options($val)]} {
+ if {$global_options($val) == "yes"} {
+ return 1
+ }
+ }
+ return 0
}
# UI Callback
proc ui_prefix {priority} {
switch $priority {
debug {
- return "DEBUG: "
+ return "DEBUG: "
}
error {
- return "Error: "
+ return "Error: "
}
warn {
- return "Warning: "
+ return "Warning: "
}
default {
- return ""
+ return ""
}
}
}
@@ -91,9 +91,9 @@
switch $priority {
debug {
if {[ui_isset ports_debug]} {
- return {stderr}
+ return {stderr}
} else {
- return {}
+ return {}
}
}
info {
@@ -101,20 +101,20 @@
return {stdout}
} else {
return {}
- }
- }
+ }
+ }
msg {
if {[ui_isset ports_quiet]} {
return {}
- } else {
- return {stdout}
- }
- }
+ } else {
+ return {stdout}
+ }
+ }
error {
- return {stderr}
+ return {stderr}
}
default {
- return {stdout}
+ return {stdout}
}
}
}
@@ -122,48 +122,50 @@
# Standard procedures
proc print_usage {args} {
- global cmdname
- set syntax { [-bcdfiknopqRstuvx] [-D portdir] [-F cmdfile] action [privopts] [actionflags]
-[[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...
+ global cmdname
+ set syntax {
+ [-bcdfiknopqRstuvx] [-D portdir] [-F cmdfile] action [privopts] [actionflags]
+ [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...
+ }
+
+ puts "Usage: $cmdname$syntax"
+ puts "\"$cmdname help\" or \"man 1 port\" for more information."
}
-
- puts "Usage: $cmdname$syntax"
- puts "\"$cmdname help\" or \"man 1 port\" for more information."
-}
proc print_help {args} {
- global cmdname
- global action_array
-
- set syntax { [-bcdfiknopqRstuvx] [-D portdir] [-F cmdfile] action [privopts] [actionflags]
-[[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...
-}
+ global cmdname
+ global action_array
+
+ set syntax {
+ [-bcdfiknopqRstuvx] [-D portdir] [-F cmdfile] action [privopts] [actionflags]
+ [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...
+ }
- # Generate and format the command list from the action_array
- set cmds ""
- set lineLen 0
- foreach cmd [lsort [array names action_array]] {
- if {$lineLen > 65} {
- set cmds "$cmds,\n"
- set lineLen 0
- }
- if {$lineLen == 0} {
- set new "$cmd"
- } else {
- set new ", $cmd"
- }
- incr lineLen [string length $new]
- set cmds "$cmds$new"
- }
-
- set cmdText "
+ # Generate and format the command list from the action_array
+ set cmds ""
+ set lineLen 0
+ foreach cmd [lsort [array names action_array]] {
+ if {$lineLen > 65} {
+ set cmds "$cmds,\n"
+ set lineLen 0
+ }
+ if {$lineLen == 0} {
+ set new "$cmd"
+ } else {
+ set new ", $cmd"
+ }
+ incr lineLen [string length $new]
+ set cmds "$cmds$new"
+ }
+
+ set cmdText "
Supported commands
------------------
$cmds
"
- set text {
+ set text {
Pseudo-portnames
----------------
Pseudo-portnames are words that may be used in place of a portname, and
@@ -182,29 +184,28 @@
Portnames that contain standard glob characters will be expanded to the
set of ports matching the glob pattern.
-
+
Port expressions
----------------
Portnames, port glob patterns, and pseudo-portnames may be logically
combined using expressions consisting of and, or, not, !, (, and ).
-
+
For more information
--------------------
See man pages: port(1), macports.conf(5), portfile(7), portgroup(7),
porthier(7), portstyle(7). Also, see http://www.macports.org.
-}
+ }
-
- puts "$cmdname$syntax $cmdText $text"
+
+ puts "$cmdname$syntax $cmdText $text"
}
-
# Produce error message and exit
proc fatal s {
- global argv0
- ui_error "$argv0: $s"
- exit 1
+ global argv0
+ ui_error "$argv0: $s"
+ exit 1
}
@@ -212,12 +213,12 @@
# we're handling errors in a soft fashion, in which
# case we continue
proc fatal_softcontinue s {
- if {[global_option_isset ports_force]} {
- ui_error $s
- return -code continue
- } else {
- fatal $s
- }
+ if {[global_option_isset ports_force]} {
+ ui_error $s
+ return -code continue
+ } else {
+ fatal $s
+ }
}
@@ -225,168 +226,168 @@
# we're handling errors in a soft fashion, in which
# case we continue
proc break_softcontinue { msg status name_status } {
- upvar $name_status status_var
- ui_error $msg
- if {[ui_isset ports_processall]} {
- set status_var 0
- return -code continue
- } else {
- set status_var $status
- return -code break
- }
+ upvar $name_status status_var
+ ui_error $msg
+ if {[ui_isset ports_processall]} {
+ set status_var 0
+ return -code continue
+ } else {
+ set status_var $status
+ return -code break
+ }
}
# Form a composite version as is sometimes used for registry functions
proc composite_version {version variations {emptyVersionOkay 0}} {
- # Form a composite version out of the version and variations
-
- # Select the variations into positive and negative
- set pos {}
- set neg {}
- foreach { key val } $variations {
- if {$val == "+"} {
- lappend pos $key
- } elseif {$val == "-"} {
- lappend neg $key
- }
- }
-
- # If there is no version, we have nothing to do
- set composite_version ""
- if {$version != "" || $emptyVersionOkay} {
- set pos_str ""
- set neg_str ""
-
- if {[llength $pos]} {
- set pos_str "+[join [lsort -ascii $pos] "+"]"
- }
- if {[llength $neg]} {
- set neg_str "-[join [lsort -ascii $neg] "-"]"
- }
-
- set composite_version "$version$pos_str$neg_str"
- }
-
- return $composite_version
+ # Form a composite version out of the version and variations
+
+ # Select the variations into positive and negative
+ set pos {}
+ set neg {}
+ foreach { key val } $variations {
+ if {$val == "+"} {
+ lappend pos $key
+ } elseif {$val == "-"} {
+ lappend neg $key
+ }
+ }
+
+ # If there is no version, we have nothing to do
+ set composite_version ""
+ if {$version != "" || $emptyVersionOkay} {
+ set pos_str ""
+ set neg_str ""
+
+ if {[llength $pos]} {
+ set pos_str "+[join [lsort -ascii $pos] "+"]"
+ }
+ if {[llength $neg]} {
+ set neg_str "-[join [lsort -ascii $neg] "-"]"
+ }
+
+ set composite_version "$version$pos_str$neg_str"
+ }
+
+ return $composite_version
}
proc split_variants {variants} {
- set result {}
- set l [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $variants]
- foreach { match sign variant } $l {
- lappend result $variant $sign
- }
- return $result
+ set result {}
+ set l [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $variants]
+ foreach { match sign variant } $l {
+ lappend result $variant $sign
+ }
+ return $result
}
proc registry_installed {portname {portversion ""}} {
- set ilist [registry::installed $portname $portversion]
- if { [llength $ilist] > 1 } {
- puts "The following versions of $portname are currently installed:"
- foreach i $ilist {
- set iname [lindex $i 0]
- set iversion [lindex $i 1]
- set irevision [lindex $i 2]
- set ivariants [lindex $i 3]
- set iactive [lindex $i 4]
- if { $iactive == 0 } {
- puts " $iname ${iversion}_${irevision}${ivariants}"
- } elseif { $iactive == 1 } {
- puts " $iname ${iversion}_${irevision}${ivariants} (active)"
- }
- }
- return -code error "Registry error: Please specify the full version as recorded in the port registry."
- } else {
- return [lindex $ilist 0]
- }
+ set ilist [registry::installed $portname $portversion]
+ if { [llength $ilist] > 1 } {
+ puts "The following versions of $portname are currently installed:"
+ foreach i $ilist {
+ set iname [lindex $i 0]
+ set iversion [lindex $i 1]
+ set irevision [lindex $i 2]
+ set ivariants [lindex $i 3]
+ set iactive [lindex $i 4]
+ if { $iactive == 0 } {
+ puts " $iname ${iversion}_${irevision}${ivariants}"
+ } elseif { $iactive == 1 } {
+ puts " $iname ${iversion}_${irevision}${ivariants} (active)"
+ }
+ }
+ return -code error "Registry error: Please specify the full version as recorded in the port registry."
+ } else {
+ return [lindex $ilist 0]
+ }
}
proc add_to_portlist {listname portentry} {
- upvar $listname portlist
- global global_options global_variations
-
- # The portlist currently has the following elements in it:
- # url if any
- # name
- # version (version_revision)
- # variants array (variant=>+-)
- # options array (key=>value)
- # fullname (name/version_revision+-variants)
-
- array set port $portentry
- if {![info exists port(url)]} { set port(url) "" }
- if {![info exists port(name)]} { set port(name) "" }
- if {![info exists port(version)]} { set port(version) "" }
- if {![info exists port(variants)]} { set port(variants) "" }
- if {![info exists port(options)]} { set port(options) [array get global_options] }
-
- # If neither portname nor url is specified, then default to the current port
- if { $port(url) == "" && $port(name) == "" } {
- set url file://.
- set portname [url_to_portname $url]
- set port(url) $url
- set port(name) $portname
- if {$portname == ""} {
- ui_error "A default port name could not be supplied."
- }
- }
-
-
- # Form the fully descriminated portname: portname/version_revison+-variants
- set port(fullname) "$port(name)/[composite_version $port(version) $port(variants)]"
-
- # Add it to our portlist
- lappend portlist [array get port]
+ upvar $listname portlist
+ global global_options global_variations
+
+ # The portlist currently has the following elements in it:
+ # url if any
+ # name
+ # version (version_revision)
+ # variants array (variant=>+-)
+ # options array (key=>value)
+ # fullname (name/version_revision+-variants)
+
+ array set port $portentry
+ if {![info exists port(url)]} { set port(url) "" }
+ if {![info exists port(name)]} { set port(name) "" }
+ if {![info exists port(version)]} { set port(version) "" }
+ if {![info exists port(variants)]} { set port(variants) "" }
+ if {![info exists port(options)]} { set port(options) [array get global_options] }
+
+ # If neither portname nor url is specified, then default to the current port
+ if { $port(url) == "" && $port(name) == "" } {
+ set url file://.
+ set portname [url_to_portname $url]
+ set port(url) $url
+ set port(name) $portname
+ if {$portname == ""} {
+ ui_error "A default port name could not be supplied."
+ }
+ }
+
+
+ # Form the fully descriminated portname: portname/version_revison+-variants
+ set port(fullname) "$port(name)/[composite_version $port(version) $port(variants)]"
+
+ # Add it to our portlist
+ lappend portlist [array get port]
}
proc add_ports_to_portlist {listname ports {overridelist ""}} {
- upvar $listname portlist
-
- array set overrides $overridelist
-
- # Add each entry to the named portlist, overriding any values
- # specified as overrides
- foreach portentry $ports {
- array set port $portentry
- if ([info exists overrides(version)]) { set port(version) $overrides(version) }
- if ([info exists overrides(variants)]) { set port(variants) $overrides(variants) }
- if ([info exists overrides(options)]) { set port(options) $overrides(options) }
- add_to_portlist portlist [array get port]
- }
+ upvar $listname portlist
+
+ array set overrides $overridelist
+
+ # Add each entry to the named portlist, overriding any values
+ # specified as overrides
+ foreach portentry $ports {
+ array set port $portentry
+ if ([info exists overrides(version)]) { set port(version) $overrides(version) }
+ if ([info exists overrides(variants)]) { set port(variants) $overrides(variants) }
+ if ([info exists overrides(options)]) { set port(options) $overrides(options) }
+ add_to_portlist portlist [array get port]
+ }
}
proc url_to_portname { url {quiet 0} } {
- # Save directory and restore the directory, since mportopen changes it
- set savedir [pwd]
- set portname ""
- if {[catch {set ctx [mportopen $url]} result]} {
- if {!$quiet} {
- ui_msg "Can't map the URL '$url' to a port description file (\"${result}\")."
- ui_msg "Please verify that the directory and portfile syntax are correct."
- }
- } else {
- array set portinfo [mportinfo $ctx]
- set portname $portinfo(name)
- mportclose $ctx
- }
- cd $savedir
- return $portname
+ # Save directory and restore the directory, since mportopen changes it
+ set savedir [pwd]
+ set portname ""
+ if {[catch {set ctx [mportopen $url]} result]} {
+ if {!$quiet} {
+ ui_msg "Can't map the URL '$url' to a port description file (\"${result}\")."
+ ui_msg "Please verify that the directory and portfile syntax are correct."
+ }
+ } else {
+ array set portinfo [mportinfo $ctx]
+ set portname $portinfo(name)
+ mportclose $ctx
+ }
+ cd $savedir
+ return $portname
}
# Supply a default porturl/portname if the portlist is empty
proc require_portlist { nameportlist } {
- upvar $nameportlist portlist
-
- if {[llength $portlist] == 0} {
- set portlist [get_current_port]
- }
+ upvar $nameportlist portlist
+
+ if {[llength $portlist] == 0} {
+ set portlist [get_current_port]
+ }
}
@@ -394,57 +395,57 @@
# When the block is entered, the variables portname, portversion, options, and variations
# will have been set
proc foreachport {portlist block} {
- # Restore cwd after each port, since mportopen changes it, and relative
- # urls will break on subsequent passes
- set savedir [pwd]
- foreach portspec $portlist {
- uplevel 1 "array set portspec { $portspec }"
- uplevel 1 {
- set porturl $portspec(url)
- set portname $portspec(name)
- set portversion $portspec(version)
- array unset variations
- array set variations $portspec(variants)
- array unset options
- array set options $portspec(options)
- }
- uplevel 1 $block
- cd $savedir
- }
+ # Restore cwd after each port, since mportopen changes it, and relative
+ # urls will break on subsequent passes
+ set savedir [pwd]
+ foreach portspec $portlist {
+ uplevel 1 "array set portspec { $portspec }"
+ uplevel 1 {
+ set porturl $portspec(url)
+ set portname $portspec(name)
+ set portversion $portspec(version)
+ array unset variations
+ array set variations $portspec(variants)
+ array unset options
+ array set options $portspec(options)
+ }
+ uplevel 1 $block
+ cd $savedir
+ }
}
proc portlist_compare { a b } {
- array set a_ $a
- array set b_ $b
- return [string compare $a_(name) $b_(name)]
+ array set a_ $a
+ array set b_ $b
+ return [string compare $a_(name) $b_(name)]
}
proc portlist_sort { list } {
- return [lsort -command portlist_compare $list]
+ return [lsort -command portlist_compare $list]
}
proc regex_pat_sanitize { s } {
- set sanitized [regsub -all {[\\(){}+$.^]} $s {\\&}]
- return $sanitized
+ set sanitized [regsub -all {[\\(){}+$.^]} $s {\\&}]
+ return $sanitized
}
proc unobscure_maintainers { list } {
- set result {}
- foreach m $list {
- if {[string first "@" $m] < 0} {
- if {[string first ":" $m] >= 0} {
- set m [regsub -- "(.*):(.*)" $m "\\2@\\1"]
- } else {
- set m "$m at macports.org"
- }
- }
- lappend result $m
- }
- return $result
+ set result {}
+ foreach m $list {
+ if {[string first "@" $m] < 0} {
+ if {[string first ":" $m] >= 0} {
+ set m [regsub -- "(.*):(.*)" $m "\\2@\\1"]
+ } else {
+ set m "$m at macports.org"
+ }
+ }
+ lappend result $m
+ }
+ return $result
}
@@ -452,187 +453,187 @@
# Port selection
##########################################
proc get_matching_ports {pattern {casesensitive no} {matchstyle glob} {field name}} {
- if {[catch {set res [mportsearch $pattern $casesensitive $matchstyle $field]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "search for portname $pattern failed: $result"
- }
+ if {[catch {set res [mportsearch $pattern $casesensitive $matchstyle $field]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "search for portname $pattern failed: $result"
+ }
- set results {}
- foreach {name info} $res {
- array unset portinfo
- array set portinfo $info
-
- #set variants {}
- #if {[info exists portinfo(variants)]} {
- # foreach variant $portinfo(variants) {
- # lappend variants $variant "+"
- # }
- #}
- # For now, don't include version or variants with all ports list
- #"$portinfo(version)_$portinfo(revision)"
- #$variants
- add_to_portlist results [list url $portinfo(porturl) name $name]
- }
-
- # Return the list of all ports, sorted
- return [portlist_sort $results]
+ set results {}
+ foreach {name info} $res {
+ array unset portinfo
+ array set portinfo $info
+
+ #set variants {}
+ #if {[info exists portinfo(variants)]} {
+ # foreach variant $portinfo(variants) {
+ # lappend variants $variant "+"
+ # }
+ #}
+ # For now, don't include version or variants with all ports list
+ #"$portinfo(version)_$portinfo(revision)"
+ #$variants
+ add_to_portlist results [list url $portinfo(porturl) name $name]
+ }
+
+ # Return the list of all ports, sorted
+ return [portlist_sort $results]
}
proc get_all_ports {} {
- global all_ports_cache
-
- if {![info exists all_ports_cache]} {
- set all_ports_cache [get_matching_ports "*"]
- }
- return $all_ports_cache
+ global all_ports_cache
+
+ if {![info exists all_ports_cache]} {
+ set all_ports_cache [get_matching_ports "*"]
+ }
+ return $all_ports_cache
}
proc get_current_ports {} {
- # This is just a synonym for get_current_port that
- # works with the regex in element
- return [get_current_port]
+ # This is just a synonym for get_current_port that
+ # works with the regex in element
+ return [get_current_port]
}
proc get_current_port {} {
- set url file://.
- set portname [url_to_portname $url]
- if {$portname == ""} {
- ui_msg "To use the current port, you must be in a port's directory."
- ui_msg "(you might also see this message if a pseudo-port such as"
- ui_msg "outdated or installed expands to no ports)."
- }
-
- set results {}
- add_to_portlist results [list url $url name $portname]
- return $results
+ set url file://.
+ set portname [url_to_portname $url]
+ if {$portname == ""} {
+ ui_msg "To use the current port, you must be in a port's directory."
+ ui_msg "(you might also see this message if a pseudo-port such as"
+ ui_msg "outdated or installed expands to no ports)."
+ }
+
+ set results {}
+ add_to_portlist results [list url $url name $portname]
+ return $results
}
proc get_installed_ports { {ignore_active yes} {active yes} } {
- set ilist {}
- if { [catch {set ilist [registry::installed]} result] } {
- if {$result != "Registry error: No ports registered as installed."} {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "port installed failed: $result"
- }
- }
-
- set results {}
- foreach i $ilist {
- set iname [lindex $i 0]
- set iversion [lindex $i 1]
- set irevision [lindex $i 2]
- set ivariants [split_variants [lindex $i 3]]
- set iactive [lindex $i 4]
-
- if { ${ignore_active} == "yes" || (${active} == "yes") == (${iactive} != 0) } {
- add_to_portlist results [list name $iname version "${iversion}_${irevision}" variants $ivariants]
- }
- }
-
- # Return the list of ports, sorted
- return [portlist_sort $results]
+ set ilist {}
+ if { [catch {set ilist [registry::installed]} result] } {
+ if {$result != "Registry error: No ports registered as installed."} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "port installed failed: $result"
+ }
+ }
+
+ set results {}
+ foreach i $ilist {
+ set iname [lindex $i 0]
+ set iversion [lindex $i 1]
+ set irevision [lindex $i 2]
+ set ivariants [split_variants [lindex $i 3]]
+ set iactive [lindex $i 4]
+
+ if { ${ignore_active} == "yes" || (${active} == "yes") == (${iactive} != 0) } {
+ add_to_portlist results [list name $iname version "${iversion}_${irevision}" variants $ivariants]
+ }
+ }
+
+ # Return the list of ports, sorted
+ return [portlist_sort $results]
}
proc get_uninstalled_ports {} {
- # Return all - installed
- set all [get_all_ports]
- set installed [get_installed_ports]
- return [opComplement $all $installed]
+ # Return all - installed
+ set all [get_all_ports]
+ set installed [get_installed_ports]
+ return [opComplement $all $installed]
}
proc get_active_ports {} {
- return [get_installed_ports no yes]
+ return [get_installed_ports no yes]
}
proc get_inactive_ports {} {
- return [get_installed_ports no no]
+ return [get_installed_ports no no]
}
proc get_outdated_ports {} {
- global macports::registry.installtype
- set is_image_mode [expr 0 == [string compare "image" ${macports::registry.installtype}]]
-
- # Get the list of installed ports
- set ilist {}
- if { [catch {set ilist [registry::installed]} result] } {
- if {$result != "Registry error: No ports registered as installed."} {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "port installed failed: $result"
- }
- }
+ global macports::registry.installtype
+ set is_image_mode [expr 0 == [string compare "image" ${macports::registry.installtype}]]
- # Now process the list, keeping only those ports that are outdated
- set results {}
- if { [llength $ilist] > 0 } {
- foreach i $ilist {
-
- # Get information about the installed port
- set portname [lindex $i 0]
- set installed_version [lindex $i 1]
- set installed_revision [lindex $i 2]
- set installed_compound "${installed_version}_${installed_revision}"
- set installed_variants [lindex $i 3]
+ # Get the list of installed ports
+ set ilist {}
+ if { [catch {set ilist [registry::installed]} result] } {
+ if {$result != "Registry error: No ports registered as installed."} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "port installed failed: $result"
+ }
+ }
- set is_active [lindex $i 4]
- if { $is_active == 0 && $is_image_mode } continue
+ # Now process the list, keeping only those ports that are outdated
+ set results {}
+ if { [llength $ilist] > 0 } {
+ foreach i $ilist {
- set installed_epoch [lindex $i 5]
+ # Get information about the installed port
+ set portname [lindex $i 0]
+ set installed_version [lindex $i 1]
+ set installed_revision [lindex $i 2]
+ set installed_compound "${installed_version}_${installed_revision}"
+ set installed_variants [lindex $i 3]
- # Get info about the port from the index
- if {[catch {set res [mportsearch $portname no exact]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "search for portname $portname failed: $result"
- }
- if {[llength $res] < 2} {
- if {[ui_isset ports_debug]} {
- puts "$portname ($installed_compound is installed; the port was not found in the port index)"
- }
- continue
- }
- array unset portinfo
- array set portinfo [lindex $res 1]
-
- # Get information about latest available version and revision
- set latest_version $portinfo(version)
- set latest_revision 0
- if {[info exists portinfo(revision)] && $portinfo(revision) > 0} {
- set latest_revision $portinfo(revision)
- }
- set latest_compound "${latest_version}_${latest_revision}"
- set latest_epoch 0
- if {[info exists portinfo(epoch)]} {
- set latest_epoch $portinfo(epoch)
- }
-
- # Compare versions, first checking epoch, then version, then revision
- set comp_result [expr $installed_epoch - $latest_epoch]
- if { $comp_result == 0 } {
- set comp_result [rpm-vercomp $installed_version $latest_version]
- if { $comp_result == 0 } {
- set comp_result [rpm-vercomp $installed_revision $latest_revision]
- }
- }
-
- # Add outdated ports to our results list
- if { $comp_result < 0 } {
- add_to_portlist results [list name $portname version $installed_compound variants [split_variants $installed_variants]]
- }
- }
- }
+ set is_active [lindex $i 4]
+ if { $is_active == 0 && $is_image_mode } continue
- return $results
+ set installed_epoch [lindex $i 5]
+
+ # Get info about the port from the index
+ if {[catch {set res [mportsearch $portname no exact]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "search for portname $portname failed: $result"
+ }
+ if {[llength $res] < 2} {
+ if {[ui_isset ports_debug]} {
+ puts "$portname ($installed_compound is installed; the port was not found in the port index)"
+ }
+ continue
+ }
+ array unset portinfo
+ array set portinfo [lindex $res 1]
+
+ # Get information about latest available version and revision
+ set latest_version $portinfo(version)
+ set latest_revision 0
+ if {[info exists portinfo(revision)] && $portinfo(revision) > 0} {
+ set latest_revision $portinfo(revision)
+ }
+ set latest_compound "${latest_version}_${latest_revision}"
+ set latest_epoch 0
+ if {[info exists portinfo(epoch)]} {
+ set latest_epoch $portinfo(epoch)
+ }
+
+ # Compare versions, first checking epoch, then version, then revision
+ set comp_result [expr $installed_epoch - $latest_epoch]
+ if { $comp_result == 0 } {
+ set comp_result [rpm-vercomp $installed_version $latest_version]
+ if { $comp_result == 0 } {
+ set comp_result [rpm-vercomp $installed_revision $latest_revision]
+ }
+ }
+
+ # Add outdated ports to our results list
+ if { $comp_result < 0 } {
+ add_to_portlist results [list name $portname version $installed_compound variants [split_variants $installed_variants]]
+ }
+ }
+ }
+
+ return $results
}
@@ -641,493 +642,493 @@
# Port expressions
##########################################
proc portExpr { resname } {
- upvar $resname reslist
- set result [seqExpr reslist]
- return $result
+ upvar $resname reslist
+ set result [seqExpr reslist]
+ return $result
}
proc seqExpr { resname } {
- upvar $resname reslist
-
- # Evaluate a sequence of expressions a b c...
- # These act the same as a or b or c
+ upvar $resname reslist
+
+ # Evaluate a sequence of expressions a b c...
+ # These act the same as a or b or c
- set result 1
- while {$result} {
- switch -- [lookahead] {
- ; -
- ) -
- _EOF_ { break }
- }
-
- set blist {}
- set result [orExpr blist]
- if {$result} {
- # Calculate the union of result and b
- set reslist [opUnion $reslist $blist]
- }
- }
-
- return $result
+ set result 1
+ while {$result} {
+ switch -- [lookahead] {
+ ; -
+ ) -
+ _EOF_ { break }
+ }
+
+ set blist {}
+ set result [orExpr blist]
+ if {$result} {
+ # Calculate the union of result and b
+ set reslist [opUnion $reslist $blist]
+ }
+ }
+
+ return $result
}
proc orExpr { resname } {
- upvar $resname reslist
-
- set a [andExpr reslist]
- while ($a) {
- switch -- [lookahead] {
- or {
- advance
- set blist {}
- if {![andExpr blist]} {
- return 0
- }
-
- # Calculate a union b
- set reslist [opUnion $reslist $blist]
- }
- default {
- return $a
- }
- }
- }
-
- return $a
+ upvar $resname reslist
+
+ set a [andExpr reslist]
+ while ($a) {
+ switch -- [lookahead] {
+ or {
+ advance
+ set blist {}
+ if {![andExpr blist]} {
+ return 0
+ }
+
+ # Calculate a union b
+ set reslist [opUnion $reslist $blist]
+ }
+ default {
+ return $a
+ }
+ }
+ }
+
+ return $a
}
proc andExpr { resname } {
- upvar $resname reslist
-
- set a [unaryExpr reslist]
- while {$a} {
- switch -- [lookahead] {
- and {
- advance
-
- set blist {}
- set b [unaryExpr blist]
- if {!$b} {
- return 0
- }
-
- # Calculate a intersect b
- set reslist [opIntersection $reslist $blist]
- }
- default {
- return $a
- }
- }
- }
-
- return $a
+ upvar $resname reslist
+
+ set a [unaryExpr reslist]
+ while {$a} {
+ switch -- [lookahead] {
+ and {
+ advance
+
+ set blist {}
+ set b [unaryExpr blist]
+ if {!$b} {
+ return 0
+ }
+
+ # Calculate a intersect b
+ set reslist [opIntersection $reslist $blist]
+ }
+ default {
+ return $a
+ }
+ }
+ }
+
+ return $a
}
proc unaryExpr { resname } {
- upvar $resname reslist
- set result 0
+ upvar $resname reslist
+ set result 0
- switch -- [lookahead] {
- ! -
- not {
- advance
- set blist {}
- set result [unaryExpr blist]
- if {$result} {
- set all [get_all_ports]
- set reslist [opComplement $all $blist]
- }
- }
- default {
- set result [element reslist]
- }
- }
-
- return $result
+ switch -- [lookahead] {
+ ! -
+ not {
+ advance
+ set blist {}
+ set result [unaryExpr blist]
+ if {$result} {
+ set all [get_all_ports]
+ set reslist [opComplement $all $blist]
+ }
+ }
+ default {
+ set result [element reslist]
+ }
+ }
+
+ return $result
}
proc element { resname } {
- upvar $resname reslist
- set el 0
-
- set url ""
- set name ""
- set version ""
- array unset variants
- array unset options
-
- set token [lookahead]
- switch -regex -- $token {
- ^\\)$ -
- ^\; -
- ^_EOF_$ { # End of expression/cmd/file
- }
-
- ^\\($ { # Parenthesized Expression
- advance
- set el [portExpr reslist]
- if {!$el || ![match ")"]} {
- set el 0
- }
- }
-
- ^all(@.*)?$ -
- ^installed(@.*)?$ -
- ^uninstalled(@.*)?$ -
- ^active(@.*)?$ -
- ^inactive(@.*)?$ -
- ^outdated(@.*)?$ -
- ^current(@.*)?$ {
- # A simple pseudo-port name
- advance
-
- # Break off the version component, if there is one
- regexp {^(\w+)(@.*)?} $token matchvar name remainder
-
- add_multiple_ports reslist [get_${name}_ports] $remainder
-
- set el 1
- }
-
- ^variants: -
- ^variant: -
- ^description: -
- ^portdir: -
- ^homepage: -
- ^epoch: -
- ^platforms: -
- ^platform: -
- ^name: -
- ^long_description: -
- ^maintainers: -
- ^maintainer: -
- ^categories: -
- ^category: -
- ^version: -
- ^revision: { # Handle special port selectors
- advance
-
- # Break up the token, because older Tcl switch doesn't support -matchvar
- regexp {^(\w+):(.*)} $token matchvar field pat
-
- # Remap friendly names to actual names
- switch -- $field {
- variant -
- platform -
- maintainer { set field "${field}s" }
- category { set field "categories" }
- }
- add_multiple_ports reslist [get_matching_ports $pat no regexp $field]
- set el 1
- }
-
- [][?*] { # Handle portname glob patterns
- advance; add_multiple_ports reslist [get_matching_ports $token no glob]
- set el 1
- }
-
- ^\\w+:.+ { # Handle a url by trying to open it as a port and mapping the name
- advance
- set name [url_to_portname $token]
- if {$name != ""} {
- parsePortSpec version variants options
- add_to_portlist reslist [list url $token \
- name $name \
- version $version \
- variants [array get variants] \
- options [array get options]]
- } else {
- ui_error "Can't open URL '$token' as a port"
- set el 0
- }
- set el 1
- }
-
- default { # Treat anything else as a portspec (portname, version, variants, options
- # or some combination thereof).
- parseFullPortSpec url name version variants options
- add_to_portlist reslist [list url $url \
- name $name \
- version $version \
- variants [array get variants] \
- options [array get options]]
- set el 1
- }
- }
-
- return $el
+ upvar $resname reslist
+ set el 0
+
+ set url ""
+ set name ""
+ set version ""
+ array unset variants
+ array unset options
+
+ set token [lookahead]
+ switch -regex -- $token {
+ ^\\)$ -
+ ^\; -
+ ^_EOF_$ { # End of expression/cmd/file
+ }
+
+ ^\\($ { # Parenthesized Expression
+ advance
+ set el [portExpr reslist]
+ if {!$el || ![match ")"]} {
+ set el 0
+ }
+ }
+
+ ^all(@.*)?$ -
+ ^installed(@.*)?$ -
+ ^uninstalled(@.*)?$ -
+ ^active(@.*)?$ -
+ ^inactive(@.*)?$ -
+ ^outdated(@.*)?$ -
+ ^current(@.*)?$ {
+ # A simple pseudo-port name
+ advance
+
+ # Break off the version component, if there is one
+ regexp {^(\w+)(@.*)?} $token matchvar name remainder
+
+ add_multiple_ports reslist [get_${name}_ports] $remainder
+
+ set el 1
+ }
+
+ ^variants: -
+ ^variant: -
+ ^description: -
+ ^portdir: -
+ ^homepage: -
+ ^epoch: -
+ ^platforms: -
+ ^platform: -
+ ^name: -
+ ^long_description: -
+ ^maintainers: -
+ ^maintainer: -
+ ^categories: -
+ ^category: -
+ ^version: -
+ ^revision: { # Handle special port selectors
+ advance
+
+ # Break up the token, because older Tcl switch doesn't support -matchvar
+ regexp {^(\w+):(.*)} $token matchvar field pat
+
+ # Remap friendly names to actual names
+ switch -- $field {
+ variant -
+ platform -
+ maintainer { set field "${field}s" }
+ category { set field "categories" }
+ }
+ add_multiple_ports reslist [get_matching_ports $pat no regexp $field]
+ set el 1
+ }
+
+ [][?*] { # Handle portname glob patterns
+ advance; add_multiple_ports reslist [get_matching_ports $token no glob]
+ set el 1
+ }
+
+ ^\\w+:.+ { # Handle a url by trying to open it as a port and mapping the name
+ advance
+ set name [url_to_portname $token]
+ if {$name != ""} {
+ parsePortSpec version variants options
+ add_to_portlist reslist [list url $token \
+ name $name \
+ version $version \
+ variants [array get variants] \
+ options [array get options]]
+ } else {
+ ui_error "Can't open URL '$token' as a port"
+ set el 0
+ }
+ set el 1
+ }
+
+ default { # Treat anything else as a portspec (portname, version, variants, options
+ # or some combination thereof).
+ parseFullPortSpec url name version variants options
+ add_to_portlist reslist [list url $url \
+ name $name \
+ version $version \
+ variants [array get variants] \
+ options [array get options]]
+ set el 1
+ }
+ }
+
+ return $el
}
proc add_multiple_ports { resname ports {remainder ""} } {
- upvar $resname reslist
-
- set version ""
- array unset variants
- array unset options
- parsePortSpec version variants options $remainder
-
- array unset overrides
- if {$version != ""} { set overrides(version) $version }
- if {[array size variants]} { set overrides(variants) [array get variants] }
- if {[array size options]} { set overrides(options) [array get options] }
+ upvar $resname reslist
+
+ set version ""
+ array unset variants
+ array unset options
+ parsePortSpec version variants options $remainder
+
+ array unset overrides
+ if {$version != ""} { set overrides(version) $version }
+ if {[array size variants]} { set overrides(variants) [array get variants] }
+ if {[array size options]} { set overrides(options) [array get options] }
- add_ports_to_portlist reslist $ports [array get overrides]
+ add_ports_to_portlist reslist $ports [array get overrides]
}
proc opUnion { a b } {
- set result {}
-
- array unset onetime
-
- # Walk through each array, adding to result only those items that haven't
- # been added before
- foreach item $a {
- array set port $item
- if {[info exists onetime($port(fullname))]} continue
- lappend result $item
- }
+ set result {}
+
+ array unset onetime
+
+ # Walk through each array, adding to result only those items that haven't
+ # been added before
+ foreach item $a {
+ array set port $item
+ if {[info exists onetime($port(fullname))]} continue
+ lappend result $item
+ }
- foreach item $b {
- array set port $item
- if {[info exists onetime($port(fullname))]} continue
- lappend result $item
- }
-
- return $result
+ foreach item $b {
+ array set port $item
+ if {[info exists onetime($port(fullname))]} continue
+ lappend result $item
+ }
+
+ return $result
}
proc opIntersection { a b } {
- set result {}
-
- # Rules we follow in performing the intersection of two port lists:
- #
- # a/, a/ ==> a/
- # a/, b/ ==>
- # a/, a/1.0 ==> a/1.0
- # a/1.0, a/ ==> a/1.0
- # a/1.0, a/2.0 ==>
- #
- # If there's an exact match, we take it.
- # If there's a match between simple and descriminated, we take the later.
-
- # First create a list of the fully descriminated names in b
- array unset bfull
- set i 0
- foreach bitem $b {
- array set port $bitem
- set bfull($port(fullname)) $i
- incr i
- }
-
- # Walk through each item in a, matching against b
- foreach aitem $a {
- array set port $aitem
-
- # Quote the fullname and portname to avoid special characters messing up the regexp
- set safefullname [regex_pat_sanitize $port(fullname)]
-
- set simpleform [expr { "$port(name)/" == $port(fullname) }]
- if {$simpleform} {
- set pat "^${safefullname}"
- } else {
- set safename [regex_pat_sanitize $port(name)]
- set pat "^${safefullname}$|^${safename}/$"
- }
-
- set matches [array names bfull -regexp $pat]
- foreach match $matches {
- if {$simpleform} {
- set i $bfull($match)
- lappend result [lindex $b $i]
- } else {
- lappend result $aitem
- }
- }
- }
-
- return $result
+ set result {}
+
+ # Rules we follow in performing the intersection of two port lists:
+ #
+ # a/, a/ ==> a/
+ # a/, b/ ==>
+ # a/, a/1.0 ==> a/1.0
+ # a/1.0, a/ ==> a/1.0
+ # a/1.0, a/2.0 ==>
+ #
+ # If there's an exact match, we take it.
+ # If there's a match between simple and descriminated, we take the later.
+
+ # First create a list of the fully descriminated names in b
+ array unset bfull
+ set i 0
+ foreach bitem $b {
+ array set port $bitem
+ set bfull($port(fullname)) $i
+ incr i
+ }
+
+ # Walk through each item in a, matching against b
+ foreach aitem $a {
+ array set port $aitem
+
+ # Quote the fullname and portname to avoid special characters messing up the regexp
+ set safefullname [regex_pat_sanitize $port(fullname)]
+
+ set simpleform [expr { "$port(name)/" == $port(fullname) }]
+ if {$simpleform} {
+ set pat "^${safefullname}"
+ } else {
+ set safename [regex_pat_sanitize $port(name)]
+ set pat "^${safefullname}$|^${safename}/$"
+ }
+
+ set matches [array names bfull -regexp $pat]
+ foreach match $matches {
+ if {$simpleform} {
+ set i $bfull($match)
+ lappend result [lindex $b $i]
+ } else {
+ lappend result $aitem
+ }
+ }
+ }
+
+ return $result
}
proc opComplement { a b } {
- set result {}
-
- # Return all elements of a not matching elements in b
-
- # First create a list of the fully descriminated names in b
- array unset bfull
- set i 0
- foreach bitem $b {
- array set port $bitem
- set bfull($port(fullname)) $i
- incr i
- }
-
- # Walk through each item in a, taking all those items that don't match b
- #
- # Note: -regexp may not be present in all versions of Tcl we need to work
- # against, in which case we may have to fall back to a slower alternative
- # for those cases. I'm not worrying about that for now, however. -jdb
- foreach aitem $a {
- array set port $aitem
-
- # Quote the fullname and portname to avoid special characters messing up the regexp
- set safefullname [regex_pat_sanitize $port(fullname)]
-
- set simpleform [expr { "$port(name)/" == $port(fullname) }]
- if {$simpleform} {
- set pat "^${safefullname}"
- } else {
- set safename [regex_pat_sanitize $port(name)]
- set pat "^${safefullname}$|^${safename}/$"
- }
-
- set matches [array names bfull -regexp $pat]
+ set result {}
+
+ # Return all elements of a not matching elements in b
+
+ # First create a list of the fully descriminated names in b
+ array unset bfull
+ set i 0
+ foreach bitem $b {
+ array set port $bitem
+ set bfull($port(fullname)) $i
+ incr i
+ }
+
+ # Walk through each item in a, taking all those items that don't match b
+ #
+ # Note: -regexp may not be present in all versions of Tcl we need to work
+ # against, in which case we may have to fall back to a slower alternative
+ # for those cases. I'm not worrying about that for now, however. -jdb
+ foreach aitem $a {
+ array set port $aitem
+
+ # Quote the fullname and portname to avoid special characters messing up the regexp
+ set safefullname [regex_pat_sanitize $port(fullname)]
+
+ set simpleform [expr { "$port(name)/" == $port(fullname) }]
+ if {$simpleform} {
+ set pat "^${safefullname}"
+ } else {
+ set safename [regex_pat_sanitize $port(name)]
+ set pat "^${safefullname}$|^${safename}/$"
+ }
+
+ set matches [array names bfull -regexp $pat]
- # We copy this element to result only if it didn't match against b
- if {![llength $matches]} {
- lappend result $aitem
- }
- }
-
- return $result
+ # We copy this element to result only if it didn't match against b
+ if {![llength $matches]} {
+ lappend result $aitem
+ }
+ }
+
+ return $result
}
proc parseFullPortSpec { urlname namename vername varname optname } {
- upvar $urlname porturl
- upvar $namename portname
- upvar $vername portversion
- upvar $varname portvariants
- upvar $optname portoptions
-
- set portname ""
- set portversion ""
- array unset portvariants
- array unset portoptions
-
- if { [moreargs] } {
- # Look first for a potential portname
- #
- # We need to allow a wide variaty of tokens here, because of actions like "provides"
- # so we take a rather lenient view of what a "portname" is. We allow
- # anything that doesn't look like either a version, a variant, or an option
- set token [lookahead]
+ upvar $urlname porturl
+ upvar $namename portname
+ upvar $vername portversion
+ upvar $varname portvariants
+ upvar $optname portoptions
+
+ set portname ""
+ set portversion ""
+ array unset portvariants
+ array unset portoptions
+
+ if { [moreargs] } {
+ # Look first for a potential portname
+ #
+ # We need to allow a wide variaty of tokens here, because of actions like "provides"
+ # so we take a rather lenient view of what a "portname" is. We allow
+ # anything that doesn't look like either a version, a variant, or an option
+ set token [lookahead]
- set remainder ""
- if {![regexp {^(@|[-+]([[:alpha:]_]+[\w\.]*)|[[:alpha:]_]+[\w\.]*=)} $token match]} {
- advance
- regexp {^([^@]+)(@.*)?} $token match portname remainder
-
- # If the portname contains a /, then try to use it as a URL
- if {[string match "*/*" $portname]} {
- set url "file://$portname"
- set name [url_to_portname $url 1]
- if { $name != "" } {
- # We mapped the url to valid port
- set porturl $url
- set portname $name
- # Continue to parse rest of portspec....
- } else {
- # We didn't map the url to a port; treat it
- # as a raw string for something like port contents
- # or cd
- set porturl ""
- # Since this isn't a port, we don't try to parse
- # any remaining portspec....
- return
- }
- }
- }
-
- # Now parse the rest of the spec
- parsePortSpec portversion portvariants portoptions $remainder
- }
+ set remainder ""
+ if {![regexp {^(@|[-+]([[:alpha:]_]+[\w\.]*)|[[:alpha:]_]+[\w\.]*=)} $token match]} {
+ advance
+ regexp {^([^@]+)(@.*)?} $token match portname remainder
+
+ # If the portname contains a /, then try to use it as a URL
+ if {[string match "*/*" $portname]} {
+ set url "file://$portname"
+ set name [url_to_portname $url 1]
+ if { $name != "" } {
+ # We mapped the url to valid port
+ set porturl $url
+ set portname $name
+ # Continue to parse rest of portspec....
+ } else {
+ # We didn't map the url to a port; treat it
+ # as a raw string for something like port contents
+ # or cd
+ set porturl ""
+ # Since this isn't a port, we don't try to parse
+ # any remaining portspec....
+ return
+ }
+ }
+ }
+
+ # Now parse the rest of the spec
+ parsePortSpec portversion portvariants portoptions $remainder
+ }
}
-
+
proc parsePortSpec { vername varname optname {remainder ""} } {
- upvar $vername portversion
- upvar $varname portvariants
- upvar $optname portoptions
-
- global global_options
-
- set portversion ""
- array unset portoptions
- array set portoptions [array get global_options]
- array unset portvariants
-
- # Parse port version/variants/options
- set opt $remainder
- set adv 0
- set consumed 0
- for {set firstTime 1} {$opt != "" || [moreargs]} {set firstTime 0} {
-
- # Refresh opt as needed
- if {$opt == ""} {
- if {$adv} advance
- set opt [lookahead]
- set adv 1
- set consumed 0
- }
-
- # Version must be first, if it's there at all
- if {$firstTime && [string match {@*} $opt]} {
- # Parse the version
-
- # Strip the @
- set opt [string range $opt 1 end]
-
- # Handle the version
- set sepPos [string first "/" $opt]
- if {$sepPos >= 0} {
- # Version terminated by "/" to disambiguate -variant from part of version
- set portversion [string range $opt 0 [expr $sepPos-1]]
- set opt [string range $opt [expr $sepPos+1] end]
- } else {
- # Version terminated by "+", or else is complete
- set sepPos [string first "+" $opt]
- if {$sepPos >= 0} {
- # Version terminated by "+"
- set portversion [string range $opt 0 [expr $sepPos-1]]
- set opt [string range $opt $sepPos end]
- } else {
- # Unterminated version
- set portversion $opt
- set opt ""
- }
- }
- set consumed 1
- } else {
- # Parse all other options
-
- # Look first for a variable setting: VARNAME=VALUE
- if {[regexp {^([[:alpha:]_]+[\w\.]*)=(.*)} $opt match key val] == 1} {
- # It's a variable setting
- set portoptions($key) "\"$val\""
- set opt ""
- set consumed 1
- } elseif {[regexp {^([-+])([[:alpha:]_]+[\w\.]*)} $opt match sign variant] == 1} {
- # It's a variant
- set portvariants($variant) $sign
- set opt [string range $opt [expr [string length $variant]+1] end]
- set consumed 1
- } else {
- # Not an option we recognize, so break from port option processing
- if { $consumed && $adv } advance
- break
- }
- }
- }
+ upvar $vername portversion
+ upvar $varname portvariants
+ upvar $optname portoptions
+
+ global global_options
+
+ set portversion ""
+ array unset portoptions
+ array set portoptions [array get global_options]
+ array unset portvariants
+
+ # Parse port version/variants/options
+ set opt $remainder
+ set adv 0
+ set consumed 0
+ for {set firstTime 1} {$opt != "" || [moreargs]} {set firstTime 0} {
+
+ # Refresh opt as needed
+ if {$opt == ""} {
+ if {$adv} advance
+ set opt [lookahead]
+ set adv 1
+ set consumed 0
+ }
+
+ # Version must be first, if it's there at all
+ if {$firstTime && [string match {@*} $opt]} {
+ # Parse the version
+
+ # Strip the @
+ set opt [string range $opt 1 end]
+
+ # Handle the version
+ set sepPos [string first "/" $opt]
+ if {$sepPos >= 0} {
+ # Version terminated by "/" to disambiguate -variant from part of version
+ set portversion [string range $opt 0 [expr $sepPos-1]]
+ set opt [string range $opt [expr $sepPos+1] end]
+ } else {
+ # Version terminated by "+", or else is complete
+ set sepPos [string first "+" $opt]
+ if {$sepPos >= 0} {
+ # Version terminated by "+"
+ set portversion [string range $opt 0 [expr $sepPos-1]]
+ set opt [string range $opt $sepPos end]
+ } else {
+ # Unterminated version
+ set portversion $opt
+ set opt ""
+ }
+ }
+ set consumed 1
+ } else {
+ # Parse all other options
+
+ # Look first for a variable setting: VARNAME=VALUE
+ if {[regexp {^([[:alpha:]_]+[\w\.]*)=(.*)} $opt match key val] == 1} {
+ # It's a variable setting
+ set portoptions($key) "\"$val\""
+ set opt ""
+ set consumed 1
+ } elseif {[regexp {^([-+])([[:alpha:]_]+[\w\.]*)} $opt match sign variant] == 1} {
+ # It's a variant
+ set portvariants($variant) $sign
+ set opt [string range $opt [expr [string length $variant]+1] end]
+ set consumed 1
+ } else {
+ # Not an option we recognize, so break from port option processing
+ if { $consumed && $adv } advance
+ break
+ }
+ }
+ }
}
@@ -1136,14 +1137,14 @@
##########################################
proc action_usage { action portlist opts } {
- print_usage
- return 0
+ print_usage
+ return 0
}
proc action_help { action portlist opts } {
- print_help
- return 0
+ print_help
+ return 0
}
@@ -1190,23 +1191,23 @@
# Map from friendly to less-friendly but real names
array set name_map "
- category categories
- maintainer maintainers
- platform platforms
- variant variants
- "
+ category categories
+ maintainer maintainers
+ platform platforms
+ variant variants
+ "
# Understand which info items are actually lists
# (this could be overloaded to provide a generic formatting code to
# allow us to, say, split off the prefix on libs)
array set list_map "
- categories 1
- depends_build 1
- depends_lib 1
- maintainers 1
- platforms 1
- variants 1
- "
+ categories 1
+ depends_build 1
+ depends_lib 1
+ maintainers 1
+ platforms 1
+ variants 1
+ "
# Set up our field separators
set show_label 1
@@ -1324,813 +1325,813 @@
proc action_location { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- if { [catch {set ilist [registry_installed $portname [composite_version $portversion [array get variations]]]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port location failed: $result" 1 status
- } else {
- set version [lindex $ilist 1]
- set revision [lindex $ilist 2]
- set variants [lindex $ilist 3]
- }
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ if { [catch {set ilist [registry_installed $portname [composite_version $portversion [array get variations]]]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port location failed: $result" 1 status
+ } else {
+ set version [lindex $ilist 1]
+ set revision [lindex $ilist 2]
+ set variants [lindex $ilist 3]
+ }
- set ref [registry::open_entry $portname $version $revision $variants]
- if { [string equal [registry::property_retrieve $ref installtype] "image"] } {
- set imagedir [registry::property_retrieve $ref imagedir]
- puts "Port $portname ${version}_${revision}${variants} is installed as an image in:"
- puts $imagedir
- } else {
- break_softcontinue "Port $portname is not installed as an image." 1 status
- }
- }
-
- return $status
+ set ref [registry::open_entry $portname $version $revision $variants]
+ if { [string equal [registry::property_retrieve $ref installtype] "image"] } {
+ set imagedir [registry::property_retrieve $ref imagedir]
+ puts "Port $portname ${version}_${revision}${variants} is installed as an image in:"
+ puts $imagedir
+ } else {
+ break_softcontinue "Port $portname is not installed as an image." 1 status
+ }
+ }
+
+ return $status
}
proc action_provides { action portlist opts } {
- # In this case, portname is going to be used for the filename... since
- # that is the first argument we expect... perhaps there is a better way
- # to do this?
- if { ![llength $portlist] } {
- ui_error "Please specify a filename to check which port provides that file."
- return 1
- }
- foreachport $portlist {
- set file [compat filenormalize $portname]
- if {[file exists $file]} {
- if {![file isdirectory $file]} {
- set port [registry::file_registered $file]
- if { $port != 0 } {
- puts "$file is provided by: $port"
- } else {
- puts "$file is not provided by a MacPorts port."
- }
- } else {
- puts "$file is a directory."
- }
- } else {
- puts "$file does not exist."
- }
- }
-
- return 0
+ # In this case, portname is going to be used for the filename... since
+ # that is the first argument we expect... perhaps there is a better way
+ # to do this?
+ if { ![llength $portlist] } {
+ ui_error "Please specify a filename to check which port provides that file."
+ return 1
+ }
+ foreachport $portlist {
+ set file [compat filenormalize $portname]
+ if {[file exists $file]} {
+ if {![file isdirectory $file]} {
+ set port [registry::file_registered $file]
+ if { $port != 0 } {
+ puts "$file is provided by: $port"
+ } else {
+ puts "$file is not provided by a MacPorts port."
+ }
+ } else {
+ puts "$file is a directory."
+ }
+ } else {
+ puts "$file does not exist."
+ }
+ }
+
+ return 0
}
proc action_activate { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- if { [catch {portimage::activate $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port activate failed: $result" 1 status
- }
- }
-
- return $status
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ if { [catch {portimage::activate $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port activate failed: $result" 1 status
+ }
+ }
+
+ return $status
}
proc action_deactivate { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- if { [catch {portimage::deactivate $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port deactivate failed: $result" 1 status
- }
- }
-
- return $status
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ if { [catch {portimage::deactivate $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port deactivate failed: $result" 1 status
+ }
+ }
+
+ return $status
}
proc action_selfupdate { action portlist opts } {
- global global_options
- if { [catch {macports::selfupdate [array get global_options]} result ] } {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "selfupdate failed: $result"
- }
-
- return 0
+ global global_options
+ if { [catch {macports::selfupdate [array get global_options]} result ] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "selfupdate failed: $result"
+ }
+
+ return 0
}
proc action_upgrade { action portlist opts } {
global global_variations
- require_portlist portlist
- foreachport $portlist {
- # Merge global variations into the variations specified for this port
- foreach { variation value } [array get global_variations] {
- if { ![info exists variations($variation)] } {
- set variations($variation) $value
- }
- }
-
- macports::upgrade $portname "port:$portname" [array get variations] [array get options]
- }
-
- return 0
+ require_portlist portlist
+ foreachport $portlist {
+ # Merge global variations into the variations specified for this port
+ foreach { variation value } [array get global_variations] {
+ if { ![info exists variations($variation)] } {
+ set variations($variation) $value
+ }
+ }
+
+ macports::upgrade $portname "port:$portname" [array get variations] [array get options]
+ }
+
+ return 0
}
proc action_version { action portlist opts } {
- puts "Version: [macports::version]"
- return 0
+ puts "Version: [macports::version]"
+ return 0
}
proc action_compact { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- if { [catch {portimage::compact $portname [composite_version $portversion [array get variations]]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port compact failed: $result" 1 status
- }
- }
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ if { [catch {portimage::compact $portname [composite_version $portversion [array get variations]]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port compact failed: $result" 1 status
+ }
+ }
- return $status
+ return $status
}
proc action_uncompact { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- if { [catch {portimage::uncompact $portname [composite_version $portversion [array get variations]]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port uncompact failed: $result" 1 status
- }
- }
-
- return $status
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ if { [catch {portimage::uncompact $portname [composite_version $portversion [array get variations]]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port uncompact failed: $result" 1 status
+ }
+ }
+
+ return $status
}
proc action_dependents { action portlist opts } {
- require_portlist portlist
- foreachport $portlist {
- registry::open_dep_map
- set deplist [registry::list_dependents $portname]
+ require_portlist portlist
+ foreachport $portlist {
+ registry::open_dep_map
+ set deplist [registry::list_dependents $portname]
- if { [llength $deplist] > 0 } {
- set dl [list]
- # Check the deps first
- foreach dep $deplist {
- set depport [lindex $dep 2]
- ui_msg "$depport depends on $portname"
- }
- } else {
- ui_msg "$portname has no dependents!"
- }
- }
- return 0
+ if { [llength $deplist] > 0 } {
+ set dl [list]
+ # Check the deps first
+ foreach dep $deplist {
+ set depport [lindex $dep 2]
+ ui_msg "$depport depends on $portname"
+ }
+ } else {
+ ui_msg "$portname has no dependents!"
+ }
+ }
+ return 0
}
proc action_uninstall { action portlist opts } {
- set status 0
- if {[global_option_isset port_uninstall_old]} {
- # if -u then uninstall all inactive ports
- # (union these to any other ports user has in the port list)
- set portlist [opUnion $portlist [get_inactive_ports]]
- } else {
- # Otherwise the user had better have supplied a portlist, or we'll default to the existing directory
- require_portlist portlist
- }
+ set status 0
+ if {[global_option_isset port_uninstall_old]} {
+ # if -u then uninstall all inactive ports
+ # (union these to any other ports user has in the port list)
+ set portlist [opUnion $portlist [get_inactive_ports]]
+ } else {
+ # Otherwise the user had better have supplied a portlist, or we'll default to the existing directory
+ require_portlist portlist
+ }
- foreachport $portlist {
- if { [catch {portuninstall::uninstall $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port uninstall failed: $result" 1 status
- }
- }
-
- return 0
+ foreachport $portlist {
+ if { [catch {portuninstall::uninstall $portname [composite_version $portversion [array get variations]] [array get options]} result] } {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port uninstall failed: $result" 1 status
+ }
+ }
+
+ return 0
}
proc action_installed { action portlist opts } {
- set status 0
- set restrictedList 0
- set ilist {}
-
- if { [llength $portlist] || ![global_option_isset ports_no_args]} {
- set restrictedList 1
- foreachport $portlist {
- set composite_version [composite_version $portversion [array get variations]]
- if { [catch {set ilist [concat $ilist [registry::installed $portname $composite_version]]} result] } {
- if {![string match "* not registered as installed." $result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port installed failed: $result" 1 status
- }
- }
- }
- } else {
- if { [catch {set ilist [registry::installed]} result] } {
- if {$result != "Registry error: No ports registered as installed."} {
- global errorInfo
- ui_debug "$errorInfo"
- ui_error "port installed failed: $result"
- set status 1
- }
- }
- }
- if { [llength $ilist] > 0 } {
- puts "The following ports are currently installed:"
- foreach i $ilist {
- set iname [lindex $i 0]
- set iversion [lindex $i 1]
- set irevision [lindex $i 2]
- set ivariants [lindex $i 3]
- set iactive [lindex $i 4]
- if { $iactive == 0 } {
- puts " $iname @${iversion}_${irevision}${ivariants}"
- } elseif { $iactive == 1 } {
- puts " $iname @${iversion}_${irevision}${ivariants} (active)"
- }
- }
- } elseif { $restrictedList } {
- puts "None of the specified ports are installed."
- } else {
- puts "No ports are installed."
- }
-
- return $status
+ set status 0
+ set restrictedList 0
+ set ilist {}
+
+ if { [llength $portlist] || ![global_option_isset ports_no_args]} {
+ set restrictedList 1
+ foreachport $portlist {
+ set composite_version [composite_version $portversion [array get variations]]
+ if { [catch {set ilist [concat $ilist [registry::installed $portname $composite_version]]} result] } {
+ if {![string match "* not registered as installed." $result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port installed failed: $result" 1 status
+ }
+ }
+ }
+ } else {
+ if { [catch {set ilist [registry::installed]} result] } {
+ if {$result != "Registry error: No ports registered as installed."} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ ui_error "port installed failed: $result"
+ set status 1
+ }
+ }
+ }
+ if { [llength $ilist] > 0 } {
+ puts "The following ports are currently installed:"
+ foreach i $ilist {
+ set iname [lindex $i 0]
+ set iversion [lindex $i 1]
+ set irevision [lindex $i 2]
+ set ivariants [lindex $i 3]
+ set iactive [lindex $i 4]
+ if { $iactive == 0 } {
+ puts " $iname @${iversion}_${irevision}${ivariants}"
+ } elseif { $iactive == 1 } {
+ puts " $iname @${iversion}_${irevision}${ivariants} (active)"
+ }
+ }
+ } elseif { $restrictedList } {
+ puts "None of the specified ports are installed."
+ } else {
+ puts "No ports are installed."
+ }
+
+ return $status
}
proc action_outdated { action portlist opts } {
- global macports::registry.installtype
- set is_image_mode [expr 0 == [string compare "image" ${macports::registry.installtype}]]
+ global macports::registry.installtype
+ set is_image_mode [expr 0 == [string compare "image" ${macports::registry.installtype}]]
- set status 0
+ set status 0
- # If port names were supplied, limit ourselves to those ports, else check all installed ports
- set ilist {}
- set restrictedList 0
- if { [llength $portlist] || ![global_option_isset ports_no_args]} {
- set restrictedList 1
- foreach portspec $portlist {
- array set port $portspec
- set portname $port(name)
- set composite_version [composite_version $port(version) $port(variants)]
- if { [catch {set ilist [concat $ilist [registry::installed $portname $composite_version]]} result] } {
- if {![string match "* not registered as installed." $result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "port outdated failed: $result" 1 status
- }
- }
- }
- } else {
- if { [catch {set ilist [registry::installed]} result] } {
- if {$result != "Registry error: No ports registered as installed."} {
- global errorInfo
- ui_debug "$errorInfo"
- ui_error "port installed failed: $result"
- set status 1
- }
- }
- }
+ # If port names were supplied, limit ourselves to those ports, else check all installed ports
+ set ilist {}
+ set restrictedList 0
+ if { [llength $portlist] || ![global_option_isset ports_no_args]} {
+ set restrictedList 1
+ foreach portspec $portlist {
+ array set port $portspec
+ set portname $port(name)
+ set composite_version [composite_version $port(version) $port(variants)]
+ if { [catch {set ilist [concat $ilist [registry::installed $portname $composite_version]]} result] } {
+ if {![string match "* not registered as installed." $result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "port outdated failed: $result" 1 status
+ }
+ }
+ }
+ } else {
+ if { [catch {set ilist [registry::installed]} result] } {
+ if {$result != "Registry error: No ports registered as installed."} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ ui_error "port installed failed: $result"
+ set status 1
+ }
+ }
+ }
- set num_outdated 0
- if { [llength $ilist] > 0 } {
- foreach i $ilist {
-
- # Get information about the installed port
- set portname [lindex $i 0]
- set installed_version [lindex $i 1]
- set installed_revision [lindex $i 2]
- set installed_compound "${installed_version}_${installed_revision}"
+ set num_outdated 0
+ if { [llength $ilist] > 0 } {
+ foreach i $ilist {
+
+ # Get information about the installed port
+ set portname [lindex $i 0]
+ set installed_version [lindex $i 1]
+ set installed_revision [lindex $i 2]
+ set installed_compound "${installed_version}_${installed_revision}"
- set is_active [lindex $i 4]
+ set is_active [lindex $i 4]
if { $is_active == 0 && $is_image_mode } {
- continue
- }
- set installed_epoch [lindex $i 5]
+ continue
+ }
+ set installed_epoch [lindex $i 5]
- # Get info about the port from the index
- if {[catch {set res [mportsearch $portname no exact]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
- if {[llength $res] < 2} {
- if {[ui_isset ports_debug]} {
- puts "$portname ($installed_compound is installed; the port was not found in the port index)"
- }
- continue
- }
- array unset portinfo
- array set portinfo [lindex $res 1]
-
- # Get information about latest available version and revision
- set latest_version $portinfo(version)
- set latest_revision 0
- if {[info exists portinfo(revision)] && $portinfo(revision) > 0} {
- set latest_revision $portinfo(revision)
- }
- set latest_compound "${latest_version}_${latest_revision}"
- set latest_epoch 0
- if {[info exists portinfo(epoch)]} {
- set latest_epoch $portinfo(epoch)
- }
-
- # Compare versions, first checking epoch, then version, then revision
- set comp_result [expr $installed_epoch - $latest_epoch]
- if { $comp_result == 0 } {
- set comp_result [rpm-vercomp $installed_version $latest_version]
- if { $comp_result == 0 } {
- set comp_result [rpm-vercomp $installed_revision $latest_revision]
- }
- }
-
- # Report outdated (or, for verbose, predated) versions
- if { $comp_result != 0 } {
-
- # Form a relation between the versions
- set flag ""
- if { $comp_result > 0 } {
- set relation ">"
- set flag "!"
- } else {
- set relation "<"
- }
-
- # Emit information
- if {$comp_result < 0 || [ui_isset ports_verbose]} {
-
- if { $num_outdated == 0 } {
- puts "The following installed ports are outdated:"
- }
- incr num_outdated
+ # Get info about the port from the index
+ if {[catch {set res [mportsearch $portname no exact]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
+ if {[llength $res] < 2} {
+ if {[ui_isset ports_debug]} {
+ puts "$portname ($installed_compound is installed; the port was not found in the port index)"
+ }
+ continue
+ }
+ array unset portinfo
+ array set portinfo [lindex $res 1]
+
+ # Get information about latest available version and revision
+ set latest_version $portinfo(version)
+ set latest_revision 0
+ if {[info exists portinfo(revision)] && $portinfo(revision) > 0} {
+ set latest_revision $portinfo(revision)
+ }
+ set latest_compound "${latest_version}_${latest_revision}"
+ set latest_epoch 0
+ if {[info exists portinfo(epoch)]} {
+ set latest_epoch $portinfo(epoch)
+ }
+
+ # Compare versions, first checking epoch, then version, then revision
+ set comp_result [expr $installed_epoch - $latest_epoch]
+ if { $comp_result == 0 } {
+ set comp_result [rpm-vercomp $installed_version $latest_version]
+ if { $comp_result == 0 } {
+ set comp_result [rpm-vercomp $installed_revision $latest_revision]
+ }
+ }
+
+ # Report outdated (or, for verbose, predated) versions
+ if { $comp_result != 0 } {
+
+ # Form a relation between the versions
+ set flag ""
+ if { $comp_result > 0 } {
+ set relation ">"
+ set flag "!"
+ } else {
+ set relation "<"
+ }
+
+ # Emit information
+ if {$comp_result < 0 || [ui_isset ports_verbose]} {
+
+ if { $num_outdated == 0 } {
+ puts "The following installed ports are outdated:"
+ }
+ incr num_outdated
- puts [format "%-30s %-24s %1s" $portname "$installed_compound $relation $latest_compound" $flag]
- }
-
- }
- }
-
- if { $num_outdated == 0 } {
- puts "No installed ports are outdated."
- }
- } elseif { $restrictedList } {
- puts "None of the specified ports are outdated."
- } else {
- puts "No ports are installed."
- }
-
- return $status
+ puts [format "%-30s %-24s %1s" $portname "$installed_compound $relation $latest_compound" $flag]
+ }
+
+ }
+ }
+
+ if { $num_outdated == 0 } {
+ puts "No installed ports are outdated."
+ }
+ } elseif { $restrictedList } {
+ puts "None of the specified ports are outdated."
+ } else {
+ puts "No ports are installed."
+ }
+
+ return $status
}
proc action_contents { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- set files [registry::port_registered $portname]
- if { $files != 0 } {
- if { [llength $files] > 0 } {
- puts "Port $portname contains:"
- foreach file $files {
- puts " $file"
- }
- } else {
- puts "Port $portname does not contain any file or is not active."
- }
- } else {
- puts "Port $portname is not installed."
- }
- }
-
- return $status
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ set files [registry::port_registered $portname]
+ if { $files != 0 } {
+ if { [llength $files] > 0 } {
+ puts "Port $portname contains:"
+ foreach file $files {
+ puts " $file"
+ }
+ } else {
+ puts "Port $portname does not contain any file or is not active."
+ }
+ } else {
+ puts "Port $portname is not installed."
+ }
+ }
+
+ return $status
}
proc action_deps { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- # Get info about the port
- if {[catch {mportsearch $portname no exact} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ # Get info about the port
+ if {[catch {mportsearch $portname no exact} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
- if {$result == ""} {
- break_softcontinue "No port $portname found." 1 status
- }
+ if {$result == ""} {
+ break_softcontinue "No port $portname found." 1 status
+ }
- array unset portinfo
- array set portinfo [lindex $result 1]
+ array unset portinfo
+ array set portinfo [lindex $result 1]
- set depstypes {depends_build depends_lib depends_run}
- set depstypes_descr {"build" "library" "runtime"}
+ set depstypes {depends_build depends_lib depends_run}
+ set depstypes_descr {"build" "library" "runtime"}
- set nodeps true
- foreach depstype $depstypes depsdecr $depstypes_descr {
- if {[info exists portinfo($depstype)] &&
- $portinfo($depstype) != ""} {
- puts "$portname has $depsdecr dependencies on:"
- foreach i $portinfo($depstype) {
- puts "\t[lindex [split [lindex $i 0] :] end]"
- }
- set nodeps false
- }
- }
-
- # no dependencies found
- if {$nodeps == "true"} {
- puts "$portname has no dependencies"
- }
- }
-
- return $status
+ set nodeps true
+ foreach depstype $depstypes depsdecr $depstypes_descr {
+ if {[info exists portinfo($depstype)] &&
+ $portinfo($depstype) != ""} {
+ puts "$portname has $depsdecr dependencies on:"
+ foreach i $portinfo($depstype) {
+ puts "\t[lindex [split [lindex $i 0] :] end]"
+ }
+ set nodeps false
+ }
+ }
+
+ # no dependencies found
+ if {$nodeps == "true"} {
+ puts "$portname has no dependencies"
+ }
+ }
+
+ return $status
}
proc action_variants { action portlist opts } {
- set status 0
- require_portlist portlist
- foreachport $portlist {
- # search for port
- if {[catch {mportsearch $portname no exact} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
-
- if {$result == ""} {
- puts "No port $portname found."
- }
-
- array unset portinfo
- array set portinfo [lindex $result 1]
- set porturl $portinfo(porturl)
- set portdir $portinfo(portdir)
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ # search for port
+ if {[catch {mportsearch $portname no exact} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
+
+ if {$result == ""} {
+ puts "No port $portname found."
+ }
+
+ array unset portinfo
+ array set portinfo [lindex $result 1]
+ set porturl $portinfo(porturl)
+ set portdir $portinfo(portdir)
- if {!([info exists options(ports_variants_index)] && $options(ports_variants_index) eq "yes")} {
- if {[catch {set mport [mportopen $porturl [array get options] [array get variations]]} result]} {
- ui_debug "$::errorInfo"
- break_softcontinue "Unable to open port: $result" 1 status
- }
- array unset portinfo
- array set portinfo [mportinfo $mport]
- mportclose $mport
- if {[info exists portdir]} {
- set portinfo(portdir) $portdir
- }
- } elseif {![info exists portinfo]} {
- ui_warn "port variants --index does not work with 'current' pseudo-port"
- continue
- }
-
- # if this fails the port doesn't have any variants
- if {![info exists portinfo(variants)]} {
- puts "$portname has no variants"
- } else {
- # Get the variant descriptions
- if {[info exists portinfo(variant_desc)]} {
- array set descs $portinfo(variant_desc)
- } else {
- array set descs ""
- }
+ if {!([info exists options(ports_variants_index)] && $options(ports_variants_index) eq "yes")} {
+ if {[catch {set mport [mportopen $porturl [array get options] [array get variations]]} result]} {
+ ui_debug "$::errorInfo"
+ break_softcontinue "Unable to open port: $result" 1 status
+ }
+ array unset portinfo
+ array set portinfo [mportinfo $mport]
+ mportclose $mport
+ if {[info exists portdir]} {
+ set portinfo(portdir) $portdir
+ }
+ } elseif {![info exists portinfo]} {
+ ui_warn "port variants --index does not work with 'current' pseudo-port"
+ continue
+ }
+
+ # if this fails the port doesn't have any variants
+ if {![info exists portinfo(variants)]} {
+ puts "$portname has no variants"
+ } else {
+ # Get the variant descriptions
+ if {[info exists portinfo(variant_desc)]} {
+ array set descs $portinfo(variant_desc)
+ } else {
+ array set descs ""
+ }
- # print out all the variants
- puts "$portname has the variants:"
- foreach v $portinfo(variants) {
- if {[info exists descs($v)]} {
- puts "\t$v: $descs($v)"
- } else {
- puts "\t$v"
- }
- }
- }
- }
-
- return $status
+ # print out all the variants
+ puts "$portname has the variants:"
+ foreach v $portinfo(variants) {
+ if {[info exists descs($v)]} {
+ puts "\t$v: $descs($v)"
+ } else {
+ puts "\t$v"
+ }
+ }
+ }
+ }
+
+ return $status
}
proc action_search { action portlist opts } {
- set status 0
- if {![llength $portlist] && [global_option_isset ports_no_args]} {
- ui_error "You must specify a search pattern"
- return 1
- }
-
- foreachport $portlist {
- set portfound 0
- if {[catch {set res [mportsearch $portname no]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
- foreach {name array} $res {
- array unset portinfo
- array set portinfo $array
+ set status 0
+ if {![llength $portlist] && [global_option_isset ports_no_args]} {
+ ui_error "You must specify a search pattern"
+ return 1
+ }
+
+ foreachport $portlist {
+ set portfound 0
+ if {[catch {set res [mportsearch $portname no]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
+ foreach {name array} $res {
+ array unset portinfo
+ array set portinfo $array
- # XXX is this the right place to verify an entry?
- if {![info exists portinfo(name)]} {
- puts "Invalid port entry, missing portname"
- continue
- }
- if {![info exists portinfo(description)]} {
- puts "Invalid port entry for $portinfo(name), missing description"
- continue
- }
- if {![info exists portinfo(version)]} {
- puts "Invalid port entry for $portinfo(name), missing version"
- continue
- }
- if {![info exists portinfo(portdir)]} {
- set output [format "%-30s %-12s %s" $portinfo(name) $portinfo(version) [join $portinfo(description)]]
- } else {
- set output [format "%-30s %-14s %-12s %s" $portinfo(name) $portinfo(portdir) $portinfo(version) [join $portinfo(description)]]
- }
- set portfound 1
- puts $output
- }
- if { !$portfound } {
- ui_msg "No match for $portname found"
- }
- }
-
- return $status
+ # XXX is this the right place to verify an entry?
+ if {![info exists portinfo(name)]} {
+ puts "Invalid port entry, missing portname"
+ continue
+ }
+ if {![info exists portinfo(description)]} {
+ puts "Invalid port entry for $portinfo(name), missing description"
+ continue
+ }
+ if {![info exists portinfo(version)]} {
+ puts "Invalid port entry for $portinfo(name), missing version"
+ continue
+ }
+ if {![info exists portinfo(portdir)]} {
+ set output [format "%-30s %-12s %s" $portinfo(name) $portinfo(version) [join $portinfo(description)]]
+ } else {
+ set output [format "%-30s %-14s %-12s %s" $portinfo(name) $portinfo(portdir) $portinfo(version) [join $portinfo(description)]]
+ }
+ set portfound 1
+ puts $output
+ }
+ if { !$portfound } {
+ ui_msg "No match for $portname found"
+ }
+ }
+
+ return $status
}
proc action_list { action portlist opts } {
- set status 0
-
- # Default to list all ports if no portnames are supplied
- if {![llength $portlist] && [global_option_isset ports_no_args]} {
- add_to_portlist portlist [list name "-all-"]
- }
-
- foreachport $portlist {
- if {$portname == "-all-"} {
- set search_string ".+"
- } else {
- set search_string [regex_pat_sanitize $portname]
- }
-
- if {[catch {set res [mportsearch ^$search_string\$ no]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $search_string failed: $result" 1 status
- }
+ set status 0
+
+ # Default to list all ports if no portnames are supplied
+ if {![llength $portlist] && [global_option_isset ports_no_args]} {
+ add_to_portlist portlist [list name "-all-"]
+ }
+
+ foreachport $portlist {
+ if {$portname == "-all-"} {
+ set search_string ".+"
+ } else {
+ set search_string [regex_pat_sanitize $portname]
+ }
+
+ if {[catch {set res [mportsearch ^$search_string\$ no]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $search_string failed: $result" 1 status
+ }
- foreach {name array} $res {
- array unset portinfo
- array set portinfo $array
- set outdir ""
- if {[info exists portinfo(portdir)]} {
- set outdir $portinfo(portdir)
- }
- puts [format "%-30s @%-14s %s" $portinfo(name) $portinfo(version) $outdir]
- }
- }
-
- return $status
+ foreach {name array} $res {
+ array unset portinfo
+ array set portinfo $array
+ set outdir ""
+ if {[info exists portinfo(portdir)]} {
+ set outdir $portinfo(portdir)
+ }
+ puts [format "%-30s @%-14s %s" $portinfo(name) $portinfo(version) $outdir]
+ }
+ }
+
+ return $status
}
proc action_echo { action portlist opts } {
- # Simply echo back the port specs given to this command
- foreachport $portlist {
- set opts {}
- foreach { key value } [array get options] {
- lappend opts "$key=$value"
- }
-
- set composite_version [composite_version $portversion [array get variations] 1]
- if { $composite_version != "" } {
- set ver_field "@$composite_version"
- } else {
- set ver_field ""
- }
- puts [format "%-30s %s %s" $portname $ver_field [join $opts " "]]
- }
-
- return 0
+ # Simply echo back the port specs given to this command
+ foreachport $portlist {
+ set opts {}
+ foreach { key value } [array get options] {
+ lappend opts "$key=$value"
+ }
+
+ set composite_version [composite_version $portversion [array get variations] 1]
+ if { $composite_version != "" } {
+ set ver_field "@$composite_version"
+ } else {
+ set ver_field ""
+ }
+ puts [format "%-30s %s %s" $portname $ver_field [join $opts " "]]
+ }
+
+ return 0
}
proc action_portcmds { action portlist opts } {
- # Operations on the port's directory and Portfile
- global env boot_env
- global current_portdir
-
- set status 0
- require_portlist portlist
- foreachport $portlist {
- # Verify the portname, getting portinfo to map to a porturl
- if {[catch {set res [mportsearch $portname no exact]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
- if {[llength $res] < 2} {
- break_softcontinue "Port $portname not found" 1 status
- }
- array set portinfo [lindex $res 1]
+ # Operations on the port's directory and Portfile
+ global env boot_env
+ global current_portdir
+
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ # Verify the portname, getting portinfo to map to a porturl
+ if {[catch {set res [mportsearch $portname no exact]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
+ if {[llength $res] < 2} {
+ break_softcontinue "Port $portname not found" 1 status
+ }
+ array set portinfo [lindex $res 1]
- # If we have a url, use that, since it's most specific
- # otherwise try to map the portname to a url
- if {$porturl == ""} {
- set porturl $portinfo(porturl)
- }
-
- set portdir [file normalize [macports::getportdir $porturl]]
- set porturl "file://${portdir}"; # Rebuild url so it's fully qualified
- set portfile "${portdir}/Portfile"
-
- if {[file readable $portfile]} {
- switch -- $action {
- cat {
- # Copy the portfile to standard output
- set f [open $portfile RDONLY]
- while { ![eof $f] } {
- puts [read $f 4096]
- }
- close $f
- }
-
- ed - edit {
- # Edit the port's portfile with the user's editor
-
- # Restore our entire environment from start time.
- # We need it to evaluate the editor, and the editor
- # may want stuff from it as well, like TERM.
- array unset env_save; array set env_save [array get env]
- array unset env *; array set env [array get boot_env]
-
- # Find an editor to edit the portfile
- set editor ""
- foreach ed { VISUAL EDITOR } {
- if {[info exists env($ed)]} {
- set editor $env($ed)
- break
- }
- }
-
- # Invoke the editor
- if { $editor == "" } {
- break_softcontinue "No EDITOR is specified in your environment" 1 status
- } else {
- if {[catch {eval exec >/dev/stdout </dev/stdin $editor $portfile} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "unable to invoke editor $editor: $result" 1 status
- }
- }
-
- # Restore internal MacPorts environment
- array unset env *; array set env [array get env_save]
- }
-
- dir {
- # output the path to the port's directory
- puts $portdir
- }
-
- work {
- # output the path to the port's work directory
- set workpath [macports::getportworkpath_from_portdir $portdir]
- if {[file exists $workpath]} {
- puts $workpath
- }
- }
-
- cd {
- # Change to the port's directory, making it the default
- # port for any future commands
- set current_portdir $portdir
- }
+ # If we have a url, use that, since it's most specific
+ # otherwise try to map the portname to a url
+ if {$porturl == ""} {
+ set porturl $portinfo(porturl)
+ }
+
+ set portdir [file normalize [macports::getportdir $porturl]]
+ set porturl "file://${portdir}"; # Rebuild url so it's fully qualified
+ set portfile "${portdir}/Portfile"
+
+ if {[file readable $portfile]} {
+ switch -- $action {
+ cat {
+ # Copy the portfile to standard output
+ set f [open $portfile RDONLY]
+ while { ![eof $f] } {
+ puts [read $f 4096]
+ }
+ close $f
+ }
+
+ ed - edit {
+ # Edit the port's portfile with the user's editor
+
+ # Restore our entire environment from start time.
+ # We need it to evaluate the editor, and the editor
+ # may want stuff from it as well, like TERM.
+ array unset env_save; array set env_save [array get env]
+ array unset env *; array set env [array get boot_env]
+
+ # Find an editor to edit the portfile
+ set editor ""
+ foreach ed { VISUAL EDITOR } {
+ if {[info exists env($ed)]} {
+ set editor $env($ed)
+ break
+ }
+ }
+
+ # Invoke the editor
+ if { $editor == "" } {
+ break_softcontinue "No EDITOR is specified in your environment" 1 status
+ } else {
+ if {[catch {eval exec >/dev/stdout </dev/stdin $editor $portfile} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "unable to invoke editor $editor: $result" 1 status
+ }
+ }
+
+ # Restore internal MacPorts environment
+ array unset env *; array set env [array get env_save]
+ }
- url {
- # output the url of the port's directory, suitable to feed back in later as a port descriptor
- puts $porturl
- }
+ dir {
+ # output the path to the port's directory
+ puts $portdir
+ }
- file {
- # output the path to the port's portfile
- puts $portfile
- }
+ work {
+ # output the path to the port's work directory
+ set workpath [macports::getportworkpath_from_portdir $portdir]
+ if {[file exists $workpath]} {
+ puts $workpath
+ }
+ }
- gohome {
- set homepage $portinfo(homepage)
- if { $homepage != "" } {
- system "${macports::autoconf::open_path} $homepage"
- } else {
- puts "(no homepage)"
- }
- }
- }
- } else {
- break_softcontinue "Could not read $portfile" 1 status
- }
- }
-
- return $status
+ cd {
+ # Change to the port's directory, making it the default
+ # port for any future commands
+ set current_portdir $portdir
+ }
+
+ url {
+ # output the url of the port's directory, suitable to feed back in later as a port descriptor
+ puts $porturl
+ }
+
+ file {
+ # output the path to the port's portfile
+ puts $portfile
+ }
+
+ gohome {
+ set homepage $portinfo(homepage)
+ if { $homepage != "" } {
+ system "${macports::autoconf::open_path} $homepage"
+ } else {
+ puts "(no homepage)"
+ }
+ }
+ }
+ } else {
+ break_softcontinue "Could not read $portfile" 1 status
+ }
+ }
+
+ return $status
}
proc action_sync { action portlist opts } {
- set status 0
- if {[catch {mportsync} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- ui_msg "port sync failed: $result"
- set status 1
- }
-
- return $status
+ set status 0
+ if {[catch {mportsync} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ ui_msg "port sync failed: $result"
+ set status 1
+ }
+
+ return $status
}
proc action_target { action portlist opts } {
global global_variations
- set status 0
- require_portlist portlist
- foreachport $portlist {
- set target $action
+ set status 0
+ require_portlist portlist
+ foreachport $portlist {
+ set target $action
- # If we have a url, use that, since it's most specific
- # otherwise try to map the portname to a url
- if {$porturl == ""} {
- # Verify the portname, getting portinfo to map to a porturl
- if {[catch {set res [mportsearch $portname no exact]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "search for portname $portname failed: $result" 1 status
- }
- if {[llength $res] < 2} {
- break_softcontinue "Port $portname not found" 1 status
- }
- array unset portinfo
- array set portinfo [lindex $res 1]
- set porturl $portinfo(porturl)
- }
-
- # If this is the install target, add any global_variations to the variations
- # specified for the port
- if { $target == "install" } {
- foreach { variation value } [array get global_variations] {
- if { ![info exists variations($variation)] } {
- set variations($variation) $value
- }
- }
- }
+ # If we have a url, use that, since it's most specific
+ # otherwise try to map the portname to a url
+ if {$porturl == ""} {
+ # Verify the portname, getting portinfo to map to a porturl
+ if {[catch {set res [mportsearch $portname no exact]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "search for portname $portname failed: $result" 1 status
+ }
+ if {[llength $res] < 2} {
+ break_softcontinue "Port $portname not found" 1 status
+ }
+ array unset portinfo
+ array set portinfo [lindex $res 1]
+ set porturl $portinfo(porturl)
+ }
+
+ # If this is the install target, add any global_variations to the variations
+ # specified for the port
+ if { $target == "install" } {
+ foreach { variation value } [array get global_variations] {
+ if { ![info exists variations($variation)] } {
+ set variations($variation) $value
+ }
+ }
+ }
- # If version was specified, save it as a version glob for use
- # in port actions (e.g. clean).
- if {[string length $portversion]} {
- set options(ports_version_glob) $portversion
- }
- if {[catch {set workername [mportopen $porturl [array get options] [array get variations]]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- break_softcontinue "Unable to open port: $result" 1 status
- }
- if {[catch {set result [mportexec $workername $target]} result]} {
- global errorInfo
- mportclose $workername
- ui_debug "$errorInfo"
- break_softcontinue "Unable to execute port: $result" 1 status
- }
+ # If version was specified, save it as a version glob for use
+ # in port actions (e.g. clean).
+ if {[string length $portversion]} {
+ set options(ports_version_glob) $portversion
+ }
+ if {[catch {set workername [mportopen $porturl [array get options] [array get variations]]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ break_softcontinue "Unable to open port: $result" 1 status
+ }
+ if {[catch {set result [mportexec $workername $target]} result]} {
+ global errorInfo
+ mportclose $workername
+ ui_debug "$errorInfo"
+ break_softcontinue "Unable to execute port: $result" 1 status
+ }
- mportclose $workername
-
- # Process any error that wasn't thrown and handled already
- if {$result} {
- break_softcontinue "Status $result encountered during processing." 1 status
- }
- }
-
- return $status
+ mportclose $workername
+
+ # Process any error that wasn't thrown and handled already
+ if {$result} {
+ break_softcontinue "Status $result encountered during processing." 1 status
+ }
+ }
+
+ return $status
}
proc action_exit { action portlist opts } {
- # Return a semaphore telling the main loop to quit
- return -999
+ # Return a semaphore telling the main loop to quit
+ return -999
}
@@ -2138,477 +2139,509 @@
# Command Parsing
##########################################
proc moreargs {} {
- global cmd_argn cmd_argc
- return [expr {$cmd_argn < $cmd_argc}]
+ global cmd_argn cmd_argc
+ return [expr {$cmd_argn < $cmd_argc}]
}
proc lookahead {} {
- global cmd_argn cmd_argc cmd_argv
- if {$cmd_argn < $cmd_argc} {
- return [lindex $cmd_argv $cmd_argn]
- } else {
- return _EOF_
- }
+ global cmd_argn cmd_argc cmd_argv
+ if {$cmd_argn < $cmd_argc} {
+ return [lindex $cmd_argv $cmd_argn]
+ } else {
+ return _EOF_
+ }
}
proc advance {} {
- global cmd_argn
- incr cmd_argn
+ global cmd_argn
+ incr cmd_argn
}
proc match s {
- if {[lookahead] == $s} {
- advance
- return 1
- }
- return 0
+ if {[lookahead] == $s} {
+ advance
+ return 1
+ }
+ return 0
}
global action_array
array set action_array {
- usage action_usage
- help action_help
+ usage action_usage
+ help action_help
- echo action_echo
-
- info action_info
- location action_location
- provides action_provides
-
- activate action_activate
- deactivate action_deactivate
-
- sync action_sync
- selfupdate action_selfupdate
-
- upgrade action_upgrade
-
- version action_version
- compact action_compact
- uncompact action_uncompact
-
- uninstall action_uninstall
-
- installed action_installed
- outdated action_outdated
- contents action_contents
- dependents action_dependents
- deps action_deps
- variants action_variants
-
- search action_search
- list action_list
-
- ed action_portcmds
- edit action_portcmds
- cat action_portcmds
- dir action_portcmds
- work action_portcmds
- cd action_portcmds
- url action_portcmds
- file action_portcmds
- gohome action_portcmds
-
- fetch action_target
- checksum action_target
- extract action_target
- patch action_target
- configure action_target
- build action_target
- destroot action_target
- install action_target
- clean action_target
- test action_target
- lint action_target
- submit action_target
- trace action_target
- livecheck action_target
- distcheck action_target
- mirror action_target
+ echo action_echo
+
+ info action_info
+ location action_location
+ provides action_provides
+
+ activate action_activate
+ deactivate action_deactivate
+
+ sync action_sync
+ selfupdate action_selfupdate
+
+ upgrade action_upgrade
+
+ version action_version
+ compact action_compact
+ uncompact action_uncompact
+
+ uninstall action_uninstall
+
+ installed action_installed
+ outdated action_outdated
+ contents action_contents
+ dependents action_dependents
+ deps action_deps
+ variants action_variants
+
+ search action_search
+ list action_list
+
+ ed action_portcmds
+ edit action_portcmds
+ cat action_portcmds
+ dir action_portcmds
+ work action_portcmds
+ cd action_portcmds
+ url action_portcmds
+ file action_portcmds
+ gohome action_portcmds
+
+ fetch action_target
+ checksum action_target
+ extract action_target
+ patch action_target
+ configure action_target
+ build action_target
+ destroot action_target
+ install action_target
+ clean action_target
+ test action_target
+ lint action_target
+ submit action_target
+ trace action_target
+ livecheck action_target
+ distcheck action_target
+ mirror action_target
- archive action_target
- unarchive action_target
- dmg action_target
- dpkg action_target
- mpkg action_target
- pkg action_target
- rpm action_target
- srpm action_target
+ archive action_target
+ unarchive action_target
+ dmg action_target
+ dpkg action_target
+ mpkg action_target
+ pkg action_target
+ rpm action_target
+ srpm action_target
- quit action_exit
- exit action_exit
+ quit action_exit
+ exit action_exit
}
proc find_action_proc { action } {
- global action_array
-
- set action_proc ""
- if { [info exists action_array($action)] } {
- set action_proc $action_array($action)
- }
-
- return $action_proc
+ global action_array
+
+ set action_proc ""
+ if { [info exists action_array($action)] } {
+ set action_proc $action_array($action)
+ }
+
+ return $action_proc
}
# Parse global options
#
# Note that this is called several times:
-# (1) Initially, to parse options that will be constant across all commands
-# (options that come prior to any command, frozen into global_options_base)
-# (2) Following each command (to parse options that will be unique to that command
-# (the global_options array is reset to global_options_base prior to each command)
+# (1) Initially, to parse options that will be constant across all commands
+# (options that come prior to any command, frozen into global_options_base)
+# (2) Following each command (to parse options that will be unique to that command
+# (the global_options array is reset to global_options_base prior to each command)
#
proc parse_options { action ui_options_name global_options_name } {
- upvar $ui_options_name ui_options
- upvar $global_options_name global_options
- global cmdname
-
- while {[moreargs]} {
- set arg [lookahead]
-
- if {[string index $arg 0] != "-"} {
- break
- } elseif {[string index $arg 1] == "-"} {
- # Process long arguments
- switch -- $arg {
- -- { # This is the options terminator; do no further option processing
- advance; break
- }
- default {
- set key [string range $arg 2 end]
- set global_options(ports_${action}_${key}) yes
- }
- }
- } else {
- # Process short arg(s)
- set opts [string range $arg 1 end]
- foreach c [split $opts {}] {
- switch -- $c {
- v { set ui_options(ports_verbose) yes }
- d { set ui_options(ports_debug) yes
- # debug implies verbose
- set ui_options(ports_verbose) yes
- }
- q { set ui_options(ports_quiet) yes
- set ui_options(ports_verbose) no
- set ui_options(ports_debug) no
- }
- i { # Always go to interactive mode
- lappend ui_options(ports_commandfiles) - }
- p { # Ignore errors while processing within a command
- set ui_options(ports_processall) yes }
- x { # Exit with error from any command while in batch/interactive mode
- set ui_options(ports_exit) yes }
-
- f { set global_options(ports_force) yes }
- o { set global_options(ports_ignore_older) yes }
- n { set global_options(ports_nodeps) yes }
- u { set global_options(port_uninstall_old) yes }
- R { set global_options(ports_do_dependents) yes }
- s { set global_options(ports_source_only) yes }
- b { set global_options(ports_binary_only) yes }
- c { set global_options(ports_autoclean) yes }
- k { set global_options(ports_autoclean) no }
- t { set global_options(ports_trace) yes }
- F { # Name a command file to process
- advance
- if {[moreargs]} {
- lappend ui_options(ports_commandfiles) [lookahead]
- }
- }
- D { advance
- if {[moreargs]} {
- cd [lookahead]
- }
- break
- }
- default {
- print_usage; exit 1
- }
- }
- }
- }
-
- advance
- }
+ upvar $ui_options_name ui_options
+ upvar $global_options_name global_options
+ global cmdname
+
+ while {[moreargs]} {
+ set arg [lookahead]
+
+ if {[string index $arg 0] != "-"} {
+ break
+ } elseif {[string index $arg 1] == "-"} {
+ # Process long arguments
+ switch -- $arg {
+ -- { # This is the options terminator; do no further option processing
+ advance; break
+ }
+ default {
+ set key [string range $arg 2 end]
+ set global_options(ports_${action}_${key}) yes
+ }
+ }
+ } else {
+ # Process short arg(s)
+ set opts [string range $arg 1 end]
+ foreach c [split $opts {}] {
+ switch -- $c {
+ v {
+ set ui_options(ports_verbose) yes
+ }
+ d {
+ set ui_options(ports_debug) yes
+ # debug implies verbose
+ set ui_options(ports_verbose) yes
+ }
+ q {
+ set ui_options(ports_quiet) yes
+ set ui_options(ports_verbose) no
+ set ui_options(ports_debug) no
+ }
+ i {
+ # Always go to interactive mode
+ lappend ui_options(ports_commandfiles) -
+ }
+ p {
+ # Ignore errors while processing within a command
+ set ui_options(ports_processall) yes
+ }
+ x {
+ # Exit with error from any command while in batch/interactive mode
+ set ui_options(ports_exit) yes
+ }
+
+ f {
+ set global_options(ports_force) yes
+ }
+ o {
+ set global_options(ports_ignore_older) yes
+ }
+ n {
+ set global_options(ports_nodeps) yes
+ }
+ u {
+ set global_options(port_uninstall_old) yes
+ }
+ R {
+ set global_options(ports_do_dependents) yes
+ }
+ s {
+ set global_options(ports_source_only) yes
+ }
+ b {
+ set global_options(ports_binary_only) yes
+ }
+ c {
+ set global_options(ports_autoclean) yes
+ }
+ k {
+ set global_options(ports_autoclean) no
+ }
+ t {
+ set global_options(ports_trace) yes
+ }
+ F {
+ # Name a command file to process
+ advance
+ if {[moreargs]} {
+ lappend ui_options(ports_commandfiles) [lookahead]
+ }
+ }
+ D {
+ advance
+ if {[moreargs]} {
+ cd [lookahead]
+ }
+ break
+ }
+ default {
+ print_usage; exit 1
+ }
+ }
+ }
+ }
+
+ advance
+ }
}
proc process_cmd { argv } {
- global cmd_argc cmd_argv cmd_argn
- global global_options global_options_base
- global current_portdir
- set cmd_argv $argv
- set cmd_argc [llength $argv]
- set cmd_argn 0
+ global cmd_argc cmd_argv cmd_argn
+ global global_options global_options_base
+ global current_portdir
+ set cmd_argv $argv
+ set cmd_argc [llength $argv]
+ set cmd_argn 0
- set action_status 0
+ set action_status 0
- # Process an action if there is one
- while {$action_status == 0 && [moreargs]} {
- set action [lookahead]
- advance
-
- # Handle command separator
- if { $action == ";" } {
- continue
- }
-
- # Handle a comment
- if { [string index $action 0] == "#" } {
- while { [moreargs] } { advance }
- break
- }
-
- # Always start out processing an action in current_portdir
- cd $current_portdir
-
- # Reset global_options from base before each action, as we munge it just below...
- array set global_options $global_options_base
-
- # Parse options that will be unique to this action
- # (to avoid abiguity with -variants and a default port, either -- must be
- # used to terminate option processing, or the pseudo-port current must be specified).
- parse_options $action ui_options global_options
-
- # Parse action arguments, setting a special flag if there were none
- # We otherwise can't tell the difference between arguments that evaluate
- # to the empty set, and the empty set itself.
- set portlist {}
- switch -- [lookahead] {
- ; -
- _EOF_ { set global_options(ports_no_args) yes }
- default {
- # Parse port specifications into portlist
- if {![portExpr portlist]} {
- ui_error "Improper expression syntax while processing parameters"
- set action_status 1
- break
- }
- }
- }
-
- # Find an action to execute
- set action_proc [find_action_proc $action]
- if { $action_proc != "" } {
- set action_status [$action_proc $action $portlist [array get global_options]]
- } else {
- puts "Unrecognized action \"$action\""
- set action_status 1
- }
-
- # semaphore to exit
- if {$action_status == -999} break
+ # Process an action if there is one
+ while {$action_status == 0 && [moreargs]} {
+ set action [lookahead]
+ advance
+
+ # Handle command separator
+ if { $action == ";" } {
+ continue
+ }
+
+ # Handle a comment
+ if { [string index $action 0] == "#" } {
+ while { [moreargs] } { advance }
+ break
+ }
+
+ # Always start out processing an action in current_portdir
+ cd $current_portdir
+
+ # Reset global_options from base before each action, as we munge it just below...
+ array set global_options $global_options_base
+
+ # Parse options that will be unique to this action
+ # (to avoid abiguity with -variants and a default port, either -- must be
+ # used to terminate option processing, or the pseudo-port current must be specified).
+ parse_options $action ui_options global_options
+
+ # Parse action arguments, setting a special flag if there were none
+ # We otherwise can't tell the difference between arguments that evaluate
+ # to the empty set, and the empty set itself.
+ set portlist {}
+ switch -- [lookahead] {
+ ; -
+ _EOF_ {
+ set global_options(ports_no_args) yes
+ }
+ default {
+ # Parse port specifications into portlist
+ if {![portExpr portlist]} {
+ ui_error "Improper expression syntax while processing parameters"
+ set action_status 1
+ break
+ }
+ }
+ }
+
+ # Find an action to execute
+ set action_proc [find_action_proc $action]
+ if { $action_proc != "" } {
+ set action_status [$action_proc $action $portlist [array get global_options]]
+ } else {
+ puts "Unrecognized action \"$action\""
+ set action_status 1
+ }
- # If we're not in exit mode then ignore the status from the command
- if { ![ui_isset ports_exit] } {
- set action_status 0
- }
- }
-
- return $action_status
+ # semaphore to exit
+ if {$action_status == -999} break
+
+ # If we're not in exit mode then ignore the status from the command
+ if { ![ui_isset ports_exit] } {
+ set action_status 0
+ }
+ }
+
+ return $action_status
}
-proc complete_portname { text state } {
- global action_array
- global complete_choices complete_position
-
- if {$state == 0} {
- set complete_position 0
- set complete_choices {}
+proc complete_portname { text state } {
+ global action_array
+ global complete_choices complete_position
+
+ if {$state == 0} {
+ set complete_position 0
+ set complete_choices {}
- # Build a list of ports with text as their prefix
- if {[catch {set res [mportsearch "${text}*" false glob]} result]} {
- global errorInfo
- ui_debug "$errorInfo"
- fatal "search for portname $pattern failed: $result"
- }
- foreach {name info} $res {
- lappend complete_choices $name
- }
- }
-
- set word [lindex $complete_choices $complete_position]
- incr complete_position
-
- return $word
+ # Build a list of ports with text as their prefix
+ if {[catch {set res [mportsearch "${text}*" false glob]} result]} {
+ global errorInfo
+ ui_debug "$errorInfo"
+ fatal "search for portname $pattern failed: $result"
+ }
+ foreach {name info} $res {
+ lappend complete_choices $name
+ }
+ }
+
+ set word [lindex $complete_choices $complete_position]
+ incr complete_position
+
+ return $word
}
-proc complete_action { text state } {
- global action_array
- global complete_choices complete_position
-
- if {$state == 0} {
- set complete_position 0
- set complete_choices [array names action_array "[string tolower $text]*"]
- }
-
- set word [lindex $complete_choices $complete_position]
- incr complete_position
-
- return $word
+proc complete_action { text state } {
+ global action_array
+ global complete_choices complete_position
+
+ if {$state == 0} {
+ set complete_position 0
+ set complete_choices [array names action_array "[string tolower $text]*"]
+ }
+
+ set word [lindex $complete_choices $complete_position]
+ incr complete_position
+
+ return $word
}
proc attempt_completion { text word start end } {
- # If the word starts with '~', or contains '.' or '/', then use the build-in
- # completion to complete the word
- if { [regexp {^~|[/.]} $word] } {
- return ""
- }
+ # If the word starts with '~', or contains '.' or '/', then use the build-in
+ # completion to complete the word
+ if { [regexp {^~|[/.]} $word] } {
+ return ""
+ }
- # Decide how to do completion based on where we are in the string
- set prefix [string range $text 0 [expr $start - 1]]
-
- # If only whitespace characters preceed us, or if the
- # previous non-whitespace character was a ;, then we're
- # an action (the first word of a command)
- if { [regexp {(^\s*$)|(;\s*$)} $prefix] } {
- return complete_action
- }
-
- # Otherwise, do completion on portname
- return complete_portname
+ # Decide how to do completion based on where we are in the string
+ set prefix [string range $text 0 [expr $start - 1]]
+
+ # If only whitespace characters preceed us, or if the
+ # previous non-whitespace character was a ;, then we're
+ # an action (the first word of a command)
+ if { [regexp {(^\s*$)|(;\s*$)} $prefix] } {
+ return complete_action
+ }
+
+ # Otherwise, do completion on portname
+ return complete_portname
}
proc get_next_cmdline { in out use_readline prompt linename } {
- upvar $linename line
-
- set line ""
- while { $line == "" } {
-
- if {$use_readline} {
- set len [readline read -attempted_completion attempt_completion line $prompt]
- } else {
- puts -nonewline $out $prompt
- set len [gets $in line]
- }
-
- if { $len < 0 } {
- return -1
- }
-
- set line [string trim $line]
-
- if { $use_readline && $line != "" } {
- rl_history add $line
- }
- }
-
- return [llength $line]
+ upvar $linename line
+
+ set line ""
+ while { $line == "" } {
+
+ if {$use_readline} {
+ set len [readline read -attempted_completion attempt_completion line $prompt]
+ } else {
+ puts -nonewline $out $prompt
+ set len [gets $in line]
+ }
+
+ if { $len < 0 } {
+ return -1
+ }
+
+ set line [string trim $line]
+
+ if { $use_readline && $line != "" } {
+ rl_history add $line
+ }
+ }
+
+ return [llength $line]
}
proc process_command_file { in } {
- global current_portdir
+ global current_portdir
- # Initialize readline
- set isstdin [string match $in "stdin"]
- set name "port"
- set use_readline [expr $isstdin && [readline init $name]]
- set history_file [file normalize "${macports::macports_user_dir}/history"]
+ # Initialize readline
+ set isstdin [string match $in "stdin"]
+ set name "port"
+ set use_readline [expr $isstdin && [readline init $name]]
+ set history_file [file normalize "${macports::macports_user_dir}/history"]
- # Read readline history
- if {$use_readline && [file isdirectory $macports::macports_user_dir]} {
- rl_history read $history_file
- rl_history stifle 100
- }
-
- # Be noisy, if appropriate
- set noisy [expr $isstdin && ![ui_isset ports_quiet]]
- if { $noisy } {
- puts "MacPorts [macports::version]"
- puts "Entering interactive mode... (\"help\" for help, \"quit\" to quit)"
- }
-
- # Main command loop
- set exit_status 0
- while { $exit_status == 0 } {
-
- # Calculate our prompt
- if { $noisy } {
- set shortdir [eval file join [lrange [file split $current_portdir] end-1 end]]
- set prompt "\[$shortdir\] > "
- } else {
- set prompt ""
- }
-
- # Get a command line
- if { [get_next_cmdline $in stdout $use_readline $prompt line] <= 0 } {
- puts ""
- break
- }
-
- # Process the command
- set exit_status [process_cmd $line]
-
- # Check for semaphore to exit
- if {$exit_status == -999} break
-
- # Ignore status unless we're in error-exit mode
- if { ![ui_isset ports_exit] } {
- set exit_status 0
- }
- }
-
- # Save readine history
- if {$use_readline && [file isdirectory $macports::macports_user_dir]} {
- rl_history write $history_file
- }
-
- # Say goodbye
- if { $noisy } {
- puts "Goodbye"
- }
-
- return $exit_status
+ # Read readline history
+ if {$use_readline && [file isdirectory $macports::macports_user_dir]} {
+ rl_history read $history_file
+ rl_history stifle 100
+ }
+
+ # Be noisy, if appropriate
+ set noisy [expr $isstdin && ![ui_isset ports_quiet]]
+ if { $noisy } {
+ puts "MacPorts [macports::version]"
+ puts "Entering interactive mode... (\"help\" for help, \"quit\" to quit)"
+ }
+
+ # Main command loop
+ set exit_status 0
+ while { $exit_status == 0 } {
+
+ # Calculate our prompt
+ if { $noisy } {
+ set shortdir [eval file join [lrange [file split $current_portdir] end-1 end]]
+ set prompt "\[$shortdir\] > "
+ } else {
+ set prompt ""
+ }
+
+ # Get a command line
+ if { [get_next_cmdline $in stdout $use_readline $prompt line] <= 0 } {
+ puts ""
+ break
+ }
+
+ # Process the command
+ set exit_status [process_cmd $line]
+
+ # Check for semaphore to exit
+ if {$exit_status == -999} break
+
+ # Ignore status unless we're in error-exit mode
+ if { ![ui_isset ports_exit] } {
+ set exit_status 0
+ }
+ }
+
+ # Save readine history
+ if {$use_readline && [file isdirectory $macports::macports_user_dir]} {
+ rl_history write $history_file
+ }
+
+ # Say goodbye
+ if { $noisy } {
+ puts "Goodbye"
+ }
+
+ return $exit_status
}
proc process_command_files { filelist } {
- set exit_status 0
-
- # For each file in the command list, process commands
- # in the file
- foreach file $filelist {
- if {$file == "-"} {
- set in stdin
- } else {
-
- if {[catch {set in [open $file]} result]} {
- fatal "Failed to open command file; $result"
- }
-
- }
-
- set exit_status [process_command_file $in]
-
- if {$in != "stdin"} {
- close $in
- }
+ set exit_status 0
- # Check for semaphore to exit
- if {$exit_status == -999} {
- set exit_status 0
- break
- }
-
- # Ignore status unless we're in error-exit mode
- if { ![ui_isset ports_exit] } {
- set exit_status 0
- }
- }
-
- return $exit_status
+ # For each file in the command list, process commands
+ # in the file
+ foreach file $filelist {
+ if {$file == "-"} {
+ set in stdin
+ } else {
+ if {[catch {set in [open $file]} result]} {
+ fatal "Failed to open command file; $result"
+ }
+ }
+
+ set exit_status [process_command_file $in]
+
+ if {$in != "stdin"} {
+ close $in
+ }
+
+ # Check for semaphore to exit
+ if {$exit_status == -999} {
+ set exit_status 0
+ break
+ }
+
+ # Ignore status unless we're in error-exit mode
+ if { ![ui_isset ports_exit] } {
+ set exit_status 0
+ }
+ }
+
+ return $exit_status
}
@@ -2617,9 +2650,9 @@
##########################################
# globals
-array set ui_options {}
-array set global_options {}
-array set global_variations {}
+array set ui_options {}
+array set global_options {}
+array set global_variations {}
# Save off a copy of the environment before mportinit monkeys with it
global env boot_env
@@ -2640,8 +2673,8 @@
# to be the name of a command file (i.e., there is an implicit -F
# before any arguments).
if {[moreargs] && $cmdname == "portf"} {
- lappend ui_options(ports_commandfiles) [lookahead]
- advance
+ lappend ui_options(ports_commandfiles) [lookahead]
+ advance
}
# Parse global options that will affect all subsequent commands
@@ -2654,15 +2687,15 @@
# This must be done following parse of global options, as some options are
# evaluated by mportinit.
if {[catch {mportinit ui_options global_options global_variations} result]} {
- global errorInfo
- puts "$errorInfo"
- fatal "Failed to initialize MacPorts, $result"
+ global errorInfo
+ puts "$errorInfo"
+ fatal "Failed to initialize MacPorts, $result"
}
# If we have no arguments remaining after option processing then force
# interactive mode
if { [llength $remaining_args] == 0 && ![info exists ui_options(ports_commandfiles)] } {
- lappend ui_options(ports_commandfiles) -
+ lappend ui_options(ports_commandfiles) -
}
# Set up some global state for our code
@@ -2678,18 +2711,18 @@
set exit_status 0
if { [llength $remaining_args] > 0 } {
- # If there are remaining arguments, process those as a command
-
- # Exit immediately, by default, unless we're going to be processing command files
- if {![info exists ui_options(ports_commandfiles)]} {
- set ui_options(ports_exit) yes
- }
- set exit_status [process_cmd $remaining_args]
+ # If there are remaining arguments, process those as a command
+
+ # Exit immediately, by default, unless we're going to be processing command files
+ if {![info exists ui_options(ports_commandfiles)]} {
+ set ui_options(ports_exit) yes
+ }
+ set exit_status [process_cmd $remaining_args]
}
# Process any prescribed command files, including standard input
if { $exit_status == 0 && [info exists ui_options(ports_commandfiles)] } {
- set exit_status [process_command_files $ui_options(ports_commandfiles)]
+ set exit_status [process_command_files $ui_options(ports_commandfiles)]
}
# Return with exit_status
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20070916/01bcc0ed/attachment.html
More information about the macports-changes
mailing list