You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Philippe Combes <Ph...@ens-lyon.fr> on 2008/03/30 14:05:12 UTC

[PATCH] make mailer.py able to use mappings on several to_addr fields

Hi all,

I am not sure I am posting to the right mailing list, but I did not find 
anything specific to mailer.py nor to contrib hook-scripts. Maybe would you be 
kind enough to forward to interested people.

One very useful case of mappings would be to have, say, several authors in 
to_addr value so that the commit e-mail would be sent to all the e-mail 
addresses of these authors. Something like

[project_foo]
for_repos = .*/repos
from_addr = %(author)s
to_addr = john sarah

[maps]
from_addr = [authors]
to_addr = [authors]

[authors]
john = jconnor@example.com
sarah = sconnor@example.com


With such a configuration, the current version of mailer.py would send "To: 
john, sarah" to the SMTP server, because the string "john sarah" has no mapping 
in [authors].
With the patch below, it is still possible to map values with white spaces in 
other options than to_addr. Only when we get the value of to_addr, we first 
expand all words with defined mappings, and then collate them back into one 
string. We had to add an argument to Config.get, expand, which defaults to 
False, and this method is called with expand=True when we want to get the value 
of to_addr.

There is probably a better way to do that, more generic, and cleaner. Indeed, it 
is the first time I read and write code in Python, so please be indulgent. But I 
dare submit this patch to give an idea of what sort of improvement I meant.

Best regards,

Philippe Combes


--- mailer.py	(révision 1)
+++ mailer.py	(copie de travail)
@@ -2,6 +2,10 @@
  #
  # mailer.py: send email describing a commit
  #
+## This is a patched version that makes it possible to specify several mapped
+## values in to_addr option. The value is a whitespace separated list of single
+## values that are each transformed according to the [maps] section.
+#
  # $HeadURL: 
http://svn.collab.net/repos/svn/branches/1.4.x/tools/hook-scripts/mailer/mailer.py $
  # $LastChangedDate$
  # $LastChangedBy: dlr $
@@ -185,7 +189,7 @@
    def start(self, group, params):
      # whitespace-separated list of addresses; split into a clean list:
      self.to_addrs = \
-        filter(None, string.split(self.cfg.get('to_addr', group, params)))
+        filter(None, string.split(self.cfg.get('to_addr', group, params, True)))
      self.from_addr = self.cfg.get('from_addr', group, params) \
                       or self.repos.author or 'no_author'
      self.reply_to = self.cfg.get('reply_to', group, params)
@@ -1078,7 +1082,7 @@
        ob = getattr(ob, part)
      return ob

-  def get(self, option, group, params):
+  def get(self, option, group, params, expand=False ):
      "Get a config value with appropriate substitutions and value mapping."

      # find the right value
@@ -1096,13 +1100,18 @@
      # apply any mapper
      mapper = getattr(self.maps, option, None)
      if mapper is not None:
-      value = mapper(value)
+      if expand:
+        value = string.join(map(mapper,string.split(value)))
+      else:
+        value = mapper(value)

        # Apply any parameters that may now be available for
        # substitution that were not before the mapping.
        if value is not None and params is not None:
          value = value % params

+      # Now if expand is required and nothing has changed
+
      return value

    def get_diff_cmd(self, group, args):

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] make mailer.py able to use mappings on several to_addr fields

Posted by Daniel Shahaf <d....@daniel.shahaf.co.il>.
[ CCing the list ]

Philippe Combes wrote on Mon, 31 Mar 2008 at 01:33 +0200:
> Hi,
>
> thank you for the interest you gave to this patch.
> Unfortunately, as a Python beginner, I do not know how to modify the trunk 
> version to add the same feature.

Unfortunately, new features must be written against trunk to be accepted; 
Subversion does not add new features directly to release branches.

> Because of this separator given between brackets at the beginning of the 
> value, I would have to duplicate code or create another function. I am not 
> sure of what I should do exactly, because I even fear that it would require 
> changes in parts of the design itself.
>
> And I really do not have time for that, sorry.
>

