commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-214-g27f9a86


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-214-g27f9a86
Date: Tue, 23 Nov 2010 23:35:41 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=27f9a867f4fcfaf29a22349043eaddcb60c2694e

The branch, master has been updated
       via  27f9a867f4fcfaf29a22349043eaddcb60c2694e (commit)
       via  43853ce85b785d36b44b6850ceac7136c54f54f0 (commit)
       via  764ebfd7f22dd2634413f1d427ab0f51b0b7797b (commit)
      from  39160956df0ea814c08af4d60adb3bac63bd41f7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 27f9a867f4fcfaf29a22349043eaddcb60c2694e
Author: Sergey Poznyakoff <address@hidden>
Date:   Wed Nov 24 01:32:55 2010 +0200

    Fix body start calculation in message_stream. Fix compose parser in mhn.
    
    * libmailutils/stream/message_stream.c (scan_stream): Merge
    with _message_open.
    * mh/mhn.c (edit_forw): Do not set ws_delim.
    Fix message addressing.
    (mhn_edit): Remove the trailing newline.

commit 43853ce85b785d36b44b6850ceac7136c54f54f0
Author: Sergey Poznyakoff <address@hidden>
Date:   Wed Nov 24 00:13:41 2010 +0200

    mh: implement rmmproc.
    
    * include/mailutils/sys/amd.h (_amd_data) <delete_msg>: New method.
    * libmailutils/base/amd.c (amd_expunge): If delete_msg is defined,
    use it.
    * libproto/mh/mbox.c (_mh_msg_delete): New method.
    (_mailbox_mh_init): Set delete_msg if "rmmproc" component is
    defined.
    
    * mh/tests/movemsg: New file.
    * mh/tests/Makefile.am (EXTRA_DIST): Add movemsg.
    * mh/tests/rmm.at: Test rmmproc effects.
    * mh/tests/rmf.at (MH_KEYWORDS): Fix copy-n-paste error.
    
    * doc/texinfo/mu-mh.texi: Document rmmproc.
    * mh/TODO: Update.

commit 764ebfd7f22dd2634413f1d427ab0f51b0b7797b
Author: Sergey Poznyakoff <address@hidden>
Date:   Tue Nov 23 20:40:09 2010 +0200

    mh: add repl tests.
    
    * mh/repl.c: Minor changes.
    * tests/repl.at: New file.
    * tests/Makefile.am (TESTSUITE_AT): Add repl.at
    * mh/tests/testsuite.at: Include repl.at.
    * mh/TODO: Update.

-----------------------------------------------------------------------

Summary of changes:
 doc/texinfo/mu-mh.texi               |    7 ++-
 include/mailutils/sys/amd.h          |    3 +-
 libmailutils/base/amd.c              |   61 ++++++++++--------
 libmailutils/stream/message_stream.c |  115 +++++++++++++--------------------
 libproto/mh/mbox.c                   |   36 +++++++++++
 mh/TODO                              |    6 +-
 mh/mhn.c                             |   20 +++++-
 mh/repl.c                            |    6 +-
 mh/tests/Makefile.am                 |    3 +-
 mh/tests/repl.at                     |   82 ++++++++++++++++++++++++
 mh/tests/rmf.at                      |    2 +-
 mh/tests/rmm.at                      |   31 +++++++++
 mh/tests/testsuite.at                |    1 +
 13 files changed, 263 insertions(+), 110 deletions(-)
 create mode 100644 mh/tests/repl.at

diff --git a/doc/texinfo/mu-mh.texi b/doc/texinfo/mu-mh.texi
index 99ebaeb..f231a69 100644
--- a/doc/texinfo/mu-mh.texi
+++ b/doc/texinfo/mu-mh.texi
@@ -427,7 +427,12 @@ Mailutils @command{rmm} does not delete any messages. 
Standard
 non-existent one. 
 
 @item
