<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository mpbb.

</pre>
<p><a href="https://github.com/macports/mpbb/commit/81c423f694d8c7860f14d7579dc8bdb27eec3dd6">https://github.com/macports/mpbb/commit/81c423f694d8c7860f14d7579dc8bdb27eec3dd6</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 81c423f  Add smarter distfile mirroring script
</span>81c423f is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 81c423f694d8c7860f14d7579dc8bdb27eec3dd6
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat Mar 10 11:37:22 2018 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Add smarter distfile mirroring script
</span>---
 mpbb-mirror-distfiles  |   2 +-
 tools/mirror-multi.tcl | 248 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 249 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-mirror-distfiles b/mpbb-mirror-distfiles
</span><span style='display:block; white-space:pre;color:#808080;'>index 76ee049..3781871 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-mirror-distfiles
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-mirror-distfiles
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -73,5 +73,5 @@ mirror-distfiles() {
</span>     # Mirror the distfiles.
     # $option_prefix is set by mpbb
     # shellcheck disable=SC2154
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    "${option_prefix}/bin/port" -p mirror "$@" $("${option_prefix}/bin/port" -pq rdeps --index "$@" | sed -E -e '/^--$/d' -e 's/^[[:space:]]+//' | sort -u)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "${option_prefix}/bin/port-tclsh" "${thisdir}/tools/mirror-multi.tcl" -c "${option_work_dir}/mirrorcache" "$@"
</span> }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/mirror-multi.tcl b/tools/mirror-multi.tcl
</span>new file mode 100755
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..a558a61
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/mirror-multi.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,248 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#!/usr/bin/env port-tclsh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- 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
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Mirrors the distfiles for the given ports, for each possible variant
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# and supported platform. Skips those that have already been mirrored
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# by comparing the Portfile's hash against the hash recorded previously.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Copyright (c) 2018 The MacPorts Project.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    notice, this list of conditions and the following disclaimer in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    the documentation and/or other materials provided with the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 3. Neither the name of the MacPorts project, nor the names of any contributors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    may be used to endorse or promote products derived from this software
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+package require macports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[catch {mportinit "" "" ""} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ui_error "$errorInfo"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ui_error "Failed to initialize ports sytem: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set platforms [list 8 ppc 8 i386 9 ppc 9 i386]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach vers {10 11 12 13 14 15 16 17} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${macports::os_major} != $vers} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend platforms $vers i386
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set deptypes {depends_fetch depends_extract depends_build depends_lib depends_run depends_test}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+array set tried_and_failed {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+array set mirror_done {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc check_mirror_done {portname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mirror_done mirrorcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists mirror_done($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $mirror_done($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set cache_entry [file join $mirrorcache_dir [string toupper [string index $portname 0]] $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file isfile $cache_entry]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result [mportlookup $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[llength $result] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portfile [file join [macports::getportdir $portinfo(porturl)] Portfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[file isfile $portfile]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set portfile_hash [sha256 file $portfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fd [open $cache_entry]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set entry_hash [gets $fd]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            close $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$portfile_hash eq $entry_hash} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set mirror_done($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                file delete -force $cache_entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set mirror_done($portname) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mirror_done($portname) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc set_mirror_done {portname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mirror_done mirrorcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists mirror_done($portname)] || $mirror_done($portname) == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result [mportlookup $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portfile [file join [macports::getportdir $portinfo(porturl)] Portfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portfile_hash [sha256 file $portfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cache_dir [file join $mirrorcache_dir [string toupper [string index $portname 0]]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file mkdir $cache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cache_entry [file join $cache_dir $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fd [open $cache_entry w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $fd $portfile_hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        close $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mirror_done($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc get_dep_list {portinfovar} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global deptypes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $portinfovar portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set deps {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype $deptypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists portinfo($deptype)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach dep $portinfo($deptype) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend deps [lindex [split $dep :] end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $deps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc get_variants {portinfovar} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $portinfovar portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists portinfo(vinfo)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set variants {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set vinfo $portinfo(vinfo)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach v [array names vinfo] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset variant
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set variant $vinfo($v)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists variant(is_default)] || $variant(is_default) ne "+"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend variants $v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc mirror_port {portinfo_list} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global platforms deptypes tried_and_failed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set portinfo $portinfo_list
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portname $portinfo(name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set porturl $portinfo(porturl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set do_mirror 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[lsearch -exact -nocase $portinfo(license) "nomirror"] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "Not mirroring $portname due to license"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set do_mirror 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {mportopen $porturl [list subport $portname] {}} mport]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "mportopen $porturl failed: $mport"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set portinfo [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set any_failed 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # have to checksum too since the mirror target claims to succeed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # even if the checksums were wrong and the files deleted
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$do_mirror && ([mportexec $mport mirror] != 0 || [mportexec $mport checksum] != 0)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set tried_and_failed($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    mportclose $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set deps [get_dep_list portinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set variants [get_variants portinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach variant $variants {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "$portname +${variant}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportopen $porturl [list subport $portname] [list $variant +]} mport]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "mportopen $porturl failed: $mport"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set tried_and_failed($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinfo [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend deps {*}[get_dep_list portinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$do_mirror && ([mportexec $mport mirror] != 0  || [mportexec $mport checksum] != 0)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mportclose $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {os_major os_arch} $platforms {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "$portname with platform 'darwin $os_major $os_arch'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportopen $porturl [list subport $portname os_major $os_major os_arch $os_arch] {}} mport]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "mportopen $porturl failed: $mport"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set tried_and_failed($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinfo [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend deps {*}[get_dep_list portinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$do_mirror && ([mportexec $mport mirror] != 0 || [mportexec $mport checksum] != 0)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mportclose $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach dep [lsort -unique $deps] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists tried_and_failed($dep)] && ![check_mirror_done $dep]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set result [mportlookup $dep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[llength $result] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_error "No such port: $dep"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[mirror_port [lindex $result 1]] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set any_failed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$any_failed == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set_mirror_done $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $any_failed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set mirrorcache_dir /tmp/mirrorcache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[lindex $::argv 0] eq "-c"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set mirrorcache_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::argv [lrange $::argv 2 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set exitval 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach portname $::argv {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists tried_and_failed($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "skipping ${portname}, already tried and failed"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[check_mirror_done $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "skipping ${portname}, already mirrored"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set result [mportlookup $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[llength $result] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "No such port: $portname"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set exitval 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[mirror_port [lindex $result 1]] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set exitval 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+exit $exitval
</span></pre><pre style='margin:0'>

</pre>