Ticket #8221: upd.patch

File upd.patch, 11.0 KB (added by gwhitneycom1@…, 17 years ago)

Proposed patch against r25313 to resolve this issue

  • src/port/port.1

     
    358358For example:
    359359.Pp
    360360.Dl "port -n upgrade ethereal"
     361.Pp
     362Note that in selecting the variants to use in the upgraded build of the
     363port, any variants specified on the command line take highest precedence,
     364then the variants active in the latest installed version of the port, and
     365finally the global variants specified in variants.conf, if any.  Note that
     366upgrade will not normally rebuild a port only to change the selected
     367variants; you can either specify -f, or deactivate the port and reinstall it
     368with different variants.
    361369.Ss clean
    362370Clean the files used for building
    363371.Ar portname .
  • src/port/port.tcl

     
    14101410    global global_variations
    14111411        require_portlist portlist
    14121412        foreachport $portlist {
    1413                 # Merge global variations into the variations specified for this port
    1414                 foreach { variation value } [array get global_variations] {
    1415                         if { ![info exists variations($variation)] } {
    1416                                 set variations($variation) $value
    1417                         }
    1418                 }
    1419                
    1420                 darwinports::upgrade $portname "port:$portname" [array get variations] [array get options]
     1413                # Global variations will have to be merged into the specified
     1414                # variations, but perhaps after the installed variations are
     1415                # merged. So we pass them into upgrade:
     1416                darwinports::upgrade $portname "port:$portname" [array get global_variations] [array get variations] [array get options]
    14211417        }
    14221418       
    14231419        return 0
  • src/darwinports1.0/darwinports.tcl

     
    16071607}
    16081608
    16091609# upgrade procedure
    1610 proc darwinports::upgrade {portname dspec variationslist optionslist {depscachename ""}} {
     1610proc darwinports::upgrade {portname dspec globalvarlist variationslist optionslist {depscachename ""}} {
    16111611        global darwinports::registry.installtype
    16121612        global darwinports::portarchivemode
    16131613        array set options $optionslist
     1614        # Note $variationslist is left alone and so retains the original
     1615        # requested variations, which should be passed to recursive calls to
     1616        # upgrade; while variations gets existing variants and global variations
     1617        # merged in later on, so it applies only to this port's upgrafe
    16141618        array set variations $variationslist
    16151619        if {![string match "" $depscachename]} {
    16161620                upvar $depscachename depscache
     
    16461650        # if this is set (not 0) we dont follow the deps
    16471651        set depflag 0
    16481652
     1653        # Sooner or later we may have to open this port to update the portinfo
     1654        # by evaluating the variants. Keep track of whether this has happened
     1655        set portwasopened 0
     1656
    16491657        # set version_installed
    16501658        set ilist {}
    16511659        if { [catch {set ilist [registry::installed $portname ""]} result] } {
     
    16531661                        ui_debug "$portname is *not* installed by DarwinPorts"
    16541662                        # open porthandle   
    16551663                        set porturl $portinfo(porturl)
    1656                     if {![info exists porturl]} {
    1657                         set porturl file://./   
     1664                        if {![info exists porturl]} {
     1665                                set porturl file://./   
    16581666                        }   
    1659                         if {[catch {set workername [dportopen $porturl [array get options] ]} result]} {
    1660                                         global errorInfo
    1661                                         ui_debug "$errorInfo"
     1667                        # Merge the global variations into the specified
     1668                        foreach { variation value } $globalvarlist {
     1669                                if { ![info exists variations($variation)] } {
     1670                                        set variations($variation) $value
     1671                                }
     1672                        }
     1673               
     1674                        if {[catch {set workername [dportopen $porturl [array get options] [array get variations]]} result]} {
     1675                                global errorInfo
     1676                                ui_debug "$errorInfo"
    16621677                                ui_error "Unable to open port: $result"       
    1663                                         return 1
    1664                     }
     1678                                return 1
     1679                        }
     1680                        # While we're at it, update the portinfo
     1681                        array unset portinfo
     1682                        array set portinfo [dportinfo $workername]
     1683                        set portwasopened 1
    16651684
    16661685                        if {![_dportispresent $workername $dspec ] } {
    16671686                                # port in not installed - install it!
     
    16711690                                        ui_error "Unable to exec port: $result"
    16721691                                        return 1
    16731692                                }
     1693                                if {$result > 0} {
     1694                                        ui_error "Problem while installing $portname"
     1695                                        return $result
     1696                                }
    16741697                        } else {
    16751698                                # port installed outside DP
    16761699                                ui_debug "$portname installed outside the MacPorts system"
    16771700                                set depflag 1
    16781701                        }
    16791702
     1703                        # update ilist since we just did an installation
     1704                        set ilist [registry::installed $portname ""]
    16801705                } else {
    16811706                        ui_error "Checking installed version failed: $result"
    16821707                        exit 1
     
    16851710        set anyactive 0
    16861711        set version_installed 0
    16871712        set epoch_installed 0
     1713
    16881714        if {$ilist == ""} {
    16891715                # XXX  this sets $version_installed to $version_in_tree even if not installed!!
    16901716                set version_installed $version_in_tree
     
    17171743                        }
    17181744                        }
    17191745                }
    1720         if { [lindex $num 4] == 0 && 0 == [string compare "image" ${darwinports::registry.installtype}] } {
     1746                # record the variant of the latest version
     1747                set variant [lindex $num 3]
     1748                if { [lindex $num 4] == 0 && 0 == [string compare "image" ${darwinports::registry.installtype}] } {
    17211749                        # activate the latest installed version
    17221750                        if {[catch {portimage::activate $portname $version_installed$variant $optionslist} result]} {
    17231751                                global errorInfo
    17241752                                ui_debug "$errorInfo"
    1725                         ui_error "Activating $portname $version_installed failed: $result"
     1753                                ui_error "Activating $portname $version_installed failed: $result"
    17261754                                return 1
    17271755                        }
    17281756                }
     
    17311759        # output version numbers
    17321760        ui_debug "epoch: in tree: $epoch_in_tree installed: $epoch_installed"
    17331761        ui_debug "$portname $version_in_tree exists in the ports tree"
    1734         ui_debug "$portname $version_installed is installed"
     1762        ui_debug "$portname $version_installed $variant is installed"
    17351763
    17361764        # set the nodeps option 
    17371765        if {![info exists options(ports_nodeps)]} {
     
    17401768                set nodeps yes
    17411769        }
    17421770
     1771        # save existing variant for later use
     1772        set oldvariant $variant
     1773        if {$portwasopened == 0} {
     1774                # If the port has not been opened, then before we do
     1775                # dependencies, we need to figure out the final variants,
     1776                # open the port, and update the portinfo. (If it was opened,
     1777                # then the variants must still be the ones we opened it with,
     1778                # and the portinfo is correct.)
     1779
     1780                set porturl $portinfo(porturl)
     1781                if {![info exists porturl]} {
     1782                        set porturl file://./
     1783                }
     1784
     1785                # check if the variants is present in $version_in_tree
     1786                set variant [split $variant +]
     1787                ui_debug "Merging existing variants $variant into variants"
     1788                if {[info exists portinfo(variants)]} {
     1789                        set avariants $portinfo(variants)
     1790                } else {
     1791                        set avariants {}
     1792                }
     1793                ui_debug "available variants are : $avariants"
     1794                foreach v $variant {
     1795                        if {[lsearch $avariants $v] == -1} {
     1796                        } else {
     1797                                ui_debug "variant $v is present in $portname $version_in_tree"
     1798                                if { ![info exists variations($v)]} {
     1799                                        set variations($v) "+"
     1800                                }
     1801                        }
     1802                }
     1803               
     1804                # Now merge in the global (i.e. variants.conf) variations.
     1805                # We wait until now so that existing variants for this port
     1806                # override global variations
     1807                foreach { variation value } $globalvarlist {
     1808                        if { ![info exists variations($variation)] } {
     1809                                set variations($variation) $value
     1810                        }
     1811                }
     1812               
     1813                ui_debug "new fully merged portvariants: [array get variations]"
     1814       
     1815                if {[catch {set workername [dportopen $porturl [array get options] [array get variations]]} result]} {
     1816                        global errorInfo
     1817                        ui_debug "$errorInfo"
     1818                        ui_error "Unable to open port: $result"
     1819                        return 1
     1820                }
     1821
     1822                array unset portinfo
     1823                array set portinfo [dportinfo $workername]
     1824                set portwasopened 1
     1825        }
     1826               
     1827
    17431828        if {$nodeps == "yes" || $depflag == 1} {
    17441829                ui_debug "Not following dependencies"
    17451830                set depflag 0
     
    17501835                                if {![llength [array get depscache $i]]} {
    17511836                                set d [lindex [split $i :] end]
    17521837                                        set depscache($i) 1
    1753                                         upgrade $d $i $variationslist $optionslist depscache
     1838                                        upgrade $d $i $globalvarlist $variationslist $optionslist depscache
    17541839                                }
    17551840                        }
    17561841                }
     
    17601845                                if {![llength [array get depscache $i]]} {
    17611846                                set d [lindex [split $i :] end]
    17621847                                        set depscache($i) 1
    1763                                         upgrade $d $i $variationslist $optionslist depscache
     1848                                        upgrade $d $i $globalvarlist $variationslist $optionslist depscache
    17641849                                }
    17651850                        }
    17661851                }
     
    17701855                                if {![llength [array get depscache $i]]} {
    17711856                                set d [lindex [split $i :] end]
    17721857                                        set depscache($i) 1
    1773                                         upgrade $d $i $variationslist $optionslist depscache
     1858                                        upgrade $d $i $globalvarlist $variationslist $optionslist depscache
    17741859                                }
    17751860                        }
    17761861                }
     
    17791864        # check installed version against version in ports
    17801865        if { [rpm-vercomp $version_installed $version_in_tree] >= 0 && ![info exists options(ports_force)] } {
    17811866                ui_debug "No need to upgrade! $portname $version_installed >= $portname $version_in_tree"
     1867                if {[info exists portinfo(portvariants)]
     1868                    && $portinfo(portvariants) != $oldvariant} {
     1869                        ui_warn "Skipping upgrdae since $portname $version_installed >= $portname $version_in_tree, even though installed variant $oldvariant differs from $portinfo(portvariants). Specify -f to force upgrade."
     1870                }
    17821871                if { $epoch_installed >= $epoch_in_tree } {
    17831872                        # Check if we have to do dependents
    17841873                        if {[info exists options(ports_do_dependents)]} {
     
    17911880                                if { [llength deplist] > 0 } {
    17921881                                        foreach dep $deplist {
    17931882                                                set dpname [lindex $dep 2]
    1794                                                 darwinports::upgrade $dpname "port:$dpname" [array get variations] [array get options]
     1883                                                darwinports::upgrade $dpname "port:$dpname" $globalvarlist $variationslist [array get options]
    17951884                                        }
    17961885                                }
    17971886                        }
     
    18031892                }
    18041893        }
    18051894
    1806         # open porthandle
    1807         set porturl $portinfo(porturl)
    1808         if {![info exists porturl]} {
    1809                 set porturl file://./
    1810         }
    18111895
    1812         # check if the variants is present in $version_in_tree
    1813         set oldvariant $variant
    1814         set variant [split $variant +]
    1815         ui_debug "variants to install $variant"
    1816         if {[info exists portinfo(variants)]} {
    1817                 set avariants $portinfo(variants)
    1818         } else {
    1819                 set avariants {}
    1820         }
    1821         ui_debug "available variants are : $avariants"
    1822         foreach v $variant {
    1823                 if {[lsearch $avariants $v] == -1} {
    1824                 } else {
    1825                         ui_debug "variant $v is present in $portname $version_in_tree"
    1826                         set variations($v) "+"
    1827                 }
    1828         }
    1829         ui_debug "new portvariants: [array get variations]"
    1830        
    1831         if {[catch {set workername [dportopen $porturl [array get options] [array get variations]]} result]} {
    1832                 global errorInfo
    1833                 ui_debug "$errorInfo"
    1834                 ui_error "Unable to open port: $result"
    1835                 return 1
    1836         }
    1837 
    18381896        # install version_in_tree
    18391897        if {0 == [string compare "yes" ${darwinports::portarchivemode}]} {
    18401898                set upgrade_action "archive"
     
    18871945                if { [llength deplist] > 0 } {
    18881946                        foreach dep $deplist {
    18891947                                set dpname [lindex $dep 2]
    1890                                 darwinports::upgrade $dpname "port:$dpname" [array get variations] [array get options]
     1948                                darwinports::upgrade $dpname "port:$dpname" $globalvarlist $variationslist [array get options]
    18911949                        }
    18921950                }
    18931951        }