[26921] trunk/base/src/macports1.0/macports.tcl

source_changes at macosforge.org source_changes at macosforge.org
Wed Jul 11 11:35:27 PDT 2007


Revision: 26921
          http://trac.macosforge.org/projects/macports/changeset/26921
Author:   sfiera at macports.org
Date:     2007-07-11 11:35:27 -0700 (Wed, 11 Jul 2007)

Log Message:
-----------
Changes to upgrade; a port's version and revision need to be considered
separately, for cases where the old and new versions consist of different
numbers of segments, i.e. openssl 0.9.8_2 and 0.9.8e_0 (true story!)

Modified Paths:
--------------
    trunk/base/src/macports1.0/macports.tcl

Modified: trunk/base/src/macports1.0/macports.tcl
===================================================================
--- trunk/base/src/macports1.0/macports.tcl	2007-07-11 16:36:02 UTC (rev 26920)
+++ trunk/base/src/macports1.0/macports.tcl	2007-07-11 18:35:27 UTC (rev 26921)
@@ -1701,19 +1701,20 @@
 	# fill array with information
 	array set portinfo [lindex $result 1]
 
-	# set version_in_tree
+	# set version_in_tree and revision_in_tree
 	if {![info exists portinfo(version)]} {
 		ui_error "Invalid port entry for $portname, missing version"
 		return 1
 	}
-	set version_in_tree "$portinfo(version)_$portinfo(revision)"
+	set version_in_tree "$portinfo(version)"
+	set revision_in_tree "$portinfo(revision)"
 	set epoch_in_tree "$portinfo(epoch)"
 
 	# the depflag tells us if we should follow deps (this is for stuff installed outside MacPorts)
 	# if this is set (not 0) we dont follow the deps
 	set depflag 0
 
