Changeset 14847 for trunk/base


Ignore:
Timestamp:
Oct 27, 2005, 6:31:58 PM (15 years ago)
Author:
jberry
Message:

Change to port(1) syntax:

  • @ is now required before any version number, in order to disambiguate cases where the portname starts with a digit, or the version doesn't.
  • The fields of a portspec are now uniquely identified by their leading character:
  • The version must begin with an @
  • A variant must begin with a - or +
  • An option must have a c-style identifier followed by an = sign
  • A portname is none of the above
  • The fields may be combined into a single argument, if some rules are followed:
  • Options must always be in an argument by themselves
  • The version, if present, must always follow the portname
  • If no version is present, then any variants must be in subsequent arguments.

That sounds more complex than it really is. Some examples will illustrate:

Given a port named "foo" and variants "v1" and "v2" and a version 1.0,

The following are legal:

port echo foo @1.0 CFLAGS=FOO LDFLAGS=BAR
port echo foo +v1
port echo foo +v1 - v2
port echo foo@1.0+v1-v2
port echo foo @1.0+v1-v2
port echo foo +v1-v2

The following are not legal:

port echo foo+v1 (no version is present, so variants must follow)
port echo foo 1.0 (@ must introduce the version)

Note that the portname may be omitted, and will default to the port in the current
directory, but only if it is the first port named (else it wouldn't be distinguishable
from the preceeding port). The pseudo port current may help you out in this case:

port echo @1.0 (current port, at version 1.0)
port echo a @1.0 (port named a at version 1.0)
port echo a current @1.0 (port named a and current port at version 1.0)
port echo a@ @1.0 (this should also mean port a and current port at version 1.0)

I changed some of the version reporting (installed, list, echo) to use the @ syntax
for version so that it gets people on the right page. We may need to do this in a
few more places as well. Let me know if you see some.

