* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 18:40 ` Linus Torvalds
@ 2007-08-14 18:54 ` Joe Perches
2007-08-14 19:33 ` Al Viro
` (3 subsequent siblings)
4 siblings, 0 replies; 38+ messages in thread
From: Joe Perches @ 2007-08-14 18:54 UTC (permalink / raw)
To: Linus Torvalds
Cc: Rene Herman, git, Junio C Hamano, Alan Cox, Arjan van de Ven,
Trond Myklebust, Mariusz Kozlowski, akpm, linux-kernel
On Tue, 2007-08-14 at 11:40 -0700, Linus Torvalds wrote:
> Anyway - the script can certainly be tweaked, the point is
> really just that the git tree _already_ contains the relevant
> information).
I believe it's not specific enough.
Things like email lists would never show up.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 18:40 ` Linus Torvalds
2007-08-14 18:54 ` Joe Perches
@ 2007-08-14 19:33 ` Al Viro
2007-08-14 19:57 ` Joe Perches
` (2 more replies)
2007-08-15 1:35 ` Richard Knutsson
` (2 subsequent siblings)
4 siblings, 3 replies; 38+ messages in thread
From: Al Viro @ 2007-08-14 19:33 UTC (permalink / raw)
To: Linus Torvalds
Cc: Joe Perches, Rene Herman, git, Junio C Hamano, Alan Cox,
Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski, akpm,
linux-kernel
On Tue, Aug 14, 2007 at 11:40:09AM -0700, Linus Torvalds wrote:
> A much *better* picture than some manually maintained thing, in fact,
> because it tells you who really does the work, and which way patches go...
>
> (Maybe you want to add a
>
> grep -v '\(Linus Torvalds\)\|\(Andrew Morton\)'
>
> to avoid seeing the normal chain too much, but hey, we probably want to
> know too. Anyway - the script can certainly be tweaked, the point is
> really just that the git tree _already_ contains the relevant
> information).
FWIW, I suspect that we are looking at that from the wrong POV. If
that's about "who ought to be Cc'd on the issues dealing with <list
of pathnames>", why does it have to be tied to "who is maintainer for
<pathname>"?
I'm not suggesting something like fs.ext2@kernel.org with something
like majordomo allowing to add yourself to those, but something less
extreme in that direction might be worth thinking about... Hell,
even simple
$ finger fs/minix/dir.c@cc.kernel.org
with majordomo-like interface for adding yourself to such lists
might solve most of those problems...
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 19:33 ` Al Viro
@ 2007-08-14 19:57 ` Joe Perches
2007-08-15 1:19 ` Rene Herman
2007-08-15 19:37 ` Krzysztof Halasa
2 siblings, 0 replies; 38+ messages in thread
From: Joe Perches @ 2007-08-14 19:57 UTC (permalink / raw)
To: Al Viro
Cc: Linus Torvalds, Rene Herman, git, Junio C Hamano, Alan Cox,
Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski, akpm,
linux-kernel
On Tue, 2007-08-14 at 20:33 +0100, Al Viro wrote:
> FWIW, I suspect that we are looking at that from the wrong POV. If
> that's about "who ought to be Cc'd on the issues dealing with <list
> of pathnames>", why does it have to be tied to "who is maintainer for
> <pathname>"?
Right, it doesn't have to.
I think a notification list would be just fine.
> I'm not suggesting something like fs.ext2@kernel.org with something
> like majordomo allowing to add yourself to those, but something less
> extreme in that direction might be worth thinking about...
> Hell, even simple
> $ finger fs/minix/dir.c@cc.kernel.org
> with majordomo-like interface for adding yourself to such lists
> might solve most of those problems...
Might solve all of my wants for this problem.
cheers, Joe
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 19:33 ` Al Viro
2007-08-14 19:57 ` Joe Perches
@ 2007-08-15 1:19 ` Rene Herman
2007-08-15 13:33 ` Satyam Sharma
2007-08-15 19:37 ` Krzysztof Halasa
2 siblings, 1 reply; 38+ messages in thread
From: Rene Herman @ 2007-08-15 1:19 UTC (permalink / raw)
To: Al Viro
Cc: Linus Torvalds, Joe Perches, git, Junio C Hamano, Alan Cox,
Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski, akpm,
linux-kernel
On 08/14/2007 09:33 PM, Al Viro wrote:
> FWIW, I suspect that we are looking at that from the wrong POV. If
> that's about "who ought to be Cc'd on the issues dealing with <list
> of pathnames>", why does it have to be tied to "who is maintainer for
> <pathname>"?
>
> I'm not suggesting something like fs.ext2@kernel.org with something
> like majordomo allowing to add yourself to those, but something less
> extreme in that direction might be worth thinking about... Hell,
> even simple
> $ finger fs/minix/dir.c@cc.kernel.org
> with majordomo-like interface for adding yourself to such lists
> might solve most of those problems...
It mostly is just about that it seems. However, this would not also allow
the other information currently in the MAINTAINERS file to be queried in
similar ways.
Git could grow a generic file meta data implementation through the use of
tags, sort of like tags on multimedia files although while with multimedia
files the tags are in fact stored as a file header, here you'd keep them
just in git. Any project using git would be free to define its own set of
info tags and you'd supply them to git simply as a list of
<tag>=<value>
pairs:
$ git info --add drivers/ide/ide-cd.c <<EOF
CC="Alan Cox <alan@lxorguk.ukuu.org.uk>", linux-ide@vger.kernel.org
EOF
Or as a more expansive example, with the tags set on a directory (and the
output shown this time):
$ git info drivers/infiniband/
CC="Roland Dreier <rolandd@cisco.com>"
CC="Sean Hefty <mshefty@ichips.intel.com>"
CC="Hal Rosenstock <halr@voltaire.com>"
CC=openib-general@openib.org
W=http://www.openib.org/
T=git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
$ git info --type="W" drivers/infiniband/
http://www.openib.org/
The project can link the actual tags such as CC, W and T to --options for
the "info" command in the git configuration file for the tree (and/or just
define a few upfront I guess) making it look nicer:
$ git info --cc drivers/infiniband/
"Roland Dreier <rolandd@cisco.com>"
"Sean Hefty <mshefty@ichips.intel.com>"
"Hal Rosenstock <halr@voltaire.com>"
openib-general@openib.org
$ git info --website drivers/infiniband/
http://www.openib.org/
$ git info --tree drivers/infiniband/
git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
Extra: when you have such an implementation, you can use it for other
purposes as well such as the summary Documentation/ files want for the
00-INDEX files:
$ git info --summary Documentation/BUG-HUNTING
brute force method of doing binary search of patches to find bug.
And importantly -- when queuried for a file that itself doesn't have the
requested info tag:
$ git info --cc drivers/infiniband/core/addr.c
git looks for the tag on the drivers/infiniband/core/ directory next, and
then on drivers/infiniband/, where it finds it. linux-kernel@vger.kernel.org
would be the final fallback, being set on the project root.
I'd really like something like this. As long as projects are both free to
use and not use them and free to define their own set of tags I believe this
would work very nicely.
Once you have these tags, you can basically use them for anything.
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 1:19 ` Rene Herman
@ 2007-08-15 13:33 ` Satyam Sharma
2007-08-15 13:39 ` Rene Herman
0 siblings, 1 reply; 38+ messages in thread
From: Satyam Sharma @ 2007-08-15 13:33 UTC (permalink / raw)
To: Rene Herman
Cc: Al Viro, Linus Torvalds, Joe Perches, git, Junio C Hamano,
Alan Cox, Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski,
Andrew Morton, Linux Kernel Mailing List
Hi Rene,
On Wed, 15 Aug 2007, Rene Herman wrote:
> It mostly is just about that it seems. However, this would not also allow the
> other information currently in the MAINTAINERS file to be queried in similar
> ways.
>
> Git could grow a generic file meta data implementation through the use of
> tags, sort of like tags on multimedia files although while with multimedia
> files the tags are in fact stored as a file header, here you'd keep them just
> in git. Any project using git would be free to define its own set of info tags
> and you'd supply them to git simply as a list of
>
> <tag>=<value>
>
> pairs:
>
> $ git info --add drivers/ide/ide-cd.c <<EOF
> CC="Alan Cox <alan@lxorguk.ukuu.org.uk>", linux-ide@vger.kernel.org
> EOF
>
> Or as a more expansive example, with the tags set on a directory (and the
> output shown this time):
>
> $ git info drivers/infiniband/
> CC="Roland Dreier <rolandd@cisco.com>"
> CC="Sean Hefty <mshefty@ichips.intel.com>"
> CC="Hal Rosenstock <halr@voltaire.com>"
> CC=openib-general@openib.org
Considering some people may want to differentiate between "those who want
to be Cc'ed for patches on subsystem X" and "those who are maintainer(s)
of subsystem X", I think another "P=" kind of tag might also be useful
here.
> W=http://www.openib.org/
> T=git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
>
> $ git info --type="W" drivers/infiniband/
> http://www.openib.org/
>
> The project can link the actual tags such as CC, W and T to --options for the
> "info" command in the git configuration file for the tree (and/or just define
> a few upfront I guess) making it look nicer:
>
> $ git info --cc drivers/infiniband/
> "Roland Dreier <rolandd@cisco.com>"
> "Sean Hefty <mshefty@ichips.intel.com>"
> "Hal Rosenstock <halr@voltaire.com>"
> openib-general@openib.org
>
> $ git info --website drivers/infiniband/
> http://www.openib.org/
>
> $ git info --tree drivers/infiniband/
> git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
>
> Extra: when you have such an implementation, you can use it for other purposes
> as well such as the summary Documentation/ files want for the 00-INDEX files:
>
> $ git info --summary Documentation/BUG-HUNTING
> brute force method of doing binary search of patches to find bug.
>
> And importantly -- when queuried for a file that itself doesn't have the
> requested info tag:
>
> $ git info --cc drivers/infiniband/core/addr.c
>
> git looks for the tag on the drivers/infiniband/core/ directory next, and then
> on drivers/infiniband/, where it finds it. linux-kernel@vger.kernel.org would
> be the final fallback, being set on the project root.
>
> I'd really like something like this. As long as projects are both free to use
> and not use them and free to define their own set of tags I believe this would
> work very nicely.
>
> Once you have these tags, you can basically use them for anything.
I'd really _love_ a tool that does all that what you've proposed above!
But why does it have to be "git-info" or anything in the git(7) suite for
that matter? This sounds like a job for a different specialised tool,
along with ".metatags" kind of files dispersed in the source tree.
Satyam
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 13:33 ` Satyam Sharma
@ 2007-08-15 13:39 ` Rene Herman
2007-08-15 13:52 ` Kyle Moffett
0 siblings, 1 reply; 38+ messages in thread
From: Rene Herman @ 2007-08-15 13:39 UTC (permalink / raw)
To: Satyam Sharma
Cc: Al Viro, Linus Torvalds, Joe Perches, git, Junio C Hamano,
Alan Cox, Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski,
Andrew Morton, Linux Kernel Mailing List
On 08/15/2007 03:33 PM, Satyam Sharma wrote:
[ git info --maintainer ]
> I'd really _love_ a tool that does all that what you've proposed above!
>
> But why does it have to be "git-info" or anything in the git(7) suite for
> that matter? This sounds like a job for a different specialised tool,
> along with ".metatags" kind of files dispersed in the source tree.
To automatically move (and delete) the meta-data alongside the files
themselves is a reason.
More generally -- shouldn't it? This is about source management (well, maybe
more about project management, but...) and the source code management tool
looks to be the right place for that. The different parts of git are
somewhat/fairly stand-alone as is, no?
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 13:39 ` Rene Herman
@ 2007-08-15 13:52 ` Kyle Moffett
2007-08-16 10:58 ` Rene Herman
0 siblings, 1 reply; 38+ messages in thread
From: Kyle Moffett @ 2007-08-15 13:52 UTC (permalink / raw)
To: Rene Herman
Cc: Satyam Sharma, Al Viro, Linus Torvalds, Joe Perches, git,
Junio C Hamano, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On Aug 15, 2007, at 09:39:44, Rene Herman wrote:
> On 08/15/2007 03:33 PM, Satyam Sharma wrote:
>
> [ git info --maintainer ]
>
>> I'd really _love_ a tool that does all that what you've proposed
>> above! But why does it have to be "git-info" or anything in the
>> git(7) suite for that matter? This sounds like a job for a
>> different specialised tool, long with ".metatags" kind of files
>> dispersed in the source tree.
>
> To automatically move (and delete) the meta-data alongside the
> files themselves is a reason.
>
> More generally -- shouldn't it? This is about source management
> (well, maybe more about project management, but...) and the source
> code management tool looks to be the right place for that. The
> different parts of git are somewhat/fairly stand-alone as is, no?
If you were going to do that I'd just suggest making git aware of the
"user.*" extended attributes and having it save those into the git
repo along with the permission data.
Cheers,
Kyle Moffett
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 13:52 ` Kyle Moffett
@ 2007-08-16 10:58 ` Rene Herman
2007-08-16 11:08 ` Rene Herman
` (2 more replies)
0 siblings, 3 replies; 38+ messages in thread
From: Rene Herman @ 2007-08-16 10:58 UTC (permalink / raw)
To: Kyle Moffett
Cc: Satyam Sharma, Al Viro, Linus Torvalds, Joe Perches, git,
Junio C Hamano, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On 08/15/2007 03:52 PM, Kyle Moffett wrote:
> On Aug 15, 2007, at 09:39:44, Rene Herman wrote:
>> On 08/15/2007 03:33 PM, Satyam Sharma wrote:
>>
>> [ git info --maintainer ]
>>
>>> I'd really _love_ a tool that does all that what you've proposed
>>> above! But why does it have to be "git-info" or anything in the
>>> git(7) suite for that matter? This sounds like a job for a different
>>> specialised tool, long with ".metatags" kind of files dispersed in
>>> the source tree.
>>
>> To automatically move (and delete) the meta-data alongside the files
>> themselves is a reason.
>>
>> More generally -- shouldn't it? This is about source management (well,
>> maybe more about project management, but...) and the source code
>> management tool looks to be the right place for that. The different
>> parts of git are somewhat/fairly stand-alone as is, no?
>
> If you were going to do that I'd just suggest making git aware of the
> "user.*" extended attributes and having it save those into the git repo
> along with the permission data.
Am looking at it but am not so sure that's a very good idea. I guess it'd be
largely okay-ish to require the repo to be on a filesystem that supports EAs
for this feature to work, but keeping the attributes intact over file system
operations seems not all that easy (yet). Having not used EAs before I may
be missing something but my version of "cp" for example (GNU coreutils 6.9)
appears to not copy them. Nor do they seem to survive a trip through GNU tar
1.16.1. EAs appear to not be very useful unless every single tool supports
them -- a repo should be resistant against simple operations like that.
Googling around, I see subversion already has this and calls the meta-data
"properties" (svn propset/get and friends). It uses a few properties itself,
such as the svn:executable property (which I saw is also the only permission
bit git keeps) and svn:ignore, which serves the same role as the .gitignore
files for git. Both those would fit into this scheme nicely for git as well,
if git were to do something similar and reserve for example the "git.*"
namespace for internal use.
Junio (and others), do you have an opinion on this? If these properties are
versioned themselves such as in svn I believe it's a decidedly non-trivial
addition (and I'm a complete git newbie) but to me, they look incredibly
useful, both for the original "maintainers" properties (and anyone else one
would want to come up with such as summary properties and author/license
stuff) and even for git internal reasons such as sketched above.
The git-blame thing as sketched before by Linus would never be able to point
out mailing lists, or general lists of "interested parties" for example, but
these properties can do anything...
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-16 10:58 ` Rene Herman
@ 2007-08-16 11:08 ` Rene Herman
2007-08-16 11:26 ` Salikh Zakirov
2007-08-16 15:40 ` Al Viro
2007-08-16 19:00 ` Junio C Hamano
2 siblings, 1 reply; 38+ messages in thread
From: Rene Herman @ 2007-08-16 11:08 UTC (permalink / raw)
To: Kyle Moffett
Cc: Satyam Sharma, Al Viro, Linus Torvalds, Joe Perches, git,
Junio C Hamano, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On 08/16/2007 12:58 PM, Rene Herman wrote:
> On 08/15/2007 03:52 PM, Kyle Moffett wrote:
>> If you were going to do that I'd just suggest making git aware of the
>> "user.*" extended attributes and having it save those into the git
>> repo along with the permission data.
>
> Am looking at it but am not so sure that's a very good idea. I guess
> it'd be largely okay-ish to require the repo to be on a filesystem that
> supports EAs for this feature to work, but keeping the attributes intact
> over file system operations seems not all that easy (yet). Having not
> used EAs before I may be missing something but my version of "cp" for
> example (GNU coreutils 6.9) appears to not copy them. Nor do they seem
> to survive a trip through GNU tar 1.16.1. EAs appear to not be very
> useful unless every single tool supports them -- a repo should be
> resistant against simple operations like that.
>
> Googling around, I see subversion already has this and calls the
> meta-data "properties" (svn propset/get and friends). It uses a few
> properties itself, such as the svn:executable property (which I saw is
> also the only permission bit git keeps) and svn:ignore, which serves the
> same role as the .gitignore files for git. Both those would fit into
> this scheme nicely for git as well, if git were to do something similar
> and reserve for example the "git.*" namespace for internal use.
>
> Junio (and others), do you have an opinion on this? If these properties
> are versioned themselves such as in svn I believe it's a decidedly
> non-trivial addition (and I'm a complete git newbie) but to me, they
> look incredibly useful, both for the original "maintainers" properties
> (and anyone else one would want to come up with such as summary
> properties and author/license stuff) and even for git internal reasons
> such as sketched above.
>
> The git-blame thing as sketched before by Linus would never be able to
> point out mailing lists, or general lists of "interested parties" for
> example, but these properties can do anything...
The svn implemention is that a single property is free-form text. As such, I
guess a property would be just another file, although one that only lives in
the index and is linked from the file/directory it is a property of.
Perhaps that immediately suggests an implementation to someone already
familiar with git internals?
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-16 10:58 ` Rene Herman
2007-08-16 11:08 ` Rene Herman
@ 2007-08-16 15:40 ` Al Viro
2007-08-16 15:53 ` Rene Herman
2007-08-16 19:00 ` Junio C Hamano
2 siblings, 1 reply; 38+ messages in thread
From: Al Viro @ 2007-08-16 15:40 UTC (permalink / raw)
To: Rene Herman
Cc: Kyle Moffett, Satyam Sharma, Linus Torvalds, Joe Perches, git,
Junio C Hamano, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On Thu, Aug 16, 2007 at 12:58:19PM +0200, Rene Herman wrote:
> Googling around, I see subversion already has this and calls the meta-data
> "properties" (svn propset/get and friends). It uses a few properties
> itself, such as the svn:executable property (which I saw is also the only
> permission bit git keeps) and svn:ignore, which serves the same role as the
> .gitignore files for git. Both those would fit into this scheme nicely for
> git as well, if git were to do something similar and reserve for example
> the "git.*" namespace for internal use.
"svn does it" is usually an indication of a bad idea, but anyway - it's
fundamentally wrong in this case, simply because "$FOO is interested
in $BAR" is a property of $FOO, not of $BAR.
> The git-blame thing as sketched before by Linus would never be able to
> point out mailing lists, or general lists of "interested parties" for
> example, but these properties can do anything...
No, they can not. "I'm interested in drivers/foo/bar.c fixes" is not
an earth-shattering event and it sure as hell does not create a new revision
of the tree.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-16 15:40 ` Al Viro
@ 2007-08-16 15:53 ` Rene Herman
0 siblings, 0 replies; 38+ messages in thread
From: Rene Herman @ 2007-08-16 15:53 UTC (permalink / raw)
To: Al Viro
Cc: Kyle Moffett, Satyam Sharma, Linus Torvalds, Joe Perches, git,
Junio C Hamano, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On 08/16/2007 05:40 PM, Al Viro wrote:
> On Thu, Aug 16, 2007 at 12:58:19PM +0200, Rene Herman wrote:
>> The git-blame thing as sketched before by Linus would never be able to
>> point out mailing lists, or general lists of "interested parties" for
>> example, but these properties can do anything...
>
> No, they can not. "I'm interested in drivers/foo/bar.c fixes" is not
> an earth-shattering event and it sure as hell does not create a new revision
> of the tree.
That's true. Okay, it can't do those general lists of interested parties.
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-16 10:58 ` Rene Herman
2007-08-16 11:08 ` Rene Herman
2007-08-16 15:40 ` Al Viro
@ 2007-08-16 19:00 ` Junio C Hamano
2007-08-17 4:24 ` Rene Herman
2 siblings, 1 reply; 38+ messages in thread
From: Junio C Hamano @ 2007-08-16 19:00 UTC (permalink / raw)
To: Rene Herman
Cc: Kyle Moffett, Satyam Sharma, Al Viro, Linus Torvalds, Joe Perches,
git, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
Rene Herman <rene.herman@gmail.com> writes:
> Am looking at it but am not so sure that's a very good idea. I guess
> it'd be largely okay-ish to require the repo to be on a filesystem
> that supports EAs for this feature to work, but keeping the attributes
> intact over file system operations seems not all that easy
> (yet). Having not used EAs before I may be missing something but my
> version of "cp" for example (GNU coreutils 6.9) appears to not copy
> them. Nor do they seem to survive a trip through GNU tar 1.16.1. EAs
> appear to not be very useful unless every single tool supports them --
> a repo should be resistant against simple operations like that.
>
> Googling around, I see subversion already has this and calls the
> meta-data "properties" (svn propset/get and friends). It uses a few
> properties itself, such as the svn:executable property (which I saw is
> also the only permission bit git keeps) and svn:ignore, which serves
> the same role as the .gitignore files for git. Both those would fit
> into this scheme nicely for git as well, if git were to do something
> similar and reserve for example the "git.*" namespace for internal use.
>
> Junio (and others), do you have an opinion on this?
Please step back a bit and imagine a world in which there was no
git. IOW, you kernel folks switched to tarballs and patches 20
months ago. It is a far superiour solution compared to CVS and
SVN, so it ought to work, right ;-)?
Now, would you implement the "whom would I send my patches to"
with EAs?
I would hope not.
Git or no git, I think a file that can be viewed with less,
edited with regular editor and processed with sed/perl/grep
tools is the way to go. I do not think adding 600+ patches to
the single MAINTAINERS list is workable in the longer term, as
it would become the single file many subsystem people need to
update and is asking for merge conflicts, but I think a file
with known name (say, "CcMe.txt") sprinkled in relevant
subdirectories, perhaps with the same format originally
suggested for MAINTAINERS, would make a lot more sense.
That would give people who work with tarballs and patches, or a
subsystem managed with something other than git (one of the most
important one is quilt), the equal access to the necessary data.
Even with git, it is my understanding that kernel community
works largely on patches exchanged over e-mails, between people
who do use git and people who do not. You would want to have
something you can easily transfer over e-mail in the patch
form.
We _could_ invent a new "patches to properties" git diff output
format that "git apply" can understand to propagate that
information, but that approach is making it less interoperable
with others, and you need to demonstrate the benefit far
outweighs that. I do not see it for this particular
application.
There may be places for "properties" that would be useful to
git, but I do not think the "find whom to send patches to" is
one of them.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-16 19:00 ` Junio C Hamano
@ 2007-08-17 4:24 ` Rene Herman
0 siblings, 0 replies; 38+ messages in thread
From: Rene Herman @ 2007-08-17 4:24 UTC (permalink / raw)
To: Junio C Hamano
Cc: Kyle Moffett, Satyam Sharma, Al Viro, Linus Torvalds, Joe Perches,
git, Alan Cox, Arjan van de Ven, Trond Myklebust,
Mariusz Kozlowski, Andrew Morton, Linux Kernel Mailing List
On 08/16/2007 09:00 PM, Junio C Hamano wrote:
> Git or no git, I think a file that can be viewed with less,
> edited with regular editor and processed with sed/perl/grep
> tools is the way to go. I do not think adding 600+ patches to
> the single MAINTAINERS list is workable in the longer term, as
> it would become the single file many subsystem people need to
> update and is asking for merge conflicts, but I think a file
> with known name (say, "CcMe.txt") sprinkled in relevant
> subdirectories, perhaps with the same format originally
> suggested for MAINTAINERS, would make a lot more sense.
>
> That would give people who work with tarballs and patches, or a
> subsystem managed with something other than git (one of the most
> important one is quilt), the equal access to the necessary data.
That is ofcourse an argument but I believe a bit of a non-argument at the
same time in practice.
There's really not much point in pretending that non-git users are still
first class citizens anyway; Linus' own suggestion of using git-blame would
tie things to git as well, as do for example frequent requests to bisect a
problem. I moreover feel there's absolutely nothing wrong with that, given
that there's nothing wrong with git.
It's the kernel's source code management tool, is included out of the box in
most distributions nowadays and is GPLd meaning that the tool (itself) won't
keep anyone from exporting data from it and importing it into something else
if someone cares to. Also, I never managed to stay un-annoyed at source code
management tools long enough to understand why I wanted to use them but have
been using git for months now so as far as I am concerned, it appears to
even be a good tool.
But, well, anyways, I did look at a git repo a bit but will unfortunately
not be able to follow up the proposal with actual (good) code in a sensible
timeframe, let alone "quickly", which means I was hoping others would agree.
I believe these properties make for an elegant setup with many possible uses
including the maintainers information, but if you disagree I guess I'm going
to shelve it...
> Even with git, it is my understanding that kernel community
> works largely on patches exchanged over e-mails, between people
> who do use git and people who do not. You would want to have
> something you can easily transfer over e-mail in the patch
> form.
>
> We _could_ invent a new "patches to properties" git diff output
> format that "git apply" can understand to propagate that
> information
Yes, not unlike the current git move "meta-diffs" ...
> but that approach is making it less interoperable with others, and you
> need to demonstrate the benefit far outweighs that. I do not see it for
> this particular application.
>
> There may be places for "properties" that would be useful to git, but I
> do not think the "find whom to send patches to" is one of them.
The important reason for wiring this into git directly would be keeping the
meta-data in sync with the data it refers to in an automated fashion. With
manual intervention, there's much more opportunity for things to grow stale.
In practice, it may not be a huge problem. It certainly is with the current
MAINTAINERS file but if one does finer-grained data around the tree, that
will probably help.
It's also not a now or never thing fortunately. If git does ever grow these
properties, the issue can be revisited, perhaps at that time both with the
experience of what the finer-grained in-tree solution did not solve and even
fewer people around that care about not making git even more of an intrinsic
part of development.
Rene.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 19:33 ` Al Viro
2007-08-14 19:57 ` Joe Perches
2007-08-15 1:19 ` Rene Herman
@ 2007-08-15 19:37 ` Krzysztof Halasa
2007-08-15 23:19 ` Al Viro
2 siblings, 1 reply; 38+ messages in thread
From: Krzysztof Halasa @ 2007-08-15 19:37 UTC (permalink / raw)
To: Al Viro
Cc: Linus Torvalds, Joe Perches, Rene Herman, git, Junio C Hamano,
Alan Cox, Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski,
akpm, linux-kernel
Al Viro <viro@ftp.linux.org.uk> writes:
> I'm not suggesting something like fs.ext2@kernel.org with something
> like majordomo allowing to add yourself to those,
Why not
> but something less
> extreme in that direction might be worth thinking about... Hell,
> even simple
> $ finger fs/minix/dir.c@cc.kernel.org
> with majordomo-like interface for adding yourself to such lists
> might solve most of those problems...
I think so.
And you would be able to add yourself even if you're merely
interested in something, not a maintainer.
However I think the mailing lists could do better. Duplicate
suppression, among other things.
And they could eventually supersede the subsystem mailing lists
we use today. Just use net@kernel.org or drivers.net@kernel.org.
--
Krzysztof Halasa
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 19:37 ` Krzysztof Halasa
@ 2007-08-15 23:19 ` Al Viro
0 siblings, 0 replies; 38+ messages in thread
From: Al Viro @ 2007-08-15 23:19 UTC (permalink / raw)
To: Krzysztof Halasa
Cc: Linus Torvalds, Joe Perches, Rene Herman, git, Junio C Hamano,
Alan Cox, Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski,
akpm, linux-kernel
On Wed, Aug 15, 2007 at 09:37:45PM +0200, Krzysztof Halasa wrote:
> > I'm not suggesting something like fs.ext2@kernel.org with something
> > like majordomo allowing to add yourself to those,
>
> Why not
You'd need to implement serious anti-spam measures for that. Besides,
cross-postings between random sets of lists would become a nightmare
pretty soon.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 18:40 ` Linus Torvalds
2007-08-14 18:54 ` Joe Perches
2007-08-14 19:33 ` Al Viro
@ 2007-08-15 1:35 ` Richard Knutsson
2007-08-15 9:29 ` Stefan Richter
2007-08-16 20:36 ` Joe Perches
4 siblings, 0 replies; 38+ messages in thread
From: Richard Knutsson @ 2007-08-15 1:35 UTC (permalink / raw)
To: Linus Torvalds
Cc: Joe Perches, Rene Herman, git, Junio C Hamano, Alan Cox,
Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski, akpm,
linux-kernel
Linus Torvalds wrote:
> On Tue, 14 Aug 2007, Joe Perches wrote:
>
>
>> On Tue, 2007-08-14 at 20:03 +0200, Rene Herman wrote:
>>
>>> "git info --maintainer drivers/ide/ide-cd.c" or some such would say "Alan
>>> Cox <alan@...>".
>>>
>> Perhaps maintainer(s), approver(s), listener(s)?
>>
>> I think something like this should be a git-goal.
>> What do the git-wranglers think?
>>
>
> The thing is, if you have git, you can basically already do this.
>
> Do a script like this:
>
> #!/bin/sh
> git log --since=6.months.ago -- "$@" |
> grep -i '^ [-a-z]*by:.*@' |
>
sed -r "s/^.*by: \"?([^\"]+)\"?/\1/" |
> sort | uniq -c |
> sort -r -n | head
>
> and it gives you a rather good picture of who is involved with a
> particular subdirectory or file.
>
>
Like the script! Especially since it reveled --since=6.month.ago and
uniq to me.
Just wondering, why order them in the acked, signed and tested? Other
then removing those, the added 'sed' also fix the <name> vs
"<name>"-"problem". + adding '-i' to uniq should help the result too, right?
Now a simple "diffstat -p1 -l <patch> | xargs <preferred script-name>"
makes the day. Too bad, as Joe pointed out, it does not include relevant ML.
cheers
Richard Knutsson
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 18:40 ` Linus Torvalds
` (2 preceding siblings ...)
2007-08-15 1:35 ` Richard Knutsson
@ 2007-08-15 9:29 ` Stefan Richter
2007-08-15 15:31 ` Ray Lee
2007-08-16 20:36 ` Joe Perches
4 siblings, 1 reply; 38+ messages in thread
From: Stefan Richter @ 2007-08-15 9:29 UTC (permalink / raw)
To: Linus Torvalds
Cc: Joe Perches, Rene Herman, git, Junio C Hamano, Alan Cox,
Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski, akpm,
linux-kernel
Linus Torvalds wrote:
> #!/bin/sh
> git log --since=6.months.ago -- "$@" |
> grep -i '^ [-a-z]*by:.*@' |
> sort | uniq -c |
> sort -r -n | head
>
> and it gives you a rather good picture of who is involved with a
> particular subdirectory or file.
No, it doesn't. The subscribers of <subsystem-devel@somewhere.org> are
not listed in patch logs.
--
Stefan Richter
-=====-=-=== =--- -====
http://arcgraph.de/sr/
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-15 9:29 ` Stefan Richter
@ 2007-08-15 15:31 ` Ray Lee
0 siblings, 0 replies; 38+ messages in thread
From: Ray Lee @ 2007-08-15 15:31 UTC (permalink / raw)
To: Stefan Richter
Cc: Linus Torvalds, Joe Perches, Rene Herman, git, Junio C Hamano,
Alan Cox, Arjan van de Ven, Trond Myklebust, Mariusz Kozlowski,
akpm, linux-kernel
On 8/15/07, Stefan Richter <stefanr@s5r6.in-berlin.de> wrote:
> Linus Torvalds wrote:
> > #!/bin/sh
> > git log --since=6.months.ago -- "$@" |
> > grep -i '^ [-a-z]*by:.*@' |
> > sort | uniq -c |
> > sort -r -n | head
> >
> > and it gives you a rather good picture of who is involved with a
> > particular subdirectory or file.
>
> No, it doesn't. The subscribers of <subsystem-devel@somewhere.org> are
> not listed in patch logs.
Then maybe they should be added into the patch logs. A CC: line isn't
that big of a deal, and also shows who got notified.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH] [1/2many] - FInd the maintainer(s) for a patch - scripts/get_maintainer.pl
2007-08-14 18:40 ` Linus Torvalds
` (3 preceding siblings ...)
2007-08-15 9:29 ` Stefan Richter
@ 2007-08-16 20:36 ` Joe Perches
4 siblings, 0 replies; 38+ messages in thread
From: Joe Perches @ 2007-08-16 20:36 UTC (permalink / raw)
To: Linus Torvalds
Cc: Rene Herman, git, Junio C Hamano, Alan Cox, Arjan van de Ven,
Trond Myklebust, Mariusz Kozlowski, akpm, linux-kernel
On Tue, 2007-08-14 at 11:40 -0700, Linus Torvalds wrote:
> Do a script like this:
>
> #!/bin/sh
> git log --since=6.months.ago -- "$@" |
> grep -i '^ [-a-z]*by:.*@' |
> sort | uniq -c |
> sort -r -n | head
> (Maybe you want to add a
> grep -v '\(Linus Torvalds\)\|\(Andrew Morton\)'
> to avoid seeing the normal chain too much, but hey, we probably want to
> know too. Anyway - the script can certainly be tweaked, the point is
> really just that the git tree _already_ contains the relevant
> information).
So, here's the same get_maintainer.pl with the git
addition. Seems to work well in combination with MAINTAINERS.
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl
new file mode 100755
index 0000000..eb3f023
--- /dev/null
+++ b/scripts/get_maintainer.pl
@@ -0,0 +1,351 @@
+#!/usr/bin/perl -w
+# (c) 2007, Joe Perches <joe@perches.com>
+# created from checkpatch.pl
+#
+# Print the contact information for the maintainers
+# of the files modified in a patch
+#
+# usage: perl scripts/get_maintainers.pl <patch>
+#
+# Licensed under the terms of the GNU GPL License version 2
+
+use strict;
+
+my $P = $0;
+$P =~ s@.*/@@g;
+
+my $V = '0.06';
+
+use Getopt::Long qw(:config no_auto_abbrev);
+
+my $tree = "./";
+my $email_maintainer = 1;
+my $email_usename = 1;
+my $email_list = 1;
+my $email_subscriber_list = 0;
+my $email_separator = ", ";
+my $email_git = 1;
+my $email_git_chief_penguins = 0;
+my $email_multiline = 0;
+my %saw;
+
+my $chief_penguins = "(Linus Torvalds|Andrew Morton)";
+
+GetOptions(
+ 'tree=s' => \$tree,
+ 'git!' => $email_git,
+ 'git-chief-penguins' => \$email_git_chief_penguins,
+ 'm!' => \$email_maintainer,
+ 'n!' => \$email_usename,
+ 'l!' => \$email_list,
+ 's!' => \$email_subscriber_list,
+ 'multiline!' => \$email_multiline,
+ 'separator=s' => \$email_separator,
+ ) or exit;
+
+my $exit = 0;
+
+if ($#ARGV < 0 ||
+ ($email_maintainer == 0
+ && $email_list == 0
+ && $email_subscriber_list == 0
+ && $email_git == 0)) {
+ print "usage: $P [options] patchfile\n";
+ print "version: $V\n";
+ print " --tree [path] => linux kernel source path\n";
+ print " --git => include recent git \*-by: signers\n";
+ print " --git_chief_penguins => include ${chief_penguins}\n";
+ print " --m => include maintainer(s) if any\n";
+ print " --n => include name 'Full Name <addr\@domain.tld>'\n";
+ print " --l => include list(s) if any\n";
+ print " --s => include subscriber only list(s) if any\n";
+ print " --separator [, ] => separator for multiple addresses on 1 line\n";
+ print " --multiline => print 1 address per line\n";
+ print "Default: [--g --m --l --separator \", \"]\n";
+ print "Be sure to select something...\n";
+ exit(1);
+}
+
+if ($tree && !top_of_kernel_tree($tree)) {
+ if (${tree} ne "") {
+ print "'${tree}' ";
+ } else {
+ print "The current directory ";
+ }
+ print "doesn't appear to be a linux kernel source tree\n";
+ exit(2);
+}
+
+## Read MAINTAINERS for type/value pairs
+
+my @typevalue = ();
+open(MAINT, "<${tree}MAINTAINERS") || die "$P: Can't open ${tree}MAINTAINERS\n";
+while (<MAINT>) {
+ if (m/^(\C):\s*(.*)/) {
+ my $type = $1;
+ my $value = $2;
+
+ ##Filename pattern matching
+ if ($type eq "F" || $type eq "X") {
+ $value =~ s@\.@\\\.@g; ##Convert . to \.
+ $value =~ s/\*/\.\*/g; ##Convert * to .*
+ }
+ push(@typevalue, "$type:$value");
+ } elsif (!/^(\s)*$/) {
+ push(@typevalue, $_);
+ }
+}
+close(MAINT);
+
+## Find the patched filenames
+
+my @patchedfiles = ();
+open(PATCH, "<$ARGV[0]") or die "Can't open $ARGV[0]\n";
+while (<PATCH>) {
+ if (m/^\+\+\+\s+(\S+)/) {
+ my $file = $1;
+ $file =~ s@^[^/]*/@@;
+ $file =~ s@\n@@;
+ push(@patchedfiles, $file);
+ }
+}
+close(PATCH);
+
+# Sort and uniq patchedfiles
+
+undef %saw;
+@patchedfiles = sort @patchedfiles;
+@patchedfiles = grep(!$saw{$_}++, @patchedfiles);
+
+# Find responsible parties
+
+my @email_to = ();
+foreach (@patchedfiles) {
+ my $patchedfile = $_;
+ my $exclude = 0;
+
+#Git
+
+ recent_git_signoffs($patchedfile);
+
+#Do not match excluded file patterns
+
+ foreach (@typevalue) {
+ if (m/^(\C):(.*)/) {
+ my $type = $1;
+ my $value = $2;
+ if ($type eq 'X') {
+ if (file_match_pattern($patchedfile, $value)) {
+ $exclude = 1;
+ }
+ }
+ }
+ }
+
+ if ($exclude == 0) {
+ my $tvi = 0;
+ foreach (@typevalue) {
+ if (m/^(\C):(.*)/) {
+ my $type = $1;
+ my $value = $2;
+ if ($type eq 'F') {
+ if (file_match_pattern($patchedfile, $value)) {
+ add_emails($tvi);
+ }
+ }
+ }
+ $tvi++;
+ }
+ }
+}
+
+## sort and uniq email_to
+
+@email_to = sort @email_to;
+undef %saw;
+@email_to = grep(!$saw{$_}++, @email_to);
+
+## add lk if no one is interested...
+
+my $address_cnt = @email_to;
+if ($address_cnt == 0 && $email_list > 0) {
+ push(@email_to, "linux-kernel\@vger.kernel.org");
+}
+if ($email_multiline != 0) {
+ foreach (@email_to) {
+ print("$_\n");
+ }
+} else {
+ print(join($email_separator, @email_to));
+ print("\n");
+}
+
+exit($exit);
+
+sub file_match_pattern {
+ my ($file, $pattern) = @_;
+ if (substr($pattern, -1) eq "/") {
+ if ($file =~ m@^$pattern@) {
+ return 1;
+ }
+ } else {
+ if ($file =~ m@^$pattern@) {
+ my $s1 = ($file =~ tr@/@@);
+ my $s2 = ($pattern =~ tr@/@@);
+ if ($s1 == $s2) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+sub top_of_kernel_tree {
+ my ($tree) = @_;
+
+ if ($tree ne "" && substr($tree,length($tree)-1,1) ne "/") {
+ $tree = $tree . "/";
+ }
+ if ( (-f "${tree}COPYING")
+ && (-f "${tree}CREDITS")
+ && (-f "${tree}Kbuild")
+ && (-f "${tree}MAINTAINERS")
+ && (-f "${tree}Makefile")
+ && (-f "${tree}README")
+ && (-d "${tree}Documentation")
+ && (-d "${tree}arch")
+ && (-d "${tree}include")
+ && (-d "${tree}drivers")
+ && (-d "${tree}fs")
+ && (-d "${tree}init")
+ && (-d "${tree}ipc")
+ && (-d "${tree}kernel")
+ && (-d "${tree}lib")
+ && (-d "${tree}scripts")) {
+ return 1;
+ }
+ return 0;
+}
+
+sub format_email {
+ my ($name, $email) = @_;
+ my $formatted_email = $name;
+
+ if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars
+ $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
+ $formatted_email = "\"${name}\"\ \<${email}\>";
+ } else {
+ $formatted_email = "${name} \<${email}\>";
+ }
+ return $formatted_email;
+}
+
+sub add_emails {
+ my ($index) = @_;
+
+ $index = $index - 1;
+ while ($index >= 0) {
+ my $tv = $typevalue[$index];
+ if ($tv =~ m/^(\C):(.*)/) {
+ my $ptype = $1;
+ my $pvalue = $2;
+ if ($ptype eq "L") {
+ my $subscr = $pvalue;
+ if ($subscr =~ m/\s*\(subscribers-only\)/) {
+ if ($email_subscriber_list > 0) {
+ $subscr =~ s/\s*\(subscribers-only\)//g;
+ push(@email_to, $subscr);
+ }
+ } else {
+ if ($email_list > 0) {
+ push(@email_to, $pvalue);
+ }
+ }
+ } elsif ($ptype eq "M") {
+ if ($email_maintainer > 0) {
+ if ($index >= 0) {
+ my $tv = $typevalue[$index - 1];
+ if ($tv =~ m/^(\C):(.*)/) {
+ if ($1 eq "P" && $email_usename > 0) {
+ push(@email_to, format_email($2, $pvalue));
+ } else {
+ push(@email_to, $pvalue);
+ }
+ }
+ } else {
+ push(@email_to, $pvalue);
+ }
+ }
+ }
+ $index--;
+ } else {
+ $index = -1;
+ }
+ }
+}
+
+sub which {
+ my ($bin) = @_;
+
+ my $path;
+
+ foreach $path (split /:/, $ENV{PATH}) {
+ if (-e "$path/$bin") {
+ return "$path/$bin";
+ }
+ }
+
+ return "";
+}
+
+sub recent_git_signoffs {
+ my ($file) = @_;
+
+ my $sign_offs = "";
+ my $cmd = "";
+ my $output = "";
+
+ my @lines = ();
+
+ if (which("git") eq "") {
+ die("Git not found\n");
+ }
+
+# Search the git logs for "by:" lines per file
+# sort in reverse order by occurance
+# add at most 5
+
+ $cmd = "git log --since=6.months.ago -- ${file} ";
+ $cmd = $cmd . " | grep -i '^ [-a-z]*by:.*\\\@' ";
+ if ($email_git_chief_penguins == 0) {
+ $cmd = $cmd . " | grep -E -v '${chief_penguins}'";
+ }
+ $cmd = $cmd . " | sort | uniq -c | sort -r -n | head -n 5";
+ $cmd = $cmd . " | cut -f 2 -d ':' -s ";
+
+ $output = `${cmd}`;
+
+ $output =~ s/^\s*//gm;
+
+ @lines = split("\n", $output);
+ foreach (@lines) {
+ my $line = $_;
+ if ($line =~ m/(.*) <(.*)>/) {
+ my $git_name = $1;
+ my $git_addr = $2;
+ $git_name =~ tr/^\"//;
+ $git_name =~ tr/\"$//;
+ if ($email_usename > 0) {
+ push(@email_to, format_email($git_name, $git_addr));
+ } else {
+ push(@email_to, $git_addr);
+ }
+ } elsif ($line =~ m/<(.*)>/) {
+ my $git_addr = $1;
+ push(@email_to, $git_addr);
+ } else {
+ push(@email_to, $line);
+ }
+ }
+ return $output;
+}
^ permalink raw reply related [flat|nested] 38+ messages in thread