<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[123822] contrib</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="https://trac.macports.org/changeset/123822">123822</a></dd>
<dt>Author</dt> <dd>cal@macports.org</dd>
<dt>Date</dt> <dd>2014-08-14 15:07:26 -0700 (Thu, 14 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>contrib: add port-checkmirrors, a script I wrote a while a go to check the integrity of distfiles on mirrors

I was told base could already do that using `distcheck`, but I've just written
the manpage for distcheck and read its source code – it doesn't even verify the
checksums, so this script may be helpful after all.</pre>

<h3>Added Paths</h3>
<ul>
<li>contrib/port-checkmirrors/</li>
<li><a href="#contribportcheckmirrorsportcheckmirrors">contrib/port-checkmirrors/port-checkmirrors</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="contribportcheckmirrorsportcheckmirrors"></a>
<div class="addfile"><h4>Added: contrib/port-checkmirrors/port-checkmirrors (0 => 123822)</h4>
<pre class="diff"><span>
<span class="info">--- contrib/port-checkmirrors/port-checkmirrors                                (rev 0)
+++ contrib/port-checkmirrors/port-checkmirrors        2014-08-14 22:07:26 UTC (rev 123822)
</span><span class="lines">@@ -0,0 +1,138 @@
</span><ins>+#!/usr/bin/env bash
+
+PORT=&quot;`which port`&quot;
+CURL=&quot;`which curl`&quot;
+OPENSSL=&quot;`which openssl`&quot;
+RM=&quot;`which rm` -f&quot;
+
+usage() {
+        echo &quot;Usage: $1 port-spec&quot; &gt;&amp;2
+        echo &gt;&amp;2
+        echo &quot;  port-spec can by in any format understood by port(1)&quot; &gt;&amp;2
+}
+
+handle_port() {
+        local PORT=&quot;$1&quot;
+        local line=&quot;&quot;
+        declare -A checksums
+
+        echo &quot;** $PORT&quot;
+
+        # read checksums
+        local firstrun=1
+        while read line; do
+                local regex='\[(.*)\].*'
+                if [[ $line =~ $regex ]]; then
+                        TARGETFILE=${BASH_REMATCH[1]}
+                        echo &quot;Processing file ${TARGETFILE}&quot;
+                        continue
+                fi
+
+                local regex='(md5|sha1|sha256|rmd160): ([0-9a-fA-F]+)'
+                if [[ $line =~ $regex ]]; then
+                        # this is a checksum line
+
+                        echo &quot;Found ${BASH_REMATCH[1]} checksum: ${BASH_REMATCH[2]}&quot;
+                        checksums[&quot;${BASH_REMATCH[1]}&quot;]=${BASH_REMATCH[2]}
+                        continue;
+                fi
+
+                URL=${line#  }
+                if [ -z &quot;$line&quot; ]; then
+                        continue;
+                fi
+
+                tput hpa 0
+                tput el
+                echo $URL
+
+                # try to get file
+                local CMD=&quot;pee&quot;
+                for checksum in &quot;${!checksums[@]}&quot;; do
+                        local indirect=&quot;OPENSSL_${checksum}[1]&quot;
+                        CMD=&quot;${CMD} '${OPENSSL} dgst -${checksum} /dev/stdin'&quot;
+                done
+
+                # fork check process
+                coproc CHECK { eval &quot;$CMD&quot;; }
+                # duplicate fd for check so the pipe doesn't get closed when check is over
+                eval &quot;exec 3&lt;&amp;${CHECK[0]}&quot;
+
+                # run the download and pipe output into pee
+                eval &quot;$CURL --connect-timeout 15 -L -f -# '${URL}' &gt;&amp;${CHECK[1]}&quot;
+                local status=&quot;$?&quot;
+
+                # remove curl output
+                tput cuu 1
+                tput hpa 0
+                tput el
+                
+                # close the pipe to pee
+                eval &quot;exec ${CHECK[1]}&gt;&amp;-&quot;
+
+                if [[ $status != 0 ]]; then
+                        # if it failed, ignore the checksums
+                        tput cuu 1
+                        echo -e &quot;\tfailed&quot; &gt;&amp;2
+                        continue
+                fi
+
+                # otherwise, test the checksums
+                while read -u 3 line; do
+                        local regex='(MD5|SHA1|SHA256|RIPEMD160)\(/dev/stdin\)= ([0-9a-fA-F]+)'
+                        if [[ $line =~ $regex ]]; then
+                                local openssl_index=&quot;${BASH_REMATCH[1]}&quot;
+                                local index=&quot;&quot;
+                                case &quot;${openssl_index}&quot; in
+                                        MD5)
+                                                index=&quot;md5&quot;;;
+                                        SHA1)
+                                                index=&quot;sha1&quot;;;
+                                        SHA256)
+                                                index=&quot;sha256&quot;;;
+                                        RIPEMD160)
+                                                index=&quot;rmd160&quot;;;
+                                        *)
+                                                echo &quot;Unknown hash type ${openssl_index}&quot; &gt;&amp;2
+                                                return
+                                esac
+                                local chash=&quot;${BASH_REMATCH[2]}&quot;
+
+                                if [ &quot;${chash}&quot; != &quot;${checksums[&quot;${index}&quot;]}&quot; ]; then
+                                        echo -e &quot;\tChecksum mismatch: ${index}&quot; &gt;&amp;2
+                                        echo -e &quot;\t   Portfile value: ${checksums[&quot;${index}&quot;]}&quot; &gt;&amp;2
+                                        echo -e &quot;\t      Local value: ${chash}&quot; &gt;&amp;2
+                                fi
+                        else
+                                echo &quot;Error parsing openssl output: ${line}&quot; &gt;&amp;2
+                        fi
+                done
+        done
+}
+
+if [ -z $1 ]; then
+        usage $0
+        exit 1
+fi
+
+coproc DISTFILELIST { $PORT distfiles $1; }
+eval &quot;exec 4&lt;&amp;${DISTFILELIST[0]}&quot;
+eval &quot;exec ${DISTFILELIST[1]}&gt;&amp;-&quot;
+wait $DISTFILELIST_PID
+if [[ $? != 0 ]]; then
+        echo &quot;port(1) failed, check your arguments&quot; &gt;&amp;2
+        exit 1
+fi
+
+# open list
+while read -u 4 line; do
+        if [ -z &quot;$line&quot; ]; then
+                continue;
+        fi
+        regex='---&gt;  Distfiles for (.*)'
+        if [[ $line =~ $regex ]]; then
+                PORT=${BASH_REMATCH[1]}
+                handle_port $PORT &lt;&amp;4
+        fi
+done
+
</ins><span class="cx">Property changes on: contrib/port-checkmirrors/port-checkmirrors
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
</div>

</body>
</html>