<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/30c27d5d3ad169ffa5f55465cf9663dbd1ff7537">https://github.com/macports/macports-base/commit/30c27d5d3ad169ffa5f55465cf9663dbd1ff7537</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 30c27d5  Support multi-valued maintainers
</span>30c27d5 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 30c27d5d3ad169ffa5f55465cf9663dbd1ff7537
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Sun Nov 6 18:11:49 2016 +0100

<span style='display:block; white-space:pre;color:#404040;'>    Support multi-valued maintainers
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Since our move to GitHub it is sometimes hard to find out whether a pull
</span><span style='display:block; white-space:pre;color:#404040;'>    request was sent by a maintainer or what a maintainer's Trac or GitHub
</span><span style='display:block; white-space:pre;color:#404040;'>    account is. This can be solved by allowing GitHub usernames as
</span><span style='display:block; white-space:pre;color:#404040;'>    maintainers, but puts us in the situation of not having an email address
</span><span style='display:block; white-space:pre;color:#404040;'>    on file for a maintainer.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Solve this by supporting multi-valued maintainer fields using Tcl lists,
</span><span style='display:block; white-space:pre;color:#404040;'>    so that
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>     maintainers {@github-username macports-handle example.com:localpart}
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    works and is displayed as beloging to a single person.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    While we're at it, drop the two implementations of unobscure_maintainers
</span><span style='display:block; white-space:pre;color:#404040;'>    and provide a public API in macports1.0 to be used.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Additionally, add tests that verify the behavior of
</span><span style='display:block; white-space:pre;color:#404040;'>    macports::unobscure_maintainers.
</span>---
 src/macports1.0/macports.tcl             | 13 +++++
 src/macports1.0/macports_util.tcl        | 50 +++++++++++++++++++
 src/macports1.0/tests/macports_util.test | 43 +++++++++++++++++
 src/port/port.tcl                        | 83 +++++++++++++++++++-------------
 src/port1.0/portutil.tcl                 | 26 ----------
 src/port1.0/tests/portutil.test          | 20 --------
 6 files changed, 155 insertions(+), 80 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 6aafa73..a4ce074 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5142,3 +5142,16 @@ proc macports::shellescape {arg} {
</span>     # Add a single quote at the start, escape all single quotes in the argument, and add a single quote at the end
     return "'[string map $mapping $arg]'"
 }
<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;'>+# Given a list of maintainers as recorded in a Portfile, return a list of lists
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# in [key value ...] format describing all maintainers. Valid keys are 'email'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# which denotes a maintainer's email address, 'github', which preceeds the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# GitHub username of the maintainer and 'keyword', which contains a special
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# maintainer keyword such as 'openmaintainer' or 'nomaintainer'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @param list A list of obscured maintainers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @return A list of associative arrays in serialized list format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::unobscure_maintainers {list} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports_util::unobscure_maintainers $list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports_util.tcl b/src/macports1.0/macports_util.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index f1b21f8..1ef61ec 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports_util.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports_util.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,6 +38,56 @@ namespace eval macports_util {
</span>     ###################
     # Private methods #
     ###################
