[66612] branches/new-help-system/base

raimue at macports.org raimue at macports.org
Sat Apr 17 21:08:02 PDT 2010


Revision: 66612
          http://trac.macports.org/changeset/66612
Author:   raimue at macports.org
Date:     2010-04-17 21:07:59 -0700 (Sat, 17 Apr 2010)
Log Message:
-----------
Merge from trunk

Modified Paths:
--------------
    branches/new-help-system/base/Mk/macports.tea.mk
    branches/new-help-system/base/configure
    branches/new-help-system/base/configure.ac
    branches/new-help-system/base/doc/portfile.7
    branches/new-help-system/base/portmgr/jobs/mirror_macports.sh
    branches/new-help-system/base/src/config.h.in
    branches/new-help-system/base/src/cregistry/Makefile
    branches/new-help-system/base/src/darwintracelib1.0/Makefile
    branches/new-help-system/base/src/macports1.0/macports.tcl
    branches/new-help-system/base/src/macports1.0/macports_fastload.tcl.in
    branches/new-help-system/base/src/macports1.0/sysctl.c
    branches/new-help-system/base/src/package1.0/portarchivefetch.tcl
    branches/new-help-system/base/src/pextlib1.0/Pextlib.c
    branches/new-help-system/base/src/pextlib1.0/rmd160cmd.c
    branches/new-help-system/base/src/pextlib1.0/sha1cmd.c
    branches/new-help-system/base/src/pextlib1.0/sha256cmd.c
    branches/new-help-system/base/src/pextlib1.0/tracelib.c
    branches/new-help-system/base/src/port/Makefile
    branches/new-help-system/base/src/port/port-help.tcl
    branches/new-help-system/base/src/port/port.tcl
    branches/new-help-system/base/src/port/portindex.tcl
    branches/new-help-system/base/src/port/portmirror.tcl
    branches/new-help-system/base/src/port1.0/Makefile
    branches/new-help-system/base/src/port1.0/fetch_common.tcl
    branches/new-help-system/base/src/port1.0/portbuild.tcl
    branches/new-help-system/base/src/port1.0/portconfigure.tcl
    branches/new-help-system/base/src/port1.0/portlint.tcl
    branches/new-help-system/base/src/port1.0/portmain.tcl
    branches/new-help-system/base/src/port1.0/portutil.tcl
    branches/new-help-system/base/src/registry2.0/portimage.tcl
    branches/new-help-system/base/src/registry2.0/portuninstall.tcl
    branches/new-help-system/base/src/registry2.0/receipt_flat.tcl
    branches/new-help-system/base/src/registry2.0/receipt_sqlite.tcl
    branches/new-help-system/base/src/registry2.0/registry.tcl
    branches/new-help-system/base/src/upgrade_sources_conf_default.tcl

Added Paths:
-----------
    branches/new-help-system/base/src/pextlib1.0/sha2.c
    branches/new-help-system/base/src/pextlib1.0/sha2.h

Property Changed:
----------------
    branches/new-help-system/base/


Property changes on: branches/new-help-system/base
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/gsoc08-privileges/base:37343-46937
/branches/gsoc09-logging/base:51231-60371
/branches/universal-sanity/base:51872-52323
/branches/variant-descs-14482/base:34469-34855,34900-37508,37511-37512,41040-41463,42575-42626,42640-42659
/trunk/base:49341-66043
/users/perry/base-bugs_and_notes:45682-46060
/users/perry/base-select:44044-44692
   + /branches/gsoc08-privileges/base:37343-46937
/branches/gsoc09-logging/base:51231-60371
/branches/universal-sanity/base:51872-52323
/branches/variant-descs-14482/base:34469-34855,34900-37508,37511-37512,41040-41463,42575-42626,42640-42659
/trunk/base:49341-66610
/users/perry/base-bugs_and_notes:45682-46060
/users/perry/base-select:44044-44692

Modified: branches/new-help-system/base/Mk/macports.tea.mk
===================================================================
--- branches/new-help-system/base/Mk/macports.tea.mk	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/Mk/macports.tea.mk	2010-04-18 04:07:59 UTC (rev 66612)
@@ -14,7 +14,7 @@
 	${SHLIB_LD} ${OBJS} -o ${SHLIB_NAME} ${TCL_STUB_LIB_SPEC} ${SHLIB_LDFLAGS} ${LIBS}
 
 pkgIndex.tcl: $(SHLIB_NAME)
-	$(SILENT) ../pkg_mkindex.sh .
+	$(SILENT) ../pkg_mkindex.sh . || ( rm -rf $@ && exit 1 )
 
 clean::
 	rm -f ${OBJS} ${SHLIB_NAME} so_locations pkgIndex.tcl

Modified: branches/new-help-system/base/configure
===================================================================
--- branches/new-help-system/base/configure	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/configure	2010-04-18 04:07:59 UTC (rev 66612)
@@ -8232,7 +8232,7 @@
 fi
 
 for ac_header in limits.h paths.h sys/file.h crt_externs.h fcntl.h sys/fcntl.h sys/cdefs.h err.h sys/socket.h \
-	readline/readline.h readline/history.h pwd.h sys/paths.h utime.h
+	sys/sysctl.h readline/readline.h readline/history.h pwd.h sys/paths.h utime.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -8250,7 +8250,7 @@
 INCLUDES="-I.. -I. $INCLUDES"
 
 # Checks for library functions.
-for ac_func in bzero memset fgetln lockf flock setmode strcasecmp strncasecmp strlcpy copyfile clearenv
+for ac_func in bzero memset fgetln lockf flock setmode strcasecmp strncasecmp strlcpy copyfile clearenv sysctlbyname
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -9365,7 +9365,7 @@
 
 
 # Output
-ac_config_files="$ac_config_files Doxyfile Makefile Mk/macports.autoconf.mk doc/prefix.mtree doc/macosx.mtree doc/macports.conf doc/asciidoc.conf portmgr/freebsd/Makefile src/Makefile src/macports1.0/macports_autoconf.tcl src/port1.0/port_autoconf.tcl src/registry2.0/registry_autoconf.tcl src/programs/Makefile src/macports1.0/macports_fastload.tcl setupenv.bash"
+ac_config_files="$ac_config_files Doxyfile Makefile Mk/macports.autoconf.mk doc/prefix.mtree doc/macosx.mtree doc/macports.conf portmgr/freebsd/Makefile src/Makefile src/macports1.0/macports_autoconf.tcl src/port1.0/port_autoconf.tcl src/registry2.0/registry_autoconf.tcl src/programs/Makefile src/macports1.0/macports_fastload.tcl setupenv.bash"
 
 
 ac_config_files="$ac_config_files src/pkg_mkindex.sh"
@@ -10062,7 +10062,6 @@
     "doc/prefix.mtree") CONFIG_FILES="$CONFIG_FILES doc/prefix.mtree" ;;
     "doc/macosx.mtree") CONFIG_FILES="$CONFIG_FILES doc/macosx.mtree" ;;
     "doc/macports.conf") CONFIG_FILES="$CONFIG_FILES doc/macports.conf" ;;
-    "doc/asciidoc.conf") CONFIG_FILES="$CONFIG_FILES doc/asciidoc.conf" ;;
     "portmgr/freebsd/Makefile") CONFIG_FILES="$CONFIG_FILES portmgr/freebsd/Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
     "src/macports1.0/macports_autoconf.tcl") CONFIG_FILES="$CONFIG_FILES src/macports1.0/macports_autoconf.tcl" ;;

Modified: branches/new-help-system/base/configure.ac
===================================================================
--- branches/new-help-system/base/configure.ac	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/configure.ac	2010-04-18 04:07:59 UTC (rev 66612)
@@ -194,12 +194,12 @@
 AC_HEADER_DIRENT
 AC_HEADER_SYS_WAIT
 AC_CHECK_HEADERS([limits.h paths.h sys/file.h crt_externs.h fcntl.h sys/fcntl.h sys/cdefs.h err.h sys/socket.h \
-	readline/readline.h readline/history.h pwd.h sys/paths.h utime.h])
+	sys/sysctl.h readline/readline.h readline/history.h pwd.h sys/paths.h utime.h])
 
 INCLUDES="-I.. -I. $INCLUDES"
 
 # Checks for library functions.
-AC_CHECK_FUNCS([bzero memset fgetln lockf flock setmode strcasecmp strncasecmp strlcpy copyfile clearenv])
+AC_CHECK_FUNCS([bzero memset fgetln lockf flock setmode strcasecmp strncasecmp strlcpy copyfile clearenv sysctlbyname])
 MP_CHECK_READLINK_IS_P1003_1A
 
 # Check for md5 implementation

Modified: branches/new-help-system/base/doc/portfile.7
===================================================================
--- branches/new-help-system/base/doc/portfile.7	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/doc/portfile.7	2010-04-18 04:07:59 UTC (rev 66612)
@@ -1556,7 +1556,7 @@
 .br
 .Sy Values:
 .Em moddate none
-.It Ic livecheck.check
+.It Ic livecheck.type
 What kind of check to perform to figure out if the software has been updated.
 Can be
 .Em freshmeat

Modified: branches/new-help-system/base/portmgr/jobs/mirror_macports.sh
===================================================================
--- branches/new-help-system/base/portmgr/jobs/mirror_macports.sh	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/portmgr/jobs/mirror_macports.sh	2010-04-18 04:07:59 UTC (rev 66612)
@@ -41,7 +41,7 @@
   $PORT mirror $P;
 
   # for each variant
-  for V in `$PORT variants $P | $GREP -v 'has no variants' | $GREP -v 'has the variants' | $CUT -d " " -f 1 | $CUT -d ":" -f 1 | $GREP -v universal | $XARGS`;
+  for V in `$PORT -q variants $P | $CUT -d " " -f 1 | $CUT -d ":" -f 1 | $GREP -v universal | $XARGS`;
   do
     # mirror with each variant
     echo "Mirroring ${P} +${V}";
@@ -49,6 +49,16 @@
     $PORT mirror $P +$V; 
   done
 
+  # mirror with each platform (can exclude the one the server is running)
+  for VERS in "8 9 10";
+  do
+    for ARCH in "i386 powerpc";
+    do
+      echo "Mirroring ${P} with platform darwin ${VERS} ${ARCH}"
+      $PORT mirror $P os.major=${VERS} os.arch=${ARCH}
+    done
+  done
+
   # clean up the work area
   $PORT clean --work $P;
 

Modified: branches/new-help-system/base/src/config.h.in
===================================================================
--- branches/new-help-system/base/src/config.h.in	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/config.h.in	2010-04-18 04:07:59 UTC (rev 66612)
@@ -152,6 +152,9 @@
 /* Define to 1 if you have the `strncasecmp' function. */
 #undef HAVE_STRNCASECMP
 
+/* Define to 1 if you have the `sysctlbyname' function. */
+#undef HAVE_SYSCTLBYNAME
+
 /* Define to 1 if you have the <sys/cdefs.h> header file. */
 #undef HAVE_SYS_CDEFS_H
 
@@ -178,6 +181,9 @@
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
+/* Define to 1 if you have the <sys/sysctl.h> header file. */
+#undef HAVE_SYS_SYSCTL_H
+
 /* Define to 1 if you have the <sys/types.h> header file. */
 #undef HAVE_SYS_TYPES_H
 

Modified: branches/new-help-system/base/src/cregistry/Makefile
===================================================================
--- branches/new-help-system/base/src/cregistry/Makefile	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/cregistry/Makefile	2010-04-18 04:07:59 UTC (rev 66612)
@@ -22,7 +22,7 @@
 	${SHLIB_LD} ${SQLEXT_OBJS} -o $@
 
 clean::
-	rm -f ${STLIB_NAME} ${SQLEXT_NAME} ${OBJS}
+	rm -f ${STLIB_NAME} ${SQLEXT_NAME} ${SQLEXT_OBJS} ${OBJS}
 
 distclean:: clean
 

Modified: branches/new-help-system/base/src/darwintracelib1.0/Makefile
===================================================================
--- branches/new-help-system/base/src/darwintracelib1.0/Makefile	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/darwintracelib1.0/Makefile	2010-04-18 04:07:59 UTC (rev 66612)
@@ -6,6 +6,8 @@
 
 include ../../Mk/macports.autoconf.mk
 
+CFLAGS+= -fPIC
+
 all:: ${SHLIB_NAME}
 
 $(SHLIB_NAME):: ${OBJS}

Modified: branches/new-help-system/base/src/macports1.0/macports.tcl
===================================================================
--- branches/new-help-system/base/src/macports1.0/macports.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/macports1.0/macports.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -63,7 +63,7 @@
 
     variable open_mports {}
 
-    variable ui_priorities "debug info msg error warn any"
+    variable ui_priorities "error warn msg info debug any"
     variable port_phases "any fetch checksum"
     variable current_phase "main"
 }
@@ -180,7 +180,7 @@
     }
 }
 
-proc ui_phase {phase} {
+proc set_phase {phase} {
     global macports::current_phase
     set macports::current_phase $phase
     if {$phase != "main"} {
@@ -188,6 +188,7 @@
         ui_debug "$phase phase started at $cur_time"
     }
 }
+
 proc ui_message {priority prefix phase args} {
     global macports::channels ::debuglog macports::current_phase
     foreach chan $macports::channels($priority) {
@@ -241,9 +242,6 @@
             interp alias {} ui_${priority}_${phase} {} ui_message $priority $prefix $phase
         }
     }
-    # Call ui_$priority
-    eval ::ui_$priority $args
-    
 }
 
 # Default implementation of ui_prefix
@@ -301,10 +299,6 @@
     }
 }
 