-The @code{rmmproc} profile component is not used.
+The @command{rmm} utility will unlink messages, if the @code{rmmproc}
+profile component has empty value, e.g.:
+
address@hidden
+rmmproc:
address@hidden example
 @end enumerate
 
 @item sortm
diff --git a/include/mailutils/sys/amd.h b/include/mailutils/sys/amd.h
index 2f921a3..fde26da 100644
--- a/include/mailutils/sys/amd.h
+++ b/include/mailutils/sys/amd.h
@@ -82,7 +82,8 @@ struct _amd_data
   int (*message_uid) (mu_message_t msg, size_t *puid);
   size_t (*next_uid) (struct _amd_data *mhd);
   int (*remove) (struct _amd_data *);
-  
+  int (*delete_msg) (struct _amd_data *, struct _amd_message *);
+                    
   /* List of messages: */
   size_t msg_count; /* number of messages in the list */
   size_t msg_max;   /* maximum message buffer capacity */
diff --git a/libmailutils/base/amd.c b/libmailutils/base/amd.c
index acbfb29..d51f941 100644
--- a/libmailutils/base/amd.c
+++ b/libmailutils/base/amd.c
@@ -1166,37 +1166,46 @@ amd_expunge (mu_mailbox_t mailbox)
       if (mhm->attr_flags & MU_ATTRIBUTE_DELETED)
        {
          int rc;
-         char *old_name;
-         char *new_name;
 
-         rc = amd->cur_msg_file_name (mhm, &old_name);
-         if (rc)
-           return rc;
-         rc = amd->new_msg_file_name (mhm, mhm->attr_flags, 1,
-                                      &new_name);
-         if (rc)
+         if (amd->delete_msg)
            {
-             free (old_name);
-             return rc;
-           }
-
-         if (new_name)
-           {
-             /* FIXME: It may be a good idea to have a capability flag
-                in struct _amd_data indicating that no actual removal
-                is needed (e.g. for traditional MH). It will allow to
-                bypass lots of no-op code here. */
-             if (strcmp (old_name, new_name))
-               /* Rename original message */
-               rename (old_name, new_name);
+             rc = amd->delete_msg (amd, mhm);
+             if (rc)
+               return rc;
            }
          else
-           /* Unlink original file */
-           unlink (old_name);
-         
-         free (old_name);
-         free (new_name);
+           {
+             char *old_name;
+             char *new_name;
+
+             rc = amd->cur_msg_file_name (mhm, &old_name);
+             if (rc)
+               return rc;
+             rc = amd->new_msg_file_name (mhm, mhm->attr_flags, 1,
+                                          &new_name);
+             if (rc)
+               {
+                 free (old_name);
+                 return rc;
+               }
 
+             if (new_name)
+               {
+                 /* FIXME: It may be a good idea to have a capability flag
+                    in struct _amd_data indicating that no actual removal
+                    is needed (e.g. for traditional MH). It will allow to
+                    bypass lots of no-op code here. */
+                 if (strcmp (old_name, new_name))
+                   /* Rename original message */
+                   rename (old_name, new_name);
+               }
+             else
+               /* Unlink original file */
+               unlink (old_name);
+             
+             free (old_name);
+             free (new_name);
+           }
          _amd_message_delete (amd, mhm);
          updated = 1;
          /* Do not increase i! */
diff --git a/libmailutils/stream/message_stream.c 
b/libmailutils/stream/message_stream.c
index 189eb0f..b4f728e 100644
--- a/libmailutils/stream/message_stream.c
+++ b/libmailutils/stream/message_stream.c
@@ -145,51 +145,62 @@ copy_trimmed_value (const char *str)
 }
   
 static int
