[146885] trunk/base/src/macports1.0

raimue at macports.org raimue at macports.org
Sat Mar 19 07:49:40 PDT 2016


Revision: 146885
          https://trac.macports.org/changeset/146885
Author:   raimue at macports.org
Date:     2016-03-19 07:49:40 -0700 (Sat, 19 Mar 2016)
Log Message:
-----------
Move selfupdate code into separate file

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

Added Paths:
-----------
    trunk/base/src/macports1.0/selfupdate.tcl

Modified: trunk/base/src/macports1.0/Makefile.in
===================================================================
--- trunk/base/src/macports1.0/Makefile.in	2016-03-19 13:41:04 UTC (rev 146884)
+++ trunk/base/src/macports1.0/Makefile.in	2016-03-19 14:49:40 UTC (rev 146885)
@@ -4,7 +4,7 @@
 include ../../Mk/macports.autoconf.mk
 
 SRCS=		macports.tcl macports_dlist.tcl macports_util.tcl \
-		macports_autoconf.tcl diagnose.tcl reclaim.tcl
+		macports_autoconf.tcl diagnose.tcl reclaim.tcl selfupdate.tcl
 OBJS=		macports.o get_systemconfiguration_proxies.o sysctl.o
 SHLIB_NAME=	MacPorts${SHLIB_SUFFIX}
 

Modified: trunk/base/src/macports1.0/macports.tcl
===================================================================
--- trunk/base/src/macports1.0/macports.tcl	2016-03-19 13:41:04 UTC (rev 146884)
+++ trunk/base/src/macports1.0/macports.tcl	2016-03-19 14:49:40 UTC (rev 146885)
@@ -38,6 +38,7 @@
 package require macports_util 1.0
 package require diagnose 1.0
 package require reclaim 1.0