-foreach priority ${macports::ui_priorities} {
-    proc ui_$priority {args} [subst { eval macports::ui_init $priority \$args }]
-}
-
 proc ui_warn_once {id msg} {
     variable macports::warning_done
     if {![info exists macports::warning_done($id)]} {
@@ -417,6 +411,11 @@
         upvar $up_variations variations
     }
 
+    # Initialize ui_*
+    foreach priority ${macports::ui_priorities} {
+        macports::ui_init $priority
+    }
+
     global auto_path env tcl_platform
     global macports::autoconf::macports_conf_path
     global macports::macports_user_dir
@@ -473,7 +472,7 @@
         lappend conf_files ${PORTSRC}
     }
 
-    # Process the first configuration file we find on conf_files list
+    # Process all configuration files we find on conf_files list
     foreach file $conf_files {
         if [file exists $file] {
             set portconf $file
@@ -571,7 +570,7 @@
         }
     }
     global macports::global_variations
-    array set macports::global_variations [mport_filtervariants [array get variations] yes]
+    array set macports::global_variations [array get variations]
 
     if {![info exists portdbpath]} {
         return -code error "portdbpath must be set in ${macports_conf_path}/macports.conf or in your ${macports_user_dir}/macports.conf"
@@ -771,6 +770,8 @@
         } else {
             set macports::universal_archs {i386 ppc}
         }
+    } elseif {[llength $macports::universal_archs] < 2} {
+        ui_warn "invalid universal_archs configured (should contain at least 2 archs)"
     }
     
     # Default arch to build for
@@ -950,7 +951,7 @@
     $workername alias mport_open mportopen
     $workername alias mport_close mportclose
     $workername alias mport_lookup mportlookup
-    $workername alias ui_phase ui_phase
+    $workername alias set_phase set_phase
 
     # instantiate the UI call-backs
     foreach priority ${macports::ui_priorities} {
@@ -1185,37 +1186,6 @@
 }
 
 
-# mport_filtervariants
-# returns the given list of variants with implicitly-set ones removed
-proc mport_filtervariants {variations {warn yes}} {
-    # Iterate through the variants, filtering out
-    # implicit ones. At the moment, the only implicit variants are
-    # platform variants.
-    set filteredvariations {}
-
-    foreach {variation value} $variations {
-        switch -regexp $variation {
-            ^(pure)?darwin         -
-            ^(free|net|open){1}bsd -
-            ^i386                  -
-            ^linux                 -
-            ^macosx                -
-            ^powerpc               -
-            ^solaris               -
-            ^sunos {
-                if {$warn} {
-                    ui_warn "Implicit variants should not be explicitly set or unset. $variation will be ignored."
-                }
-            }
-            default {
-                lappend filteredvariations $variation $value
-            }
-        }
-    }
-    return $filteredvariations
-}
-
-
 # mportopen
 # Opens a MacPorts portfile specified by a URL.  The Portfile is
 # opened with the given list of options and variations.  The result
@@ -1311,7 +1281,6 @@
     foreach v $minusvariant {
         lappend variations $v "-"
     }
-    set variations [mport_filtervariants $variations no]
     
     return [mportopen "file://${portfile_dir}/" $options $variations]
 }
@@ -1585,6 +1554,15 @@
         set dlist [dlist_append_dependents $macports::open_mports $mport {}]
 
         dlist_delete dlist $mport
+        
+        # print the dep list
+        if {[llength $dlist] > 0} {
+            set depstring "--->  Dependencies to be installed:"
+            foreach ditem $dlist {
+                append depstring " [ditem_key $ditem provides]"
+            }
+            ui_msg $depstring
+        }
 
         # install them
         # xxx: as with below, this is ugly.  and deps need to be fixed to
@@ -1649,82 +1627,82 @@
     set workername [ditem_key $mport workername]
     set deptypes [macports::_deptypes_for_target $target]
     array set portinfo [mportinfo $mport]
-    set depends {}
     array set depscache {}
 
     set required_archs [$workername eval get_canonical_archs]
+    set depends_skip_archcheck [_mportkey $mport depends_skip_archcheck]
 
-    foreach deptype $deptypes {
-        # Add to the list of dependencies if the option exists and isn't empty.
-        if {[info exists portinfo($deptype)] && $portinfo($deptype) != ""} {
-            set depends [concat $depends $portinfo($deptype)]
-        }
-    }
-    
     if {[string equal ${macports::registry.installtype} "image"]} {
         set test _portnameactive
     } else {
         set test registry::entry_exists_for_name
     }
 