<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;'>+    # Given a list of maintainers as recorded in a Portfile, return a list of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # lists in [key value ...] format describing all maintainers. Valid keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # are 'email' which denotes a maintainer's email address, 'github', which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # preceeds the GitHub username of the maintainer and 'keyword', which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # contains a special maintainer keyword such as 'openmaintainer' or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # 'nomaintainer'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @param list A list of obscured maintainers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @return A list of associative arrays in serialized list format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc unobscure_maintainers {list} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach sublist $list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array set maintainer {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach token $sublist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[string index $token 0] eq "@"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Strings starting with @ are GitHub usernames
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set maintainer(github) [string range $token 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {[string first "@" $token] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Other strings that contain @ are plain email addresses
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set maintainer(email) $token
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {[string first ":" $token] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Strings that contain a colon are obfuscated email
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # addresses
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Split at :, assign the first part to $domain, re-assemble
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # the rest and assign it to $localpart
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set localpart [join [lassign [split $token ":"] domain] ":"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set maintainer(email) "${localpart}@${domain}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {$token in {"openmaintainer" "nomaintainer"}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Filter openmaintainer and nomaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set maintainer(keyword) $token
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # All other entries must be MacPorts handles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set maintainer(email) "${token}@macports.org"
</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 serialized [array get maintainer]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array unset maintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[llength $serialized]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Filter empty maintainers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend result $serialized
</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 $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     proc method_wrap {name} {
         variable argdefault
     
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/tests/macports_util.test b/src/macports1.0/tests/macports_util.test
</span><span style='display:block; white-space:pre;color:#808080;'>index a2fe398..72dc8cd 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/tests/macports_util.test
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/tests/macports_util.test
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,6 +30,49 @@ test method_wrap {
</span> } -result "Method wrap successful."
 
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_github {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with a GitHub handle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {@github-user}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{github github-user}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_email {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with unobfuscated email addresses
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {localpart@example.com}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{email localpart@example.com}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_obfuscated_email {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with obfuscated email addresses
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {example.com:localpart}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{email localpart@example.com}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_handle {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with MacPorts handles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {handle}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{email handle@macports.org}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_keywords {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with nomaintainer and openmaintainer keywords
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {nomaintainer openmaintainer}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{keyword nomaintainer} {keyword openmaintainer}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_multiple {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with multiple maintainers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {@github-user example.com:localpart}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{github github-user} {email localpart@example.com}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test unobscure_maintainers_multivalue {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    Test macports::unobscure_maintainers with multi-value maintainers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -body {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [macports::unobscure_maintainers {{handle @github-user}}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} -result {{email handle@macports.org github github-user}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> test ldindex {
     Ldindex unit test.
 } -body {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/port.tcl b/src/port/port.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 6b5a2ea..5312e5a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -629,22 +629,6 @@ proc wraplabel {label string maxlen {indent ""}} {
</span>     return "$label[wrap $string $maxlen $indent 0]"
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc unobscure_maintainers { list } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set result {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach m $list {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[string first "@" $m] < 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[string first ":" $m] >= 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set m [regsub -- "(.*):(.*)" $m "\\2@\\1"]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$m ne "openmaintainer" && $m ne "nomaintainer"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set m "$m@macports.org"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend result $m
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> ##########################################
 # Port selection
 ##########################################
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2000,21 +1984,21 @@ proc action_info { action portlist opts } {
</span>         # Understand which info items are actually lists
         # (this could be overloaded to provide a generic formatting code to
         # allow us to, say, split off the prefix on libs)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set list_map "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            categories      1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_fetch   1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_extract 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_build   1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_lib     1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_run     1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            depends_test    1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            maintainers     1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            platforms       1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            variants        1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            conflicts       1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            subports        1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            patchfiles      1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set list_map {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            categories      ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_fetch   ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_extract ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_build   ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_lib     ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_run     ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            depends_test    ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            maintainers     "\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            platforms       ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            variants        ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            conflicts       ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            subports        ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            patchfiles      ", "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span> 
         # Label map for pretty printing
         array set pretty_label {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2155,7 +2139,7 @@ proc action_info { action portlist opts } {
</span>                 if {![info exists portinfo($ropt)]} {
                     set inf ""
                 } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set inf [join $portinfo($ropt)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set inf $portinfo($ropt)
</span>                 }
             }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2171,9 +2155,40 @@ proc action_info { action portlist opts } {
</span>                 set label "$opt: "
             }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$ropt in {"description" "long_description"}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # These fields support newlines, we need to [join ...] to make
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # them newlines
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set inf [join $inf]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>             # Format the data
             if { $ropt eq "maintainers" } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set inf [unobscure_maintainers $inf]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set infresult {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach serialized [macports::unobscure_maintainers $inf] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set parts {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    array set maintainer $serialized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[info exists maintainer(email)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend parts "Email: $maintainer(email)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[info exists maintainer(github)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend parts "GitHub: $maintainer(github)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[info exists maintainer(keyword)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        switch $maintainer(keyword) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            nomaintainer {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                lappend parts "none"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            openmaintainer {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                lappend parts "Policy: openmaintainer"
</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;'>+                    array unset maintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend infresult [join $parts ", "]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set inf $infresult
</span>             }
             #     ... special formatting for certain fields when prettyprinting
             if {$pretty_print} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2217,7 +2232,7 @@ proc action_info { action portlist opts } {
</span>             }
             #End of special pretty-print formatting for certain fields
             if {[info exists list_map($ropt)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set field [join $inf $subfield_sep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set field [join $inf $list_map($ropt)]
</span>             } else {
                 set field $inf
             }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index c3e364a..74dff1b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1308,32 +1308,6 @@ proc lipo {} {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# unobscure maintainer addresses as used in Portfiles
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# We allow two obscured forms:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#   (1) User name only with no domain:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#           foo implies foo@macports.org
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#   (2) Mangled name:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#           subdomain.tld:username implies username@subdomain.tld
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc unobscure_maintainers { list } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set result {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach m $list {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[string first "@" $m] < 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[string first ":" $m] >= 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set m [regsub -- "(.*):(.*)" $m "\\2@\\1"]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set m "$m@macports.org"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend result $m
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> ########### Internal Dependency Manipulation Procedures ###########
 global ports_dry_last_skipped
 set ports_dry_last_skipped ""
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/tests/portutil.test b/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;color:#808080;'>index dd4cc4e..fe82531 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -470,26 +470,6 @@ test makeuserproc {
</span> # test lipo -
 
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-test unobscure_maintainers {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Unobscure maintainers unit test.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-} -body {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set list { port }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { [unobscure_maintainers $list] != "port@macports.org" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "FAIL: invalid maintainer name"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set list { google.com:port }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { [unobscure_maintainers $list] != "port@google.com" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "FAIL: invalid maintainer name"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set list { port@google.com }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { [unobscure_maintainers $list] != "port@google.com" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "FAIL: invalid maintainer name"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return "unobscure_maintainers successful."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-} -result "unobscure_maintainers successful."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # test target_run
 # test recursive_collect_deps
 
</pre><pre style='margin:0'>

</pre>