-scan_stream (struct _mu_message_stream *str)
+_message_open (mu_stream_t stream)
 {
+  struct _mu_message_stream *str = (struct _mu_message_stream*) stream;
   char *from = NULL;
   char *env_from = NULL;
   char *env_date = NULL;
   int rc;
   char *buffer = NULL;
   size_t bufsize = 0;
-  size_t len;
+  size_t offset, len;
   mu_off_t body_start, body_end;
-  mu_stream_t stream = str->transport;
-
-  if (str->envelope)
+  mu_stream_t transport = str->transport;
+  
+  rc = mu_stream_seek (transport, 0, MU_SEEK_SET, NULL);
+  if (rc)
+    return rc;
+  offset = 0;
+  while ((rc = mu_stream_getline (transport, &buffer, &bufsize, &len)) == 0
+        && len > 0)
     {
-      char *s = str->envelope + 5;
-      char *p = strchr (s, ' ');
-      size_t len;
-
-      if (p)
+      if (offset == 0 && memcmp (buffer, "From ", 5) == 0)
        {
-         len = p - s;
-         env_from = mu_alloc (len + 1);
-         if (!env_from)
+         char *s, *p;
+         
+         str->envelope_length = len;
+         str->envelope = mu_strdup (buffer);
+         if (!str->envelope)
            return ENOMEM;
-         memcpy (env_from, s, len);
-         env_from[len] = 0;
-         env_date = mu_strdup (p + 1);
-         if (!env_date)
+         str->envelope[len - 1] = 0;
+
+         s = str->envelope + 5;
+         p = strchr (s, ' ');
+
+         if (p)
            {
-             free (env_from);
-             return ENOMEM;
+             len = p - s;
+             env_from = mu_alloc (len + 1);
+             if (!env_from)
+               return ENOMEM;
+             memcpy (env_from, s, len);
+             env_from[len] = 0;
+             env_date = mu_strdup (p + 1);
+             if (!env_date)
+               {
+                 free (env_from);
+                 return ENOMEM;
+               }
            }
        }
-    }
-
-  rc = mu_stream_seek (stream, 0, MU_SEEK_SET, NULL);
-  if (rc)
-    return rc;
-  while ((rc = mu_stream_getline (stream, &buffer, &bufsize, &len)) == 0
-        && len > 0)
-    {
-      if (buffer[0] == '\n')
-       break;
-
-      if (!env_from || !env_date)
+      else if (mu_mh_delim (buffer))
+       {
+         str->mark_offset = offset;
+         str->mark_length = len - 1; /* do not count the terminating newline */
+         break;
+       }
+      else if (!env_from || !env_date)
        {
          if (!from && mu_c_strncasecmp (buffer, MU_HEADER_FROM,
                                         sizeof (MU_HEADER_FROM) - 1) == 0)
@@ -206,14 +217,15 @@ scan_stream (struct _mu_message_stream *str)
            env_date = copy_trimmed_value (buffer +
                                           sizeof (MU_HEADER_ENV_DATE));
        }
+      offset += len;
     }
 
   free (buffer);
 
-  rc = mu_stream_seek (stream, 0, MU_SEEK_CUR, &body_start);
+  rc = mu_stream_seek (transport, 0, MU_SEEK_CUR, &body_start);
   if (rc)
     return rc;
-  rc = mu_stream_size (stream, &body_end);
+  rc = mu_stream_size (transport, &body_end);
   if (rc)
     return rc;
   
@@ -256,43 +268,6 @@ scan_stream (struct _mu_message_stream *str)
 }
 
 static int