Feedback welcome.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/src/port/port.tcl

    r14844 r14847  
    33exec @TCLSH@ "$0" "$@"
    44# port.tcl
    5 # $Id: port.tcl,v 1.141 2005/10/26 23:57:51 jberry Exp $
     5# $Id: port.tcl,v 1.142 2005/10/27 18:31:58 jberry Exp $
    66#
    77# Copyright (c) 2004 Robert Shaw <rshaw@opendarwin.org>
     
    447447
    448448
     449proc get_current_ports {} {
     450        # This is just a synonym for get_current_port that
     451        # works with the regex in element
     452        return [get_current_port]
     453}
     454
     455
    449456proc get_current_port {} {
    450457        set url file://.
     
    741748                                                }
    742749                       
    743                 ^all$                   -
    744                 ^installed$             -
    745                 ^uninstalled$   -
    746                 ^active$                -
    747                 ^inactive$              -
    748                 ^outdated$              {       advance; add_multiple_ports reslist [get_${token}_ports];       set el 1 }
    749                 ^current$               {       advance; add_multiple_ports reslist [get_current_port];         set el 1 }
     750                ^all(@.*)?$                     -
     751                ^installed(@.*)?$               -
     752                ^uninstalled(@.*)?$             -
     753                ^active(@.*)?$                  -
     754                ^inactive(@.*)?$                -
     755                ^outdated(@.*)?$                -
     756                ^current(@.*)?$ {
     757                                                        # A simple pseudo-port name
     758                                                        advance
     759                                                       
     760                                                        # Break off the version component, if there is one
     761                                                        regexp {^(\w+)(@.*)?} $token matchvar name remainder
     762                                                       
     763                                                        add_multiple_ports reslist [get_${name}_ports] $remainder
     764                                                       
     765                                                        set el 1
     766                                                }
    750767               
    751768                ^variants:              -
     
    817834
    818835
    819 proc add_multiple_ports { resname ports } {
     836proc add_multiple_ports { resname ports {remainder ""} } {
    820837        upvar $resname reslist
    821838       
     
    823840        array unset variants
    824841        array unset options
    825         parsePortSpec version variants options
     842        parsePortSpec version variants options $remainder
    826843       
    827844        array unset overrides
     
    965982        upvar $optname portoptions
    966983       
     984        set portname ""
     985        set portversion ""
     986        array unset portvariants
     987        array unset portoptions
     988       
    967989        if { [moreargs] } {
    968990                # Look first for a potential portname
     
    970992                # We need to allow a wide variaty of tokens here, because of actions like "provides"
    971993                # so we take a rather lenient view of what a "portname" is. We allow
    972                 # anything that doesn't look like either a variant, a version, or an option
     994                # anything that doesn't look like either a version, a variant, or an option
    973995                set token [lookahead]
    974                 if {![regexp {^(\d.*|[-+].*|[[:alpha:]_]+[\w\.]*=.*)} $token match]} {
    975                         set portname $token
    976                         advance
     996
     997                set remainder ""
     998                if {![regexp {^(@|[-+]|[[:alpha:]_]+[\w\.]*=)} $token match]} {
     999                        advance                 
     1000                        regexp {^([^@]+)(@.*)?} $token match portname remainder
    9771001                }
    9781002               
    9791003                # Now parse the rest of the spec
    980                 parsePortSpec portversion portvariants portoptions
    981         }
    982 }
    983 
    984        
    985 proc parsePortSpec { vername varname optname } {
     1004                parsePortSpec portversion portvariants portoptions $remainder
     1005        }
     1006}
     1007
     1008       
     1009proc parsePortSpec { vername varname optname {remainder ""} } {
    9861010        upvar $vername portversion
    9871011        upvar $varname portvariants
     
    9961020       
    9971021        # Parse port version/variants/options
    998         set opt ""
    999         if {[moreargs]} {
    1000                 set opt [lookahead]
    1001         }
     1022        set opt $remainder
     1023        set adv 0
     1024        set consumed 0
    10021025        for {set firstTime 1} {$opt != "" || [moreargs]} {set firstTime 0} {
     1026       
    10031027                # Refresh opt as needed
    1004                 if {[string length $opt] == 0} {
    1005                         advance
     1028                if {$opt == ""} {
     1029                        if {$adv} advance
    10061030                        set opt [lookahead]
     1031                        set adv 1
     1032                        set consumed 0
    10071033                }
    10081034               
    10091035                # Version must be first, if it's there at all
    1010                 if {$firstTime && [string match {[0-9]*} $opt]} {
     1036                if {$firstTime && [string match {@*} $opt]} {
    10111037                        # Parse the version
    10121038                       
     1039                        # Strip the @
     1040                        set opt [string range $opt 1 end]
     1041                       
     1042                        # Handle the version
    10131043                        set sepPos [string first "/" $opt]
    10141044                        if {$sepPos >= 0} {
     
    10171047                                set opt [string range $opt [expr $sepPos+1] end]
    10181048                        } else {
     1049                                # Version terminated by "+", or else is complete
    10191050                                set sepPos [string first "+" $opt]
    10201051                                if {$sepPos >= 0} {
     
    10281059                                }
    10291060                        }
     1061                        set consumed 1
    10301062                } else {
    10311063                        # Parse all other options
     
    10361068                                set portoptions($key) \"$val\"
    10371069                                set opt ""
     1070                                set consumed 1
    10381071                        } elseif {[regexp {^([-+])([[:alpha:]_]+[\w\.]*)} $opt match sign variant] == 1} {
    10391072                                # It's a variant
    10401073                                set portvariants($variant) $sign
    10411074                                set opt [string range $opt [expr [string length $variant]+1] end]
     1075                                set consumed 1
    10421076                        } else {
    10431077                                # Not an option we recognize, so break from port option processing
     1078                                if { $consumed && $adv } advance
    10441079                                break
    10451080                        }
     
    14171452                set iactive [lindex $i 4]
    14181453                if { $iactive == 0 } {
    1419                     puts "  $iname ${iversion}_${irevision}${ivariants}"
     1454                    puts "  $iname @${iversion}_${irevision}${ivariants}"
    14201455                } elseif { $iactive == 1 } {
    1421                     puts "  $iname ${iversion}_${irevision}${ivariants} (active)"
     1456                    puts "  $iname @${iversion}_${irevision}${ivariants} (active)"
    14221457                }
    14231458            }
     
    16381673                                }
    16391674                                if {![info exists portinfo(portdir)]} {
    1640                                         set output [format "%-30s %-12s %s" $portinfo(name) $portinfo(version) $portinfo(description)]
     1675                                        set output [format "%-30s @%-12s %s" $portinfo(name) $portinfo(version) $portinfo(description)]
    16411676                                } else {
    1642                                         set output [format "%-30s %-14s %-12s %s" $portinfo(name) $portinfo(portdir) $portinfo(version) $portinfo(description)]
     1677                                        set output [format "%-30s %-14s @%-12s %s" $portinfo(name) $portinfo(portdir) $portinfo(version) $portinfo(description)]
    16431678                                }
    16441679                                set portfound 1
     
    16771712                                        set outdir $portinfo(portdir)
    16781713                                }
    1679                                 puts [format "%-30s %-14s %s" $portinfo(name) $portinfo(version) $outdir]
     1714                                puts [format "%-30s @%-14s %s" $portinfo(name) $portinfo(version) $outdir]
    16801715                        }
    16811716                }
     
    16901725                        }
    16911726                       
    1692                         puts [format "%-30s %s %s" $portname [composite_version $portversion [array get variations] 1] [join $opts " "]]
     1727                        set composite_version [composite_version $portversion [array get variations] 1]
     1728                        if { $composite_version != "" } {
     1729                                set ver_field "@$composite_version"
     1730                        } else {
     1731                                set ver_field ""
     1732                        }
     1733                        puts [format "%-30s %s %s" $portname $ver_field  [join $opts " "]]
    16931734                }
    16941735        }
Note: See TracChangeset for help on using the changeset viewer.