[git] GPGME - branch, master, updated. gpgme-1.6.0-136-g00ff6d0

by Justus Winter cvs at cvs.gnupg.org
Tue May 24 18:01:15 CEST 2016


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 "GnuPG Made Easy".

The branch, master has been updated
       via  00ff6d07330028da370c869e3ec442eb76f8cbb8 (commit)
       via  7bc9cc717e428f48d4b27016f44c9f3900b1fba6 (commit)
       via  0ebd6a1b43a96bffa78da89dc8629edac0a74d35 (commit)
       via  8b57f06e0c04f5c9b87a3c76618230d757412076 (commit)
       via  72afb68f8c2f0cb326f20b289215402fd849339d (commit)
      from  00e93b2cae0585ff10425421d9097a846943b21c (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 00ff6d07330028da370c869e3ec442eb76f8cbb8
Author: Justus Winter <justus at gnupg.org>
Date:   Tue May 24 17:57:10 2016 +0200

    python: Improve and test Context.wait.
    
    * lang/python/pyme/core.py (Context.wait): Improve docstring.  As the
    context passed to 'gpgme_wait' is never NULL, it is pointless to look
    at the returned context.  Always raise exceptions.
    * lang/python/tests/Makefile.am (pytests): Add new test.
    * lang/python/tests/t-wait.py: New file.
    
    Signed-off-by: Justus Winter <justus at gnupg.org>

diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index aca5ec2..5f8378d 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -316,23 +316,17 @@ class Context(GpgmeWrapper):
         errorcheck(pygpgme.gpgme_ctx_set_engine_info(self.wrapped, proto, file_name, home_dir))
 
     def wait(self, hang):
-        """Wait for asynchronous call to finish. Wait forever if hang is True
+        """Wait for asynchronous call to finish. Wait forever if hang is True.
+        Raises an exception on errors.
 
-        Return:
-            On an async call completion its return status.
-            On timeout - None.
+        Please read the GPGME manual for more information.
 
-        Please read the GPGME manual for more information."""
+        """
         ptr = pygpgme.new_gpgme_error_t_p()
-        context = pygpgme.gpgme_wait(self.wrapped, ptr, hang)
+        pygpgme.gpgme_wait(self.wrapped, ptr, hang)
         status = pygpgme.gpgme_error_t_p_value(ptr)
         pygpgme.delete_gpgme_error_t_p(ptr)
-
-        if context == None:
-            errorcheck(status)
-            return None
-        else:
-            return status
+        errorcheck(status)
 
     def op_edit(self, key, func, fnc_value, out):
         """Start key editing using supplied callback function"""
diff --git a/lang/python/tests/Makefile.am b/lang/python/tests/Makefile.am
index 236354f..7df40a2 100644
--- a/lang/python/tests/Makefile.am
+++ b/lang/python/tests/Makefile.am
@@ -39,7 +39,8 @@ py_tests = t-wrapper.py \
 	t-signers.py \
 	t-decrypt.py \
 	t-export.py \
-	t-edit.py
+	t-edit.py \
+	t-wait.py
 
 TESTS = $(top_srcdir)/tests/gpg/initial.test \
 	$(py_tests) \
diff --git a/lang/python/tests/t-wait.py b/lang/python/tests/t-wait.py
new file mode 100755
index 0000000..7eaa46a
--- /dev/null
+++ b/lang/python/tests/t-wait.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2016 g10 Code GmbH
+#
+# This file is part of GPGME.
+#
+# GPGME 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 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME 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 Lesser General
+# Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+import time
+from pyme import core, constants, errors
+import support
+
+support.init_gpgme(constants.PROTOCOL_OpenPGP)
+c = core.Context()
+c.set_armor(True)
+
+# Checking a message without a signature.
+sig = core.Data("foo\n")
+text = core.Data()
+c.op_verify_start(sig, None, text)
+
+try:
+    while True:
+        err = c.wait(False)
+        if err:
+            break
+        time.sleep(0.1)
+except Exception as e:
+    assert e.getcode() == errors.NO_DATA
+else:
+    assert False, "Expected an error, got none"

commit 7bc9cc717e428f48d4b27016f44c9f3900b1fba6
Author: Justus Winter <justus at gnupg.org>
Date:   Tue May 24 17:22:08 2016 +0200

    python: Make all GnuPG errors available.
    
    * lang/python/Makefile.am (errors.i): Generate file.
    * lang/python/gpgme.i: Include generated file.
    * lang/python/pyme/errors.py: Pull in all errors and error sources.
    
    Signed-off-by: Justus Winter <justus at gnupg.org>

diff --git a/lang/python/Makefile.am b/lang/python/Makefile.am
index 86c1965..f58f079 100644
--- a/lang/python/Makefile.am
+++ b/lang/python/Makefile.am
@@ -29,7 +29,12 @@ copystamp: $(srcdir)/pyme $(srcdir)/helpers.c $(srcdir)/helpers.h
 	if test "$(srcdir)" != "$(builddir)" ; then cp -r $^ . ; fi
 	touch $@
 
-gpgme_wrap.c pyme/pygpgme.py: gpgme.i gpgme.h copystamp
+errors.i:
+	sed -n -e \
+	  '/GPG_ERR_[^ ]* =/s/ *\(.*\) = .*/%constant long \1 = \1;/p' \
+	  `gpg-error-config --prefix`/include/gpg-error.h >$@
+
+gpgme_wrap.c pyme/pygpgme.py: gpgme.i errors.i gpgme.h copystamp
 	$(SWIG) -python -py3 $(SWIGOPT) \
 	  -o $(builddir)/gpgme_wrap.c -outdir $(builddir)/pyme \
 	  $<
@@ -38,7 +43,8 @@ all-local: gpgme_wrap.c pyme/pygpgme.py copystamp
 	$(PYTHON) $(srcdir)/setup.py build --verbose
 
 clean-local:
-	rm -rf -- build gpgme.h gpgme_wrap.c pyme/pygpgme.py copystamp
+	rm -rf -- build gpgme.h errors.i gpgme_wrap.c pyme/pygpgme.py \
+	  copystamp
 	if test "$(srcdir)" != "$(builddir)" ; then \
 	  rm -rf pyme helpers.c helpers.h ; \
 	fi
diff --git a/lang/python/gpgme.i b/lang/python/gpgme.i
index a82efb5..84bc6e9 100644
--- a/lang/python/gpgme.i
+++ b/lang/python/gpgme.i
@@ -259,7 +259,7 @@ PyObject* object_to_gpgme_t(PyObject* input, const char* objtype, int argnum) {
 %}
 %include "gpgme.h"
 
-%constant long EOF = GPG_ERR_EOF;
+%include "errors.i"
 
 // Generating and handling pointers-to-pointers.
 
diff --git a/lang/python/pyme/errors.py b/lang/python/pyme/errors.py
index 5c8f922..f716421 100644
--- a/lang/python/pyme/errors.py
+++ b/lang/python/pyme/errors.py
@@ -17,6 +17,9 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 
 from . import pygpgme
+from . import util
+
+util.process_constants('GPG_ERR_', globals())
 
 class GPGMEError(Exception):
     def __init__(self, error = None, message = None):
@@ -43,8 +46,6 @@ class GPGMEError(Exception):
     def __str__(self):
         return "%s (%d,%d)"%(self.getstring(), self.getsource(), self.getcode())
 
-EOF = getattr(pygpgme, "EOF")
-
 def errorcheck(retval, extradata = None):
     if retval:
         raise GPGMEError(retval, extradata)

commit 0ebd6a1b43a96bffa78da89dc8629edac0a74d35
Author: Justus Winter <justus at gnupg.org>
Date:   Tue May 24 16:45:39 2016 +0200

    python: Move the base wrapper class.
    
    * python/lang/pyme/util.py (GpgmeWrapper): Move...
    * python/lang/pyme/core.py: ... here.
    
    Signed-off-by: Justus Winter <justus at gnupg.org>

diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index f15444b..aca5ec2 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -22,7 +22,83 @@
 from . import pygpgme
 from .errors import errorcheck, GPGMEError
 from . import errors
-from .util import GpgmeWrapper
+
+class GpgmeWrapper(object):
+    """Base class all Pyme wrappers for GPGME functionality.  Not to be
+    instantiated directly."""
+
+    def __init__(self, wrapped):
+        self._callback_excinfo = None
+        self.wrapped = wrapped
+
+    def __repr__(self):
+        return '<instance of %s.%s with GPG object at %s>' % \
+               (__name__, self.__class__.__name__,
+                self.wrapped)
+
+    def __str__(self):
+        return repr(self)
+
+    def __hash__(self):
+        return hash(repr(self.wrapped))
+
+    def __eq__(self, other):
+        if other == None:
+            return False
+        else:
+            return repr(self.wrapped) == repr(other.wrapped)
+
+    def _getctype(self):
+        """Must be implemented by child classes.
+
+        Must return the name of the c type."""
+        raise NotImplementedError()
+
+    def _getnameprepend(self):
+        """Must be implemented by child classes.
+
+        Must return the prefix of all c functions mapped to methods of
+        this class."""
+        raise NotImplementedError()
+
+    def _errorcheck(self, name):
+        """Must be implemented by child classes.
+
+        This function must return a trueish value for all c functions
+        returning gpgme_error_t."""
+        raise NotImplementedError()
+
+    def __getattr__(self, key):
+        """On-the-fly function generation."""
+        if key[0] == '_' or self._getnameprepend() == None:
+            return None
+        name = self._getnameprepend() + key
+        func = getattr(pygpgme, name)
+
+        if self._errorcheck(name):
+            def _funcwrap(slf, *args, **kwargs):
+                result = func(slf.wrapped, *args, **kwargs)
+                if slf._callback_excinfo:
+                    pygpgme.pygpgme_raise_callback_exception(slf)
+                return errorcheck(result, "Invocation of " + name)
+        else:
+            def _funcwrap(slf, *args, **kwargs):
+                result = func(slf.wrapped, *args, **kwargs)
+                if slf._callback_excinfo:
+                    pygpgme.pygpgme_raise_callback_exception(slf)
+                return result
+
+        _funcwrap.__doc__ = getattr(func, "__doc__")
+
+        # Monkey-patch the class.
+        setattr(self.__class__, key, _funcwrap)
+
+        # Bind the method to 'self'.
+        def wrapper(*args, **kwargs):
+            return _funcwrap(self, *args, **kwargs)
+        _funcwrap.__doc__ = getattr(func, "__doc__")
+
+        return wrapper
 
 class Context(GpgmeWrapper):
     """From the GPGME C documentation:
diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py
index b54cd4d..d52cd1f 100644
--- a/lang/python/pyme/util.py
+++ b/lang/python/pyme/util.py
@@ -17,7 +17,6 @@
 #    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 
 from . import pygpgme
-from .errors import errorcheck
 
 def process_constants(starttext, dict):
     """Called by the constant libraries to load up the appropriate constants
@@ -28,80 +27,3 @@ def process_constants(starttext, dict):
             continue
         name = identifier[index:]
         dict[name] = getattr(pygpgme, identifier)
-
-class GpgmeWrapper(object):
-    """Base class all Pyme wrappers for GPGME functionality.  Not to be
-    instantiated directly."""
-
-    def __init__(self, wrapped):
-        self._callback_excinfo = None
-        self.wrapped = wrapped
-
-    def __repr__(self):
-        return '<instance of %s.%s with GPG object at %s>' % \
-               (__name__, self.__class__.__name__,
-                self.wrapped)
-
-    def __str__(self):
-        return repr(self)
-
-    def __hash__(self):
-        return hash(repr(self.wrapped))
-
-    def __eq__(self, other):
-        if other == None:
-            return False
-        else:
-            return repr(self.wrapped) == repr(other.wrapped)
-
-    def _getctype(self):
-        """Must be implemented by child classes.
-
-        Must return the name of the c type."""
-        raise NotImplementedError()
-
-    def _getnameprepend(self):
-        """Must be implemented by child classes.
-
-        Must return the prefix of all c functions mapped to methods of
-        this class."""
-        raise NotImplementedError()
-
-    def _errorcheck(self, name):
-        """Must be implemented by child classes.
-
-        This function must return a trueish value for all c functions
-        returning gpgme_error_t."""
-        raise NotImplementedError()
-
-    def __getattr__(self, key):
-        """On-the-fly function generation."""
-        if key[0] == '_' or self._getnameprepend() == None:
-            return None
-        name = self._getnameprepend() + key
-        func = getattr(pygpgme, name)
-
-        if self._errorcheck(name):
-            def _funcwrap(slf, *args, **kwargs):
-                result = func(slf.wrapped, *args, **kwargs)
-                if slf._callback_excinfo:
-                    pygpgme.pygpgme_raise_callback_exception(slf)
-                return errorcheck(result, "Invocation of " + name)
-        else:
-            def _funcwrap(slf, *args, **kwargs):
-                result = func(slf.wrapped, *args, **kwargs)
-                if slf._callback_excinfo:
-                    pygpgme.pygpgme_raise_callback_exception(slf)
-                return result
-
-        _funcwrap.__doc__ = getattr(func, "__doc__")
-
-        # Monkey-patch the class.
-        setattr(self.__class__, key, _funcwrap)
-
-        # Bind the method to 'self'.
-        def wrapper(*args, **kwargs):
-            return _funcwrap(self, *args, **kwargs)
-        _funcwrap.__doc__ = getattr(func, "__doc__")
-
-        return wrapper

commit 8b57f06e0c04f5c9b87a3c76618230d757412076
Author: Justus Winter <justus at gnupg.org>
Date:   Tue May 24 15:14:53 2016 +0200

    python: Support status callbacks.
    
    * lang/python/helpers.c (pyStatusCb): New function.
    (pygpgme_set_status_cb): Likewise.
    * lang/python/helpers.h (pygpgme_set_status_cb): New prototype.
    * lang/python/pyme/core.py (Context.__init__): Initialize
    'last_statuscb'.
    (Context._free_statuscb): New function.
    (Context.set_status_cb): Likewise.
    * lang/python/tests/t-callbacks.py: Test status callbacks.
    
    Signed-off-by: Justus Winter <justus at gnupg.org>

diff --git a/lang/python/helpers.c b/lang/python/helpers.c
index d0c1f3b..ec7264a 100644
--- a/lang/python/helpers.c
+++ b/lang/python/helpers.c
@@ -272,7 +272,72 @@ void pygpgme_set_progress_cb(gpgme_ctx_t ctx, PyObject *cb, PyObject **freelater
   *freelater = cb;
   gpgme_set_progress_cb(ctx, (gpgme_progress_cb_t) pyProgressCb, (void *) cb);
 }
+

+/* Status callbacks.  */
+static gpgme_error_t pyStatusCb(void *hook, const char *keyword,
+                                const char *args) {
+  gpgme_error_t err = 0;
+  PyObject *pyhook = (PyObject *) hook;
+  PyObject *self = NULL;
+  PyObject *func = NULL;
+  PyObject *dataarg = NULL;
+  PyObject *pyargs = NULL;
+  PyObject *retval = NULL;
+
+  assert (PyTuple_Check(pyhook));
+  assert (PyTuple_Size(pyhook) == 2 || PyTuple_Size(pyhook) == 3);
+  self = PyTuple_GetItem(pyhook, 0);
+  func = PyTuple_GetItem(pyhook, 1);
+  if (PyTuple_Size(pyhook) == 3) {
+    dataarg = PyTuple_GetItem(pyhook, 2);
+    pyargs = PyTuple_New(3);
+  } else {
+    pyargs = PyTuple_New(2);
+  }
+
+  if (keyword)
+    PyTuple_SetItem(pyargs, 0, PyUnicode_DecodeUTF8(keyword, strlen (keyword),
+                                                    "strict"));
+  else
+    {
+      Py_INCREF(Py_None);
+      PyTuple_SetItem(pyargs, 0, Py_None);
+    }
+  PyTuple_SetItem(pyargs, 1, PyUnicode_DecodeUTF8(args, strlen (args),
+                                                "strict"));
+  if (PyErr_Occurred()) {
+    err = gpg_error(GPG_ERR_GENERAL);
+    Py_DECREF(pyargs);
+    goto leave;
+  }
+
+  if (dataarg) {
+    Py_INCREF(dataarg);
+    PyTuple_SetItem(pyargs, 2, dataarg);
+  }
+
+  retval = PyObject_CallObject(func, pyargs);
+  if (PyErr_Occurred())
+    err = pygpgme_exception2code();
+  Py_DECREF(pyargs);
+  Py_XDECREF(retval);
+
+ leave:
+  if (err)
+    pygpgme_stash_callback_exception(self);
+  return err;
+}
 
+void pygpgme_set_status_cb(gpgme_ctx_t ctx, PyObject *cb,
+                           PyObject **freelater) {
+  if (cb == Py_None) {
+    gpgme_set_status_cb(ctx, NULL, NULL);
+    return;
+  }
+  Py_INCREF(cb);
+  *freelater = cb;
+  gpgme_set_status_cb(ctx, (gpgme_status_cb_t) pyStatusCb, (void *) cb);
+}
 

 /* Edit callbacks.  */
 gpgme_error_t pyEditCb(void *opaque, gpgme_status_code_t status,
diff --git a/lang/python/helpers.h b/lang/python/helpers.h
index 4bd8ef8..5dd88a0 100644
--- a/lang/python/helpers.h
+++ b/lang/python/helpers.h
@@ -35,6 +35,8 @@ PyObject *pygpgme_raise_callback_exception(PyObject *self);
 void pygpgme_set_passphrase_cb(gpgme_ctx_t ctx, PyObject *cb,
 			       PyObject **freelater);
 void pygpgme_set_progress_cb(gpgme_ctx_t ctx, PyObject *cb, PyObject **freelater);
+void pygpgme_set_status_cb(gpgme_ctx_t ctx, PyObject *cb,
+                           PyObject **freelater);
 
 gpgme_error_t pyEditCb(void *opaque, gpgme_status_code_t status,
 		       const char *args, int fd);
diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index 43a2413..f15444b 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -64,6 +64,7 @@ class Context(GpgmeWrapper):
         super().__init__(wrapped)
         self.last_passcb = None
         self.last_progresscb = None
+        self.last_statuscb = None
 
     def __del__(self):
         if not pygpgme:
@@ -91,6 +92,14 @@ class Context(GpgmeWrapper):
                 pygpgme.delete_PyObject_p_p(self.last_progresscb)
             self.last_progresscb = None
 
+    def _free_statuscb(self):
+        if self.last_statuscb != None:
+            if pygpgme.pygpgme_clear_generic_cb:
+                pygpgme.pygpgme_clear_generic_cb(self.last_statuscb)
+            if pygpgme.delete_PyObject_p_p:
+                pygpgme.delete_PyObject_p_p(self.last_statuscb)
+            self.last_statuscb = None
+
     def op_keylist_all(self, *args, **kwargs):
         self.op_keylist_start(*args, **kwargs)
         key = self.op_keylist_next()
@@ -195,6 +204,29 @@ class Context(GpgmeWrapper):
                 hookdata = (self, func, hook)
         pygpgme.pygpgme_set_progress_cb(self.wrapped, hookdata, self.last_progresscb)
 
+    def set_status_cb(self, func, hook=None):
+        """Sets the status callback to the function specified by FUNC.  If
+        FUNC is None, the callback will be cleared.
+
+        The function will be called with two arguments, keyword and
+        args.  If HOOK is not None, it will be supplied as third
+        argument.
+
+        Please see the GPGME manual for more information.
+
+        """
+        self._free_statuscb()
+        if func == None:
+            hookdata = None
+        else:
+            self.last_statuscb = pygpgme.new_PyObject_p_p()
+            if hook == None:
+                hookdata = (self, func)
+            else:
+                hookdata = (self, func, hook)
+        pygpgme.pygpgme_set_status_cb(self.wrapped, hookdata,
+                                      self.last_statuscb)
+
     def get_engine_info(self):
         """Returns this context specific engine info"""
         return pygpgme.gpgme_ctx_get_engine_info(self.wrapped)
diff --git a/lang/python/tests/t-callbacks.py b/lang/python/tests/t-callbacks.py
index d962dc4..5797526 100755
--- a/lang/python/tests/t-callbacks.py
+++ b/lang/python/tests/t-callbacks.py
@@ -146,3 +146,38 @@ except Exception as e:
     assert e == myException
 else:
     assert False, "Expected an error, got none"
+
+
+
+# Test the status callback.
+source = core.Data("Hallo Leute\n")
+sink = core.Data()
+
+status_cb_called = False
+def status_cb(keyword, args, hook=None):
+    global status_cb_called
+    status_cb_called = True
+    assert hook == cookie
+
+c = core.Context()
+c.set_status_cb(status_cb, cookie)
+c.set_ctx_flag("full-status", "1")
+c.op_encrypt([alpha], constants.ENCRYPT_ALWAYS_TRUST, source, sink)
+assert status_cb_called
+
+# Test exceptions.
+source = core.Data("Hallo Leute\n")
+sink = core.Data()
+
+def status_cb(keyword, args):
+    raise myException
+
+c = core.Context()
+c.set_status_cb(status_cb, None)
+c.set_ctx_flag("full-status", "1")
+try:
+    c.op_encrypt([alpha], constants.ENCRYPT_ALWAYS_TRUST, source, sink)
+except Exception as e:
+    assert e == myException
+else:
+    assert False, "Expected an error, got none"

commit 72afb68f8c2f0cb326f20b289215402fd849339d
Author: Justus Winter <justus at gnupg.org>
Date:   Tue May 24 15:12:40 2016 +0200

    python: Improve docstring.
    
    * lang/python/pyme/core.py (Context.set_progress_cb): Improve
    docstring.
    
    Signed-off-by: Justus Winter <justus at gnupg.org>

diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index 1b4e6ae..43a2413 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -173,12 +173,17 @@ class Context(GpgmeWrapper):
         pygpgme.pygpgme_set_passphrase_cb(self.wrapped, hookdata, self.last_passcb)
 
     def set_progress_cb(self, func, hook=None):
-        """Sets the progress meter callback to the function specified by
+        """Sets the progress meter callback to the function specified by FUNC.
+        If FUNC is None, the callback will be cleared.
 
-        This function will be called to provide an interactive update of
-        the system's progress.
+        This function will be called to provide an interactive update
+        of the system's progress.  The function will be called with
+        three arguments, type, total, and current.  If HOOK is not
+        None, it will be supplied as fourth argument.
 
-        Please see the GPGME manual for more information."""
+        Please see the GPGME manual for more information.
+
+        """
         self._free_progresscb()
         if func == None:
             hookdata = None

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

Summary of changes:
 lang/python/Makefile.am                      |  10 +-
 lang/python/gpgme.i                          |   2 +-
 lang/python/helpers.c                        |  65 ++++++++++++
 lang/python/helpers.h                        |   2 +
 lang/python/pyme/core.py                     | 141 +++++++++++++++++++++++----
 lang/python/pyme/errors.py                   |   5 +-
 lang/python/pyme/util.py                     |  78 ---------------
 lang/python/tests/Makefile.am                |   3 +-
 lang/python/tests/t-callbacks.py             |  35 +++++++
 lang/python/tests/{t-export.py => t-wait.py} |  27 ++---
 10 files changed, 256 insertions(+), 112 deletions(-)
 copy lang/python/tests/{t-export.py => t-wait.py} (67%)


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list