-    foreach depspec $depends {
-        set dep_portname [$workername eval _get_dep_port $depspec]
-        if {$dep_portname != "" && ![info exists depscache(port:$dep_portname)] && [$test $dep_portname]} {
-            set variants {}
-
-            # check that the dep has the required archs
-            set active_archs [_get_registry_archs $dep_portname]
-            if {$active_archs != "" && $active_archs != "noarch" && $required_archs != "noarch"} {
-                set missing {}
-                foreach arch $required_archs {
-                    if {[lsearch -exact $active_archs $arch] == -1} {
-                        lappend missing $arch
+    foreach deptype $deptypes {
+        if {![info exists portinfo($deptype)]} {
+            set portinfo($deptype) ""
+        }
+        foreach depspec $portinfo($deptype) {
+            set dep_portname [$workername eval _get_dep_port $depspec]
+            if {$dep_portname != "" && ![info exists depscache(port:$dep_portname)] && [$test $dep_portname]} {
+                set variants {}
+    
+                # check that the dep has the required archs
+                set active_archs [_get_registry_archs $dep_portname]
+                if {$deptype != "depends_fetch" && $deptype != "depends_extract"
+                    && $active_archs != "" && $active_archs != "noarch" && $required_archs != "noarch"
+                    && [lsearch -exact $depends_skip_archcheck $dep_portname] == -1} {
+                    set missing {}
+                    foreach arch $required_archs {
+                        if {[lsearch -exact $active_archs $arch] == -1} {
+                            lappend missing $arch
+                        }
                     }
-                }
-                if {[llength $missing] > 0} {
-                    set res [mportlookup $dep_portname]
-                    array unset dep_portinfo
-                    array set dep_portinfo [lindex $res 1]
-                    if {[info exists dep_portinfo(variants)] && [lsearch $dep_portinfo(variants) universal] != -1} {
-                        # dep offers a universal variant
-                        if {[llength $active_archs] == 1} {
-                            # not installed universal
-                            set missing {}
-                            foreach arch $required_archs {
-                                if {[lsearch -exact $macports::universal_archs $arch] == -1} {
-                                    lappend missing $arch
+                    if {[llength $missing] > 0} {
+                        set res [mportlookup $dep_portname]
+                        array unset dep_portinfo
+                        array set dep_portinfo [lindex $res 1]
+                        if {[info exists dep_portinfo(variants)] && [lsearch $dep_portinfo(variants) universal] != -1} {
+                            # dep offers a universal variant
+                            if {[llength $active_archs] == 1} {
+                                # not installed universal
+                                set missing {}
+                                foreach arch $required_archs {
+                                    if {[lsearch -exact $macports::universal_archs $arch] == -1} {
+                                        lappend missing $arch
+                                    }
                                 }
-                            }
-                            if {[llength $missing] > 0} {
+                                if {[llength $missing] > 0} {
+                                    ui_error "Cannot install [_mportkey $mport name] for the arch(s) '$required_archs' because"
+                                    ui_error "its dependency $dep_portname is only installed for the arch '$active_archs'"
+                                    ui_error "and the configured universal_archs '$macports::universal_archs' are not sufficient."
+                                    return -code error "architecture mismatch"
+                                } else {
+                                    # upgrade the dep with +universal
+                                    lappend variants universal +
+                                    lappend options ports_upgrade_enforce-variants yes
+                                }
+                            } else {
+                                # already universal
                                 ui_error "Cannot install [_mportkey $mport name] for the arch(s) '$required_archs' because"
-                                ui_error "its dependency $dep_portname is only installed for the arch '$active_archs'"
-                                ui_error "and the configured universal_archs '$macports::universal_archs' are not sufficient."
+                                ui_error "its dependency $dep_portname is only installed for the archs '$active_archs'."
                                 return -code error "architecture mismatch"
-                            } else {
-                                # upgrade the dep with +universal
-                                lappend variants universal +
-                                lappend options ports_upgrade_enforce-variants yes
                             }
                         } else {
-                            # already universal
                             ui_error "Cannot install [_mportkey $mport name] for the arch(s) '$required_archs' because"
-                            ui_error "its dependency $dep_portname is only installed for the archs '$active_archs'."
+                            ui_error "its dependency $dep_portname is only installed for the arch '$active_archs'"
+                            ui_error "and does not have a universal variant."
                             return -code error "architecture mismatch"
                         }
-                    } else {
-                        ui_error "Cannot install [_mportkey $mport name] for the arch(s) '$required_archs' because"
-                        ui_error "its dependency $dep_portname is only installed for the arch '$active_archs'"
-                        ui_error "and does not have a universal variant."
-                        return -code error "architecture mismatch"
                     }
                 }
+    
+                set status [macports::upgrade $dep_portname "port:$dep_portname" $variants $options depscache]
+                # status 2 means the port was not found in the index
+                if {$status != 0 && $status != 2 && ![macports::ui_isset ports_processall]} {
+                    return -code error "upgrade $dep_portname failed"
+                }
             }
-
-            set status [macports::upgrade $dep_portname "port:$dep_portname" $variants $options depscache]
-            # status 2 means the port was not found in the index
-            if {$status != 0 && $status != 2 && ![macports::ui_isset ports_processall]} {
-                return -code error "upgrade $dep_portname failed"
-            }
         }
     }
 }
@@ -1947,6 +1925,11 @@
         }
     }
 
+    # refresh the quick index if necessary (batch or interactive run)
+    if {[info exists macports::ui_options(ports_commandfiles)]} {
+        _mports_load_quickindex
+    }
+
     if {$numfailed > 0} {
         return -code error "Synchronization of $numfailed source(s) failed"
     }
@@ -2215,6 +2198,8 @@
 proc _mports_load_quickindex {args} {
     global macports::sources macports::quick_index
 
+    unset -nocomplain macports::quick_index
+
     set sourceno 0
     foreach source $sources {
         unset -nocomplain quicklist
@@ -2288,7 +2273,7 @@
 
 proc mportinfo {mport} {
     set workername [ditem_key $mport workername]
-    return [$workername eval array get PortInfo]
+    return [$workername eval array get ::PortInfo]
 }
 
 proc mportclose {mport} {
@@ -2334,7 +2319,6 @@
 proc mportdepends {mport {target ""} {recurseDeps 1} {skipSatisfied 1}} {
 
     array set portinfo [mportinfo $mport]
-    set depends {}
     set deptypes {}
 
     # progress indicator
@@ -2356,91 +2340,92 @@
 
     set deptypes [macports::_deptypes_for_target $target]
 
-    # Gather the dependencies for deptypes
-    foreach deptype $deptypes {
-        # Add to the list of dependencies if the option exists and isn't empty.
-        if {[info exists portinfo($deptype)] && $portinfo($deptype) != ""} {
-            set depends [concat $depends $portinfo($deptype)]
-        }
-    }
-
     set subPorts {}
-    if {[llength $depends] > 0} {
+    if {[llength $deptypes] > 0} {
         array set optionsarray [ditem_key $mport options]
         # avoid propagating requested flag from parent
         set optionsarray(ports_requested) 0
         set options [array get optionsarray]
         set variations [ditem_key $mport variations]
         set required_archs [[ditem_key $mport workername] eval get_canonical_archs]
+        set depends_skip_archcheck [_mportkey $mport depends_skip_archcheck]
     }
 
-    foreach depspec $depends {
-        # Is that dependency satisfied or this port installed?
-        # If we don't skip or if it is not, add it to the list.
-        if {!$skipSatisfied || ![_mportispresent $mport $depspec]} {
-            # grab the portname portion of the depspec
-            set dep_portname [lindex [split $depspec :] end]
-
-            # Find the porturl
-            if {[catch {set res [mportlookup $dep_portname]} error]} {
-                global errorInfo
-                ui_debug "$errorInfo"
-                ui_error "Internal error: port lookup failed: $error"
-                return 1
-            }
-
-            array unset portinfo
-            array set portinfo [lindex $res 1]
-            if {![info exists portinfo(porturl)]} {
-                if {![macports::ui_isset ports_debug]} {
-                    ui_msg ""
+    # Process the dependencies for each of the deptypes
+    foreach deptype $deptypes {
+        if {![info exists portinfo($deptype)]} {
+            set portinfo($deptype) ""
+        }
+        foreach depspec $portinfo($deptype) {
+            # Is that dependency satisfied or this port installed?
+            # If we don't skip or if it is not, add it to the list.
+            if {!$skipSatisfied || ![_mportispresent $mport $depspec]} {
+                # grab the portname portion of the depspec
+                set dep_portname [lindex [split $depspec :] end]
+    
+                # Find the porturl
+                if {[catch {set res [mportlookup $dep_portname]} error]} {
+                    global errorInfo
+                    ui_debug "$errorInfo"
+                    ui_error "Internal error: port lookup failed: $error"
+                    return 1
                 }
-                ui_error "Dependency '$dep_portname' not found."
-                return 1
-            }
-
-            # Figure out the subport. Check the open_mports list first, since
-            # we potentially leak mport references if we mportopen each time,
-            # because mportexec only closes each open mport once.
-            set subport [dlist_search $macports::open_mports porturl $portinfo(porturl)]
-            if {$subport == {}} {
-                # We haven't opened this one yet.
-                set subport [mportopen $portinfo(porturl) $options $variations]
-
-                # check archs
-                if {![macports::_mport_supports_archs $subport $required_archs]} {
-                    set supported_archs [_mportkey $subport supported_archs]
-                    mportclose $subport
-                    set arch_mismatch 1
-                    set has_universal 0
-                    if {[info exists portinfo(variants)] && [lsearch -exact $portinfo(variants) universal] != -1} {
-                        # a universal variant is offered
-                        set has_universal 1
-                        array unset variation_array
-                        array set variation_array $variations
-                        if {![info exists variation_array(universal)] || $variation_array(universal) != "+"} {
-                            set variation_array(universal) +
-                            # try again with +universal
-                            set subport [mportopen $portinfo(porturl) $options [array get variation_array]]
-                            if {[macports::_mport_supports_archs $subport $required_archs]} {
-                                set arch_mismatch 0
+    
+                array unset dep_portinfo
+                array set dep_portinfo [lindex $res 1]
+                if {![info exists dep_portinfo(porturl)]} {
+                    if {![macports::ui_isset ports_debug]} {
+                        ui_msg ""
+                    }
+                    ui_error "Dependency '$dep_portname' not found."
+                    return 1
+                }
+    
+                # Figure out the subport. Check the open_mports list first, since
+                # we potentially leak mport references if we mportopen each time,
+                # because mportexec only closes each open mport once.
+                set subport [dlist_search $macports::open_mports porturl $dep_portinfo(porturl)]
+                if {$subport == {}} {
+                    # We haven't opened this one yet.
+                    set subport [mportopen $dep_portinfo(porturl) $options $variations]
+    
+                    # check archs
+                    if {$deptype != "depends_fetch" && $deptype != "depends_extract"
+                        && [lsearch -exact $depends_skip_archcheck $dep_portname] == -1
+                        && ![macports::_mport_supports_archs $subport $required_archs]} {
+                        set supported_archs [_mportkey $subport supported_archs]
+                        mportclose $subport
+                        set arch_mismatch 1
+                        set has_universal 0
+                        if {[info exists dep_portinfo(variants)] && [lsearch -exact $dep_portinfo(variants) universal] != -1} {
+                            # a universal variant is offered
+                            set has_universal 1
+                            array unset variation_array
+                            array set variation_array $variations
+                            if {![info exists variation_array(universal)] || $variation_array(universal) != "+"} {
+                                set variation_array(universal) +
+                                # try again with +universal
+                                set subport [mportopen $dep_portinfo(porturl) $options [array get variation_array]]
+                                if {[macports::_mport_supports_archs $subport $required_archs]} {
+                                    set arch_mismatch 0
+                                }
                             }
                         }
+                        if {$arch_mismatch} {
+                            macports::_explain_arch_mismatch [_mportkey $mport name] $dep_portname $required_archs $supported_archs $has_universal
+                            return -code error "architecture mismatch"
+                        }
                     }
-                    if {$arch_mismatch} {
-                        macports::_explain_arch_mismatch [_mportkey $mport name] $dep_portname $required_archs $supported_archs $has_universal
-                        return -code error "architecture mismatch"
+                    
+                    if {$recurseDeps} {
+                        # Add to the list we need to recurse on.
+                        lappend subPorts $subport
                     }
                 }
-                
-                if {$recurseDeps} {
-                    # Add to the list we need to recurse on.
-                    lappend subPorts $subport
-                }
+    
+                # Append the sub-port's provides to the port's requirements list.
+                ditem_append_unique $mport requires "[ditem_key $subport provides]"
             }
-
-            # Append the sub-port's provides to the port's requirements list.
-            ditem_append_unique $mport requires "[ditem_key $subport provides]"
         }
     }
 
@@ -2514,11 +2499,12 @@
         extract     -
         patch       { set deptypes "depends_fetch depends_extract" }
         configure   -
-        build       { set deptypes "depends_fetch depends_extract depends_lib depends_build" }
+        build       { set deptypes "depends_fetch depends_extract depends_build depends_lib" }
 
         test        -
         destroot    -
         install     -
+        activate    -
         archive     -
         dmg         -
         pkg         -
@@ -2528,7 +2514,7 @@
         rpm         -
         srpm        -
         dpkg        -
-        ""          { set deptypes "depends_fetch depends_extract depends_lib depends_build depends_run" }
+        ""          { set deptypes "depends_fetch depends_extract depends_build depends_lib depends_run" }
     }
     return $deptypes
 }
@@ -2675,8 +2661,6 @@
         set macports::global_options(ports_nodeps) yes
         set orig_nodeps no
     }
-    # filter out implicit variants from the explicitly set/unset variants.
-    set variationslist [mport_filtervariants $variationslist yes]
     
     # run the actual upgrade
     set status [macports::_upgrade $portname $dspec $variationslist $optionslist depscache]
@@ -2772,7 +2756,7 @@
                 
                 # upgrade its dependencies first
                 set status [_upgrade_dependencies portinfo depscache variationslist options yes]
-                if {$status != 0 && ![ui_isset ports_processall]} {
+                if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} {
                     catch {mportclose $workername}
                     return $status
                 }
@@ -2882,8 +2866,6 @@
     foreach v $minusvariant {
         lappend oldvariantlist $v "-"
     }
-    # remove implicit variants, without printing warnings
-    set oldvariantlist [mport_filtervariants $oldvariantlist no]
 
     # merge in the old variants
     foreach {variation value} $oldvariantlist {
@@ -2986,7 +2968,7 @@
     # first upgrade dependencies
     if {![info exists options(ports_nodeps)]} {
         set status [_upgrade_dependencies portinfo depscache variationslist options $will_build]
-        if {$status != 0 && ![ui_isset ports_processall]} {
+        if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} {
             catch {mportclose $workername}
             return $status
         }
@@ -3012,7 +2994,7 @@
                     set mpname [lindex $dep 2]
                     if {![llength [array get depscache port:${mpname}]]} {
                         set status [macports::_upgrade $mpname port:${mpname} $variationslist [array get options] depscache]
-                        if {$status != 0 && ![ui_isset ports_processall]} {
+                        if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} {
                             catch {mportclose $workername}
                             return $status
                         }
@@ -3131,7 +3113,7 @@
                 set mpname [lindex $dep 2]
                 if {![llength [array get depscache port:${mpname}]]} {
                     set status [macports::_upgrade $mpname port:${mpname} $variationslist [array get options] depscache]
-                    if {$status != 0 && ![ui_isset ports_processall]} {
+                    if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} {
                         catch {mportclose $workername}
                         return $status
                     }
@@ -3213,11 +3195,11 @@
                         set d [lindex [split $i :] end]
                     }
                     set status [macports::_upgrade $d $dspec $variationslist [array get options] depscache]
-                    if {$status != 0 && ![ui_isset ports_processall]} break
+                    if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} break
                 }
             }
         }
-        if {$status != 0 && ![ui_isset ports_processall]} break
+        if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} break
     }
     # restore dependent-following to its former value
     if {$saved_do_dependents} {

Modified: branches/new-help-system/base/src/macports1.0/macports_fastload.tcl.in
===================================================================
--- branches/new-help-system/base/src/macports1.0/macports_fastload.tcl.in	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/macports1.0/macports_fastload.tcl.in	2010-04-18 04:07:59 UTC (rev 66612)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
 # macports_fastload.tcl.in
 # $Id$
 #
@@ -45,39 +46,45 @@
 #
 if { [regexp {\d+\.\d+\.\d+} [info patchlevel]] &&
         ([package vcompare [info patchlevel] 8.4.7] < 0) } {
-	global allpackages
-	if {![info exists allpackages]} {
-		# Only patch once.
-		array set allpackages {}
-		rename package package_native
-		proc package {args} {
-				global allpackages
-				if {([lindex $args 0] == "ifneeded") && ([llength $args] == 4)} {
-						set package_name [lindex $args 1]
-						set package_version [lindex $args 2]
-						set package_key ${package_name}::${package_version}
-						if {![info exists allpackages($package_key)]} {
-								set allpackages($package_key) 1
-								set result [eval package_native $args]
-						} else {
-								set result ""
-						}
-				} else {
-						set result [eval package_native $args]
-				}
-				return $result
-		}
-	}
+    global allpackages
+    if {![info exists allpackages]} {
+        # Only patch once.
+        array set allpackages {}
+        rename package package_native
+        proc package {args} {
+            global allpackages
+            if {([lindex $args 0] == "ifneeded") && ([llength $args] == 4)} {
+                set package_name [lindex $args 1]
+                set package_version [lindex $args 2]
+                set package_key ${package_name}::${package_version}
+                if {![info exists allpackages($package_key)]} {
+                    set allpackages($package_key) 1
+                    set result [eval package_native $args]
+                    } else {
+                        set result ""
+                    }
+            } else {
+                set result [eval package_native $args]
+            }
+            return $result
+        }
+    }
 }
 
-set sharetcldir "@macports_tcl_dir@"
+set sharetcldir [file normalize [file join [file dirname [info script]] ..]]
 if {[file exists $sharetcldir]} {
-	foreach dir [glob -directory $sharetcldir *] {
-		catch {source [file join $dir pkgIndex.tcl]}
-	}
+    foreach dir [glob -directory $sharetcldir *] {
+        set pkgindex [file join $dir pkgIndex.tcl]
+        if [file exists $pkgindex] {
+            source $pkgindex
+        }
+    }
 }
 
 if { "@SQLITE3_TCL_DIR@" != "" } {
-	set dir "@SQLITE3_TCL_DIR@"
-	catch {source [file join $dir pkgIndex.tcl]}
+    set dir "@SQLITE3_TCL_DIR@"
+    set pkgindex [file join $dir pkgIndex.tcl]
+    if [file exists $pkgindex] {
+        source $pkgindex
+    }
 }

Modified: branches/new-help-system/base/src/macports1.0/sysctl.c
===================================================================
--- branches/new-help-system/base/src/macports1.0/sysctl.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/macports1.0/sysctl.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -39,7 +39,10 @@
 #include <string.h>
 #include <errno.h>
 #include <sys/types.h>
+
+#if HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
+#endif
 
 #include "sysctl.h"
 
@@ -48,6 +51,7 @@
  */
 int SysctlCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {
+#if HAVE_SYSCTLBYNAME
     const char error_message[] = "sysctl failed: ";
     Tcl_Obj *tcl_result;
     int res;
@@ -84,4 +88,8 @@
     
     Tcl_SetObjResult(interp, tcl_result);
     return TCL_OK;
+#else
+    Tcl_SetObjResult(interp, Tcl_NewStringObj("sysctl not available", -1));
+    return TCL_ERROR;
+#endif
 }

Modified: branches/new-help-system/base/src/package1.0/portarchivefetch.tcl
===================================================================
--- branches/new-help-system/base/src/package1.0/portarchivefetch.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/package1.0/portarchivefetch.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -57,8 +57,7 @@
 # Ignore SSL certificate
 default archivefetch.ignore_sslcert no
 
-# TODO: enable this when binaries are available on a macports server
-#default archive_sites macports_archives
+default archive_sites macports_archives
 default archive_sites.listfile {"archive_sites.tcl"}
 default archive_sites.listpath {"port1.0/fetch"}
 

Modified: branches/new-help-system/base/src/pextlib1.0/Pextlib.c
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/Pextlib.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/pextlib1.0/Pextlib.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -399,6 +399,10 @@
 #else
         clearenv();
 #endif
+        /* "If the entire env array is unset then Tcl will stop monitoring
+            env accesses and will not update environment variables."
+            - <http://www.tcl.tk/man/tcl8.4/TclCmd/tclvars.htm#M4> */
+        setenv("MACPORTS_DUMMY", "", 0);
     } else {
         (void) unsetenv(name);
     }

Modified: branches/new-help-system/base/src/pextlib1.0/rmd160cmd.c
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/rmd160cmd.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/pextlib1.0/rmd160cmd.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -40,9 +40,7 @@
 
 #include "rmd160cmd.h"
 
-#if HAVE_COMMONCRYPTO_COMMONDIGEST_H
-
-/* We do not have libmd.
+/*
  * let's use our own version of rmd160* libraries.
  */
 #include <stdio.h>
@@ -60,13 +58,6 @@
 CHECKSUMEnd(RMD160, RMD160_CTX, RIPEMD160_DIGEST_LENGTH)
 CHECKSUMFile(RMD160, RMD160_CTX)
 
-#elif defined(HAVE_LIBMD)
-#include <sys/types.h>
-#include <ripemd.h>
-#define RMD160File(x, y) RIPEMD160_File(x, y)
-#else
-#error CommonCrypto or libmd required
-#endif
 
 int RMD160Cmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {

Modified: branches/new-help-system/base/src/pextlib1.0/sha1cmd.c
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/sha1cmd.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/pextlib1.0/sha1cmd.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -57,6 +57,8 @@
 #elif defined(HAVE_LIBMD)
 #include <sys/types.h>
 #include <sha.h>
+#define SHA_DIGEST_LENGTH (SHA_HASHBYTES)
+#define SHA1_File(x,y) SHAFile(x,y)
 #else
 #error CommonCrypto or libmd required
 #endif

Copied: branches/new-help-system/base/src/pextlib1.0/sha2.c (from rev 66610, trunk/base/src/pextlib1.0/sha2.c)
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/sha2.c	                        (rev 0)
+++ branches/new-help-system/base/src/pextlib1.0/sha2.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -0,0 +1,472 @@
+/*	$OpenBSD: sha2.c,v 1.6 2004/05/03 02:57:36 millert Exp $	*/
+
+/*
+ * FILE:	sha2.c
+ * AUTHOR:	Aaron D. Gifford <me at aarongifford.com>
+ * 
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
+ */
+
+#include <sys/param.h>
+#include <sys/time.h>
+
+/*
+ * UNROLLED TRANSFORM LOOP NOTE:
+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
+ * loop version for the hash transform rounds (defined using macros
+ * later in this file).  Either define on the command line, for example:
+ *
+ *   cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
+ *
+ * or define below:
+ *
+ *   #define SHA2_UNROLL_TRANSFORM
+ *
+ */
+
+
+/*** SHA-256 Machine Architecture Definitions *****************/
+/*
+ * BYTE_ORDER NOTE:
+ *
+ * Please make sure that your system defines BYTE_ORDER.  If your
+ * architecture is little-endian, make sure it also defines
+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
+ * equivilent.
+ *
+ * If your system does not define the above, then you can do so by
+ * hand like this:
+ *
+ *   #define LITTLE_ENDIAN 1234
+ *   #define BIG_ENDIAN    4321
+ *
+ * And for little-endian machines, add:
+ *
+ *   #define BYTE_ORDER LITTLE_ENDIAN 
+ *
+ * Or for big-endian machines:
+ *
+ *   #define BYTE_ORDER BIG_ENDIAN
+ *
+ * The FreeBSD machine this was written on defines BYTE_ORDER
+ * appropriately by including <sys/types.h> (which in turn includes
+ * <machine/endian.h> where the appropriate definitions are actually
+ * made).
+ */
+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
+#endif
+
+
+/*** SHA-256 Various Length Definitions ***********************/
+/* NOTE: Most of these are in sha2.h */
+#define SHA256_SHORT_BLOCK_LENGTH	(SHA256_BLOCK_LENGTH - 8)
+
+
+/*** ENDIAN REVERSAL MACROS *******************************************/
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define REVERSE32(w,x)	{ \
+	u_int32_t tmp = (w); \
+	tmp = (tmp >> 16) | (tmp << 16); \
+	(x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
+}
+#define REVERSE64(w,x)	{ \
+	u_int64_t tmp = (w); \
+	tmp = (tmp >> 32) | (tmp << 32); \
+	tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
+	      ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
+	(x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
+	      ((tmp & 0x0000ffff0000ffffULL) << 16); \
+}
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+/*
+ * Macro for incrementally adding the unsigned 64-bit integer n to the
+ * unsigned 128-bit integer (represented using a two-element array of
+ * 64-bit words):
+ */
+#define ADDINC128(w,n)	{ \
+	(w)[0] += (u_int64_t)(n); \
+	if ((w)[0] < (n)) { \
+		(w)[1]++; \
+	} \
+}
+
+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
+/*
+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
+ *
+ *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
+ *   S is a ROTATION) because the SHA-256/384/512 description document
+ *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
+ *   same "backwards" definition.
+ */
+/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
+#define R(b,x) 		((x) >> (b))
+/* 32-bit Rotate-right (used in SHA-256): */
+#define S32(b,x)	(((x) >> (b)) | ((x) << (32 - (b))))
+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
+#define S64(b,x)	(((x) >> (b)) | ((x) << (64 - (b))))
+
+/* Two of six logical functions used in SHA-256: */
+#define Ch(x,y,z)	(((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+/* Four of six logical functions used in SHA-256: */
+#define Sigma0_256(x)	(S32(2,  (x)) ^ S32(13, (x)) ^ S32(22, (x)))
+#define Sigma1_256(x)	(S32(6,  (x)) ^ S32(11, (x)) ^ S32(25, (x)))
+#define sigma0_256(x)	(S32(7,  (x)) ^ S32(18, (x)) ^ R(3 ,   (x)))
+#define sigma1_256(x)	(S32(17, (x)) ^ S32(19, (x)) ^ R(10,   (x)))
+
+/*** INTERNAL FUNCTION PROTOTYPES *************************************/
+/* NOTE: These should not be accessed directly from outside this
+ * library -- they are intended for private internal visibility/use
+ * only.
+ */
+void SHA256_Transform(SHA256_CTX *, const u_int8_t *);
+
+
+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
+/* Hash constant words K for SHA-256: */
+static const u_int32_t K256[64] = {
+	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+	0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+	0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+	0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+	0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+	0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+	0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+	0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+	0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+	0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+	0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+	0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+	0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/* Initial hash value H for SHA-256: */
+static const u_int32_t sha256_initial_hash_value[8] = {
+	0x6a09e667UL,
+	0xbb67ae85UL,
+	0x3c6ef372UL,
+	0xa54ff53aUL,
+	0x510e527fUL,
+	0x9b05688cUL,
+	0x1f83d9abUL,
+	0x5be0cd19UL
+};
+
+
+
+/*** SHA-256: *********************************************************/
+void
+SHA256_Init(SHA256_CTX *context)
+{
+	if (context == NULL)
+		return;
+	bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
+	bzero(context->buffer, SHA256_BLOCK_LENGTH);
+	context->bitcount = 0;
+}
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-256 round macros: */
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do {				    \
+	W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) |	    \
+	    ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24);	    \
+	data += 4;							    \
+	T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
+	(d) += T1;							    \
+	(h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c));		    \
+	j++;								    \
+} while(0)
+
+#define ROUND256(a,b,c,d,e,f,g,h) do {					    \
+	s0 = W256[(j+1)&0x0f];						    \
+	s0 = sigma0_256(s0);						    \
+	s1 = W256[(j+14)&0x0f];						    \
+	s1 = sigma1_256(s1);						    \
+	T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] +	    \
+	     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);		    \
+	(d) += T1;							    \
+	(h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c));		    \
+	j++;								    \
+} while(0)
+
+void
+SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
+{
+	u_int32_t	a, b, c, d, e, f, g, h, s0, s1;
+	u_int32_t	T1, *W256;
+	int		j;
+
+	W256 = (u_int32_t *)context->buffer;
+
+	/* Initialize registers with the prev. intermediate value */
+	a = context->state[0];
+	b = context->state[1];
+	c = context->state[2];
+	d = context->state[3];
+	e = context->state[4];
+	f = context->state[5];
+	g = context->state[6];
+	h = context->state[7];
+
+	j = 0;
+	do {
+		/* Rounds 0 to 15 (unrolled): */
+		ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
+		ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
+		ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
+		ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
+		ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
+		ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
+		ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
+		ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
+	} while (j < 16);
+
+	/* Now for the remaining rounds to 64: */
+	do {
+		ROUND256(a,b,c,d,e,f,g,h);
+		ROUND256(h,a,b,c,d,e,f,g);
+		ROUND256(g,h,a,b,c,d,e,f);
+		ROUND256(f,g,h,a,b,c,d,e);
+		ROUND256(e,f,g,h,a,b,c,d);
+		ROUND256(d,e,f,g,h,a,b,c);
+		ROUND256(c,d,e,f,g,h,a,b);
+		ROUND256(b,c,d,e,f,g,h,a);
+	} while (j < 64);
+
+	/* Compute the current intermediate hash value */
+	context->state[0] += a;
+	context->state[1] += b;
+	context->state[2] += c;
+	context->state[3] += d;
+	context->state[4] += e;
+	context->state[5] += f;
+	context->state[6] += g;
+	context->state[7] += h;
+
+	/* Clean up */
+	a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+void
+SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
+{
+	u_int32_t	a, b, c, d, e, f, g, h, s0, s1;
+	u_int32_t	T1, T2, *W256;
+	int		j;
+
+	W256 = (u_int32_t *)context->buffer;
+
+	/* Initialize registers with the prev. intermediate value */
+	a = context->state[0];
+	b = context->state[1];
+	c = context->state[2];
+	d = context->state[3];
+	e = context->state[4];
+	f = context->state[5];
+	g = context->state[6];
+	h = context->state[7];
+
+	j = 0;
+	do {
+		W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) |
+		    ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24);
+		data += 4;
+		/* Apply the SHA-256 compression function to update a..h */
+		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
+		T2 = Sigma0_256(a) + Maj(a, b, c);
+		h = g;
+		g = f;
+		f = e;
+		e = d + T1;
+		d = c;
+		c = b;
+		b = a;
+		a = T1 + T2;
+
+		j++;
+	} while (j < 16);
+
+	do {
+		/* Part of the message block expansion: */
+		s0 = W256[(j+1)&0x0f];
+		s0 = sigma0_256(s0);
+		s1 = W256[(j+14)&0x0f];	
+		s1 = sigma1_256(s1);
+
+		/* Apply the SHA-256 compression function to update a..h */
+		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
+		     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
+		T2 = Sigma0_256(a) + Maj(a, b, c);
+		h = g;
+		g = f;
+		f = e;
+		e = d + T1;
+		d = c;
+		c = b;
+		b = a;
+		a = T1 + T2;
+
+		j++;
+	} while (j < 64);
+
+	/* Compute the current intermediate hash value */
+	context->state[0] += a;
+	context->state[1] += b;
+	context->state[2] += c;
+	context->state[3] += d;
+	context->state[4] += e;
+	context->state[5] += f;
+	context->state[6] += g;
+	context->state[7] += h;
+
+	/* Clean up */
+	a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+void
+SHA256_Update(SHA256_CTX *context, const u_int8_t *data, size_t len)
+{
+	size_t	freespace, usedspace;
+
+	/* Calling with no data is valid (we do nothing) */
+	if (len == 0)
+		return;
+
+	usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+	if (usedspace > 0) {
+		/* Calculate how much free space is available in the buffer */
+		freespace = SHA256_BLOCK_LENGTH - usedspace;
+
+		if (len >= freespace) {
+			/* Fill the buffer completely and process it */
+			bcopy(data, &context->buffer[usedspace], freespace);
+			context->bitcount += freespace << 3;
+			len -= freespace;
+			data += freespace;
+			SHA256_Transform(context, context->buffer);
+		} else {
+			/* The buffer is not yet full */
+			bcopy(data, &context->buffer[usedspace], len);
+			context->bitcount += len << 3;
+			/* Clean up: */
+			usedspace = freespace = 0;
+			return;
+		}
+	}
+	while (len >= SHA256_BLOCK_LENGTH) {
+		/* Process as many complete blocks as we can */
+		SHA256_Transform(context, data);
+		context->bitcount += SHA256_BLOCK_LENGTH << 3;
+		len -= SHA256_BLOCK_LENGTH;
+		data += SHA256_BLOCK_LENGTH;
+	}
+	if (len > 0) {
+		/* There's left-overs, so save 'em */
+		bcopy(data, context->buffer, len);
+		context->bitcount += len << 3;
+	}
+	/* Clean up: */
+	usedspace = freespace = 0;
+}
+
+void
+SHA256_Final(u_int8_t digest[], SHA256_CTX *context)
+{
+	u_int32_t	*d = (u_int32_t *)digest;
+	unsigned int	usedspace;
+
+	/* If no digest buffer is passed, we don't bother doing this: */
+	if (digest != NULL) {
+		usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+		/* Convert FROM host byte order */
+		REVERSE64(context->bitcount,context->bitcount);
+#endif
+		if (usedspace > 0) {
+			/* Begin padding with a 1 bit: */
+			context->buffer[usedspace++] = 0x80;
+
+			if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
+				/* Set-up for the last transform: */
+				bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
+			} else {
+				if (usedspace < SHA256_BLOCK_LENGTH) {
+					bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
+				}
+				/* Do second-to-last transform: */
+				SHA256_Transform(context, context->buffer);
+
+				/* And set-up for the last transform: */
+				bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+			}
+		} else {
+			/* Set-up for the last transform: */
+			bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+
+			/* Begin padding with a 1 bit: */
+			*context->buffer = 0x80;
+		}
+		/* Set the bit count: */
+		*(u_int64_t *)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
+
+		/* Final transform: */
+		SHA256_Transform(context, context->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+		{
+			/* Convert TO host byte order */
+			int	j;
+			for (j = 0; j < 8; j++) {
+				REVERSE32(context->state[j],context->state[j]);
+				*d++ = context->state[j];
+			}
+		}
+#else
+		bcopy(context->state, d, SHA256_DIGEST_LENGTH);
+#endif
+	}
+
+	/* Clean up state data: */
+	bzero(context, sizeof(*context));
+	usedspace = 0;
+}

Copied: branches/new-help-system/base/src/pextlib1.0/sha2.h (from rev 66610, trunk/base/src/pextlib1.0/sha2.h)
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/sha2.h	                        (rev 0)
+++ branches/new-help-system/base/src/pextlib1.0/sha2.h	2010-04-18 04:07:59 UTC (rev 66612)
@@ -0,0 +1,62 @@
+/*	$OpenBSD: sha2.h,v 1.2 2004/04/28 23:11:57 millert Exp $	*/
+
+/*
+ * FILE:	sha2.h
+ * AUTHOR:	Aaron D. Gifford <me at aarongifford.com>
+ * 
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $From: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
+ */
+
+#ifndef _SHA2_H
+#define _SHA2_H
+
+
+/*** SHA-256 Various Length Definitions ***********************/
+#define SHA256_BLOCK_LENGTH		64
+#define SHA256_DIGEST_LENGTH		32
+#define SHA256_DIGEST_STRING_LENGTH	(SHA256_DIGEST_LENGTH * 2 + 1)
+
+
+/*** SHA-256 Context Structures *******************************/
+typedef struct _SHA256_CTX {
+	u_int32_t	state[8];
+	u_int64_t	bitcount;
+	u_int8_t	buffer[SHA256_BLOCK_LENGTH];
+} SHA256_CTX;
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+void SHA256_Init(SHA256_CTX *);
+void SHA256_Update(SHA256_CTX *, const u_int8_t *, size_t);
+void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX *);
+__END_DECLS
+
+#endif /* _SHA2_H */

Modified: branches/new-help-system/base/src/pextlib1.0/sha256cmd.c
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/sha256cmd.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/pextlib1.0/sha256cmd.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -58,18 +58,19 @@
 #define SHA256_Final(m, c)              CC_SHA256_Final(m,c)
 #endif
 
+#else
+/* We do not have CommonCrypto.
+* let's use our own version of sha256* libraries.
+*/
+#include <sys/types.h>
+#include "sha2.h"
+#include "sha2.c"
+#endif
+
 #include "md_wrappers.h"
 CHECKSUMEnd(SHA256_, SHA256_CTX, SHA256_DIGEST_LENGTH)
 CHECKSUMFile(SHA256_, SHA256_CTX)
 
-#elif defined(HAVE_LIBMD)
-#include <sys/types.h>
-#include <sha256.h>
-#define SHA256_DIGEST_LENGTH 32
-#else
-#error CommonCrypto or libmd required
-#endif
-
 int SHA256Cmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {
 	char *file, *action;

Modified: branches/new-help-system/base/src/pextlib1.0/tracelib.c
===================================================================
--- branches/new-help-system/base/src/pextlib1.0/tracelib.c	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/pextlib1.0/tracelib.c	2010-04-18 04:07:59 UTC (rev 66612)
@@ -30,7 +30,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if HAVE_CONFIG_H
 #include <config.h>
+#endif
+
 #include <string.h>
 #include <sys/time.h>
 #include <sys/resource.h>
@@ -47,6 +50,26 @@
 #include <limits.h>
 #include "tracelib.h"
 
+#ifndef HAVE_STRLCPY
+/* Define strlcpy if it's not available. */
+size_t strlcpy(char* dst, const char* src, size_t size);
+size_t strlcpy(char* dst, const char* src, size_t size)
+{
+	size_t result = strlen(src);
+	if (size > 0)
+	{
+		size_t copylen = size - 1;
+		if (copylen > result)
+		{
+			copylen = result;
+		}
+		memcpy(dst, src, copylen);
+		dst[copylen] = 0;
+	}
+	return result;
+}
+#endif
+
 static char * name;
 static char * sandbox;
 static char * filemap, * filemap_end;

Modified: branches/new-help-system/base/src/port/Makefile
===================================================================
--- branches/new-help-system/base/src/port/Makefile	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port/Makefile	2010-04-18 04:07:59 UTC (rev 66612)
@@ -14,12 +14,15 @@
 
 portmirror: portmirror.tcl ../../Mk/macports.autoconf.mk
 	${edit} portmirror.tcl > $@
+	chmod +x $@
 
 portindex: portindex.tcl ../../Mk/macports.autoconf.mk
 	${edit} portindex.tcl > $@
+	chmod +x $@
 
 port: port.tcl ../../Mk/macports.autoconf.mk
 	${edit} port.tcl > $@
+	chmod +x $@
 
 mkdirs:
 	cat ../../doc/prefix.mtree | $(MTREE) -U -d -e -p ${INSTALLDIR} > /dev/null

Modified: branches/new-help-system/base/src/port/port-help.tcl
===================================================================
--- branches/new-help-system/base/src/port/port-help.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port/port-help.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -9,6 +9,8 @@
 
 set porthelp(activate) {
 Activate the given ports
+
+--no-exec   Do not execute any stored pre- or post-activate procedures
 }
 
 set porthelp(archive) {
@@ -50,8 +52,8 @@
 set porthelp(log) {
 Shows main log for given ports
 
---phase <phase>		Filteres log file by phase (configure, fetch, etc..)
---verbosity <ver>	Filteres log file by verbosity level (msg, debug, info)	
+--phase <phase>		Filters by phase (fetch, checksum, extract, patch, configure, build, destroot)
+--level <level>	        Filter messages above verbosity level (error, warn, msg, info, debug)
 }
 
 set porthelp(configure) {
@@ -64,6 +66,8 @@
 
 set porthelp(deactivate) {
 Deactivates the given ports
+
+--no-exec   Do not execute any stored pre- or post-deactivate procedures
 }
 
 set porthelp(dependents) {
@@ -73,10 +77,29 @@
 Dependents are those ports which depend on the given port, not vice-versa!
 }
 
+set porthelp(rdependents) {
+Recursive version of dependents
+
+--full          Display all branches of the tree of dependents instead of only
+                showing each port once.
+}
+
 set porthelp(deps) {
 This action is an alias for 'info --pretty --fullname --depends'
 }
 
+set porthelp(rdeps) {
+Display a recursive dependency listing for the given ports
+
+--full          Display all branches of the dependency tree instead of only
+                showing each port once.
+--index         Do not read the Portfile, instead rely solely on the PortIndex
+                information. Note this option will prevent the dependencies
+                reported from reflecting the effects of any variants specified.
+--no-build      Exclude dependencies only required at build time, i.e.
+                depends_fetch, depends_extract, and depends_build.
+}
+
 set porthelp(destroot) {
 Destroot the given ports
 }
@@ -265,6 +288,14 @@
 Creates a srpm for each of the given ports
 }
 
+set porthelp(setrequested) {
+Marks each of the given ports as requested
+}
+
+set porthelp(unsetrequested) {
+Marks each of the given ports as unrequested
+}
+
 set porthelp(submit) {
 Submit a port to the MacPorts Web Application (unimplemented)
 }
@@ -283,6 +314,8 @@
 
 set porthelp(uninstall) {
 Uninstall the given ports
+
+--no-exec   Do not execute any stored pre- or post-uninstall procedures
 }
 
 set porthelp(unload) $porthelp(load)

Modified: branches/new-help-system/base/src/port/port.tcl
===================================================================
--- branches/new-help-system/base/src/port/port.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port/port.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -34,8 +34,14 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
-catch {source \
-    [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]}
+if {([file tail [pwd]] == "src" && [file exists [set dir macports1.0]/macports_fastload.tcl])
+        || ([file tail [pwd]] == "base" && [file exists [set dir src/macports1.0]/macports_fastload.tcl])} {
+    # developer mode, source packages from current directory
+    source [file join $dir macports_fastload.tcl]
+} else {
+    source [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]
+}
+
 package require macports
 package require Pextlib 1.0
 
@@ -88,14 +94,16 @@
 ----------------
 Pseudo-portnames are words that may be used in place of a portname, and
 which expand to some set of ports. The common pseudo-portnames are:
-all, current, active, inactive, installed, uninstalled, outdated and obsolete.
+all, current, active, inactive, installed, uninstalled, outdated, obsolete,
+requested, unrequested and leaves.
 These pseudo-portnames expand to the set of ports named.
 
 Additional pseudo-portnames start with...
 variants:, variant:, description:, depends:, depends_lib:, depends_run:,
 depends_build:, depends_fetch:, depends_extract:, portdir:, homepage:, epoch:,
 platforms:, platform:, name:, long_description:, maintainers:, maintainer:,
-categories:, category:, version:, revision:, and license:.
+categories:, category:, version:, revision:, license:, depof:, rdepof:,
+dependentof:, and rdependentof:.
 These each select a set of ports based on a regex search of metadata
 about the ports. In all such cases, a standard regex pattern following
 the colon will be used to select the set of ports to which the
@@ -911,6 +919,108 @@
 }
 
 
+proc get_dep_ports {portname recursive} {
+    global global_variations
+
+    # look up portname
+    if {[catch {mportlookup $portname} result]} {
+        ui_debug "$::errorInfo"
+        return -code error "lookup of portname $portname failed: $result"
+    }
+    if {[llength $result] < 2} {
+        return -code error "Port $portname not found"
+    }
+    array unset portinfo
+    array set portinfo [lindex $result 1]
+    set porturl $portinfo(porturl)
+
+    # open portfile
+    if {[catch {set mport [mportopen $porturl {} [array get global_variations]]} result]} {
+        ui_debug "$::errorInfo"
+        return -code error "Unable to open port: $result"
+    }
+    array unset portinfo
+    array set portinfo [mportinfo $mport]
+    mportclose $mport
+
+    # gather its deps
+    set results {}
+    set deptypes {depends_fetch depends_extract depends_build depends_lib depends_run}
+
+    set deplist {}
+    foreach type $deptypes {
+        if {[info exists portinfo($type)]} {
+            foreach dep $portinfo($type) {
+                add_to_portlist results [list name [lindex [split $dep :] end]]
+                lappend deplist $dep
+            }
+        }
+    }
+
+    # actually do this iteratively to avoid hitting Tcl's recursion limit
+    if {$recursive} {
+        while 1 {
+            set rportlist {}
+            set newlist {}
+            foreach dep $deplist {
+                set depname [lindex [split $dep :] end]
+                if {![info exists seen($depname)]} {
+                    set seen($depname) 1
+
+                    # look up the dep
+                    if {[catch {mportlookup $depname} result]} {
+                        ui_debug "$::errorInfo"
+                        return -code error "lookup of portname $depname failed: $result"
+                    }
+                    if {[llength $result] < 2} {
+                        ui_error "Port $depname not found"
+                        continue
+                    }
+                    array unset portinfo
+                    array set portinfo [lindex $result 1]
+                    set porturl $portinfo(porturl)
+                
+                    # open its portfile
+                    if {[catch {set mport [mportopen $porturl {} [array get global_variations]]} result]} {
+                        ui_debug "$::errorInfo"
+                        ui_error "Unable to open port: $result"
+                        continue
+                    }
+                    array unset portinfo
+                    array set portinfo [mportinfo $mport]
+                    mportclose $mport
+
+                    # collect its deps
+                    set rdeplist {}
+                    foreach type $deptypes {
+                        if {[info exists portinfo($type)]} {
+                            foreach rdep $portinfo($type) {
+                                add_to_portlist results [list name [lindex [split $rdep :] end]]
+                                lappend rdeplist $rdep
+                            }
+                        }
+                    }
+
+                    # add them to the lists
+                    foreach rdep $rdeplist {
+                        lappend newlist $rdep
+                        add_to_portlist rportlist [list name [lindex [split $rdep :] end]]
+                    }
+                }
+            }
+            if {[llength $rportlist] > 0} {
+                set results [opUnion $results $rportlist]
+                set deplist $newlist
+            } else {
+                break
+            }
+        }
+    }
+
+    return [portlist_sort $results]
+}
+
+
 ##########################################
 # Port expressions
 ##########################################
@@ -1133,7 +1243,20 @@
             
             set el 1
         }
+        
+        ^depof:             -
+        ^rdepof:            {
+            advance
 
+            # Break up the token, because older Tcl switch doesn't support -matchvar
+            regexp {^(\w+):(.*)} $token matchvar selector portname
+
+            set recursive [string equal $selector rdepof]
+            add_multiple_ports reslist [get_dep_ports $portname $recursive]
+            
+            set el 1
+        }
+
         [][?*]              { # Handle portname glob patterns
             advance; add_multiple_ports reslist [get_matching_ports $token no glob]
             set el 1
@@ -1334,7 +1457,7 @@
     if { [moreargs] } {
         # Look first for a potential portname
         #
-        # We need to allow a wide variaty of tokens here, because of actions like "provides"
+        # We need to allow a wide variety 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]
@@ -1606,8 +1729,13 @@
                 set phase "\[a-z\]*"
             }
 
-            if {[info exists global_options(ports_log_verbosity)]} {
-                set prefix $global_options(ports_log_verbosity);
+            if {[info exists global_options(ports_log_level)]} {
+                set index [lsearch -exact ${macports::ui_priorities} $global_options(ports_log_level)]
+                if {$index == -1} {
+                    set prefix ""
+                } else {
+                    set prefix [join [lrange ${macports::ui_priorities} 0 $index] "|"]
+                }
             } else {
                 set prefix "\[a-z\]*"
             }
@@ -2105,7 +2233,11 @@
     }
     foreachport $portlist {
         set composite_version [composite_version $portversion [array get variations]]
-        if {${macports::registry.format} == "receipt_sqlite" && ![catch {set ilist [registry::installed $portname $composite_version]}] && [llength $ilist] == 1} {
+        if {${macports::registry.format} == "receipt_sqlite"
+            && ![info exists options(ports_activate_no-exec)]
+            && ![catch {set ilist [registry::installed $portname $composite_version]}]
+            && [llength $ilist] == 1} {
+
             set i [lindex $ilist 0]
             set regref [registry::entry open $portname [lindex $i 1] [lindex $i 2] [lindex $i 3] [lindex $i 5]]
             if {[registry::run_target $regref activate [array get options]]} {
@@ -2135,7 +2267,10 @@
     }
     foreachport $portlist {
         set composite_version [composite_version $portversion [array get variations]]
-        if {${macports::registry.format} == "receipt_sqlite" && ![catch {set ilist [registry::active $portname]}]} {
+        if {${macports::registry.format} == "receipt_sqlite"
+            && ![info exists options(ports_deactivate_no-exec)]
+            && ![catch {set ilist [registry::active $portname]}]} {
+
             set i [lindex $ilist 0]
             set iversion [lindex $i 1]
             set irevision [lindex $i 2]
@@ -2397,19 +2532,252 @@
         
         set deplist [registry::list_dependents $portname $iversion $irevision $ivariants]
         if { [llength $deplist] > 0 } {
-            set dl [list]
-            # Check the deps first
+            if {$action == "rdependents"} {
+                set toplist $deplist
+                while 1 {
+                    set newlist {}
+                    foreach dep $deplist {
+                        set depname [lindex $dep 2]
+                        if {![info exists seen($depname)]} {
+                            set seen($depname) 1
+                            set rdeplist [registry::list_dependents $depname]
+                            foreach rdep $rdeplist {
+                                lappend newlist $rdep
+                            }
+                            set dependentsof($depname) $rdeplist
+                        }
+                    }
+                    if {[llength $newlist] > 0} {
+                        set deplist $newlist
+                    } else {
+                        break
+                    }
+                }
+                set portstack [list $toplist]
+                set pos_stack [list 0]
+                array unset seen
+                ui_msg "The following ports are dependent on ${portname}:"
+                while 1 {
+                    set cur_portlist [lindex $portstack end]
+                    set cur_pos [lindex $pos_stack end]
+                    if {$cur_pos >= [llength $cur_portlist]} {
+                        set portstack [lreplace $portstack end end]
+                        set pos_stack [lreplace $pos_stack end end]
+                        if {[llength $portstack] <= 0} {
+                            break
+                        } else {
+                            continue
+                        }
+                    }
+                    set cur_port [lindex $cur_portlist $cur_pos]
+                    set cur_portname [lindex $cur_port 2]
+                    set spaces [string repeat " " [expr {[llength $pos_stack] * 2}]]
+                    if {![info exists seen($cur_portname)] || ([info exists options(ports_rdependents_full)] && [string is true -strict $options(ports_rdependents_full)])} {
+                        puts "${spaces}${cur_portname}"
+                        set seen($cur_portname) 1
+                        incr cur_pos
+                        set pos_stack [lreplace $pos_stack end end $cur_pos]
+                        if {[info exists dependentsof($cur_portname)]} {
+                            lappend portstack $dependentsof($cur_portname)
+                            lappend pos_stack 0
+                        }
+                        continue
+                    }
+                    incr cur_pos
+                    set pos_stack [lreplace $pos_stack end end $cur_pos]
+                }
+            } else {
+                foreach dep $deplist {
+                    set depport [lindex $dep 2]
+                    if {[macports::ui_isset ports_quiet]} {
+                        puts "$depport"
+                    } elseif {![macports::ui_isset ports_verbose]} {
+                        ui_msg "$depport depends on $portname"
+                    } else {
+                        ui_msg "$depport depends on $portname (by [lindex $dep 1]:)"
+                    }
+                }
+            }
+        } else {
+            ui_msg "$portname has no dependents."
+        }
+    }
+    return $status
+}
+
+
+proc action_rdeps { action portlist opts } {
+    global global_variations
+    set status 0
+    if {[require_portlist portlist]} {
+        return 1
+    }
+
+    foreachport $portlist {
+        if {[info exists options(ports_rdeps_no-build)] && [string is true -strict $options(ports_rdeps_no-build)]} {
+            set deptypes {depends_lib depends_run}
+        } else {
+            set deptypes {depends_fetch depends_extract depends_build depends_lib depends_run}
+        }
+        
+        # If we have a url, use that, since it's most specific
+        # otherwise try to map the portname to a url
+        if {$porturl eq ""} {
+        # Verify the portname, getting portinfo to map to a porturl
+            if {[catch {mportlookup $portname} result]} {
+                ui_debug "$::errorInfo"
+                break_softcontinue "lookup of portname $portname failed: $result" 1 status
+            }
+            if {[llength $result] < 2} {
+                break_softcontinue "Port $portname not found" 1 status
+            }
+            array unset portinfo
+            array set portinfo [lindex $result 1]
+            set porturl $portinfo(porturl)
+        } elseif {$porturl ne "file://."} {
+            # Extract the portdir from porturl and use it to search PortIndex.
+            # Only the last two elements of the path (porturl) make up the
+            # portdir.
+            set portdir [file split [macports::getportdir $porturl]]
+            set lsize [llength $portdir]
+            set portdir \
+                [file join [lindex $portdir [expr $lsize - 2]] \
+                           [lindex $portdir [expr $lsize - 1]]]
+            if {[catch {mportsearch $portdir no exact portdir} result]} {
+                ui_debug "$::errorInfo"
+                break_softcontinue "Portdir $portdir not found" 1 status
+            }
+            if {[llength $result] < 2} {
+                break_softcontinue "Portdir $portdir not found" 1 status
+            }
+            array unset portinfo
+            array set portinfo [lindex $result 1]
+        }
+
+        if {!([info exists options(ports_rdeps_index)] && $options(ports_rdeps_index) eq "yes")} {
+            # Add any global_variations to the variations
+            # specified for the port, so we get dependencies right
+            array unset merged_variations
+            array set merged_variations [array get variations]
+            foreach { variation value } [array get global_variations] { 
+                if { ![info exists merged_variations($variation)] } { 
+                    set merged_variations($variation) $value 
+                } 
+            }
+            if {[catch {set mport [mportopen $porturl [array get options] [array get merged_variations]]} result]} {
+                ui_debug "$::errorInfo"
+                break_softcontinue "Unable to open port: $result" 1 status
+            }
+            array unset portinfo
+            array set portinfo [mportinfo $mport]
+            mportclose $mport
+        } elseif {![info exists portinfo]} {
+            ui_warn "port rdeps --index does not work with the 'current' pseudo-port"
+            continue
+        }
+
+        set deplist {}
+        # get list of direct deps
+        foreach type $deptypes {
+            if {[info exists portinfo($type)]} {
+                foreach dep $portinfo($type) {
+                    lappend deplist $dep
+                }
+            }
+        }
+
+        set toplist $deplist
+        # gather all the deps
+        while 1 {
+            set newlist {}
             foreach dep $deplist {
-                set depport [lindex $dep 2]
-                if {![macports::ui_isset ports_verbose]} {
-                    ui_msg "$depport depends on $portname"
-                } else {
-                    ui_msg "$depport depends on $portname (by [lindex $dep 1]:)"
+                set depname [lindex [split $dep :] end]
+                if {![info exists seen($depname)]} {
+                    set seen($depname) 1
+                    
+                    # look up the dep
+                    if {[catch {mportlookup $depname} result]} {
+                        ui_debug "$::errorInfo"
+                        break_softcontinue "lookup of portname $depname failed: $result" 1 status
+                    }
+                    if {[llength $result] < 2} {
+                        break_softcontinue "Port $depname not found" 1 status
+                    }
+                    array unset portinfo
+                    array set portinfo [lindex $result 1]
+                    set porturl $portinfo(porturl)
+                    
+                    # open the portfile if requested
+                    if {!([info exists options(ports_rdeps_index)] && $options(ports_rdeps_index) eq "yes")} {
+                        if {[catch {set mport [mportopen $porturl [array get options] [array get merged_variations]]} result]} {
+                            ui_debug "$::errorInfo"
+                            break_softcontinue "Unable to open port: $result" 1 status
+                        }
+                        array unset portinfo
+                        array set portinfo [mportinfo $mport]
+                        mportclose $mport
+                    }
+                    
+                    # get list of the dep's deps
+                    set rdeplist {}
+                    foreach type $deptypes {
+                        if {[info exists portinfo($type)]} {
+                            foreach rdep $portinfo($type) {
+                                lappend rdeplist $rdep
+                                lappend newlist $rdep
+                            }
+                        }
+                    }
+                    set depsof($depname) $rdeplist
                 }
             }
+            if {[llength $newlist] > 0} {
+                set deplist $newlist
+            } else {
+                break
+            }
+        }
+        set portstack [list $toplist]
+        set pos_stack [list 0]
+        array unset seen
+        if {[llength $toplist] > 0} {
+            ui_msg "The following ports are dependencies of ${portname}:"
         } else {
-            ui_msg "$portname has no dependents!"
+            ui_msg "No ports are dependencies of ${portname}."
         }
+        while 1 {
+            set cur_portlist [lindex $portstack end]
+            set cur_pos [lindex $pos_stack end]
+            if {$cur_pos >= [llength $cur_portlist]} {
+                set portstack [lreplace $portstack end end]
+                set pos_stack [lreplace $pos_stack end end]
+                if {[llength $portstack] <= 0} {
+                    break
+                } else {
+                    continue
+                }
+            }
+            set cur_port [lindex $cur_portlist $cur_pos]
+            set cur_portname [lindex [split $cur_port :] end]
+            set spaces [string repeat " " [expr {[llength $pos_stack] * 2}]]
+            if {![info exists seen($cur_portname)] || ([info exists options(ports_rdeps_full)] && [string is true -strict $options(ports_rdeps_full)])} {
+                if {[macports::ui_isset ports_verbose]} {
+                    puts "${spaces}${cur_port}"
+                } else {
+                    puts "${spaces}${cur_portname}"
+                }
+                set seen($cur_portname) 1
+                incr cur_pos
+                set pos_stack [lreplace $pos_stack end end $cur_pos]
+                if {[info exists depsof($cur_portname)]} {
+                    lappend portstack $depsof($cur_portname)
+                    lappend pos_stack 0
+                }
+                continue
+            }
+            incr cur_pos
+            set pos_stack [lreplace $pos_stack end end $cur_pos]
+        }
     }
     return $status
 }
@@ -2435,7 +2803,11 @@
             continue
         }
         set composite_version [composite_version $portversion [array get variations]]
-        if {${macports::registry.format} == "receipt_sqlite" && ![catch {set ilist [registry::installed $portname $composite_version]}] && [llength $ilist] == 1} {
+        if {${macports::registry.format} == "receipt_sqlite"
+            && ![info exists options(ports_uninstall_no-exec)]
+            && ![catch {set ilist [registry::installed $portname $composite_version]}]
+            && [llength $ilist] == 1} {
+
             set i [lindex $ilist 0]
             set iactive [lindex $i 4]
             set regref [registry::entry open $portname [lindex $i 1] [lindex $i 2] [lindex $i 3] [lindex $i 5]]
@@ -3225,26 +3597,13 @@
             array set portinfo [lindex $res 1]
             set porturl $portinfo(porturl)
         }
-        
+
         # use existing variants iff none were explicitly requested
         if {[array get requested_variations] == "" && [array get variations] != ""} {
             array unset requested_variations
             array set requested_variations [array get variations]
-            set filtered_variations [mport_filtervariants [array get variations] no]
-        } else {
-            set filtered_variations [mport_filtervariants [array get requested_variations] yes]
         }
-        # Filter out implicit variants from the explicitly set/unset variants.
-        # Except we need to keep them for some targets to work right...
-        switch -exact $target {
-            distfiles -
-            mirror {}
-            default {
-                array unset requested_variations
-                array set requested_variations $filtered_variations
-            }
-        }
-        
+
         # Add any global_variations to the variations
         # specified for the port
         foreach { variation value } [array get global_variations] {
@@ -3377,7 +3736,9 @@
     outdated    [list action_outdated       [ACTION_ARGS_PORTS]] \
     contents    [list action_contents       [ACTION_ARGS_PORTS]] \
     dependents  [list action_dependents     [ACTION_ARGS_PORTS]] \
+    rdependents [list action_dependents     [ACTION_ARGS_PORTS]] \
     deps        [list action_info           [ACTION_ARGS_PORTS]] \
+    rdeps       [list action_rdeps          [ACTION_ARGS_PORTS]] \
     variants    [list action_variants       [ACTION_ARGS_PORTS]] \
     \
     search      [list action_search         [ACTION_ARGS_STRINGS]] \
@@ -3472,19 +3833,23 @@
                  line long_description
                  maintainer maintainers name platform platforms portdir pretty
                  replaced_by revision variant variants version}
+    rdeps       {index no-build full}
+    rdependents {full}
     search      {case-sensitive category categories depends_fetch
                  depends_extract depends_build depends_lib depends_run
                  depends description epoch exact glob homepage line
                  long_description maintainer maintainers name platform
                  platforms portdir regex revision variant variants version}
     selfupdate  {nosync}
-    uninstall   {follow-dependents}
+    activate    {no-exec}
+    deactivate  {no-exec}
+    uninstall   {follow-dependents follow-dependencies no-exec}
     variants    {index}
     clean       {all archive dist work logs}
     mirror      {new}
     lint        {nitpick}
     select      {list set show}
-    log         {{phase 1} {verbosity 1}}
+    log         {{phase 1} {level 1}}
     upgrade     {force enforce-variants no-replace}
 }
 
@@ -4000,6 +4365,12 @@
 # Get arguments remaining after option processing
 set remaining_args [lrange $cmd_argv $cmd_argn end]
 
+# 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) -
+}
+
 # Initialize mport
 # This must be done following parse of global options, as some options are
 # evaluated by mportinit.
@@ -4009,12 +4380,6 @@
     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) -
-}
-
 # Set up some global state for our code
 global current_portdir
 set current_portdir [pwd]

Modified: branches/new-help-system/base/src/port/portindex.tcl
===================================================================
--- branches/new-help-system/base/src/port/portindex.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port/portindex.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -7,8 +7,14 @@
 # if requested
 # $Id$
 
-catch {source \
-    [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]}
+if {([file tail [pwd]] == "src" && [file exists [set dir macports1.0]/macports_fastload.tcl])
+        || ([file tail [pwd]] == "base" && [file exists [set dir src/macports1.0]/macports_fastload.tcl])} {
+    # developer mode, source packages from current directory
+    source [file join $dir macports_fastload.tcl]
+} else {
+    source [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]
+}
+
 package require macports
 package require Pextlib
 

Modified: branches/new-help-system/base/src/port/portmirror.tcl
===================================================================
--- branches/new-help-system/base/src/port/portmirror.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port/portmirror.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -11,8 +11,14 @@
 # Updates the distfiles to current distfiles by deleting old stuff.
 # Uses the database.
 
-catch {source \
-    [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]}
+if {([file tail [pwd]] == "src" && [file exists [set dir macports1.0]/macports_fastload.tcl])
+        || ([file tail [pwd]] == "base" && [file exists [set dir src/macports1.0]/macports_fastload.tcl])} {
+    # developer mode, source packages from current directory
+    source [file join $dir macports_fastload.tcl]
+} else {
+    source [file join "@macports_tcl_dir@" macports1.0 macports_fastload.tcl]
+}
+
 package require macports
 package require Pextlib
 

Modified: branches/new-help-system/base/src/port1.0/Makefile
===================================================================
--- branches/new-help-system/base/src/port1.0/Makefile	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/Makefile	2010-04-18 04:07:59 UTC (rev 66612)
@@ -16,7 +16,7 @@
 all:: pkgIndex.tcl
 
 pkgIndex.tcl:
-	$(SILENT) ../pkg_mkindex.sh .
+	$(SILENT) ../pkg_mkindex.sh . || ( rm -rf $@ && exit 1 )
 
 clean::
 	rm -f pkgIndex.tcl

Modified: branches/new-help-system/base/src/port1.0/fetch_common.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/fetch_common.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/fetch_common.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -190,8 +190,12 @@
 
     foreach {url_var distfile} $fetch_urls {
         if {![info exists urlmap($url_var)]} {
-            ui_error [format [msgcat::mc "No defined site for tag: %s, using $default_listvar"] $url_var]
-            set urlmap($url_var) [set $default_listvar]
+            if {$url_var != $default_listvar} {
+                ui_error [format [msgcat::mc "No defined site for tag: %s, using $default_listvar"] $url_var]
+                set urlmap($url_var) [set $default_listvar]
+            } else {
+                set urlmap($url_var) {}
+            }
         }
         set urllist $urlmap($url_var)
         set hosts {}

Modified: branches/new-help-system/base/src/port1.0/portbuild.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/portbuild.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/portbuild.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -112,7 +112,7 @@
             ui_warn "failed to determine the number of available CPUs (probably not supported on this platform)"
             ui_warn "defaulting to $jobs jobs, consider setting buildmakejobs to a nonzero value in macports.conf"
         }
-        if {$jobs > $memsize / 1000000000 + 1} {
+        if {[info exists memsize] && $jobs > $memsize / 1000000000 + 1} {
             set jobs [expr $memsize / 1000000000 + 1]
         }
     }

Modified: branches/new-help-system/base/src/port1.0/portconfigure.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/portconfigure.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/portconfigure.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -337,16 +337,13 @@
 # internal function to determine the default compiler
 proc portconfigure::configure_get_default_compiler {args} {
     global os.platform os.major
-    set compiler ""
     switch -exact "${os.platform} ${os.major}" {
-        "darwin 7" { set compiler gcc-3.3 }
-        "darwin 8" { set compiler gcc-4.0 }
-        "darwin 9" { set compiler gcc-4.0 }
-        "darwin 10" { set compiler gcc-4.2 }
-        "darwin 11" { set compiler llvm-gcc-4.2 }
-        default { set compiler gcc }
+        "darwin 8"  -
+        "darwin 9"  { return gcc-4.0 }
+        "darwin 10" { return gcc-4.2 }
+        "darwin 11" { return llvm-gcc-4.2 }
+        default     { return gcc }
     }
-    return $compiler
 }
 
 # internal function to find correct compilers

Modified: branches/new-help-system/base/src/port1.0/portlint.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/portlint.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/portlint.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -243,7 +243,7 @@
         if {[string match "platform\[ \t\]*" $line]} {
             regexp {platform\s+(?:\w+\s+(?:\w+\s+)?)?(\w+)} $line -> platform_arch
             if {$platform_arch == "ppc"} {
-                ui_error "Arch 'ppc' in platform variant on line $lineno should be 'powerpc'"
+                ui_error "Arch 'ppc' in platform on line $lineno should be 'powerpc'"
                 incr errors
             }
         }

Modified: branches/new-help-system/base/src/port1.0/portmain.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/portmain.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/portmain.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -46,9 +46,9 @@
 # define options
 options prefix name version revision epoch categories maintainers
 options long_description description homepage license provides conflicts replaced_by
-options worksrcdir filesdir distname portdbpath libpath distpath sources_conf os.platform os.version os.major os.arch os.endian platforms default_variants install.user install.group macosx_deployment_target
+options worksrcdir filesdir distname portdbpath libpath distpath sources_conf os.platform os.subplatform os.version os.major os.arch os.endian platforms default_variants install.user install.group macosx_deployment_target
 options universal_variant os.universal_supported
-options supported_archs
+options supported_archs depends_skip_archcheck
 options copy_log_files
 options compiler.cpath compiler.library_path
 
@@ -77,6 +77,7 @@
 default worksrcpath {[file join $workpath $worksrcdir]}
 # empty list means all archs are supported
 default supported_archs {}
+default depends_skip_archcheck {}
 
 # Configure settings
 default install.user {${portutil::autoconf::install_user}}
@@ -110,22 +111,27 @@
 
 default universal_variant yes
 
-default compiler.cpath {${prefix}/include}
-default compiler.library_path {${prefix}/lib}
+# sub-platforms of darwin
+if {[option os.platform] == "darwin"} {
+    if {[file isdirectory /System/Library/Frameworks/Carbon.framework]} {
+        default os.subplatform macosx
+    } else {
+        default os.subplatform puredarwin
+    }
+}
 
-# Select implicit variants
-if {[info exists os.platform] && ![info exists variations(${os.platform})]} { variant_set ${os.platform}}
-if {[info exists os.arch] && ![info exists variations(${os.arch})]} { variant_set ${os.arch} }
-if {[info exists os.platform] && (${os.platform} == "darwin") && ![file isdirectory /System/Library/Frameworks/Carbon.framework] && ![info exists variations(puredarwin)]} { variant_set puredarwin }
-if {[info exists os.platform] && (${os.platform} == "darwin") && [file isdirectory /System/Library/Frameworks/Carbon.framework] && ![info exists variations(macosx)]} { variant_set macosx }
-if {[info exists variations(macosx)] && $variations(macosx) == "+"} {
+# check if we're on Mac OS X and can therefore build universal
+if {[info exists os.subplatform] && ${os.subplatform} == "macosx"} {
     # the universal variant itself is now created in
-    # add_default_universal_variant, which is called from mportopen
+    # universal_setup, which is called from mportopen
     default os.universal_supported yes
 } else {
     default os.universal_supported no
 }
 
+default compiler.cpath {${prefix}/include}
+default compiler.library_path {${prefix}/lib}
+
 # start gsoc08-privileges
 
 # Record initial euid/egid

Modified: branches/new-help-system/base/src/port1.0/portutil.tcl
===================================================================
--- branches/new-help-system/base/src/port1.0/portutil.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/port1.0/portutil.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -675,23 +675,21 @@
     }
 }
 
-# platform <os> [<release>] [<arch>]
+# platform [<os> [<release>]] [<arch>]
 # Portfile level procedure to provide support for declaring platform-specifics
-# Basically, just wrap 'variant', so that Portfiles' platform declarations can
+# Basically, just a fancy 'if', so that Portfiles' platform declarations can
 # be more readable, and support arch and version specifics
 proc platform {args} {
-    global all_variants PortInfo os.platform os.arch os.version os.major
+    global os.platform os.subplatform os.arch os.major
 
     set len [llength $args]
     if {$len < 2} {
-        return -code error "Malformed platform variant specification"
+        return -code error "Malformed platform specification"
     }
     set code [lindex $args end]
     set os [lindex $args 0]
     set args [lrange $args 1 [expr $len - 2]]
 
-    set ditem [variant_new "temp-variant"]
-
     foreach arg $args {
         if {[regexp {(^[0-9]+$)} $arg match result]} {
             set release $result
@@ -700,27 +698,19 @@
         }
     }
 
-    # Add the variant for this platform
-    set platform $os
-    if {[info exists release]} { set platform ${platform}_${release} }
-    if {[info exists arch]} { set platform ${platform}_${arch} }
-
-    # Pick up a unique name.
-    if {[variant_exists $platform]} {
-        set suffix 1
-        while {[variant_exists "${platform}_${suffix}"]} {
-            incr suffix
-        }
-
-        set platform "${platform}_${suffix}"
+    set match 0
+    # 'os' could be a platform or an arch when it's alone
+    if {$len == 2 && ($os == ${os.platform} || ([info exists os.subplatform] && $os == ${os.subplatform}) || $os == ${os.arch})} {
+        set match 1
+    } elseif {($os == ${os.platform} || ([info exists os.subplatform] && $os == ${os.subplatform}))
+              && (![info exists release] || ${os.major} == $release)
+              && (![info exists arch] || ${os.arch} == $arch)} {
+        set match 1
     }
-    variant $platform $code
 
-    # Set the variant if this platform matches the platform we're on
-    if {([info exists os.platform] && ${os.platform} == $os)
-            && !([info exists os.major] && [info exists release] && ${os.major} != $release)
-            && !([info exists arch] && [info exists os.arch] && ${os.arch} != $arch)} {
-        variant_set $platform
+    # Execute the code if this platform matches the platform we're on
+    if {$match} {
+        uplevel 1 $code
     }
 }
 
@@ -1269,7 +1259,7 @@
                 if {[ditem_contains $ditem prerun]} {
                     set result [catch {[ditem_key $ditem prerun] $targetname} errstr]
                 }
-                ui_phase  $target
+                set_phase  $target
                 #start tracelib
                 if {($result ==0
                   && [info exists ports_trace]

Modified: branches/new-help-system/base/src/registry2.0/portimage.tcl
===================================================================
--- branches/new-help-system/base/src/registry2.0/portimage.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/registry2.0/portimage.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -66,6 +66,7 @@
 
 variable force 0
 variable use_reg2 0
+variable noexec 0
 
 # Activate a "Port Image"
 proc activate {name v optionslist} {
@@ -73,10 +74,14 @@
     array set options $optionslist
     variable force
     variable use_reg2
+    variable noexec
 
     if {[info exists options(ports_force)] && [string is true -strict $options(ports_force)] } {
         set force 1
     }
+    if {[info exists options(ports_activate_no-exec)]} {
+        set noexec $options(ports_activate_no-exec)
+    }
     if {[string equal ${macports::registry.format} "receipt_sqlite"]} {
         set use_reg2 1
         if {![info exists registry_open]} {
@@ -115,7 +120,7 @@
             }
         }
         foreach a $todeactivate {
-            if {![registry::run_target $a deactivate [list ports_nodepcheck 1]]} {
+            if {$noexec || ![registry::run_target $a deactivate [list ports_nodepcheck 1]]} {
                 deactivate $name "[$a version]_[$a revision][$a variants]" [list ports_nodepcheck 1]
             }
         }
@@ -409,6 +414,7 @@
 proc _activate_contents {port {imagefiles {}} {imagedir {}}} {
     variable force
     variable use_reg2
+    variable noexec
     global macports::prefix
 
     set files [list]
@@ -449,7 +455,7 @@
                         set result [mportlookup [$owner name]]
                         array unset portinfo
                         array set portinfo [lindex $result 1]
-                        if {[info exists portinfo(replaced_by)] && [lsearch -exact -nocase $portinfo(replaced_by) [$port name]] != -1} {
+                        if {[info exists portinfo(replaced_by)] && [lsearch -regexp $portinfo(replaced_by) "(?i)^[$port name]\$"] != -1} {
                             # we'll deactivate the owner later, but before activating our files
                             set todeactivate($owner) yes
                             set owner "replaced"
@@ -504,7 +510,7 @@
 
             # deactivate ports replaced_by this one
             foreach owner [array names todeactivate] {
-                if {![registry::run_target $owner deactivate [list ports_nodepcheck 1]]} {
+                if {$noexec || ![registry::run_target $owner deactivate [list ports_nodepcheck 1]]} {
                     deactivate [$owner name] "" [list ports_nodepcheck 1]
                 }
             }
@@ -543,9 +549,9 @@
             }
             # reactivate deactivated ports
             foreach entry [array names todeactivate] {
-                if {[$entry state] == "imaged" && ![registry::run_target $entry activate ""]} {
+                if {[$entry state] == "imaged" && ($noexec || ![registry::run_target $entry activate ""])} {
                     set pvers "[$entry version]_[$entry revision][$entry variants]"
-                    activate [$entry name] $pvers ""
+                    activate [$entry name] $pvers [list ports_activate_no-exec $noexec]
                 }
             }
             throw
@@ -574,7 +580,7 @@
                 }
                 array unset portinfo
                 array set portinfo [lindex $result 1]
-                if {[info exists portinfo(replaced_by)] && [lsearch -exact -nocase $portinfo(replaced_by) $name] != -1} {
+                if {[info exists portinfo(replaced_by)] && [lsearch -regexp $portinfo(replaced_by) "(?i)^${name}\$"] != -1} {
                     lappend deactivated [lindex [registry::active $port] 0]
                     deactivate $port "" ""
                     set port 0

Modified: branches/new-help-system/base/src/registry2.0/portuninstall.tcl
===================================================================
--- branches/new-help-system/base/src/registry2.0/portuninstall.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/registry2.0/portuninstall.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -52,6 +52,10 @@
     if {[info exists options(ports_force)] && [string is true -strict $options(ports_force)]} {
         set uninstall.force yes
     }
+    # if no-exec is set for uninstall, set for deactivate too
+    if {[info exists options(ports_uninstall_no-exec)]} {
+        set options(ports_deactivate_no-exec) $options(ports_uninstall_no-exec)
+    }
     # check which registry API to use
     set use_reg2 [string equal ${macports::registry.format} "receipt_sqlite"]
 
@@ -126,7 +130,7 @@
             foreach depport [$port dependents] {
                 # make sure it's still installed, since a previous dep uninstall may have removed it
                 if {[registry::entry exists $depport] && ([$depport state] == "imaged" || [$depport state] == "installed")} {
-                    if {![registry::run_target $depport uninstall $optionslist]} {
+                    if {[info exists options(ports_uninstall_no-exec)] || ![registry::run_target $depport uninstall $optionslist]} {
                         set depname [$depport name]
                         set depver "[$depport version]_[$depport revision][$depport variants]"
                         registry_uninstall::uninstall $depname $depver $optionslist
@@ -142,8 +146,8 @@
             if {[info exists options(ports_dryrun)] && [string is true -strict $options(ports_dryrun)]} {
                 ui_msg "For $portname @${v}: skipping deactivate (dry run)"
             } else {
-                if {![registry::run_target $port deactivate $optionslist]} {
-                    portimage::deactivate $portname $v $optionslist
+                if {[info exists options(ports_uninstall_no-exec)] || ![registry::run_target $port deactivate $optionslist]} {
+                    portimage::deactivate $portname $v [array get options]
                 }
             }
         }
@@ -208,110 +212,199 @@
             }
         }
     }
+    
+    # note deps before we uninstall if we're going to uninstall them too
+    if {[info exists options(ports_uninstall_follow-dependencies)] && [string is true -strict $options(ports_uninstall_follow-dependencies)]} {
+        set deptypes {depends_fetch depends_extract depends_build depends_lib depends_run}
+        set all_dependencies {}
+        # look up deps from the saved portfile if possible
+        if {$use_reg2 && ![catch {set mport [mportopen_installed [$port name] [$port version] [$port revision] [$port variants] $optionslist]}]} {
+            array set depportinfo [mportinfo $mport]
+            mportclose_installed $mport
+            foreach type $deptypes {
+                if {[info exists depportinfo($type)]} {
+                    foreach dep $depportinfo($type) {
+                        lappend all_dependencies [lindex [split $dep :] end]
+                    }
+                }
+            }
+            # append those from the registry (could be different because of path deps)
+            foreach dep [$port dependencies] {
+                lappend all_dependencies [$dep name]
+            }
+        } else {
+            # grab the deps from the dep map
+            set depmaplist [registry::list_depends $portname $version $revision $variants]
+            foreach dep $depmaplist {
+                lappend all_dependencies [lindex $dep 0]
+            }
+            # and the ones from the current portfile
+            if {![catch {mportlookup $portname} result] && [llength $result] >= 2} {
+                array set depportinfo [lindex $result 1]
+                set porturl $depportinfo(porturl)
+                set variations {}
+                set minusvariant [lrange [split [$port negated_variants] -] 1 end]
+                set plusvariant [lrange [split [$port variants] +] 1 end]
+                foreach v $plusvariant {
+                    lappend variations $v "+"
+                }
+                foreach v $minusvariant {
+                    lappend variations $v "-"
+                }
+                if {![catch {set mport [mportopen $porturl $optionslist [array get variations]]} result]} {
+                    array unset depportinfo
+                    array set depportinfo [mportinfo $mport]
+                    mportclose $mport
+                }
+                foreach type $deptypes {
+                    if {[info exists depportinfo($type)]} {
+                        foreach dep $depportinfo($type) {
+                            lappend all_dependencies [lindex [split $dep :] end]
+                        }
+                    }
+                }
+            }
+        }
+        array unset depportinfo
+        set all_dependencies [lsort -unique $all_dependencies]
+    }
 
     if {[info exists options(ports_dryrun)] && [string is true -strict $options(ports_dryrun)]} {
         ui_msg "For $portname @${v}: skipping uninstall (dry run)"
-        return 0
-    }
-
-    ui_msg "$UI_PREFIX [format [msgcat::mc "Uninstalling %s @%s"] $portname $v]"
-
-    if {!$use_reg2} {
-        # Look to see if the port has registered an uninstall procedure
-        set uninstall [registry::property_retrieve $ref pkg_uninstall] 
-        if { $uninstall != 0 } {
-            if {![catch {eval [string map { \\n \n } $uninstall]} err]} {
-                ui_info "Executing pkg_uninstall procedure"
-                if {[catch {pkg_uninstall $portname "${version}_${revision}${variants}" } err]} {
-                    ui_error [format [msgcat::mc "Error executing pkg_uninstall procedure: %s"] $err]
+    } else {
+        ui_msg "$UI_PREFIX [format [msgcat::mc "Uninstalling %s @%s"] $portname $v]"
+    
+        if {!$use_reg2} {
+            # Look to see if the port has registered an uninstall procedure
+            set uninstall [registry::property_retrieve $ref pkg_uninstall] 
+            if { $uninstall != 0 } {
+                if {![catch {eval [string map { \\n \n } $uninstall]} err]} {
+                    ui_info "Executing pkg_uninstall procedure"
+                    if {[catch {pkg_uninstall $portname "${version}_${revision}${variants}" } err]} {
+                        ui_error [format [msgcat::mc "Error executing pkg_uninstall procedure: %s"] $err]
+                    }
+                } else {
+                    global errorInfo
+                    ui_debug "$errorInfo"
+                    ui_error [format [msgcat::mc "Could not evaluate pkg_uninstall procedure: %s"] $err]
                 }
-            } else {
-                global errorInfo
-                ui_debug "$errorInfo"
-                ui_error [format [msgcat::mc "Could not evaluate pkg_uninstall procedure: %s"] $err]
             }
+        
+            # Remove the port from the dep_map if only one version was installed.
+            # This is a temporary fix for a deeper problem that is that the dependency
+            # map doesn't take the port version into account (but should).
+            # Fixing it means transitioning to a new dependency map format.
+            if {$nb_versions_installed == 1} {
+                registry::unregister_dependencies $portname
+            }
         }
     
-        # Remove the port from the dep_map if only one version was installed.
-        # This is a temporary fix for a deeper problem that is that the dependency
-        # map doesn't take the port version into account (but should).
-        # Fixing it means transitionning to a new dependency map format.
-        if {$nb_versions_installed == 1} {
-            registry::unregister_dependencies $portname
-        }
-    }
-
-    # Now look for a contents list
-    if {$use_reg2} {
-        # imagefiles gives the actual installed files in direct mode
-        set contents [$port imagefiles]
-        set imagedir [$port location]
-    } else {
-        set contents [registry::property_retrieve $ref contents]
-        if { $contents == "" } {
-            return -code error [msgcat::mc "Uninstall failed: Port has no contents entry"]
-        }
-    }
-    set bak_suffix ".mp_[clock seconds]"
-    set files [list]
-    foreach f $contents {
+        # Now look for a contents list
         if {$use_reg2} {
-            set fname "${imagedir}${f}"
-            #set sum1 [$port md5sum $f]
-            # there's an md5 column in registry.files in the db, but
-            # no way to get or set it seems to be implemented
-            set sum1 NONE
+            # imagefiles gives the actual installed files in direct mode
+            set contents [$port imagefiles]
+            set imagedir [$port location]
         } else {
-            set fname [lindex $f 0]
-            set md5index [lsearch -regex [lrange $f 1 end] MD5]
-            if {$md5index != -1} {
-                set sumx [lindex $f [expr $md5index + 1]]
-            } else {
-                # XXX There is no MD5 listed, set sumx to an
-                # empty list, causing the next conditional to
-                # return a checksum error
-                set sumx {}
+            set contents [registry::property_retrieve $ref contents]
+            if { $contents == "" } {
+                return -code error [msgcat::mc "Uninstall failed: Port has no contents entry"]
             }
-            set sum1 [lindex $sumx [expr [llength $sumx] - 1]]
         }
-        if {![string match $sum1 NONE] && !([info exists uninstall.nochecksum] && [string is true -strict ${uninstall.nochecksum}]) } {
-            if {![catch {set sum2 [md5 $fname]}] && ![string match $sum1 $sum2]} {
-                ui_warn "$UI_PREFIX  [format [msgcat::mc "Original checksum does not match for %s, saving a copy to %s"] $fname ${fname}${bak_suffix}]"
-                catch {file copy $fname "${fname}${bak_suffix}"}
+        set bak_suffix ".mp_[clock seconds]"
+        set files [list]
+        foreach f $contents {
+            if {$use_reg2} {
+                set fname "${imagedir}${f}"
+                #set sum1 [$port md5sum $f]
+                # there's an md5 column in registry.files in the db, but
+                # no way to get or set it seems to be implemented
+                set sum1 NONE
+            } else {
+                set fname [lindex $f 0]
+                set md5index [lsearch -regex [lrange $f 1 end] MD5]
+                if {$md5index != -1} {
+                    set sumx [lindex $f [expr $md5index + 1]]
+                } else {
+                    # XXX There is no MD5 listed, set sumx to an
+                    # empty list, causing the next conditional to
+                    # return a checksum error
+                    set sumx {}
+                }
+                set sum1 [lindex $sumx [expr [llength $sumx] - 1]]
             }
+            if {![string match $sum1 NONE] && !([info exists uninstall.nochecksum] && [string is true -strict ${uninstall.nochecksum}]) } {
+                if {![catch {set sum2 [md5 $fname]}] && ![string match $sum1 $sum2]} {
+                    ui_warn "$UI_PREFIX  [format [msgcat::mc "Original checksum does not match for %s, saving a copy to %s"] $fname ${fname}${bak_suffix}]"
+                    catch {file copy $fname "${fname}${bak_suffix}"}
+                }
+            }
+            
+            set theFile [file normalize $fname]
+            if { [file exists $theFile] || (![catch {file type $theFile}] && [file type $theFile] == "link") } {
+                # Normalize the file path to avoid removing the intermediate
+                # symlinks (remove the empty directories instead)
+                lappend files $theFile
+    
+                # Split out the filename's subpaths and add them to the
+                # list as well. The realpath call is necessary because file normalize
+                # does not resolve symlinks on OS X < 10.6
+                set directory [realpath [file dirname $theFile]]
+                while { [lsearch -exact $files $directory] == -1 } { 
+                    lappend files $directory
+                    set directory [file dirname $directory]
+                }
+            }
         }
-        
-        set theFile [file normalize $fname]
-        if { [file exists $theFile] || (![catch {file type $theFile}] && [file type $theFile] == "link") } {
-            # Normalize the file path to avoid removing the intermediate
-            # symlinks (remove the empty directories instead)
-            lappend files $theFile
-
-            # Split out the filename's subpaths and add them to the
-            # list as well. The realpath call is necessary because file normalize
-            # does not resolve symlinks on OS X < 10.6
-            set directory [realpath [file dirname $theFile]]
-            while { [lsearch -exact $files $directory] == -1 } { 
-                lappend files $directory
-                set directory [file dirname $directory]
+    
+        # Sort the list in reverse order, removing duplicates.
+        # Since the list is sorted in reverse order, we're sure that directories
+        # are after their elements.
+        set theList [lsort -decreasing -unique $files]
+    
+        # Remove all elements.
+        _uninstall_list $theList
+    
+        if {$use_reg2} {
+            registry::entry delete $port
+        } else {
+            ui_info "$UI_PREFIX [format [msgcat::mc "Uninstall is removing %s from the port registry."] $portname]"
+            registry::delete_entry $ref
+        }
+    }
+    
+    # uninstall dependencies if requested
+    if {[info exists options(ports_uninstall_follow-dependencies)] && [string is true -strict $options(ports_uninstall_follow-dependencies)]} {
+        while 1 {
+            set remaining_list {}
+            foreach dep $all_dependencies {
+                if {![catch {set ilist [registry::installed $dep]}]} {
+                    set remaining 0
+                    foreach i $ilist {
+                        set iversion [lindex $i 1]
+                        set irevision [lindex $i 2]
+                        set ivariants [lindex $i 3]
+                        if {[llength [registry::list_dependents $dep $iversion $irevision $ivariants]] == 0} {
+                            set regref [registry::open_entry $dep $iversion $irevision $ivariants [lindex $i 5]]
+                            if {![registry::property_retrieve $regref requested] && (!$use_reg2 || [info exists options(ports_uninstall_no-exec)] || ![registry::run_target $regref uninstall $optionslist])} {
+                                set depver "${iversion}_${irevision}${ivariants}"
+                                registry_uninstall::uninstall $dep $depver $optionslist
+                            }
+                        } else {
+                            set remaining 1
+                        }
+                    }
+                    if {$remaining} {
+                        lappend remaining_list $dep
+                    }
+                }
             }
+            if {[llength $remaining_list] == 0 || [llength $remaining_list] == [llength $all_dependencies]} {
+                break
+            }
+            set all_dependencies $remaining_list
         }
     }
-
-    # Sort the list in reverse order, removing duplicates.
-    # Since the list is sorted in reverse order, we're sure that directories
-    # are after their elements.
-    set theList [lsort -decreasing -unique $files]
-
-    # Remove all elements.
-    _uninstall_list $theList
-
-    if {$use_reg2} {
-        registry::entry delete $port
-    } else {
-        ui_info "$UI_PREFIX [format [msgcat::mc "Uninstall is removing %s from the port registry."] $portname]"
-        registry::delete_entry $ref
-    }
+    
     return 0
 }
 

Modified: branches/new-help-system/base/src/registry2.0/receipt_flat.tcl
===================================================================
--- branches/new-help-system/base/src/registry2.0/receipt_flat.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/registry2.0/receipt_flat.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -764,7 +764,7 @@
 }
 
 # List all ports this one depends on
-proc list_depends {name} {
+proc list_depends {name version revision variants} {
 	variable dep_map
 	if { [llength $dep_map] < 1 && [info exists dep_map] } {
 		open_dep_map

Modified: branches/new-help-system/base/src/registry2.0/receipt_sqlite.tcl
===================================================================
--- branches/new-help-system/base/src/registry2.0/receipt_sqlite.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/registry2.0/receipt_sqlite.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -204,6 +204,30 @@
 proc open_dep_map {args} {
 }
 
+# List all the ports that this port depends on
+proc list_depends {name version revision variants} {
+	set rlist [list]
+	set searchcmd "registry::entry search"
+    foreach key {name version revision} {
+        if {[set $key] != ""} {
+            append searchcmd " $key [set $key]"
+        }
+    }
+    if {$variants != 0} {
+        append searchcmd " variants {$variants}"
+    }
+    if {[catch {set ports [eval $searchcmd]}]} {
+        set ports [list]
+    }
+    foreach port $ports {
+        foreach dep [$port dependencies] {
+            lappend rlist [list [$dep name] port [$port name]]
+        }
+    }
+	
+	return [lsort -unique $rlist]
+}
+
 # List all the ports that depend on this port
 proc list_dependents {name version revision variants} {
 	set rlist [list]

Modified: branches/new-help-system/base/src/registry2.0/registry.tcl
===================================================================
--- branches/new-help-system/base/src/registry2.0/registry.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/registry2.0/registry.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -356,9 +356,9 @@
 }
 
 # List all ports this one depends on
-proc list_depends {name} {
+proc list_depends {name {version ""} {revision ""} {variants 0}} {
 	global macports::registry.format
-	return [${macports::registry.format}::list_depends $name]
+	return [${macports::registry.format}::list_depends $name $version $revision $variants]
 }
 
 # List all the ports that depend on this port

Modified: branches/new-help-system/base/src/upgrade_sources_conf_default.tcl
===================================================================
--- branches/new-help-system/base/src/upgrade_sources_conf_default.tcl	2010-04-18 04:02:17 UTC (rev 66611)
+++ branches/new-help-system/base/src/upgrade_sources_conf_default.tcl	2010-04-18 04:07:59 UTC (rev 66612)
@@ -23,7 +23,7 @@
 }
 
 
-set mktempChannel [open "|/usr/bin/mktemp -t macports_sources_upgrade" r]
+set mktempChannel [open "|/usr/bin/mktemp -t macports_sources_upgrade.XXXXXXXXXX" r]
 set tempfile [read -nonewline $mktempChannel]
 close $mktempChannel
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20100417/57681f76/attachment-0001.html>


More information about the macports-changes mailing list