diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0da46a9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/gpgme-1.10.0.tar.bz2
diff --git a/.gpgme.metadata b/.gpgme.metadata
new file mode 100644
index 0000000..2367c73
--- /dev/null
+++ b/.gpgme.metadata
@@ -0,0 +1 @@
+77d3390887da25ed70b7ac04392360efbdca501f SOURCES/gpgme-1.10.0.tar.bz2
diff --git a/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch b/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch
new file mode 100644
index 0000000..080fde0
--- /dev/null
+++ b/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch
@@ -0,0 +1,47 @@
+From b99502274ae5efdf6df0d967900ec3d1e64373d7 Mon Sep 17 00:00:00 2001
+From: Werner Koch <wk@gnupg.org>
+Date: Thu, 12 Apr 2018 20:36:30 +0200
+Subject: [PATCH] core: Tweak STATUS_FAILURE handling.
+
+* src/op-support.c (_gpgme_parse_failure): Ignore failures with
+location "gpg-exit".
+* tests/gpg/t-verify.c (main): Adjust for the now working checking of
+the second key.
+
+Signed-off-by: Werner Koch <wk@gnupg.org>
+---
+ src/op-support.c     | 10 +++++++++-
+ tests/gpg/t-verify.c |  8 +++++---
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/src/op-support.c b/src/op-support.c
+index 43cb1c76..e55875f9 100644
+--- a/src/op-support.c
++++ b/src/op-support.c
+@@ -400,7 +400,13 @@ _gpgme_parse_plaintext (char *args, char **filenamep)
+ 
+ 
+ /* Parse a FAILURE status line and return the error code.  ARGS is
+-   modified to contain the location part.  */
++ * modified to contain the location part.  Note that for now we ignore
++ * failure codes with a location of gpg-exit; they are too trouble
++ * some.  Instead we should eventually record that error in the
++ * context and provide a function to return a fuller error
++ * description; this could then also show the location of the error
++ * (e.g. "option- parser") to make it easier for the user to detect
++ * the actual error. */
+ gpgme_error_t
+ _gpgme_parse_failure (char *args)
+ {
+@@ -418,6 +424,8 @@ _gpgme_parse_failure (char *args)
+     *where = '\0';
+ 
+   where = args;
++  if (!strcmp (where, "gpg-exit"))
++    return 0;
+ 
+   return atoi (which);
+ }
+-- 
+2.14.3
+
diff --git a/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch b/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch
new file mode 100644
index 0000000..39298db
--- /dev/null
+++ b/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch
@@ -0,0 +1,47 @@
+From 07a8ac908cbadb22c344895ebf9cc00c6a8fd3f7 Mon Sep 17 00:00:00 2001
+From: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
+Date: Wed, 29 Mar 2017 07:05:41 +0200
+Subject: [PATCH] don't add extra libraries for linking
+
+Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
+---
+ lang/cpp/src/GpgmeppConfig.cmake.in.in | 2 +-
+ src/gpgme-config.in                    | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/lang/cpp/src/GpgmeppConfig.cmake.in.in b/lang/cpp/src/GpgmeppConfig.cmake.in.in
+index 73f5eaad..3104d715 100644
+--- a/lang/cpp/src/GpgmeppConfig.cmake.in.in
++++ b/lang/cpp/src/GpgmeppConfig.cmake.in.in
+@@ -63,7 +63,7 @@ add_library(Gpgmepp SHARED IMPORTED)
+ 
+ set_target_properties(Gpgmepp PROPERTIES
+   INTERFACE_INCLUDE_DIRECTORIES "@resolved_includedir@/gpgme++;@resolved_includedir@"
+-  INTERFACE_LINK_LIBRARIES "pthread;@resolved_libdir@/libgpgme@libsuffix@;@LIBASSUAN_LIBS@"
++  INTERFACE_LINK_LIBRARIES "pthread;@resolved_libdir@/libgpgme@libsuffix@"
+   IMPORTED_LOCATION "@resolved_libdir@/libgpgmepp@libsuffix@"
+ )
+ 
+diff --git a/src/gpgme-config.in b/src/gpgme-config.in
+index a4d152e1..6a854e4a 100644
+--- a/src/gpgme-config.in
++++ b/src/gpgme-config.in
+@@ -22,12 +22,12 @@ cflags="-I@includedir@"
+ libs="-L@libdir@"
+ 
+ # Network libraries.
+-assuan_cflags="@LIBASSUAN_CFLAGS@"
+-assuan_libs="@LIBASSUAN_LIBS@"
++#assuan_cflags="@LIBASSUAN_CFLAGS@"
++#assuan_libs="@LIBASSUAN_LIBS@"
+ 
+ # Configure libgpg-error.
+ gpg_error_cflags="@GPG_ERROR_CFLAGS@"
+-gpg_error_libs="@GPG_ERROR_LIBS@"
++#gpg_error_libs="@GPG_ERROR_LIBS@"
+ 
+ # Configure thread packages.
+ thread_modules=""
+-- 
+2.15.1
+
diff --git a/SOURCES/0001-fix-stupid-ax_python_devel.patch b/SOURCES/0001-fix-stupid-ax_python_devel.patch
new file mode 100644
index 0000000..40cf7df
--- /dev/null
+++ b/SOURCES/0001-fix-stupid-ax_python_devel.patch
@@ -0,0 +1,27 @@
+From b0eabea4b1232ee7f45d13b8add928d463f37444 Mon Sep 17 00:00:00 2001
+From: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
+Date: Wed, 29 Mar 2017 07:13:35 +0200
+Subject: [PATCH] fix stupid ax_python_devel
+
+References: https://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=commit;h=883a2abd5af5c96be894d5ef7ee6e9a2b8e64307
+Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
+---
+ m4/ax_python_devel.m4 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4
+index b990d5b3..318b089c 100644
+--- a/m4/ax_python_devel.m4
++++ b/m4/ax_python_devel.m4
+@@ -137,7 +137,7 @@ variable to configure. See ``configure --help'' for reference.
+ 	#
+ 	AC_MSG_CHECKING([for the distutils Python package])
+ 	ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
+-	if test -z "$ac_distutils_result"; then
++	if test $? -eq 0; then
+ 		AC_MSG_RESULT([yes])
+ 	else
+ 		AC_MSG_RESULT([no])
+-- 
+2.12.1
+
diff --git a/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch b/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch
new file mode 100644
index 0000000..6bbbd78
--- /dev/null
+++ b/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch
@@ -0,0 +1,901 @@
+diff -Naur a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp
+--- a/lang/cpp/src/context.cpp	2018-11-12 13:57:39.922527452 +0100
++++ b/lang/cpp/src/context.cpp	2018-11-14 13:22:37.402101541 +0100
+@@ -222,6 +222,7 @@
+         }
+         break;
+     default:
++        gpgme_release(ctx);
+         return 0;
+     }
+ 
+@@ -267,6 +268,7 @@
+         }
+         break;
+     default:
++        gpgme_release(ctx);
+         if (error) {
+             *error = Error::fromCode(GPG_ERR_INV_ARG);
+         }
+diff -Naur a/lang/cpp/src/data.cpp b/lang/cpp/src/data.cpp
+--- a/lang/cpp/src/data.cpp	2018-11-12 13:57:39.925527381 +0100
++++ b/lang/cpp/src/data.cpp	2018-11-14 13:29:09.167961419 +0100
+@@ -244,6 +244,7 @@
+     }
+ 
+     if (gpgme_op_keylist_from_data_start (ctx->impl()->ctx, d->data, 0)) {
++        delete ctx;
+         return ret;
+     }
+ 
+diff -Naur a/lang/python/gpgme.i b/lang/python/gpgme.i
+--- a/lang/python/gpgme.i	2018-11-12 13:57:39.842529333 +0100
++++ b/lang/python/gpgme.i	2018-11-14 13:04:00.404376027 +0100
+@@ -43,7 +43,7 @@
+     {
+       encodedInput = PyUnicode_AsUTF8String($input);
+       if (encodedInput == NULL)
+-        return NULL;
++        SWIG_fail;
+       $1 = PyBytes_AsString(encodedInput);
+     }
+   else if (PyBytes_Check($input))
+@@ -52,22 +52,25 @@
+     PyErr_Format(PyExc_TypeError,
+                  "arg %d: expected str, bytes, or None, got %s",
+ 		 $argnum, $input->ob_type->tp_name);
+-    return NULL;
++    SWIG_fail;
+   }
+ }
+ %typemap(freearg) const char * {
+   Py_XDECREF(encodedInput$argnum);
+ }
+ 
++%typemap(arginit) const char *[] {
++  $1 = NULL;
++}
++
+ /* Likewise for a list of strings.  */
+-%typemap(in) const char *[] (void *vector = NULL,
+-                             size_t size,
++%typemap(in) const char *[] (size_t size,
+                              PyObject **pyVector = NULL) {
+   /* Check if is a list */
+   if (PyList_Check($input)) {
+     size_t i, j;
+     size = PyList_Size($input);
+-    $1 = (char **) (vector = malloc((size+1) * sizeof(char *)));
++    $1 = (char **) malloc((size+1) * sizeof(char *));
+     pyVector = calloc(sizeof *pyVector, size);
+ 
+     for (i = 0; i < size; i++) {
+@@ -76,12 +79,7 @@
+         {
+           pyVector[i] = PyUnicode_AsUTF8String(o);
+           if (pyVector[i] == NULL)
+-            {
+-              free(vector);
+-              for (j = 0; j < i; j++)
+-                Py_XDECREF(pyVector[j]);
+-              return NULL;
+-            }
++            SWIG_fail;
+           $1[i] = PyBytes_AsString(pyVector[i]);
+         }
+       else if (PyString_Check(o))
+@@ -91,8 +89,7 @@
+                      "arg %d: list must contain only str or bytes, got %s "
+                      "at position %d",
+                      $argnum, o->ob_type->tp_name, i);
+-	free($1);
+-	return NULL;
++	SWIG_fail;
+       }
+     }
+     $1[i] = NULL;
+@@ -100,14 +97,17 @@
+     PyErr_Format(PyExc_TypeError,
+                  "arg %d: expected a list of str or bytes, got %s",
+                  $argnum, $input->ob_type->tp_name);
+-    return NULL;
++    SWIG_fail;
+   }
+ }
+ %typemap(freearg) const char *[] {
+-  size_t i;
+-  free(vector$argnum);
+-  for (i = 0; i < size$argnum; i++)
+-    Py_XDECREF(pyVector$argnum[i]);
++  if (pyVector$argnum) {
++    size_t i;
++    for (i = 0; i < size$argnum; i++)
++      Py_XDECREF(pyVector$argnum[i]);
++    free(pyVector$argnum);
++  }
++  if ($1) free($1);
+ }
+ 
+ /* Release returned buffers as necessary.  */
+@@ -125,7 +125,7 @@
+   if (!PySequence_Check($input)) {
+     PyErr_Format(PyExc_ValueError, "arg %d: Expected a list of gpgme_key_t",
+ 		 $argnum);
+-    return NULL;
++    SWIG_fail;
+   }
+   if((numb = PySequence_Length($input)) != 0) {
+     $1 = (gpgme_key_t*)malloc((numb+1)*sizeof(gpgme_key_t));
+@@ -142,8 +142,7 @@
+                      "arg %d: list must contain only gpgme_key_ts, got %s "
+                      "at position %d",
+                      $argnum, pypointer->ob_type->tp_name, i);
+-        free($1);
+-	return NULL;
++	SWIG_fail;
+       }
+       Py_DECREF(pypointer);
+     }
+@@ -169,7 +168,7 @@
+     pypointer = _gpg_obj2gpgme_data_t($input, $argnum, &wrapper,
+                                        &bytesio, &view);
+     if (pypointer == NULL)
+-      return NULL;
++      SWIG_fail;
+     have_view = !! view.obj;
+ 
+     /* input = $input, 1 = $1, 1_descriptor = $1_descriptor */
+@@ -179,7 +178,7 @@
+     if ((SWIG_ConvertPtr(pypointer,(void **) &$1, $1_descriptor,
+          SWIG_POINTER_EXCEPTION | $disown )) == -1) {
+       Py_DECREF(pypointer);
+-      return NULL;
++      SWIG_fail;
+     }
+     Py_DECREF(pypointer);
+   }
+@@ -336,6 +335,11 @@
+     PyErr_SetString(PyExc_TypeError, "Numeric argument expected");
+ }
+ 
++%typemap(arginit) (void *buffer, size_t size), (char *buf, size_t buflen) {
++  $1 = NULL;
++  $2 = 0;
++}
++
+ /* Those are for gpgme_data_read() and gpgme_strerror_r().  */
+ %typemap(in) (void *buffer, size_t size), (char *buf, size_t buflen) {
+   {
+@@ -349,12 +353,12 @@
+     else
+       {
+         PyErr_SetString(PyExc_TypeError, "Numeric argument expected");
+-        return NULL;
++        SWIG_fail;
+       }
+ 
+     if (tmp$argnum < 0) {
+       PyErr_SetString(PyExc_ValueError, "Positive integer expected");
+-      return NULL;
++      SWIG_fail;
+     }
+     $2 = (size_t) tmp$argnum;
+     $1 = ($1_ltype) malloc($2+1);
+@@ -363,11 +367,11 @@
+ %typemap(argout) (void *buffer, size_t size), (char *buf, size_t buflen) {
+   Py_XDECREF($result);   /* Blow away any previous result */
+   if (result < 0) {      /* Check for I/O error */
+-    free($1);
++    if ($1) free($1);
+     return PyErr_SetFromErrno(PyExc_RuntimeError);
+   }
+   $result = PyBytes_FromStringAndSize($1,result);
+-  free($1);
++  if ($1) free($1);
+ }
+ 
+ /* For gpgme_data_write, but should be universal.  */
+@@ -380,11 +384,11 @@
+     {
+       encodedInput = PyUnicode_AsUTF8String($input);
+       if (encodedInput == NULL)
+-        return NULL;
++        SWIG_fail;
+       if (PyBytes_AsStringAndSize(encodedInput, (char **) &$1, &ssize) == -1)
+         {
+           Py_DECREF(encodedInput);
+-          return NULL;
++          SWIG_fail;
+         }
+     }
+   else if (PyBytes_Check($input))
+@@ -393,7 +397,7 @@
+     PyErr_Format(PyExc_TypeError,
+                  "arg %d: expected str, bytes, or None, got %s",
+ 		 $argnum, $input->ob_type->tp_name);
+-    return NULL;
++    SWIG_fail;
+   }
+ 
+   if (! $1)
+@@ -422,8 +426,17 @@
+     size++;
+   }
+   $result = PyList_New(size);
++  if ($result == NULL)
++    SWIG_fail;
+   for (i=0,curr=$1; i<size; i++,curr=curr->next) {
+     PyObject *o = SWIG_NewPointerObj(SWIG_as_voidptr(curr), $1_descriptor, %newpointer_flags);
++    if (o == NULL) {
++      int j;
++      for (j = 0; j < i; j++)
++        Py_XDECREF(PyList_GetItem($result, j));
++      Py_DECREF($result);
++      SWIG_fail;
++    }
+     PyList_SetItem($result, i, o);
+   }
+ }
+@@ -436,6 +449,8 @@
+   PyObject *fragile;
+   fragile = SWIG_NewPointerObj(SWIG_as_voidptr($1), $1_descriptor,
+                                %newpointer_flags);
++  if (fragile == NULL)
++    SWIG_fail;
+   $result = _gpg_wrap_result(fragile, name);
+   Py_DECREF(fragile);
+ }
+@@ -459,22 +474,28 @@
+   }
+   $result = PyList_New(size);
+   if ($result == NULL)
+-    return NULL;	/* raise */
++    SWIG_fail;	/* raise */
+   for (i=0,curr=$1; i<size; i++,curr=curr->next) {
+     PyObject *fragile, *o;
+     fragile = SWIG_NewPointerObj(SWIG_as_voidptr(curr), $1_descriptor,
+                                  %newpointer_flags);
+     if (fragile == NULL)
+       {
++        int j;
++        for (j = 0; j < i; j++)
++          Py_XDECREF(PyList_GetItem($result, j));
+         Py_DECREF($result);
+-        return NULL;	/* raise */
++        SWIG_fail;	/* raise */
+       }
+     o = _gpg_wrap_result(fragile, "EngineInfo");
+     Py_DECREF(fragile);
+     if (o == NULL)
+       {
++        int j;
++        for (j = 0; j < i; j++)
++          Py_XDECREF(PyList_GetItem($result, j));
+         Py_DECREF($result);
+-        return NULL;	/* raise */
++        SWIG_fail;	/* raise */
+       }
+     PyList_SetItem($result, i, o);
+   }
+diff -Naur a/lang/qt/tests/t-various.cpp b/lang/qt/tests/t-various.cpp
+--- a/lang/qt/tests/t-various.cpp	2018-11-12 13:57:39.907527804 +0100
++++ b/lang/qt/tests/t-various.cpp	2018-11-14 15:22:25.475304073 +0100
+@@ -34,6 +34,7 @@
+  #include "config.h"
+ #endif
+ 
++#include <QScopedPointer>
+ #include <QDebug>
+ #include <QTest>
+ #include <QSignalSpy>
+@@ -103,27 +104,30 @@
+         if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.1.13") {
+             return;
+         }
+-        KeyListJob *job = openpgp()->keyListJob(false, true, true);
+         std::vector<GpgME::Key> keys;
+-        GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("alfa@example.net"),
+-                                                false, keys);
+-        delete job;
+-        QVERIFY (!result.error());
+-        QVERIFY (keys.size() == 1);
++        {
++          QScopedPointer<KeyListJob> job(openpgp()->keyListJob(false, true, true));
++          QVERIFY(!job.isNull());
++          GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("alfa@example.net"),
++                                                  false, keys);
++          QVERIFY (!result.error());
++          QVERIFY (keys.size() == 1);
++        }
+         Key key = keys.front();
+ 
+         QVERIFY (key.numUserIDs() == 3);
+         const char uid[] = "Foo Bar (with comment) <foo@bar.baz>";
+ 
+-        auto ctx = Context::createForProtocol(key.protocol());
+-        QVERIFY (ctx);
+-        TestPassphraseProvider provider;
+-        ctx->setPassphraseProvider(&provider);
+-        ctx->setPinentryMode(Context::PinentryLoopback);
+-
+-        QVERIFY(!ctx->addUid(key, uid));
+-        delete ctx;
+-        key.update();
++        {
++          QScopedPointer<Context> ctx(Context::createForProtocol(key.protocol()));
++          QVERIFY (!ctx.isNull());
++          TestPassphraseProvider provider;
++          ctx->setPassphraseProvider(&provider);
++          ctx->setPinentryMode(Context::PinentryLoopback);
++
++          QVERIFY(!ctx->addUid(key, uid));
++          key.update();
++        }
+ 
+         QVERIFY (key.numUserIDs() == 4);
+         bool id_found = false;;
+@@ -136,10 +140,12 @@
+         }
+         QVERIFY (id_found);
+ 
+-        ctx = Context::createForProtocol(key.protocol());
+-        QVERIFY (!ctx->revUid(key, uid));
+-        delete ctx;
+-        key.update();
++        {
++          QScopedPointer<Context> ctx(Context::createForProtocol(key.protocol()));
++          QVERIFY (!ctx.isNull());
++          QVERIFY (!ctx->revUid(key, uid));
++          key.update();
++        }
+ 
+         bool id_revoked = false;;
+         for (const auto &u: key.userIDs()) {
+diff -Naur a/src/engine.c b/src/engine.c
+--- a/src/engine.c	2018-11-12 13:57:40.081523713 +0100
++++ b/src/engine.c	2018-11-15 15:14:49.518729792 +0100
+@@ -459,7 +459,9 @@
+       if (!new_version)
+         {
+           free (new_file_name);
+-          free (new_home_dir);
++          if (new_home_dir)
++            free (new_home_dir);
++          return gpg_error_from_syserror ();
+         }
+     }
+ 
+diff -Naur a/src/engine-gpg.c b/src/engine-gpg.c
+--- a/src/engine-gpg.c	2018-11-12 13:57:40.083523666 +0100
++++ b/src/engine-gpg.c	2018-11-15 14:55:35.374077739 +0100
+@@ -968,7 +968,7 @@
+ 		== -1)
+ 	      {
+ 		int saved_errno = errno;
+-		free (fd_data_map);
++		free_fd_data_map (fd_data_map);
+ 		free_argv (argv);
+ 		return gpg_error (saved_errno);
+ 	      }
+@@ -978,10 +978,10 @@
+ 					       close_notify_handler,
+ 					       gpg))
+ 	      {
+-                /* We leak fd_data_map and the fds.  This is not easy
+-                   to avoid and given that we reach this here only
+-                   after a malloc failure for a small object, it is
+-                   probably better not to do anything.  */
++                close (fds[0]);
++                close (fds[1]);
++                free_fd_data_map (fd_data_map);
++                free_argv (argv);
+ 		return gpg_error (GPG_ERR_GENERAL);
+ 	      }
+ 	    /* If the data_type is FD, we have to do a dup2 here.  */
+@@ -1024,7 +1024,7 @@
+ 	      if (!argv[argc])
+ 		{
+                   int saved_err = gpg_error_from_syserror ();
+-		  free (fd_data_map);
++		  free_fd_data_map (fd_data_map);
+ 		  free_argv (argv);
+ 		  return saved_err;
+                 }
+@@ -1049,7 +1049,7 @@
+ 	  if (!argv[argc])
+ 	    {
+               int saved_err = gpg_error_from_syserror ();
+-	      free (fd_data_map);
++	      free_fd_data_map (fd_data_map);
+ 	      free_argv (argv);
+ 	      return saved_err;
+             }
+@@ -1104,6 +1104,9 @@
+       buffer = realloc (buffer, bufsize);
+       if (!buffer)
+ 	return gpg_error_from_syserror ();
++      /* Update buffer and bufsize here to prevent memory leaks.  */
++      gpg->status.buffer = buffer;
++      gpg->status.bufsize = bufsize;
+     }
+ 
+   nread = _gpgme_io_read (gpg->status.fd[0],
+@@ -1254,8 +1257,6 @@
+     }
+ 
+   /* Update the gpg object.  */
+-  gpg->status.bufsize = bufsize;
+-  gpg->status.buffer = buffer;
+   gpg->status.readpos = readpos;
+   return 0;
+ }
+@@ -1295,6 +1296,9 @@
+       buffer = realloc (buffer, bufsize);
+       if (!buffer)
+ 	return gpg_error_from_syserror ();
++      /* Prevent memory leaks.  */
++      gpg->colon.buffer = buffer;
++      gpg->colon.bufsize = bufsize;
+     }
+ 
+   nread = _gpgme_io_read (gpg->colon.fd[0], buffer+readpos, bufsize-readpos);
+@@ -1374,8 +1378,6 @@
+     }
+ 
+   /* Update the gpg object.  */
+-  gpg->colon.bufsize = bufsize;
+-  gpg->colon.buffer  = buffer;
+   gpg->colon.readpos = readpos;
+   return 0;
+ }
+diff -Naur a/src/engine-gpgsm.c b/src/engine-gpgsm.c
+--- a/src/engine-gpgsm.c	2018-11-12 13:57:40.083523666 +0100
++++ b/src/engine-gpgsm.c	2018-11-15 15:03:09.798301245 +0100
+@@ -1366,8 +1366,10 @@
+   gpgsm->output_cb.data = keydata;
+   err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ 		      : map_data_enc (gpgsm->output_cb.data));
+-  if (err)
++  if (err) {
++    free (cmd);
+     return err;
++  }
+   gpgsm_clear_fd (gpgsm, INPUT_FD);
+   gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+   gpgsm->inline_data = NULL;
+@@ -1467,8 +1469,10 @@
+   gpgsm->output_cb.data = keydata;
+   err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ 		      : map_data_enc (gpgsm->output_cb.data));
+-  if (err)
++  if (err) {
++    free (line);
+     return err;
++  }
+   gpgsm_clear_fd (gpgsm, INPUT_FD);
+   gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+   gpgsm->inline_data = NULL;
+diff -Naur a/src/gpgme-tool.c b/src/gpgme-tool.c
+--- a/src/gpgme-tool.c	2018-11-12 13:57:40.084523642 +0100
++++ b/src/gpgme-tool.c	2018-11-15 22:02:04.913188338 +0100
+@@ -2330,8 +2330,8 @@
+   char *inp_fn;
+   assuan_fd_t out_fd;
+   char *out_fn;
+-  gpgme_data_t inp_data;
+-  gpgme_data_t out_data;
++  gpgme_data_t inp_data = NULL;
++  gpgme_data_t out_data = NULL;
+ 
+   (void)line;
+ 
+@@ -2346,13 +2346,18 @@
+ 
+   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			 &server->input_stream);
+-  if (err)
++  if (err) {
++    if (inp_data)
++      gpgme_data_release (inp_data);
+     return err;
++  }
+   err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+ 			 &server->output_stream);
+   if (err)
+     {
+       gpgme_data_release (inp_data);
++      if (out_data)
++        gpgme_data_release (out_data);
+       return err;
+     }
+ 
+@@ -2425,8 +2430,11 @@
+     {
+       err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			     &server->input_stream);
+-      if (err)
++      if (err) {
++	if (inp_data)
++	  gpgme_data_release (inp_data);
+ 	return err;
++      }
+     }
+   if (out_fd != ASSUAN_INVALID_FD || out_fn)
+     {
+@@ -2435,6 +2443,8 @@
+       if (err)
+ 	{
+ 	  gpgme_data_release (inp_data);
++	  if (out_data)
++	    gpgme_data_release (out_data);
+ 	  return err;
+ 	}
+     }
+@@ -2499,8 +2509,8 @@
+   char *inp_fn;
+   assuan_fd_t out_fd;
+   char *out_fn;
+-  gpgme_data_t inp_data;
+-  gpgme_data_t out_data;
++  gpgme_data_t inp_data = NULL;
++  gpgme_data_t out_data = NULL;
+   gpgme_sig_mode_t mode = GPGME_SIG_MODE_NORMAL;
+ 
+   if (strstr (line, "--clear"))
+@@ -2519,13 +2529,18 @@
+ 
+   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			 &server->input_stream);
+-  if (err)
++  if (err) {
++    if (inp_data)
++      gpgme_data_release (inp_data);
+     return err;
++  }
+   err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+ 			 &server->output_stream);
+   if (err)
+     {
+       gpgme_data_release (inp_data);
++      if (out_data)
++        gpgme_data_release (out_data);
+       return err;
+     }
+ 
+@@ -2557,7 +2572,7 @@
+   char *inp_fn;
+   char *msg_fn;
+   char *out_fn;
+-  gpgme_data_t inp_data;
++  gpgme_data_t inp_data = NULL;
+   gpgme_data_t msg_data = NULL;
+   gpgme_data_t out_data = NULL;
+ 
+@@ -2574,8 +2589,11 @@
+ 
+   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			 &server->input_stream);
+-  if (err)
++  if (err) {
++    if (inp_data)
++      gpgme_data_release (inp_data);
+     return err;
++  }
+   if (msg_fd != ASSUAN_INVALID_FD || msg_fn)
+     {
+       err = server_data_obj (msg_fd, msg_fn, 0, server->message_enc, &msg_data,
+@@ -2583,6 +2601,8 @@
+       if (err)
+ 	{
+ 	  gpgme_data_release (inp_data);
++	  if (msg_data)
++	    gpgme_data_release (msg_data);
+ 	  return err;
+ 	}
+     }
+@@ -2594,6 +2614,8 @@
+ 	{
+ 	  gpgme_data_release (inp_data);
+ 	  gpgme_data_release (msg_data);
++	  if (out_data)
++	    gpgme_data_release (out_data);
+ 	  return err;
+ 	}
+     }
+@@ -2634,7 +2656,7 @@
+       gpg_error_t err;
+       assuan_fd_t inp_fd;
+       char *inp_fn;
+-      gpgme_data_t inp_data;
++      gpgme_data_t inp_data = NULL;
+ 
+       inp_fd = server->input_fd;
+       inp_fn = server->input_filename;
+@@ -2643,8 +2665,11 @@
+ 
+       err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			     &server->input_stream);
+-      if (err)
++      if (err) {
++	if (inp_data)
++	  gpgme_data_release (inp_data);
+ 	return err;
++      }
+ 
+       err = gt_import (server->gt, inp_data);
+ 
+@@ -2668,7 +2693,7 @@
+   gpg_error_t err;
+   assuan_fd_t out_fd;
+   char *out_fn;
+-  gpgme_data_t out_data;
++  gpgme_data_t out_data = NULL;
+   gpgme_export_mode_t mode = 0;
+   const char *pattern[2];
+ 
+@@ -2678,8 +2703,11 @@
+     return GPG_ERR_ASS_NO_OUTPUT;
+   err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+ 			 &server->output_stream);
+-  if (err)
++  if (err) {
++    if (out_data)
++      gpgme_data_release (out_data);
+     return err;
++  }
+ 
+   if (has_option (line, "--extern"))
+     mode |= GPGME_EXPORT_MODE_EXTERN;
+@@ -2733,7 +2761,7 @@
+   char *inp_fn;
+   assuan_fd_t out_fd;
+   char *out_fn;
+-  gpgme_data_t inp_data;
++  gpgme_data_t inp_data = NULL;
+   gpgme_data_t out_data = NULL;
+   gpgme_data_t parms_data = NULL;
+   const char *parms;
+@@ -2749,8 +2777,11 @@
+ 
+   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			 &server->input_stream);
+-  if (err)
++  if (err) {
++    if (inp_data)
++      gpgme_data_release (inp_data);
+     return err;
++  }
+   if (out_fd != ASSUAN_INVALID_FD || out_fn)
+     {
+       err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+@@ -2758,6 +2789,8 @@
+       if (err)
+ 	{
+ 	  gpgme_data_release (inp_data);
++	  if (out_data)
++	    gpgme_data_release (out_data);
+ 	  return err;
+ 	}
+     }
+@@ -2795,6 +2828,7 @@
+     }
+ 
+   err = gt_genkey (server->gt, parms, out_data, NULL);
++  free (parms);
+ 
+   server_reset_fds (server);
+ 
+@@ -2968,7 +3002,7 @@
+   gpg_error_t err;
+   assuan_fd_t out_fd;
+   char *out_fn;
+-  gpgme_data_t out_data;
++  gpgme_data_t out_data = NULL;
+   unsigned int flags = 0;
+ 
+   out_fd = server->output_fd;
+@@ -2977,8 +3011,11 @@
+     return GPG_ERR_ASS_NO_OUTPUT;
+   err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+ 			 &server->output_stream);
+-  if (err)
++  if (err) {
++    if (out_data)
++      gpgme_data_release (out_data);
+     return err;
++  }
+ 
+   if (strstr (line, "--html"))
+     flags |= GPGME_AUDITLOG_HTML;
+@@ -3111,7 +3148,7 @@
+   gpg_error_t err;
+   assuan_fd_t inp_fd;
+   char *inp_fn;
+-  gpgme_data_t inp_data;
++  gpgme_data_t inp_data = NULL;
+ 
+   (void)line;
+ 
+@@ -3122,8 +3159,11 @@
+ 
+   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+                          &server->input_stream);
+-  if (err)
++  if (err) {
++    if (inp_data)
++      gpgme_data_release (inp_data);
+     return err;
++  }
+ 
+   err = gt_identify (server->gt, inp_data);
+ 
+@@ -3159,8 +3199,11 @@
+     {
+       err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ 			     &server->input_stream);
+-      if (err)
++      if (err) {
++	if (inp_data)
++	  gpgme_data_release (inp_data);
+ 	return err;
++      }
+     }
+   if (out_fd != ASSUAN_INVALID_FD || out_fn)
+     {
+@@ -3169,6 +3212,8 @@
+       if (err)
+ 	{
+ 	  gpgme_data_release (inp_data);
++	  if (out_data)
++	    gpgme_data_release (out_data);
+ 	  return err;
+ 	}
+     }
+diff -Naur a/tests/gpg/t-import.c b/tests/gpg/t-import.c
+--- a/tests/gpg/t-import.c	2018-11-12 13:57:39.808530132 +0100
++++ b/tests/gpg/t-import.c	2018-11-16 12:52:09.829248570 +0100
+@@ -212,7 +212,7 @@
+ {
+   gpgme_ctx_t ctx;
+   gpgme_error_t err;
+-  gpgme_data_t in;
++  gpgme_data_t in = NULL;
+   gpgme_import_result_t result;
+   char *pubkey_1_asc = make_filename ("pubkey-1.asc");
+   char *seckey_1_asc = make_filename ("seckey-1.asc");
+@@ -235,6 +235,7 @@
+   check_result (result, "ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55", 0);
+   gpgme_data_release (in);
+ 
++  in = NULL; /* Make Coverity happy.  */
+   err = gpgme_data_new_from_file (&in, seckey_1_asc, 1);
+   free (seckey_1_asc);
+   fail_if_err (err);
+diff -Naur a/tests/gpg/t-trustlist.c b/tests/gpg/t-trustlist.c
+--- a/tests/gpg/t-trustlist.c	2018-11-12 13:57:39.810530085 +0100
++++ b/tests/gpg/t-trustlist.c	2018-11-16 12:52:09.837248378 +0100
+@@ -39,7 +39,7 @@
+ {
+   gpgme_ctx_t ctx;
+   gpgme_error_t err;
+-  gpgme_trust_item_t item;
++  gpgme_trust_item_t item = NULL;
+ 
+   (void)argc;
+   (void)argv;
+@@ -58,6 +58,7 @@
+ 	      item->level, item->keyid, item->type, item->owner_trust,
+ 	      item->validity, item->name);
+       gpgme_trust_item_unref (item);
++      item = NULL; /* Make Coverity happy.  */
+     }
+   if (gpgme_err_code (err) != GPG_ERR_EOF)
+     fail_if_err (err);
+diff -Naur a/tests/gpgsm/cms-keylist.c b/tests/gpgsm/cms-keylist.c
+--- a/tests/gpgsm/cms-keylist.c	2018-11-12 13:57:39.830529615 +0100
++++ b/tests/gpgsm/cms-keylist.c	2018-11-16 12:52:09.842248259 +0100
+@@ -45,7 +45,7 @@
+ {
+   gpgme_error_t err;
+   gpgme_ctx_t ctx;
+-  gpgme_key_t key;
++  gpgme_key_t key = NULL;
+   gpgme_keylist_result_t result;
+ 
+   if (argc)
+@@ -107,6 +107,7 @@
+       putchar ('\n');
+ 
+       gpgme_key_unref (key);
++      key = NULL; /* Make Coverity happy.  */
+     }
+   if (gpgme_err_code (err) != GPG_ERR_EOF)
+     fail_if_err (err);
+diff -Naur a/tests/gpgsm/t-import.c b/tests/gpgsm/t-import.c
+--- a/tests/gpgsm/t-import.c	2018-11-12 13:57:39.829529639 +0100
++++ b/tests/gpgsm/t-import.c	2018-11-16 12:52:07.932293971 +0100
+@@ -142,7 +142,7 @@
+ {
+   gpgme_ctx_t ctx;
+   gpgme_error_t err;
+-  gpgme_data_t in;
++  gpgme_data_t in = NULL;
+   gpgme_import_result_t result;
+   char *cert_1 = make_filename ("cert_dfn_pca01.der");
+   char *cert_2 = make_filename ("cert_dfn_pca15.der");
+@@ -164,6 +164,7 @@
+   check_result (result, "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD", 1, 1);
+   gpgme_data_release (in);
+ 
++  in = NULL; /* Make Coverity happy.  */
+   err = gpgme_data_new_from_file (&in, cert_2, 1);
+   free (cert_2);
+   fail_if_err (err);
+diff -Naur a/tests/gpgsm/t-keylist.c b/tests/gpgsm/t-keylist.c
+--- a/tests/gpgsm/t-keylist.c	2018-11-12 13:57:39.829529639 +0100
++++ b/tests/gpgsm/t-keylist.c	2018-11-16 13:20:51.685124686 +0100
+@@ -85,7 +85,7 @@
+ {
+   gpgme_error_t err;
+   gpgme_ctx_t ctx;
+-  gpgme_key_t key;
++  gpgme_key_t key = NULL;
+   gpgme_keylist_result_t result;
+   int i = 0;
+ 
+@@ -111,6 +111,7 @@
+ 	  fprintf (stderr, "Warning: Skipping unknown key %s\n",
+ 		   key->subkeys->fpr);
+ 	  gpgme_key_unref (key);
++	  key = NULL; /* Make Coverity happy.  */
+ 	  continue;
+ 	}
+       else
+@@ -365,6 +366,7 @@
+ 
+ 
+       gpgme_key_unref (key);
++      key = NULL; /* Make Coverity happy.  */
+       i++;
+     }
+   if (gpgme_err_code (err) != GPG_ERR_EOF)
+diff -Naur a/tests/run-identify.c b/tests/run-identify.c
+--- a/tests/run-identify.c	2018-11-12 13:57:39.806530179 +0100
++++ b/tests/run-identify.c	2018-11-16 12:59:06.391278677 +0100
+@@ -77,7 +77,7 @@
+   int last_argc = -1;
+   gpgme_error_t err;
+   int anyerr = 0;
+-  gpgme_data_t data;
++  gpgme_data_t data = NULL;
+   gpgme_data_type_t dt;
+ 
+   if (argc)
+@@ -122,6 +122,7 @@
+             anyerr = 1;
+           printf ("%s: %s\n", *argv, data_type_to_string (dt));
+           gpgme_data_release (data);
++          data = NULL; /* Make Coverity happy.  */
+         }
+     }
+ 
+diff -Naur a/tests/run-import.c b/tests/run-import.c
+--- a/tests/run-import.c	2018-11-12 13:57:39.833529545 +0100
++++ b/tests/run-import.c	2018-11-16 13:00:30.184273195 +0100
+@@ -58,7 +58,7 @@
+   int url_mode = 0;
+   int nul_mode = 0;
+   gpgme_import_result_t impres;
+-  gpgme_data_t data;
++  gpgme_data_t data = NULL;
+ 
+   if (argc)
+     { argc--; argv++; }
+@@ -122,6 +122,7 @@
+       print_import_result (impres);
+ 
+       gpgme_data_release (data);
++      data = NULL; /* Make Coverity happy.  */
+     }
+ 
+   gpgme_release (ctx);
diff --git a/SOURCES/gpgme-1.3.2-largefile.patch b/SOURCES/gpgme-1.3.2-largefile.patch
new file mode 100644
index 0000000..bbf88de
--- /dev/null
+++ b/SOURCES/gpgme-1.3.2-largefile.patch
@@ -0,0 +1,24 @@
+diff -up gpgme-1.3.2/src/gpgme-config.in.largefile gpgme-1.3.2/src/gpgme-config.in
+--- gpgme-1.3.2/src/gpgme-config.in.largefile	2012-09-26 10:10:37.882744198 +0200
++++ gpgme-1.3.2/src/gpgme-config.in	2012-09-26 10:16:02.558762827 +0200
+@@ -41,6 +41,10 @@ cflags_pthread=""
+ cflags_glib="@GLIB_CFLAGS@"
+ with_glib=
+ 
++if test "0@NEED__FILE_OFFSET_BITS@" -gt "0" ; then
++    cflags_lfs="-D_FILE_OFFSET_BITS=@NEED__FILE_OFFSET_BITS@"
++fi
++
+ output=""
+ 
+ usage()
+@@ -105,6 +109,9 @@ while test $# -gt 0; do
+ 	    exit 0
+ 	    ;;
+         --cflags)
++	    if test "x$cflags_lfs" != "x"; then
++		output="$output $cflags_lfs"
++	    fi
+             result=
+             tmp_c=
+             tmp_g=
diff --git a/SOURCES/gpgme-multilib.h b/SOURCES/gpgme-multilib.h
new file mode 100644
index 0000000..574f09d
--- /dev/null
+++ b/SOURCES/gpgme-multilib.h
@@ -0,0 +1,20 @@
+/* gpgme-multilib.h */
+/* This file is here to prevent a file conflict on multiarch systems.  A
+ * conflict will occur because gpgme.h has arch-specific definitions.
+ *
+ * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */
+
+#ifndef GPGME_MULTILIB_H
+#define GPGME_MULTILIB_H
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "gpgme-32.h"
+#elif __WORDSIZE == 64
+#include "gpgme-64.h"
+#else
+#error "unexpected value for __WORDSIZE macro"
+#endif
+
+#endif
+
diff --git a/SPECS/gpgme.spec b/SPECS/gpgme.spec
new file mode 100644
index 0000000..4e6dc49
--- /dev/null
+++ b/SPECS/gpgme.spec
@@ -0,0 +1,566 @@
+%bcond_without check
+
+%if 0%{?rhel} > 7
+# Disable python2 build by default
+%bcond_with python2
+%else
+%bcond_without python2
+%endif
+
+# trim changelog included in binary rpms
+%global _changelog_trimtime %(date +%s -d "1 year ago")
+
+# STATUS_KEY_CONSIDERED has been added in 2.1.13
+%global gnupg2_min_ver 2.1.13
+# GPG_ERR_SUBKEYS_EXP_OR_REV has been added in 1.23
+%global libgpg_error_min_ver 1.23
+
+Name:           gpgme
+Summary:        GnuPG Made Easy - high level crypto API
+Version:        1.10.0
+Release:        6%{?dist}
+
+License:        LGPLv2+
+URL:            https://gnupg.org/related_software/gpgme/
+Source0:        ftp://ftp.gnupg.org/gcrypt/gpgme/gpgme-%{version}.tar.bz2
+Source2:        gpgme-multilib.h
+
+## upstream patches
+# https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gpgme.git;a=commit;h=b99502274ae5efdf6df0d967900ec3d1e64373d7
+Patch1000:      0001-core-Tweak-STATUS_FAILURE-handling.patch
+
+## downstream patches
+# Don't add extra libs/cflags in gpgme-config/cmake equivalent
+Patch1001:      0001-don-t-add-extra-libraries-for-linking.patch
+# add -D_FILE_OFFSET_BITS... to gpgme-config, upstreamable
+Patch1002:      gpgme-1.3.2-largefile.patch
+# Let's fix stupid AX_PYTHON_DEVEL
+Patch1003:      0001-fix-stupid-ax_python_devel.patch
+# Fix resource leaks discovered by static code analyzer
+Patch1004:      gpgme-1.10.0-fix-resource-leaks.patch
+
+BuildRequires:  autoconf
+BuildRequires:  automake
+BuildRequires:  gcc
+BuildRequires:  gcc-c++
+BuildRequires:  gawk
+BuildRequires:  gnupg2 >= %{gnupg2_min_ver}
+BuildRequires:  gnupg2-smime
+BuildRequires:  libgpg-error-devel >= %{libgpg_error_min_ver}
+BuildRequires:  libassuan-devel >= 2.0.2
+
+# For python bindings
+BuildRequires:  swig
+
+# to remove RPATH
+BuildRequires:  chrpath
+
+# For AutoReq cmake-filesystem
+BuildRequires:  cmake
+
+Requires:       gnupg2 >= %{gnupg2_min_ver}
+
+# On the following architectures workaround multiarch conflict of -devel packages:
+%define multilib_arches %{ix86} x86_64 ia64 ppc ppc64 s390 s390x %{sparc}
+
+%description
+GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG
+easier for applications.  It provides a high-level crypto API for
+encryption, decryption, signing, signature verification and key
+management.
+
+%package devel
+Summary:        Development headers and libraries for %{name}
+Requires:       %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+Requires:       libgpg-error-devel%{?_isa} >= %{libgpg_error_min_ver}
+Requires(post): /sbin/install-info
+Requires(postun): /sbin/install-info
+
+%description devel
+%{summary}.
+
+%package -n %{name}pp
+Summary:        C++ bindings/wrapper for GPGME
+Obsoletes:      gpgme-pp < 1.8.0-7
+Provides:       gpgme-pp = %{?epoch:%{epoch}:}%{version}-%{release}
+Provides:       gpgme-pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+Requires:       %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+
+%description -n %{name}pp
+%{summary}.
+
+%package -n %{name}pp-devel
+Summary:        Development libraries and header files for %{name}-pp
+Obsoletes:      gpgme-pp-devel < 1.8.0-7
+Provides:       gpgme-pp-devel = %{?epoch:%{epoch}:}%{version}-%{release}
+Provides:       gpgme-pp-devel%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+Requires:       %{name}pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+Requires:       %{name}-devel%{?_isa}
+# For automatic provides
+BuildRequires:  cmake
+
+%description -n %{name}pp-devel
+%{summary}
+
+%package -n q%{name}
+Summary:        Qt API bindings/wrapper for GPGME
+Requires:       %{name}pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+BuildRequires:  pkgconfig(Qt5Core)
+BuildRequires:  pkgconfig(Qt5Test)
+
+%description -n q%{name}
+%{summary}.
+
+%package -n q%{name}-devel
+Summary:        Development libraries and header files for %{name}
+# before libqgpgme.so symlink was moved to avoid conflict
+Conflicts:      kdepimlibs-devel < 4.14.10-17
+Requires:       q%{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+Requires:       %{name}pp-devel%{?_isa}
+# For automatic provides
+BuildRequires:  cmake
+
+%description -n q%{name}-devel
+%{summary}.
+
+%if %{with python2}
+%package -n python2-gpg
+Summary:        %{name} bindings for Python 2
+%{?python_provide:%python_provide python2-gpg}
+BuildRequires:  python2-devel
+Requires:       %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+
+%description -n python2-gpg
+%{summary}.
+%endif # without python2
+
+%package -n python3-gpg
+Summary:        %{name} bindings for Python 3
+%{?python_provide:%python_provide python3-gpg}
+BuildRequires:  python3-devel
+Requires:       %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}
+
+%description -n python3-gpg
+%{summary}.
+
+%prep
+%autosetup -p1
+
+## HACK ALERT
+# The config script already suppresses the -L if it's /usr/lib, so cheat and
+# set it to a value which we know will be suppressed.
+sed -i -e 's|^libdir=@libdir@$|libdir=@exec_prefix@/lib|g' src/gpgme-config.in
+
+find -type f -name Makefile\* -exec sed -i -e 's|GPG = gpg|GPG = gpg2|' {} ';'
+
+%build
+./autogen.sh
+%configure --disable-static --disable-silent-rules \
+ --enable-languages=cpp,qt,python3
+
+%make_build
+
+%install
+%make_install
+
+# unpackaged files
+rm -fv %{buildroot}%{_infodir}/dir
+rm -fv %{buildroot}%{_libdir}/lib*.la
+
+# Hack to resolve multiarch conflict (#341351)
+%ifarch %{multilib_arches}
+mv %{buildroot}%{_bindir}/gpgme-config{,.%{_target_cpu}}
+cat > gpgme-config-multilib.sh <<__END__
+#!/bin/sh
+exec %{_bindir}/gpgme-config.\$(arch) \$@
+__END__
+install -D -p gpgme-config-multilib.sh %{buildroot}%{_bindir}/gpgme-config
+mv %{buildroot}%{_includedir}/gpgme.h \
+   %{buildroot}%{_includedir}/gpgme-%{__isa_bits}.h
+install -m644 -p -D %{SOURCE2} %{buildroot}%{_includedir}/gpgme.h
+%endif
+chrpath -d %{buildroot}%{_bindir}/%{name}-tool
+chrpath -d %{buildroot}%{_libdir}/lib%{name}pp.so*
+chrpath -d %{buildroot}%{_libdir}/libq%{name}.so*
+
+# autofoo installs useless stuff for uninstall
+%if %{with python2}
+rm -vf %{buildroot}%{python2_sitelib}/gpg/install_files.txt
+%endif # with python2
+rm -vf %{buildroot}%{python3_sitelib}/gpg/install_files.txt
+
+%if %{with check}
+%check
+make check
+%endif
+
+%ldconfig_scriptlets
+
+%files
+%license COPYING*
+%doc AUTHORS ChangeLog NEWS README* THANKS TODO VERSION
+%{_libdir}/lib%{name}.so.11*
+
+%post devel
+/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || :
+
+%preun devel
+if [ $1 -eq 0 ] ; then
+  /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || :
+fi
+
+%files devel
+%{_bindir}/%{name}-config
+%{_bindir}/%{name}-tool
+%ifarch %{multilib_arches}
+%{_bindir}/%{name}-config.%{_target_cpu}
+%{_includedir}/%{name}-%{__isa_bits}.h
+%endif
+%{_includedir}/%{name}.h
+%{_libdir}/lib%{name}.so
+%{_datadir}/aclocal/%{name}.m4
+%{_infodir}/%{name}.info*
+
+%files -n %{name}pp
+%doc lang/cpp/README
+%{_libdir}/lib%{name}pp.so.*
+
+%files -n %{name}pp-devel
+%{_includedir}/%{name}++/
+%{_libdir}/lib%{name}pp.so
+%{_libdir}/cmake/Gpgmepp/
+
+%files -n q%{name}
+%doc lang/qt/README
+%{_libdir}/libq%{name}.so.*
+
+%files -n q%{name}-devel
+%{_includedir}/q%{name}/
+%{_includedir}/QGpgME/
+%{_libdir}/libq%{name}.so
+%{_libdir}/cmake/QGpgme/
+
+%if %{with python2}
+%files -n python2-gpg
+%doc lang/python/README
+%{python2_sitearch}/gpg-*.egg-info
+%{python2_sitearch}/gpg/
+%endif # with python2
+
+%files -n python3-gpg
+%doc lang/python/README
+%{python3_sitearch}/gpg-*.egg-info
+%{python3_sitearch}/gpg/
+
+%changelog
+* Mon Nov 12 2018 Jiri Kucera <jkucera@redhat.com> - 1.10.0-6
+- Fix important static scanner issues
+  Resolves: #1602526
+
+* Mon May 28 2018 Charalampos Stratakis <cstratak@redhat.com> - 1.10.0-5
+- Conditionalize the python2 subpackage
+- Build only the python3 bindings
+
+* Tue Apr 17 2018 Jonathan Lebon <jonathan@jlebon.com> - 1.10.0-4
+- Backport patch to tweak STATUS_FAILURE handling
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.10.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Tue Jan 30 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.10.0-2
+- Switch to %%ldconfig_scriptlets
+
+* Wed Dec 13 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.10.0-1
+- Update to 1.10.0
+
+* Tue Nov 07 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.9.0-8
+- Use better Obsoletes for platform-python
+
+* Fri Nov 03 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.9.0-7
+- Remove platform-python subpackages
+
+* Thu Aug 10 2017 Petr Viktorin <pviktori@redhat.com> - 1.9.0-6
+- Add subpackage for platform-python (https://fedoraproject.org/wiki/Changes/Platform_Python_Stack)
+
+* Mon Aug 07 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.9.0-5
+- Remove BuildRequires: pth-devel, it is not needed for long time
+
+* Mon Aug 07 2017 Björn Esser <besser82@fedoraproject.org> - 1.9.0-4
+- Rebuilt for AutoReq cmake-filesystem
+
+* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.9.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.9.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Wed Mar 29 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.9.0-1
+- Update to 1.9.0
+
+* Sat Feb 11 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.8.0-12
+- Fix FTBFS
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.8.0-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Jan 18 2017 Rex Dieter <rdieter@fedoraproject.org> - 1.8.0-10
+- patch out LIBASSUAN_LIBRARIES in cmake too
+
+* Wed Jan 18 2017 Rex Dieter <rdieter@fedoraproject.org> - 1.8.0-9
+- gpgmepp-devel: Requires: libassuan-devel
+
+* Mon Jan 16 2017 Rex Dieter <rdieter@fedoraproject.org> - 1.8.0-8
+- qgpgme-devel: Conflicts: kdepimlibs-devel < 4.14.10-17
+
+* Sun Jan 01 2017 Rex Dieter <rdieter@math.unl.edu> - 1.8.0-7
+- rename gpgme-pp to gpgmepp, simplify -devel deps
+
+* Sun Jan 01 2017 Rex Dieter <rdieter@math.unl.edu> - 1.8.0-6
+- backport upstream cmake-related fix
+
+* Thu Dec 22 2016 Miro Hrončok <mhroncok@redhat.com> - 1.8.0-5
+- Rebuild for Python 3.6
+
+* Sun Dec 11 2016 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 1.8.0-4
+- Rename pythonX-gpgme into pythonX-gpg
+
+* Sun Dec 11 2016 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 1.8.0-3
+- Add Qt and C++ subpackages
+
+* Sat Dec 10 2016 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 1.8.0-2
+- Enable tests
+
+* Sat Dec 10 2016 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 1.8.0-1
+- Update to 1.8.0
+
+* Wed Sep 21 2016 Igor Gnatenko <ignatenko@redhat.com> - 1.7.0-1
+- Update to 1.7.0
+
+* Mon Jul 25 2016 Igor Gnatenko <ignatenko@redhat.com> - 1.6.0-3
+- Set min ver for libgpg-error
+
+* Mon Jul 25 2016 Igor Gnatenko <ignatenko@redhat.com> - 1.6.0-2
+- Backport patch for STATUS_KEY_CONSIDERED (RHBZ #1359521)
+
+* Wed Jul 13 2016 Igor Gnatenko <ignatenko@redhat.com> - 1.6.0-1
+- Update to 1.6.0 (RHBZ #1167656)
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1.4.3-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.4.3-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Sat Dec 06 2014 Frantisek Kluknavsky <fkluknav@redhat.com> - 1.4.3-5
+- CVE-2014-3564, rhbz#1125170, gpgme-1.3.2-bufferoverflow.patch
+
+* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.4.3-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sat Jul 12 2014 Tom Callaway <spot@fedoraproject.org> - 1.4.3-3
+- fix license handling
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.4.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Wed Oct 09 2013 Rex Dieter <rdieter@fedoraproject.org> - 1.4.3-1
+- gpgme-1.4.3
+- cleanup .spec, trim changelog
+
+* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Tue Jul 09 2013 Karsten Hopp <karsten@redhat.com> 1.3.2-3
+- rebuild to fix some f20 dependency issues on PPC
+
+* Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.2-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Tue Nov 20 2012 Frantisek Kluknavsky <fkluknav@redhat.com> - 1.3.2-2
+- minor spec cleanup
+
+* Wed Sep 26 2012 Tomas Mraz <tmraz@redhat.com> - 1.3.2-1
+- new upstream version
+- re-enable gpg tests (original patch by John Morris <john@zultron.com>)
+- quiet configure warning 'could not find g13'
+- there is no libgpgme-pth anymore
+
+* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.0-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Sun Apr 22 2012 Rex Dieter <rdieter@fedoraproject.org> 1.3.0-8
+- -devel: make Requires: libgpg-error-devel arch'd
+- ensure gpgme-config wrapper is executable
+
+* Sun Apr 22 2012 Rex Dieter <rdieter@fedoraproject.org> 1.3.0-7
+- gpgme.h: fatal error: gpgme-i386.h: No such file or directory compilation terminated (#815116)
+
+* Wed Feb 15 2012 Simon Lukasik <slukasik@redhat.com> - 1.3.0-6
+- Resolve multilib conflict of gpgme-config (#341351)
+- Resolve multilib conflict of gpgme.h (#341351)
+
+* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.3.0-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Thu Mar 17 2011 Rex Dieter <rdieter@fedoraproject.org> - 1.3.0-4
+- gpgme-config: remove libassuan-related flags as threatened (#676954) 
+\
+* Sun Feb 13 2011 Rex Dieter <rdieter@fedoraproject.org> - 1.3.0-3
+- -devel: fix typo (broken dep)
+
+* Sat Feb 12 2011 Rex Dieter <rdieter@fedoraproject.org> - 1.3.0-2
+- BR: libassuan2-devel
+- gpgme-config outputs -lassuan (#676954)
+
+* Fri Feb 11 2011 Tomas Mraz <tmraz@redhat.com> - 1.3.0-1
+- new upstream version
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.2.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Wed Aug 18 2010 Tomas Mraz <tmraz@redhat.com> - 1.2.0-3
+- fix the condition for adding the -D_FILE_OFFSET_BITS...
+
+* Wed Aug 11 2010 Tomas Mraz <tmraz@redhat.com> - 1.2.0-2
+- add -D_FILE_OFFSET_BITS... to gpgme-config as appropriate (#621698)
+
+* Fri Jul 02 2010 Rex Dieter <rdieter@fedoraproject.org> - 1.2.0-1
+- gpgme-1.2.0 (#610984)
+
+* Sun Feb 14 2010 Rex Dieter <rdieter@fedoraproject.org> - 1.1.8-4
+- FTBFS gpgme-1.1.8-3.fc13: ImplicitDSOLinking (#564605)
+
+* Thu Nov 19 2009 Tomas Mraz <tmraz@redhat.com> - 1.1.8-3
+- Add buildrequires gnupg2-smime for the gpgsm
+
+* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.8-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Sat Jun 20 2009 Rex Dieter <rdieter@fedoraproject.org> - 1.1.8-1
+- gpgme-1.1.8
+- -devel: s/postun/preun/ info scriptlet
+
+* Wed Mar 11 2009 Rex Dieter <rdieter@fedoraproject.org> - 1.1.7-3
+- track shlib sonames closer, to highlight future abi/soname changes
+- _with_gpg macro, to potentially conditionalize gnupg vs gnupg2 defaults
+  for various os/releases (ie, fedora vs rhel)
+
+* Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.7-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Sat Oct 18 2008 Rex Dieter <rdieter@fedoraproject.org> 1.1.7-1
+- gpgme-1.1.7
+
+* Sun Feb 17 2008 Rex Dieter <rdieter@fedoraproject.org> 1.1.6-3
+- --with-gpg=%%_bindir/gpg2 (#432445)
+- drop Requires: gnupg (#432445)
+
+* Fri Feb 08 2008 Rex Dieter <rdieter@fedoraproject.org> 1.1.6-2 
+- respin (gcc43)
+
+* Fri Jan 04 2008 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.6-1
+- gpgme-1.1.6
+- multiarch conflicts in gpgme (#341351)
+
+* Sat Aug 25 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.5-4
+- BR: gawk
+
+* Sat Aug 25 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.5-3
+- respin (BuildID)
+
+* Thu Aug 09 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.5-2
+- License: LGPLv2+
+
+* Mon Jul 09 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.5-1
+- gpgme-1.1.5
+
+* Mon Mar 05 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.4-1
+- gpgme-1.1.4
+
+* Sat Feb 03 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.1.3-1
+- gpgme-1.1.3
+
+* Tue Oct 03 2006 Rex Dieter <rexdieter[AT]users.sf.net>
+- respin
+
+* Mon Sep 18 2006 Rex Dieter <rexdieter[AT]users.sf.net> 1.1.2-6
+- fix gpgme-config --thread=pthread --cflags
+
+* Tue Aug 29 2006 Rex Dieter <rexdieter[AT]users.sf.net> 1.1.2-5
+- fc6 respin
+
+* Mon Mar 6 2006 Rex Dieter <rexdieter[AT]users.sf.net> 1.1.2-4
+- add back support for gpgme-config --thread=pthread
+
+* Mon Mar 6 2006 Rex Dieter <rexdieter[AT]users.sf.net> 1.1.2-2
+- drop extraneous libs from gpgme-config
+
+* Fri Mar 3 2006 Rex Dieter <rexdieter[AT]users.sf.net> 1.1.2-1
+- 1.1.2
+- drop upstreamed gpgme-1.1.0-tests.patch
+
+* Wed Mar 1 2006 Rex Dieter <rexdieter[AT]users.sf.net>
+- fc5: gcc/glibc respin
+
+* Wed Nov 30 2005 Rex Dieter <rexdieter[AT]users.sf.net> - 1.1.0-3
+- (re)build against (newer) libksba/gnupg2
+
+* Thu Oct 06 2005 Rex Dieter <rexdieter[AT]users.sf.net> - 1.1.0-2
+- 1.1.0
+
+* Mon Aug  8 2005 Rex Dieter <rexdieter[AT]users.sf.net> - 1.0.3-1
+- 1.0.3
+- --disable-static
+
+* Thu May 12 2005 Michael Schwendt <mschwendt[AT]users.sf.net> - 1.0.2-3
+- rebuilt
+
+* Fri Mar 18 2005 Ville Skyttä <ville.skytta at iki.fi> - 1.0.2-2
+- Fix FC4 build.
+
+* Tue Feb  1 2005 Michael Schwendt <mschwendt[AT]users.sf.net> - 0:1.0.2-1
+- LGPL used here, and made summary more explicit.
+- Remove dirmngr dependency (gpgsm interfaces with it).
+- Obsolete cryptplug as gpgme >= 0.4.5 provides what we used cryptplug for.
+
+* Thu Jan 06 2005 Rex Dieter <rexdieter[AT]users.sf.net> 0:1.0.2-0.fdr.1
+- 1.0.2
+
+* Thu Oct 21 2004 Rex Dieter <rexdieter at sf.net> 0:1.0.0-0.fdr.1
+- 1.0.0
+- Requires: dirmngr
+
+* Tue Oct 19 2004 Rex Dieter <rexdieter at sf.net> 0:0.4.7-0.fdr.1
+- 0.4.7
+
+* Sun May  2 2004 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.3-0.fdr.3
+- Require %%{_bindir}/gpgsm instead of newpg.
+- Cosmetic spec file improvements.
+
+* Thu Oct 23 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.3-0.fdr.2
+- Update description.
+
+* Tue Oct  7 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.3-0.fdr.1
+- Update to 0.4.3.
+
+* Fri Aug 15 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.2-0.fdr.1
+- Update to 0.4.2.
+- make check in the %%check section.
+
+* Thu Jul 10 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.1-0.fdr.1
+- Update to 0.4.1.
+- Make -devel cooperate with --excludedocs.
+
+* Sat Apr 19 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.0-0.fdr.2
+- BuildRequire pth-devel, fix missing epoch in -devel Requires (#169).
+- Save .spec in UTF-8.
+
+* Sat Mar 22 2003 Ville Skyttä <ville.skytta at iki.fi> - 0:0.4.0-0.fdr.1
+- Update to current Fedora guidelines.
+- Exclude %%{_libdir}/*.la.
+
+* Tue Feb 12 2003 Warren Togami <warren@togami.com> 0.4.0-1.fedora.3
+- info/dir temporary workaround
+
+* Sat Feb  8 2003 Ville Skyttä <ville.skytta at iki.fi> - 0.4.0-1.fedora.1
+- First Fedora release.