[PATCH] rtemstoolkit/mailer.py: Add --use-gitconfig option

Chris Johns chrisj at rtems.org
Wed Apr 14 01:02:34 UTC 2021


OK to push with a minor fix noted below ...

On 14/4/21 7:33 am, Alex White wrote:
> This adds the option to pull mail-related configuration values from the
> user's git configuration.
> 
> Closes #4384
> ---
>  rtemstoolkit/mailer.py | 46 ++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/rtemstoolkit/mailer.py b/rtemstoolkit/mailer.py
> index aa804ae..763a4d8 100644
> --- a/rtemstoolkit/mailer.py
> +++ b/rtemstoolkit/mailer.py
> @@ -39,11 +39,13 @@ import smtplib
>  import socket
>  
>  from rtemstoolkit import error
> +from rtemstoolkit import execute
>  from rtemstoolkit import options
>  from rtemstoolkit import path
>  
>  _options = {
>      '--mail'         : 'Send email report or results.',
> +    '--use-gitconfig': 'Use mail configuration from git config.',
>      '--mail-to'      : 'Email address to send the email to.',
>      '--mail-from'    : 'Email address the report is from.',
>      '--smtp-host'    : 'SMTP host to send via.',
> @@ -58,12 +60,22 @@ def append_options(opts):
>  
>  def add_arguments(argsp):
>      argsp.add_argument('--mail', help = _options['--mail'], action = 'store_true')
> +    argsp.add_argument('--use-gitconfig', help = _options['--use-gitconfig'], action = 'store_true')
>      for o in list(_options)[1:]:
>          argsp.add_argument(o, help = _options[o], type = str)
>  
>  class mail:
>      def __init__(self, opts):
>          self.opts = opts
> +        self.gitconfig_lines = None
> +        if opts.find_arg('--use-gitconfig') is not None:
> +            # Read the output of `git config --list` instead of reading the
> +            # .gitconfig file directly because Python 2 ConfigParser does not
> +            # accept tabs at the beginning of lines.
> +            e = execute.capture_execution()
> +            exit_code, proc, output = e.open('git config --list', shell=True)
> +            if exit_code == 0:
> +                self.gitconfig_lines = output.split('\n')

'\n' or os.linesep?

Chris

>  
>      def _args_are_macros(self):
>          return isinstance(self.opts, options.command_line)
> @@ -83,6 +95,16 @@ class mail:
>                  value = None
>          return value
>  
> +    def _get_from_gitconfig(self, variable_name):
> +        if self.gitconfig_lines is None:
> +            return None
> +        
> +        for line in self.gitconfig_lines:
> +            if line.startswith(variable_name):
> +                ls = line.split('=')
> +                if len(ls) >= 2:
> +                    return ls[1]
> +
>      def from_address(self):
>  
>          def _clean(l):
> @@ -97,6 +119,12 @@ class mail:
>          addr = self._get_arg('--mail-from')
>          if addr is not None:
>              return addr
> +        addr = self._get_from_gitconfig('user.email')
> +        if addr is not None:
> +            name = self._get_from_gitconfig('user.name')
> +            if name is not None:
> +                addr = '%s <%s>' % (name, addr)
> +            return addr
>          mailrc = None
>          if 'MAILRC' in os.environ:
>              mailrc = os.environ['MAILRC']
> @@ -125,6 +153,9 @@ class mail:
>  
>      def smtp_host(self):
>          host = self._get_arg('--smtp-host')
> +        if host is not None:
> +            return host
> +        host = self._get_from_gitconfig('sendemail.smtpserver')
>          if host is not None:
>              return host
>          if self._args_are_macros():
> @@ -135,6 +166,9 @@ class mail:
>  
>      def smtp_port(self):
>          port = self._get_arg('--smtp-port')
> +        if port is not None:
> +            return port
> +        port = self._get_from_gitconfig('sendemail.smtpserverport')
>          if port is not None:
>              return port
>          if self._args_are_macros():
> @@ -142,10 +176,18 @@ class mail:
>          return port
>  
>      def smtp_user(self):
> -        return self._get_arg('--smtp-user')
> +        user = self._get_arg('--smtp-user')
> +        if user is not None:
> +            return user
> +        user = self._get_from_gitconfig('sendemail.smtpuser')
> +        return user
>  
>      def smtp_password(self):
> -        return self._get_arg('--smtp-password')
> +        password = self._get_arg('--smtp-password')
> +        if password is not None:
> +            return password
> +        password = self._get_from_gitconfig('sendemail.smtppass')
> +        return password
>  
>      def send(self, to_addr, subject, body):
>          from_addr = self.from_address()
> 


More information about the devel mailing list