-_message_open (mu_stream_t stream)
-{
-  struct _mu_message_stream *s = (struct _mu_message_stream*) stream;
-  size_t offset, len;
-  char *buffer = NULL;
-  size_t bufsize = 0;
-  int rc;
-
-  offset = 0;
-  mu_stream_seek (s->transport, 0, MU_SEEK_SET, NULL);
-  while ((rc = mu_stream_getline (s->transport, &buffer, &bufsize,
-                                 &len)) == 0
-        && len > 0)
-    {
-      if (offset == 0 && memcmp (buffer, "From ", 5) == 0)
-       {
-         s->envelope_length = len;
-         s->envelope = mu_strdup (buffer);
-         if (!s->envelope)
-           return ENOMEM;
-         s->envelope[len - 1] = 0;
-       }
-      else if (mu_mh_delim (buffer))
-       {
-         s->mark_offset = offset;
-         s->mark_length = len - 1; /* do not count the terminating newline */
-         break;
-       }
-
-      offset += len;
-    }
-  free (buffer);
-
-  return scan_stream (s);
-}
-
-static int
 _message_close (mu_stream_t stream)
 {
   struct _mu_message_stream *s = (struct _mu_message_stream*) stream;
diff --git a/libproto/mh/mbox.c b/libproto/mh/mbox.c
index c28aee5..82d0283 100644
--- a/libproto/mh/mbox.c
+++ b/libproto/mh/mbox.c
@@ -351,6 +351,38 @@ _mh_msg_init (struct _amd_data *amd, struct _amd_message 
*amm)
   return 0;
 }
 
+static int
+_mh_msg_delete (struct _amd_data *amd, struct _amd_message *amm)
+{
+  int rc, status;
+  char *name;
+  char *argv[3];
+  /* FIXME: Cache this value */
+  const char *proc = mu_mhprop_get_value (mu_mh_profile, "rmmproc", NULL);
+  if (!proc)
+    return ENOSYS;
+
+  rc = amd->cur_msg_file_name (amm, &name);
+  if (rc)
+    return rc;
+  
+  if (proc[0] == 0)
+    {
+      rc = unlink (name);
+      if (rc)
+       rc = errno;
+    }
+  else
+    {
+      argv[0] = (char*) proc;
+      argv[1] = name;
+      argv[2] = NULL;
+      rc = mu_spawnvp (proc, argv, &status);
+    }
+  free (name);
+  return rc;
+}
+
 
 static int
 mh_remove (struct _amd_data *amd)
@@ -442,6 +474,10 @@ _mailbox_mh_init (mu_mailbox_t mailbox)
 
   mailbox->_get_property = mh_get_property;
   mailbox->_translate = mh_translate;
+
+  if (mu_mhprop_get_value (mu_mh_profile, "rmmproc", NULL))
+    amd->delete_msg = _mh_msg_delete;
+    
   
   return 0;
 }
diff --git a/mh/TODO b/mh/TODO
index 7bc3a40..34724d1 100644
--- a/mh/TODO
+++ b/mh/TODO
@@ -19,13 +19,13 @@ State       Nice    Utility         Comments
 -------------------------------------------
 +      -20     scan
 +      -20     inc
-*      -20     repl            --inplace
+*      -20     repl            --inplace,--query
 +      -20     comp            
 *      -20     forw            --inplace
 *      -20     send            --alias,--filter,--format,--forward,--mime,
                                --width
-*      -20     refile          --link copies messages; rmmproc ignored.
-*      -20     rmm             rmproc: 
+*      -20     refile          --link copies messages
++      -20     rmm             
 +      -15     folder(s)       
 +      -15     mhn             
 +      -10     rmf
diff --git a/mh/mhn.c b/mh/mhn.c
index d66ef9b..5ddfece 100644
--- a/mh/mhn.c
+++ b/mh/mhn.c
@@ -2083,9 +2083,7 @@ edit_forw (char *cmd, struct compose_env *env, 
mu_message_t *pmsg, int level)
   if (status)
     return status;
 
