[64317] trunk/base/src

jmr at macports.org jmr at macports.org
Mon Mar 1 19:09:34 PST 2010


Revision: 64317
          http://trac.macports.org/changeset/64317
Author:   jmr at macports.org
Date:     2010-03-01 19:09:31 -0800 (Mon, 01 Mar 2010)
Log Message:
-----------
add flat->sqlite receipt conversion, fix receipt_sqlite::entry_exists_for_name, fix reg2 uninstall --follow-dependents

Modified Paths:
--------------
    trunk/base/src/macports1.0/macports.tcl
    trunk/base/src/registry2.0/portuninstall.tcl
    trunk/base/src/registry2.0/receipt_sqlite.tcl
    trunk/base/src/registry2.0/registry.tcl

Modified: trunk/base/src/macports1.0/macports.tcl
===================================================================
--- trunk/base/src/macports1.0/macports.tcl	2010-03-02 01:27:53 UTC (rev 64316)
+++ trunk/base/src/macports1.0/macports.tcl	2010-03-02 03:09:31 UTC (rev 64317)
@@ -907,10 +907,16 @@
     
     # init registry if needed
     if {${registry.format} == "receipt_sqlite"} {
-        registry::open [file join ${registry.path} registry registry.db]
+        set db_path [file join ${registry.path} registry registry.db]
+        set db_exists [file exists $db_path]
+        registry::open $db_path
         # for the benefit of the portimage code that is called from multiple interpreters
         global registry_open
         set registry_open yes
+        # convert any flat receipts if we just created a new db
+        if {$db_exists == 0 && [file writable $db_path]} {
+            registry::convert_to_sqlite
+        }
     }
 }
 

Modified: trunk/base/src/registry2.0/portuninstall.tcl
===================================================================
--- trunk/base/src/registry2.0/portuninstall.tcl	2010-03-02 01:27:53 UTC (rev 64316)
+++ trunk/base/src/registry2.0/portuninstall.tcl	2010-03-02 03:09:31 UTC (rev 64317)
@@ -130,7 +130,7 @@
         if {[info exists options(ports_uninstall_follow-dependents)] && $options(ports_uninstall_follow-dependents) eq "yes"} {
             foreach depport [$port dependents] {
                 # make sure it's still installed, since a previous dep uninstall may have removed it
-                if {[$depport state] == "imaged" || [$depport state] == "installed"} {
+                if {[registry::entry exists $depport] && ([$depport state] == "imaged" || [$depport state] == "installed")} {
                     set depname [$depport name]
                     set depver "[$depport version]_[$depport revision][$depport variants]"
                     portuninstall::uninstall $depname $depver [array get options]

Modified: trunk/base/src/registry2.0/receipt_sqlite.tcl
===================================================================
--- trunk/base/src/registry2.0/receipt_sqlite.tcl	2010-03-02 01:27:53 UTC (rev 64316)
+++ trunk/base/src/registry2.0/receipt_sqlite.tcl	2010-03-02 03:09:31 UTC (rev 64317)
@@ -72,7 +72,7 @@
 
 # Check to see if an entry exists
 proc entry_exists_for_name {name} {
-	if {![catch {registry::entry search name $name}]} {
+	if {![catch {set ports [registry::entry search name $name]}] && [llength $ports] > 0} {
 	    return 1
 	}
 	return 0
@@ -196,5 +196,29 @@
 	return $rlist
 }
 
+# adds a registry entry from a list of keys and values
+proc create_entry_l {proplist} {
+    array set props $proplist
+    registry::write {
+        set regref [registry::entry create $props(name) $props(version) $props(revision) $props(variants) $props(epoch)]
+        $regref date $props(date)
+        $regref location $props(location)
+        $regref state $props(state)
+        $regref installtype $props(installtype)
+        if {$props(installtype) == "image"} {
+            $regref map $props(imagefiles)
+            if {$props(state) == "installed"} {
+                $regref activate $props(imagefiles) $props(files)
+            }
+        } else {
+            $regref map $props(files)
+        }
+        foreach dep_portname $props(depends) {
+            $regref depends $dep_portname
+        }
+        $regref portfile $props(portfile)
+    }
+}
+
 # End of receipt_sqlite namespace
 }

Modified: trunk/base/src/registry2.0/registry.tcl
===================================================================
--- trunk/base/src/registry2.0/registry.tcl	2010-03-02 01:27:53 UTC (rev 64316)
+++ trunk/base/src/registry2.0/registry.tcl	2010-03-02 03:09:31 UTC (rev 64317)
@@ -389,7 +389,65 @@
 	return [${macports::registry.format}::write_dep_map $args]
 }
 
+# upgrade flat receipts to registry2.0 sqlite db
+proc convert_to_sqlite {} {
+    set ilist [receipt_flat::installed "" ""]
 
+    foreach installed $ilist {
+        set iname [lindex $installed 0]
+        set iversion [lindex $installed 1]
+        set irevision [lindex $installed 2]
+        set ivariants [lindex $installed 3]
+        set proplist [list name $iname version $iversion revision $irevision variants $ivariants]
+
+        set iref [receipt_flat::open_entry $iname $iversion $irevision $ivariants]
+        
+        lappend proplist date [receipt_flat::property_retrieve $iref date]
+        lappend proplist epoch [receipt_flat::property_retrieve $iref epoch]
+        
+        set installtype [receipt_flat::property_retrieve $iref installtype]
+        lappend proplist installtype $installtype
+        if { $installtype == "image" } {
+            set imagedir [receipt_flat::property_retrieve $iref imagedir]
+            set contents [receipt_flat::property_retrieve $iref contents]
+            set imagefiles [list]
+            set idlen [string length $imagedir]
+            foreach f $contents {
+                set fullpath [lindex $f 0]
+                # strip image dir from start
+                set path [string range $fullpath $idlen [string length $fullpath]]
+                lappend imagefiles $path
+            }
+            lappend proplist imagefiles $imagefiles
+            set active [receipt_flat::property_retrieve $iref active]
+            if {$active} {
+                set state installed
+                lappend proplist files [receipt_flat::port_registered $iname]
+            } else {
+                set state imaged
+            }
+        } else {
+            set imagedir ""
+            set state installed
+            lappend proplist files [receipt_flat::port_registered $iname]
+        }
+        lappend proplist location $imagedir
+        lappend proplist state $state
+        
+        receipt_flat::open_dep_map
+        set deplist [receipt_flat::list_depends $iname]
+        set depnames [list]
+        foreach dep $deplist {
+            lappend depnames [lindex $dep 0]
+        }
+        lappend proplist depends $depnames
+        
+        lappend proplist portfile ""
+        
+        # add the entry to the db
+        receipt_sqlite::create_entry_l $proplist
+    }
+}
+
 # End of registry namespace
 }
-
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20100301/8b6e8b9b/attachment-0001.html>


More information about the macports-changes mailing list