<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>