-  ws.ws_delim = "\n";
-  if (mu_wordsplit (cmd, &ws,
-                   MU_WRDSF_DEFFLAGS | MU_WRDSF_DELIM | MU_WRDSF_WS))
+  if (mu_wordsplit (cmd, &ws, MU_WRDSF_DEFFLAGS))
     {
       mu_error (_("%s:%lu: cannot split line: %s"),
                input_file,
@@ -2100,7 +2098,19 @@ edit_forw (char *cmd, struct compose_env *env, 
mu_message_t *pmsg, int level)
   for (i = 1; i < ws.ws_wordc; i++)
     {
       mu_message_t input_msg;
-      if (mh_get_message (mbox, i, &input_msg) == 0)
+      char *endp;
+      size_t n = strtoul (ws.ws_wordv[i], &endp, 10);
+
+      if (*endp)
+       {
+         mu_error (_("%s:%lu: malformed directive near %s"),
+                   input_file,
+                   (unsigned long) mhn_error_loc (env),
+                   endp);
+         return 1;
+       }
+                   
+      if (mh_get_message (mbox, n, &input_msg) == 0)
        {
          mu_error (_("%s:%lu: no such message: %lu"),
                    input_file,
@@ -2326,6 +2336,8 @@ mhn_edit (struct compose_env *env, int level)
              if (line_count)
                /* Close and append the previous part */
                finish_text_msg (env, &msg, ascii_buf);
+
+             mu_rtrim_cset (buf, "\n");
              
              /* Execute the directive */
              tok = buf;
diff --git a/mh/repl.c b/mh/repl.c
index 09c85a7..8629d61 100644
--- a/mh/repl.c
+++ b/mh/repl.c
@@ -58,7 +58,7 @@ static struct argp_option options[] = {
   {"inplace", ARG_INPLACE, N_("BOOL"), OPTION_ARG_OPTIONAL,
    N_("* annotate the message in place")},
   {"query", ARG_QUERY, N_("BOOL"), OPTION_ARG_OPTIONAL,
-   N_("query for addresses to place in To: and Cc: lists")},
+   N_("* query for addresses to place in To: and Cc: lists")},
   {"width", ARG_WIDTH, N_("NUMBER"), 0, N_("set output width")},
   {"whatnowproc", ARG_WHATNOWPROC, N_("PROG"), 0,
    N_("set the replacement for whatnow program")},
@@ -143,8 +143,7 @@ opt_handler (int key, char *arg, struct argp_state *state)
   switch (key)
     {
     case ARGP_KEY_INIT:
-      draftfolder = mh_global_profile_get ("Draft-Folder",
-                                          mu_folder_directory ());
+      draftfolder = mh_global_profile_get ("Draft-Folder", NULL);
       whatnowproc = mh_global_profile_get ("whatnowproc", NULL);
       break;
       
@@ -225,6 +224,7 @@ opt_handler (int key, char *arg, struct argp_state *state)
       break;
       
     case ARG_QUERY:
+      mh_opt_notimpl_warning ("-inplace");
       query_mode = is_true (arg);
       break;
       
diff --git a/mh/tests/Makefile.am b/mh/tests/Makefile.am
index 72f470f..7e76c33 100644
--- a/mh/tests/Makefile.am
+++ b/mh/tests/Makefile.am
@@ -14,7 +14,7 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
 
-EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 
+EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 mhed movemsg
 DISTCLEANFILES       = atconfig $(check_SCRIPTS)
 MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
 
@@ -55,6 +55,7 @@ TESTSUITE_AT = \
  pick.at\
  scan.at\
  refile.at\
+ repl.at\
  rmf.at\
  rmm.at\
  testsuite.at
diff --git a/mh/tests/repl.at b/mh/tests/repl.at
new file mode 100644
index 0000000..2df8e6b
--- /dev/null
+++ b/mh/tests/repl.at
@@ -0,0 +1,82 @@
+# This file is part of GNU Mailutils. -*- Autotest -*-
+# Copyright (C) 2010 Free Software Foundation, Inc.
+#
+# GNU Mailutils is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3, or (at
+# your option) any later version.
+#
+# GNU Mailutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
+
+m4_pushdef([MH_KEYWORDS],[repl])
+m4_pushdef([replcmd],[repl dnl
+-editor $abs_top_srcdir/mh/tests/mhed])
+
+MH_CHECK([repl msg],[repl00 repl-msg],[
+mkdir Mail/inbox
+AT_DATA([Mail/inbox/1],[From: address@hidden
+To: address@hidden
+Subject: test input
+
+message body
+])
+echo "quit" | replcmd +inbox 1 | sed "s|$dir/*||;s|  *$||"
+echo == Mail/draft ==
+cat Mail/draft
+],
+[0],
+[-- Editor invocation: Mail/draft
+-- Input file:
+To: <address@hidden>
+Subject: Re: test input
+X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
+--------
+-- Input file end
+What now? draft left on "Mail/draft".
+== Mail/draft ==
+To: <address@hidden>
+Subject: Re: test input
+X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
+--------
+Seen by mhed
+])
+
+MH_CHECK([repl -draftfolder],[repl01 repl-draftfolder],[
+mkdir Mail/inbox
+mkdir Mail/drafts
+AT_DATA([Mail/inbox/1],[From: address@hidden
+To: address@hidden
+Subject: test input
+
+message body
+])
+echo "quit" | replcmd -draftfolder drafts +inbox 1 | sed "s|$dir/*||;s|  *$||"
+echo == Mail/drafts/1 ==
+cat Mail/drafts/1
+],
+[0],
+[-- Editor invocation: Mail/drafts/1
+-- Input file:
+To: <address@hidden>
+Subject: Re: test input
+X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
+--------
+-- Input file end
+What now? draft left on "Mail/drafts/1".
+== Mail/drafts/1 ==
+To: <address@hidden>
+Subject: Re: test input
+X-Mailer: MH (AT_PACKAGE_NAME AT_PACKAGE_VERSION)
+--------
+Seen by mhed
+])
+
+m4_popdef([replcmd])
+m4_popdef([MH_KEYWORDS])
+# End of repl.at
\ No newline at end of file
diff --git a/mh/tests/rmf.at b/mh/tests/rmf.at
index 9f93647..49db7fd 100644
--- a/mh/tests/rmf.at
+++ b/mh/tests/rmf.at
@@ -14,7 +14,7 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
 
-m4_pushdef([MH_KEYWORDS],[rmm])
+m4_pushdef([MH_KEYWORDS],[rmf])
 
 MH_CHECK([rmf +folder],[rmf00 rmf+folder],[
 MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
diff --git a/mh/tests/rmm.at b/mh/tests/rmm.at
index 850fd7a..1e34d0c 100644
--- a/mh/tests/rmm.at
+++ b/mh/tests/rmm.at
@@ -47,5 +47,36 @@ test: 2 3 5
 cur: 1
 ])
 
+MH_CHECK([rmm rmmproc],[rmm02 rmmproc],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+echo "rmmproc: $abs_top_srcdir/mh/tests/movemsg" >> $MH
+rmm 1 4 || exit $?
+find Mail/inbox -name '[[0-9]]' | sort
+find Mail/removed -name '[[0-9]]' | sort
+],
+[0],
+[Mail/inbox/2
+Mail/inbox/3
+Mail/inbox/5
+Mail/removed/1
+Mail/removed/4
+])
+
+MH_CHECK([rmm -- null rmmproc],[rmm03 null-rmmproc],[
+MUT_MBCOPY($abs_top_srcdir/testsuite/mh/mbox1,[Mail/inbox])
+echo "rmmproc:" >> $MH
+rmm 1 4 || exit $?
+find Mail/inbox -name '[[0-9]]' | sort
+test -f Mail/inbox/,1 || echo OK
+test -f Mail/inbox/,4 || echo OK
+],
+[0],
+[Mail/inbox/2
+Mail/inbox/3
+Mail/inbox/5
+OK
+OK
+])
+
 m4_popdef[MH_KEYWORDS])
 # End of rmm.at
diff --git a/mh/tests/testsuite.at b/mh/tests/testsuite.at
index 1e07c4a..f06f082 100644
--- a/mh/tests/testsuite.at
+++ b/mh/tests/testsuite.at
@@ -59,3 +59,4 @@ m4_include([pick.at])
 m4_include([burst.at])
 m4_include([comp.at])
 m4_include([forw.at])
+m4_include([repl.at])


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]