+package require selfupdate 1.0
 package require Tclx
 
 namespace eval macports {
@@ -3544,198 +3545,7 @@
 
 # selfupdate procedure
 proc macports::selfupdate {{optionslist {}} {updatestatusvar {}}} {
-    global macports::prefix macports::portdbpath macports::rsync_server macports::rsync_dir \
-           macports::rsync_options macports::autoconf::macports_version \
-           macports::autoconf::rsync_path tcl_platform macports::autoconf::openssl_path \
-           macports::autoconf::tar_path
-    array set options $optionslist
-
-    # variable that indicates whether we actually updated base
-    if {$updatestatusvar ne ""} {
-        upvar $updatestatusvar updatestatus
-        set updatestatus no
-    }
-
-    # are we syncing a tarball? (implies detached signature)
-    set is_tarball 0
-    if {[string range $rsync_dir end-3 end] eq ".tar"} {
-        set is_tarball 1
-        set mp_source_path [file join $portdbpath sources $rsync_server [file dirname $rsync_dir]]
-    } else {
-        if {[string index $rsync_dir end] ne "/"} {
-            append rsync_dir /
-        }
-        set mp_source_path [file join $portdbpath sources $rsync_server $rsync_dir]
-    }
-    # create the path to the to be downloaded sources if it doesn't exist
-    if {![file exists $mp_source_path]} {
-        file mkdir $mp_source_path
-    }
-    ui_debug "MacPorts sources location: $mp_source_path"
-
-    # sync the MacPorts sources
-    ui_msg "$macports::ui_prefix Updating MacPorts base sources using rsync"
-    try -pass_signal {
-        system "$rsync_path $rsync_options rsync://${rsync_server}/$rsync_dir $mp_source_path"
-    } catch {{*} eCode eMessage} {
-        return -code error "Error synchronizing MacPorts sources: $eMessage"
-    }
-
-    if {$is_tarball} {
-        # verify signature for tarball
-        global macports::archivefetch_pubkeys
-        try -pass_signal {
-            system "$rsync_path $rsync_options rsync://${rsync_server}/${rsync_dir}.rmd160 $mp_source_path"
-        } catch {{*} eCode eMessage} {
-            return -code error "Error synchronizing MacPorts source signature: $eMessage"
-        }
-        set openssl [findBinary openssl $macports::autoconf::openssl_path]
-        set tarball ${mp_source_path}/[file tail $rsync_dir]
-        set signature ${tarball}.rmd160
-        set verified 0
-        foreach pubkey $macports::archivefetch_pubkeys {
-            try -pass_signal {
-                exec $openssl dgst -ripemd160 -verify $pubkey -signature $signature $tarball
-                set verified 1
-                ui_debug "successful verification with key $pubkey"
-                break
-            }  catch {{*} eCode eMessage} {
-                ui_debug "failed verification with key $pubkey"
-                ui_debug "openssl output: $eMessage"
-            }
-        }
-        if {!$verified} {
-            return -code error "Failed to verify signature for MacPorts source!"
-        }
-
-        # extract tarball and move into place
-        set tar [macports::findBinary tar $macports::autoconf::tar_path]
-        file mkdir ${mp_source_path}/tmp
-        set tar_cmd "$tar -C ${mp_source_path}/tmp -xf $tarball"
-        try -pass_signal {
-            system $tar_cmd
-        } catch {*} {
-            return -code error "Failed to extract MacPorts sources from tarball!"
-        }
-        file delete -force ${mp_source_path}/base
-        file rename ${mp_source_path}/tmp/base ${mp_source_path}/base
-        file delete -force ${mp_source_path}/tmp
-        # set the final extracted source path
-        set mp_source_path ${mp_source_path}/base
-    }
-
-    # echo current MacPorts version
-    ui_msg "MacPorts base version $macports::autoconf::macports_version installed,"
-
-    if {[info exists options(ports_force)] && $options(ports_force)} {
-        set use_the_force_luke yes
-        ui_debug "Forcing a rebuild and reinstallation of MacPorts"
-    } else {
-        set use_the_force_luke no
-        ui_debug "Rebuilding and reinstalling MacPorts if needed"
-    }
-
-    # Choose what version file to use: old, floating point format or new, real version number format
-    set version_file [file join $mp_source_path config macports_version]
-    if {[file exists $version_file]} {
-        set fd [open $version_file r]
-        gets $fd macports_version_new
-        close $fd
-        # echo downloaded MacPorts version
-        ui_msg "MacPorts base version $macports_version_new downloaded."
-    } else {
-        ui_warn "No version file found, please rerun selfupdate."
-        set macports_version_new 0
-    }
-
-    # check if we we need to rebuild base
-    set comp [vercmp $macports_version_new $macports::autoconf::macports_version]
-
-    # syncing ports tree.
-    if {![info exists options(ports_selfupdate_nosync)] || !$options(ports_selfupdate_nosync)} {
-        if {$comp > 0} {
-            # updated portfiles potentially need new base to parse - tell sync to try to
-            # use prefabricated PortIndex files and signal if it couldn't
-            lappend optionslist no_reindex 1 needed_portindex_var needed_portindex
-        }
-        try {
-            mportsync $optionslist
-        }  catch {{*} eCode eMessage} {
-            return -code error "Couldn't sync the ports tree: $eMessage"
-        }
-    }
-
-    if {$use_the_force_luke || $comp > 0} {
-        if {[info exists options(ports_dryrun)] && $options(ports_dryrun)} {
-            ui_msg "$macports::ui_prefix MacPorts base is outdated, selfupdate would install $macports_version_new (dry run)"
-        } else {
-            ui_msg "$macports::ui_prefix MacPorts base is outdated, installing new version $macports_version_new"
-
-            # get installation user/group and permissions
-            set owner [file attributes $prefix -owner]
-            set group [file attributes $prefix -group]
-            set perms [string range [file attributes $prefix -permissions] end-3 end]
-            if {$tcl_platform(user) ne "root" && $tcl_platform(user) ne $owner} {
-                return -code error "User $tcl_platform(user) does not own $prefix - try using sudo"
-            }
-            ui_debug "Permissions OK"
-
-            set configure_args "--prefix=[macports::shellescape $prefix] --with-install-user=[macports::shellescape $owner] --with-install-group=[macports::shellescape $group] --with-directory-mode=[macports::shellescape $perms]"
-            # too many users have an incompatible readline in /usr/local, see ticket #10651
-            if {$tcl_platform(os) ne "Darwin" || $prefix eq "/usr/local"
-                || ([glob -nocomplain /usr/local/lib/lib{readline,history}*] eq "" && [glob -nocomplain /usr/local/include/readline/*.h] eq "")} {
-                append configure_args " --enable-readline"
-            } else {
-                ui_warn "Disabling readline support due to readline in /usr/local"
-            }
-
-            if {$prefix eq "/usr/local" || $prefix eq "/usr"} {
-                append configure_args " --with-unsupported-prefix"
-            }
-
-            # Choose a sane compiler
-            set cc_arg {}
-            if {$::macports::os_platform eq "darwin"} {
-                set cc_arg "CC=/usr/bin/cc OBJC=/usr/bin/cc "
-            }
-
-            # do the actual configure, build and installation of new base
-            ui_msg "Installing new MacPorts release in $prefix as ${owner}:${group}; permissions ${perms}\n"
-            try {
-                system -W $mp_source_path "${cc_arg}./configure $configure_args && make SELFUPDATING=1 && make install SELFUPDATING=1"
-            } catch {{*} eCode eMessage} {
-                return -code error "Error installing new MacPorts base: $eMessage"
-            }
-            if {[info exists updatestatus]} {
-                set updatestatus yes
-            }
-        }
-    } elseif {$comp < 0} {
-        ui_msg "$macports::ui_prefix MacPorts base is probably trunk or a release candidate"
-    } else {
-        ui_msg "$macports::ui_prefix MacPorts base is already the latest version"
-    }
-
-    # set the MacPorts sources to the right owner
-    set sources_owner [file attributes [file join $portdbpath sources/] -owner]
-    ui_debug "Setting MacPorts sources ownership to $sources_owner"
-    try {
-        exec [findBinary chown $macports::autoconf::chown_path] -R $sources_owner [file join $portdbpath sources/]
-    }  catch {{*} eCode eMessage} {
-        return -code error "Couldn't change permissions of the MacPorts sources at $mp_source_path to ${sources_owner}: $eMessage"
-    }
-
-    if {![info exists options(ports_selfupdate_nosync)] || !$options(ports_selfupdate_nosync)} {
-        if {[info exists needed_portindex]} {
-            ui_msg "Not all sources could be fully synced using the old version of MacPorts."
-            ui_msg "Please run selfupdate again now that MacPorts base has been updated."
-        } else {
-            ui_msg "\nThe ports tree has been updated. To upgrade your installed ports, you should run"
-            ui_msg "  port upgrade outdated"
-        }
-    }
-
-    return 0
+    return [uplevel [list selfupdate::main $optionslist $updatestatusvar]]
 }
 
 # upgrade API wrapper procedure

Added: trunk/base/src/macports1.0/selfupdate.tcl
===================================================================
--- trunk/base/src/macports1.0/selfupdate.tcl	                        (rev 0)
+++ trunk/base/src/macports1.0/selfupdate.tcl	2016-03-19 14:49:40 UTC (rev 146885)
@@ -0,0 +1,233 @@
+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
+# selfupdate.tcl
+# $Id$
+#
+# Copyright (c) 2016 The MacPorts Project
+# 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 Apple Inc. nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+
+package provide selfupdate 1.0
+
+package require macports
+
+namespace eval selfupdate {
+    namespace export main
+}
+
+proc selfupdate::main {{optionslist {}} {updatestatusvar {}}} {
+    global macports::prefix macports::portdbpath macports::rsync_server macports::rsync_dir \
+           macports::rsync_options macports::autoconf::macports_version \
+           macports::autoconf::rsync_path tcl_platform macports::autoconf::openssl_path \
+           macports::autoconf::tar_path
+    array set options $optionslist
+
+    # variable that indicates whether we actually updated base
+    if {$updatestatusvar ne ""} {
+        upvar $updatestatusvar updatestatus
+        set updatestatus no
+    }
+
+    # are we syncing a tarball? (implies detached signature)
+    set is_tarball 0
+    if {[string range $rsync_dir end-3 end] eq ".tar"} {
+        set is_tarball 1
+        set mp_source_path [file join $portdbpath sources $rsync_server [file dirname $rsync_dir]]
+    } else {
+        if {[string index $rsync_dir end] ne "/"} {
+            append rsync_dir /
+        }
+        set mp_source_path [file join $portdbpath sources $rsync_server $rsync_dir]
+    }
+    # create the path to the to be downloaded sources if it doesn't exist
+    if {![file exists $mp_source_path]} {
+        file mkdir $mp_source_path
+    }
+    ui_debug "MacPorts sources location: $mp_source_path"
+
+    # sync the MacPorts sources
+    ui_msg "$macports::ui_prefix Updating MacPorts base sources using rsync"
+    try -pass_signal {
+        system "$rsync_path $rsync_options rsync://${rsync_server}/$rsync_dir $mp_source_path"
+    } catch {{*} eCode eMessage} {
+        return -code error "Error synchronizing MacPorts sources: $eMessage"
+    }
+
+    if {$is_tarball} {
+        # verify signature for tarball
+        global macports::archivefetch_pubkeys
+        try -pass_signal {
+            system "$rsync_path $rsync_options rsync://${rsync_server}/${rsync_dir}.rmd160 $mp_source_path"
+        } catch {{*} eCode eMessage} {
+            return -code error "Error synchronizing MacPorts source signature: $eMessage"
+        }
+        set openssl [macports::findBinary openssl $macports::autoconf::openssl_path]
+        set tarball ${mp_source_path}/[file tail $rsync_dir]
+        set signature ${tarball}.rmd160
+        set verified 0
+        foreach pubkey $macports::archivefetch_pubkeys {
+            try -pass_signal {
+                exec $openssl dgst -ripemd160 -verify $pubkey -signature $signature $tarball
+                set verified 1
+                ui_debug "successful verification with key $pubkey"
+                break
+            }  catch {{*} eCode eMessage} {
+                ui_debug "failed verification with key $pubkey"
+                ui_debug "openssl output: $eMessage"
+            }
+        }
+        if {!$verified} {
+            return -code error "Failed to verify signature for MacPorts source!"
+        }
+
+        # extract tarball and move into place
+        set tar [macports::findBinary tar $macports::autoconf::tar_path]
+        file mkdir ${mp_source_path}/tmp
+        set tar_cmd "$tar -C ${mp_source_path}/tmp -xf $tarball"
+        try -pass_signal {
+            system $tar_cmd
+        } catch {*} {
+            return -code error "Failed to extract MacPorts sources from tarball!"
+        }
+        file delete -force ${mp_source_path}/base
+        file rename ${mp_source_path}/tmp/base ${mp_source_path}/base
+        file delete -force ${mp_source_path}/tmp
+        # set the final extracted source path
+        set mp_source_path ${mp_source_path}/base
+    }
+
+    # echo current MacPorts version
+    ui_msg "MacPorts base version $macports::autoconf::macports_version installed,"
+
+    if {[info exists options(ports_force)] && $options(ports_force)} {
+        set use_the_force_luke yes
+        ui_debug "Forcing a rebuild and reinstallation of MacPorts"
+    } else {
+        set use_the_force_luke no
+        ui_debug "Rebuilding and reinstalling MacPorts if needed"
+    }
+
+    # Choose what version file to use: old, floating point format or new, real version number format
+    set version_file [file join $mp_source_path config macports_version]
+    if {[file exists $version_file]} {
+        set fd [open $version_file r]
+        gets $fd macports_version_new
+        close $fd
+        # echo downloaded MacPorts version
+        ui_msg "MacPorts base version $macports_version_new downloaded."
+    } else {
+        ui_warn "No version file found, please rerun selfupdate."
+        set macports_version_new 0
+    }
+
+    # check if we we need to rebuild base
+    set comp [vercmp $macports_version_new $macports::autoconf::macports_version]
+
+    # syncing ports tree.
+    if {![info exists options(ports_selfupdate_nosync)] || !$options(ports_selfupdate_nosync)} {
+        if {$comp > 0} {
+            # updated portfiles potentially need new base to parse - tell sync to try to
+            # use prefabricated PortIndex files and signal if it couldn't
+            lappend optionslist no_reindex 1 needed_portindex_var needed_portindex
+        }
+        try {
+            mportsync $optionslist
+        }  catch {{*} eCode eMessage} {
+            return -code error "Couldn't sync the ports tree: $eMessage"
+        }
+    }
+
+    if {$use_the_force_luke || $comp > 0} {
+        if {[info exists options(ports_dryrun)] && $options(ports_dryrun)} {
+            ui_msg "$macports::ui_prefix MacPorts base is outdated, selfupdate would install $macports_version_new (dry run)"
+        } else {
+            ui_msg "$macports::ui_prefix MacPorts base is outdated, installing new version $macports_version_new"
+
+            # get installation user/group and permissions
+            set owner [file attributes $prefix -owner]
+            set group [file attributes $prefix -group]
+            set perms [string range [file attributes $prefix -permissions] end-3 end]
+            if {$tcl_platform(user) ne "root" && $tcl_platform(user) ne $owner} {
+                return -code error "User $tcl_platform(user) does not own $prefix - try using sudo"
+            }
+            ui_debug "Permissions OK"
+
+            set configure_args "--prefix=[macports::shellescape $prefix] --with-install-user=[macports::shellescape $owner] --with-install-group=[macports::shellescape $group] --with-directory-mode=[macports::shellescape $perms]"
+            # too many users have an incompatible readline in /usr/local, see ticket #10651
+            if {$tcl_platform(os) ne "Darwin" || $prefix eq "/usr/local"
+                || ([glob -nocomplain /usr/local/lib/lib{readline,history}*] eq "" && [glob -nocomplain /usr/local/include/readline/*.h] eq "")} {
+                append configure_args " --enable-readline"
+            } else {
+                ui_warn "Disabling readline support due to readline in /usr/local"
+            }
+
+            if {$prefix eq "/usr/local" || $prefix eq "/usr"} {
+                append configure_args " --with-unsupported-prefix"
+            }
+
+            # Choose a sane compiler
+            set cc_arg {}
+            if {$::macports::os_platform eq "darwin"} {
+                set cc_arg "CC=/usr/bin/cc OBJC=/usr/bin/cc "
+            }
+
+            # do the actual configure, build and installation of new base
+            ui_msg "Installing new MacPorts release in $prefix as ${owner}:${group}; permissions ${perms}\n"
+            try {
+                system -W $mp_source_path "${cc_arg}./configure $configure_args && make SELFUPDATING=1 && make install SELFUPDATING=1"
+            } catch {{*} eCode eMessage} {
+                return -code error "Error installing new MacPorts base: $eMessage"
+            }
+            if {[info exists updatestatus]} {
+                set updatestatus yes
+            }
+        }
+    } elseif {$comp < 0} {
+        ui_msg "$macports::ui_prefix MacPorts base is probably trunk or a release candidate"
+    } else {
+        ui_msg "$macports::ui_prefix MacPorts base is already the latest version"
+    }
+
+    # set the MacPorts sources to the right owner
+    set sources_owner [file attributes [file join $portdbpath sources/] -owner]
+    ui_debug "Setting MacPorts sources ownership to $sources_owner"
+    try {
+        exec [macports::findBinary chown $macports::autoconf::chown_path] -R $sources_owner [file join $portdbpath sources/]
+    }  catch {{*} eCode eMessage} {
+        return -code error "Couldn't change permissions of the MacPorts sources at $mp_source_path to ${sources_owner}: $eMessage"
+    }
+
+    if {![info exists options(ports_selfupdate_nosync)] || !$options(ports_selfupdate_nosync)} {
+        if {[info exists needed_portindex]} {
+            ui_msg "Not all sources could be fully synced using the old version of MacPorts."
+            ui_msg "Please run selfupdate again now that MacPorts base has been updated."
+        } else {
+            ui_msg "\nThe ports tree has been updated. To upgrade your installed ports, you should run"
+            ui_msg "  port upgrade outdated"
+        }
+    }
+
+    return 0
+}


Property changes on: trunk/base/src/macports1.0/selfupdate.tcl
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20160319/2959685b/attachment-0001.html>


More information about the macports-changes mailing list