-	# set version_installed
+	# set version_installed and revision_installed
 	set ilist {}
 	if { [catch {set ilist [registry::installed $portname ""]} result] } {
 		if {$result == "Registry error: $portname not registered as installed." } {
@@ -1751,10 +1752,12 @@
 	}
 	set anyactive 0
 	set version_installed 0
+	set revision_installed 0
 	set epoch_installed 0
 	if {$ilist == ""} {
 		# XXX  this sets $version_installed to $version_in_tree even if not installed!!
 		set version_installed $version_in_tree
+		set revision_installed $revision_in_tree
 		# That was a very dirty hack showing how ugly our depencendy and upgrade code is.
 		# To get it working when user provides -f, we also need to set the variant to
 		# avoid a future failure.
@@ -1766,30 +1769,38 @@
 		set variant ""
 		foreach i $ilist {
 			set variant [lindex $i 3]
-			set version "[lindex $i 1]_[lindex $i 2]"
-			if { [rpm-vercomp $version $version_installed] > 0} {
+			set version [lindex $i 1]
+			set revision [lindex $i 2]
+			if { [rpm-vercomp $version $version_installed] > 0
+					|| ([rpm-vercomp $version $version_installed] == 0
+						&& [rpm-vercomp $revision $revision_installed] > 0)} {
 				set version_installed $version
+				set revision_installed $revision
 				set epoch_installed [registry::property_retrieve [registry::open_entry $portname [lindex $i 1] [lindex $i 2] $variant] epoch]
 				set num $i
 			}
 
 			set isactive [lindex $i 4]
-			if {$isactive == 1 && [rpm-vercomp $version_installed $version] < 0 } {
-				# deactivate version
-    			if {[catch {portimage::deactivate $portname $version $optionslist} result]} {
-					global errorInfo
-					ui_debug "$errorInfo"
-    	    		ui_error "Deactivating $portname $version_installed failed: $result"
-    	    		return 1
-    			}
+			if {$isactive == 1}
+				if { [rpm-vercomp $version_installed $version] < 0
+						|| ([rpm-vercomp $version_installed $version] == 0
+							&& [rpm-vercomp $revision_installed $revision] < 0)} {
+					# deactivate version
+    				if {[catch {portimage::deactivate $portname $version $optionslist} result]} {
+						global errorInfo
+						ui_debug "$errorInfo"
+    	    			ui_error "Deactivating $portname $version_installed_$revision_installed failed: $result"
+    	    			return 1
+    				}
+				}
 			}
 		}
         if { [lindex $num 4] == 0 && 0 == [string compare "image" ${macports::registry.installtype}] } {
 			# activate the latest installed version
-			if {[catch {portimage::activate $portname $version_installed$variant $optionslist} result]} {
+			if {[catch {portimage::activate $portname ${version_installed}_$revision_installed$variant $optionslist} result]} {
 				global errorInfo
 				ui_debug "$errorInfo"
-    			ui_error "Activating $portname $version_installed failed: $result"
+    			ui_error "Activating $portname ${version_installed}_$revision_installed failed: $result"
 				return 1
 			}
 		}
@@ -1797,8 +1808,8 @@
 
 	# output version numbers
 	ui_debug "epoch: in tree: $epoch_in_tree installed: $epoch_installed"
-	ui_debug "$portname $version_in_tree exists in the ports tree"
-	ui_debug "$portname $version_installed is installed"
+	ui_debug "$portname ${version_in_tree}_$revision_in_tree exists in the ports tree"
+	ui_debug "$portname ${version_installed}_$revision_installed is installed"
 
 	# set the nodeps option  
 	if {![info exists options(ports_nodeps)]} {
@@ -1844,8 +1855,11 @@
 	}
 
 	# check installed version against version in ports
-	if { [rpm-vercomp $version_installed $version_in_tree] >= 0 && ![info exists options(ports_force)] } {
-		ui_debug "No need to upgrade! $portname $version_installed >= $portname $version_in_tree"
+	if { ( [rpm-vercomp $version_installed $version_in_tree] > 0
+			|| ([rpm-vercomp $version_installed $version_in_tree] == 0
+				&& [rpm-vercomp $revision_installed $revision_in_tree] >= 0 ))
+		&& ![info exists options(ports_force)] } {
+		ui_debug "No need to upgrade! $portname ${version_installed}_$revision_installed >= $portname ${version_in_tree}_$revision_in_tree"
 		if { $epoch_installed >= $epoch_in_tree } {
 			# Check if we have to do dependents
 			if {[info exists options(ports_do_dependents)]} {
@@ -1889,7 +1903,7 @@
 	foreach v $variant {
 		if {[lsearch $avariants $v] == -1} {
 		} else {
-			ui_debug "variant $v is present in $portname $version_in_tree"
+			ui_debug "variant $v is present in $portname ${version_in_tree}_$revision_in_tree"
 			set variations($v) "+"
 		}
 	}
@@ -1919,19 +1933,19 @@
 	# uninstall old ports
     if {[info exists options(port_uninstall_old)] || $epoch_override == 1 || [info exists options(ports_force)] || 0 != [string compare "image" ${macports::registry.installtype}] } {
 		# uninstall old
-		ui_debug "Uninstalling $portname $version_installed$oldvariant"
-		if {[catch {portuninstall::uninstall $portname $version_installed$oldvariant $optionslist} result]} {
+		ui_debug "Uninstalling $portname ${version_installed}_$revision_installed$oldvariant"
+		if {[catch {portuninstall::uninstall $portname ${version_installed}_$revision_installed$oldvariant $optionslist} result]} {
 			global errorInfo
 			ui_debug "$errorInfo"
-     		ui_error "Uninstall $portname $version_installed$oldvariant failed: $result"
+     		ui_error "Uninstall $portname ${version_installed}_$revision_installed$oldvariant failed: $result"
        		return 1
     	}
 	} else {
 		# XXX deactivate version_installed
-		if {[catch {portimage::deactivate $portname $version_installed$oldvariant $optionslist} result]} {
+		if {[catch {portimage::deactivate $portname ${version_installed}_$revision_installed$oldvariant $optionslist} result]} {
 			global errorInfo
 			ui_debug "$errorInfo"
-			ui_error "Deactivating $portname $version_installed failed: $result"
+			ui_error "Deactivating $portname ${version_installed}_$revision_installed failed: $result"
 			return 1
 		}
 	}
@@ -1939,7 +1953,7 @@
 	if {[catch {set result [mportexec $workername install]} result]} {
 		global errorInfo
 		ui_debug "$errorInfo"
-		ui_error "Couldn't activate $portname $version_in_tree$oldvariant: $result"
+		ui_error "Couldn't activate $portname ${version_in_tree}_$revision_in_tree$oldvariant: $result"
 		return 1
 	}
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20070711/95b47290/attachment.html


More information about the macports-changes mailing list