I'm not familiar with mailer.py, but I'm sure someone who is could
advise you how to implement this feature with minimal changes to
existing code.  In other words, if you are in doubts about the design,
ask!

Thanks for the patch,

Daniel

> Regards,
>
> Philippe.
>
> Daniel Shahaf a écrit :
>> Philippe,
>> 
>> Philippe Combes wrote on Sun, 30 Mar 2008 at 16:05 +0200:
>>> Hi all,
>>> 
>>> I am not sure I am posting to the right mailing list, but I did not find 
>>> anything specific to mailer.py nor to contrib hook-scripts. Maybe would 
>>> you be kind enough to forward to interested people.
>>> 
>>> One very useful case of mappings would be to have, say, several authors 
>>> in to_addr value so that the commit e-mail would be sent to all the 
>>> e-mail addresses of these authors. Something like
>>> 
>>> [project_foo]
>>> for_repos = .*/repos
>>> from_addr = %(author)s
>>> to_addr = john sarah
>>> 
>>> [maps]
>>> from_addr = [authors]
>>> to_addr = [authors]
>>> 
>>> [authors]
>>> john = jconnor@example.com
>>> sarah = sconnor@example.com
>>> 
>>> 
>>> With such a configuration, the current version of mailer.py would send 
>>> "To: john, sarah" to the SMTP server, because the string "john sarah" 
>>> has no mapping in [authors].
>>> With the patch below, it is still possible to map values with white 
>>> spaces in other options than to_addr. Only when we get the value of 
>>> to_addr, we first expand all words with defined mappings, and then 
>>> collate them back into one string. We had to add an argument to 
>>> Config.get, expand, which defaults to False, and this method is called 
>>> with expand=True when we want to get the value of to_addr.
>>> 
>>> There is probably a better way to do that, more generic, and cleaner. 
>>> Indeed, it is the first time I read and write code in Python, so please 
>>> be indulgent. But I dare submit this patch to give an idea of what sort 
>>> of improvement I meant.
>>> 
>>> Best regards,
>>> 
>>> Philippe Combes
>>> 
>>> 
>>> --- mailer.py    (révision 1)
>>> +++ mailer.py    (copie de travail)
>>> @@ -2,6 +2,10 @@
>>> #
>>> # mailer.py: send email describing a commit
>>> #
>>> +## This is a patched version that makes it possible to specify several 
>>> mapped
>>> +## values in to_addr option. The value is a whitespace separated list 
>>> of single
>>> +## values that are each transformed according to the [maps] section.
>>> +#
>>> # $HeadURL: 
>>> http://svn.collab.net/repos/svn/branches/1.4.x/tools/hook-scripts/mailer/mailer.py 
>> 
>> Could you please submit a new version of the patch against the trunk
>> version of mailer.py?  Also, please provide a log message (see 
>> http://subversion.tigris.org/hacking.html#patches).
>> 
>>> $
>>> # $LastChangedDate$
>>> # $LastChangedBy: dlr $
>>> @@ -185,7 +189,7 @@
>>>   def start(self, group, params):
>>>     # whitespace-separated list of addresses; split into a clean list:
>>>     self.to_addrs = \
>>> -        filter(None, string.split(self.cfg.get('to_addr', group, 
>>> params)))
>>> +        filter(None, string.split(self.cfg.get('to_addr', group, 
>>> params, True)))
>>>     self.from_addr = self.cfg.get('from_addr', group, params) \
>>>                      or self.repos.author or 'no_author'
>>>     self.reply_to = self.cfg.get('reply_to', group, params)
>>> @@ -1078,7 +1082,7 @@
>>>       ob = getattr(ob, part)
>>>     return ob
>>> 
>>> -  def get(self, option, group, params):
>>> +  def get(self, option, group, params, expand=False ):
>>>     "Get a config value with appropriate substitutions and value 
>>> mapping."
>>>
>>>     # find the right value
>>> @@ -1096,13 +1100,18 @@
>>>     # apply any mapper
>>>     mapper = getattr(self.maps, option, None)
>>>     if mapper is not None:
>>> -      value = mapper(value)
>>> +      if expand:
>>> +        value = string.join(map(mapper,string.split(value)))
>>> +      else:
>>> +        value = mapper(value)
>>>
>>>       # Apply any parameters that may now be available for
>>>       # substitution that were not before the mapping.
>>>       if value is not None and params is not None:
>>>         value = value % params
>>> 
>>> +      # Now if expand is required and nothing has changed
>>> +
>> 
>> Incomplete sentence?
>> 
>> Daniel
>>
>>>     return value
>>>
>>>   def get_diff_cmd(self, group, args):
>>> 
>

Re: [PATCH] make mailer.py able to use mappings on several to_addr fields

Posted by Daniel Shahaf <d....@daniel.shahaf.co.il>.
Philippe,

Philippe Combes wrote on Sun, 30 Mar 2008 at 16:05 +0200:
> Hi all,
>
> I am not sure I am posting to the right mailing list, but I did not find 
> anything specific to mailer.py nor to contrib hook-scripts. Maybe would you 
> be kind enough to forward to interested people.
>
> One very useful case of mappings would be to have, say, several authors in 
> to_addr value so that the commit e-mail would be sent to all the e-mail 
> addresses of these authors. Something like
>
> [project_foo]
> for_repos = .*/repos
> from_addr = %(author)s
> to_addr = john sarah
>
> [maps]
> from_addr = [authors]
> to_addr = [authors]
>
> [authors]
> john = jconnor@example.com
> sarah = sconnor@example.com
>
>
> With such a configuration, the current version of mailer.py would send "To: 
> john, sarah" to the SMTP server, because the string "john sarah" has no 
> mapping in [authors].
> With the patch below, it is still possible to map values with white spaces 
> in other options than to_addr. Only when we get the value of to_addr, we 
> first expand all words with defined mappings, and then collate them back 
> into one string. We had to add an argument to Config.get, expand, which 
> defaults to False, and this method is called with expand=True when we want 
> to get the value of to_addr.
>
> There is probably a better way to do that, more generic, and cleaner. 
> Indeed, it is the first time I read and write code in Python, so please be 
> indulgent. But I dare submit this patch to give an idea of what sort of 
> improvement I meant.
>
> Best regards,
>
> Philippe Combes
>
>
> --- mailer.py	(révision 1)
> +++ mailer.py	(copie de travail)
> @@ -2,6 +2,10 @@
> #
> # mailer.py: send email describing a commit
> #
> +## This is a patched version that makes it possible to specify several 
> mapped
> +## values in to_addr option. The value is a whitespace separated list of 
> single
> +## values that are each transformed according to the [maps] section.
> +#
> # $HeadURL: 
> http://svn.collab.net/repos/svn/branches/1.4.x/tools/hook-scripts/mailer/mailer.py

Could you please submit a new version of the patch against the trunk
version of mailer.py?  Also, please provide a log message (see 
http://subversion.tigris.org/hacking.html#patches).

> $
> # $LastChangedDate$
> # $LastChangedBy: dlr $
> @@ -185,7 +189,7 @@
>   def start(self, group, params):
>     # whitespace-separated list of addresses; split into a clean list:
>     self.to_addrs = \
> -        filter(None, string.split(self.cfg.get('to_addr', group, params)))
> +        filter(None, string.split(self.cfg.get('to_addr', group, params, 
> True)))
>     self.from_addr = self.cfg.get('from_addr', group, params) \
>                      or self.repos.author or 'no_author'
>     self.reply_to = self.cfg.get('reply_to', group, params)
> @@ -1078,7 +1082,7 @@
>       ob = getattr(ob, part)
>     return ob
>
> -  def get(self, option, group, params):
> +  def get(self, option, group, params, expand=False ):
>     "Get a config value with appropriate substitutions and value mapping."
>
>     # find the right value
> @@ -1096,13 +1100,18 @@
>     # apply any mapper
>     mapper = getattr(self.maps, option, None)
>     if mapper is not None:
> -      value = mapper(value)
> +      if expand:
> +        value = string.join(map(mapper,string.split(value)))
> +      else:
> +        value = mapper(value)
>
>       # Apply any parameters that may now be available for
>       # substitution that were not before the mapping.
>       if value is not None and params is not None:
>         value = value % params
>
> +      # Now if expand is required and nothing has changed
> +

Incomplete sentence?

Daniel

>     return value
>
>   def get_diff_cmd(self, group, args):
>

Re: [PATCH] make mailer.py able to use mappings on several to_addr fields

Posted by Daniel Shahaf <d....@daniel.shahaf.co.il>.
Filed as issue #3160 against 1.4.  Philippe, if you ever have time to 
update your patch for trunk, please let the list know.

http://subversion.tigris.org/issues/show_bug.cgi?id=3160

Thanks,

Daniel

Philippe Combes wrote on Sun, 30 Mar 2008 at 16:05 +0200:
> Hi all,
>
> I am not sure I am posting to the right mailing list, but I did not find 
> anything specific to mailer.py nor to contrib hook-scripts. Maybe would you 
> be kind enough to forward to interested people.
>
> One very useful case of mappings would be to have, say, several authors in 
> to_addr value so that the commit e-mail would be sent to all the e-mail 
> addresses of these authors. Something like
>
> [project_foo]
> for_repos = .*/repos
> from_addr = %(author)s
> to_addr = john sarah
>
> [maps]
> from_addr = [authors]
> to_addr = [authors]
>
> [authors]
> john = jconnor@example.com
> sarah = sconnor@example.com
>
>
> With such a configuration, the current version of mailer.py would send "To: 
> john, sarah" to the SMTP server, because the string "john sarah" has no 
> mapping in [authors].
> With the patch below, it is still possible to map values with white spaces 
> in other options than to_addr. Only when we get the value of to_addr, we 
> first expand all words with defined mappings, and then collate them back 
> into one string. We had to add an argument to Config.get, expand, which 
> defaults to False, and this method is called with expand=True when we want 
> to get the value of to_addr.
>
> There is probably a better way to do that, more generic, and cleaner. 
> Indeed, it is the first time I read and write code in Python, so please be 
> indulgent. But I dare submit this patch to give an idea of what sort of 
> improvement I meant.
>
> Best regards,
>
> Philippe Combes
>
>
> --- mailer.py	(révision 1)
> +++ mailer.py	(copie de travail)
> @@ -2,6 +2,10 @@
> #
> # mailer.py: send email describing a commit
> #
> +## This is a patched version that makes it possible to specify several 
> mapped
> +## values in to_addr option. The value is a whitespace separated list of 
> single
> +## values that are each transformed according to the [maps] section.
> +#
> # $HeadURL: 
> http://svn.collab.net/repos/svn/branches/1.4.x/tools/hook-scripts/mailer/mailer.py 
> $
> # $LastChangedDate$
> # $LastChangedBy: dlr $
> @@ -185,7 +189,7 @@
>   def start(self, group, params):
>     # whitespace-separated list of addresses; split into a clean list:
>     self.to_addrs = \
> -        filter(None, string.split(self.cfg.get('to_addr', group, params)))
> +        filter(None, string.split(self.cfg.get('to_addr', group, params, 
> True)))
>     self.from_addr = self.cfg.get('from_addr', group, params) \
>                      or self.repos.author or 'no_author'
>     self.reply_to = self.cfg.get('reply_to', group, params)
> @@ -1078,7 +1082,7 @@
>       ob = getattr(ob, part)
>     return ob
>
> -  def get(self, option, group, params):
> +  def get(self, option, group, params, expand=False ):
>     "Get a config value with appropriate substitutions and value mapping."
>
>     # find the right value
> @@ -1096,13 +1100,18 @@
>     # apply any mapper
>     mapper = getattr(self.maps, option, None)
>     if mapper is not None:
> -      value = mapper(value)
> +      if expand:
> +        value = string.join(map(mapper,string.split(value)))
> +      else:
> +        value = mapper(value)
>
>       # Apply any parameters that may now be available for
>       # substitution that were not before the mapping.
>       if value is not None and params is not None:
>         value = value % params
>
> +      # Now if expand is required and nothing has changed
> +
>     return value
>
>   def get_diff_cmd(self, group, args):