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

</pre>
<p><a href="https://github.com/macports/macports-infrastructure/commit/f33ef74e66534471b1e906c9eec32660d43bdc64">https://github.com/macports/macports-infrastructure/commit/f33ef74e66534471b1e906c9eec32660d43bdc64</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 f33ef74  Add script to delete old distfiles
</span>f33ef74 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit f33ef74e66534471b1e906c9eec32660d43bdc64
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Jun 21 07:42:51 2018 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Add script to delete old distfiles
</span>---
 jobs/delete_old_distfiles.tcl | 159 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 159 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/jobs/delete_old_distfiles.tcl b/jobs/delete_old_distfiles.tcl
</span>new file mode 100755
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..d9c710e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/jobs/delete_old_distfiles.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,159 @@
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Find all distfiles that exist under distfiles_root and are not needed by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# the current version of any port or by a version existing as a package
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# under packages_root.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[llength $argv] == 4 && [lindex $argv 0] eq "-k"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set keepfile [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;'>+if {[llength $argv] != 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "Usage: $argv0 [-k keepfile] distfiles_root packages_root"
</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;'>+set distfiles_root [lindex $argv 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set packages_root [lindex $argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set archive_type tbz2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[info exists env(TMPDIR)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set tmpdir $env(TMPDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set tmpdir /tmp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set workdir [file normalize [pwd]]
</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;'>+package require macports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+mportinit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set platforms [list 8 powerpc 8 i386 9 powerpc 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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[catch {set res [mportlistall]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts stderr "$::errorInfo"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    error "listing all ports failed: $result"
</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 add_distfiles {porturl subport distfiles_var} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global platforms
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $distfiles_var portname_distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {mportopen $porturl [list subport $subport] {}} 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;'>+        error "couldn't open portfile for $subport"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set workername [ditem_key $mport workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![catch {$workername eval {portfetch::fetch_init; return $all_dist_files}} all_dist_files]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # has distfiles, add them to the list
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend portname_distfiles {*}$all_dist_files
</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;'>+    array set portinfo [mportinfo $mport]
</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 variants [get_variants portinfo]
</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 "$subport +${variant}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportopen $porturl [list subport $subport] [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;'>+            # unfortunately quite a few ports have variants that fail
</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;'>+        set workername [ditem_key $mport workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![catch {$workername eval {portfetch::fetch_init; return $all_dist_files}} all_dist_files]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend portname_distfiles {*}$all_dist_files
</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 "$subport with platform 'darwin $os_major $os_arch'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportopen $porturl [list subport $subport 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;'>+            # sometimes whole subports are not defined on certain platforms
</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;'>+        set workername [ditem_key $mport workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![catch {$workername eval {portfetch::fetch_init; return $all_dist_files}} all_dist_files]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend portname_distfiles {*}$all_dist_files
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set distfiles_to_keep {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[info exists keepfile]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set fd [open $keepfile r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while {[gets $fd line] != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend distfiles_to_keep $line
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    close $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # generate list of desired distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portfile_dir [file join ${tmpdir} from_archive]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file delete -force ${portfile_dir}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file mkdir ${portfile_dir}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {portname info_list} $result {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portname_distfiles {}
</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 $info_list
</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;'>+            # shouldn't be mirrored, so don't keep it if it is somehow there
</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;'>+        add_distfiles $portinfo(porturl) $portname portname_distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach archive [glob -nocomplain -directory $packages_root ${portname}/*.${archive_type}] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            exec -ignorestderr tar -xjq -C ${portfile_dir} -f $archive +PORTFILE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file rename -force ${portfile_dir}/+PORTFILE ${portfile_dir}/Portfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            add_distfiles file://${portfile_dir} $portname portname_distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # deduplicate as we go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend distfiles_to_keep {*}[lsort -unique $portname_distfiles]
</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 distfiles_to_keep [lsort -unique $distfiles_to_keep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set fd [open [file join $workdir distfiles_keep.txt] w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $fd [join $distfiles_to_keep \n]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    close $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file delete -force ${portfile_dir}
</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;'>+# scan actual distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# What we have in $distfiles_to_keep is filenames only, i.e. $dist_subdir is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# not taken into account. This is a lot simpler to deal with, even if it means
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# we may keep a few files that could be deleted if there are identically named
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# files in different subdirs. This may even be preferable with stealth updates
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# since we don't know which version the archives were built from.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set dirlist [list $distfiles_root]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set fd [open [file join $workdir distfiles_delete.txt] w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+while {$dirlist ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dir [lindex $dirlist 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dirlist [lreplace $dirlist 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [glob -nocomplain -directory $dir *] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[file isfile $f] && [lsearch -exact -sorted $distfiles_to_keep [file tail $f]] == -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $fd $f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[file isdirectory $f]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend dirlist $f
</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;'>+close $fd
</span></pre><pre style='margin:0'>

</pre>