Blob Blame History Raw
From ab61bd2cb0ae458aae7c8e4ff7081bd2ab2094f5 Mon Sep 17 00:00:00 2001
From: Jaroslav Rohel <jrohel@redhat.com>
Date: Thu, 2 May 2019 10:56:04 +0200
Subject: [PATCH] Reintroduce hawkey.Repo (deprecated, for compatibility)

---
 python/hawkey/CMakeLists.txt   |   1 +
 python/hawkey/__init__.py      |   5 +++--
 python/hawkey/hawkeymodule.cpp |   8 +++++++-
 python/hawkey/repo-py.cpp      | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 python/hawkey/repo-py.hpp      |  33 +++++++++++++++++++++++++++++++++
 python/hawkey/sack-py.cpp      |  48 +++++++++++++++++++++++++++++++-----------------
 6 files changed, 288 insertions(+), 20 deletions(-)
 create mode 100644 python/hawkey/repo-py.cpp
 create mode 100644 python/hawkey/repo-py.hpp

diff --git a/python/hawkey/CMakeLists.txt b/python/hawkey/CMakeLists.txt
index 96e9d43..d964534 100644
--- a/python/hawkey/CMakeLists.txt
+++ b/python/hawkey/CMakeLists.txt
@@ -33,6 +33,7 @@ set(hawkeymodule_SRCS
     packagedelta-py.cpp
     query-py.cpp
     reldep-py.cpp
+    repo-py.cpp
     sack-py.cpp
     selector-py.cpp
     subject-py.cpp
diff --git a/python/hawkey/__init__.py b/python/hawkey/__init__.py
index 7ad77f8..f5f0816 100644
--- a/python/hawkey/__init__.py
+++ b/python/hawkey/__init__.py
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2012-2014 Red Hat, Inc.
+# Copyright (C) 2012-2019 Red Hat, Inc.
 #
 # Licensed under the GNU Lesser General Public License Version 2.1
 #
@@ -52,7 +52,7 @@ __all__ = [
     # functions
     'chksum_name', 'chksum_type', 'split_nevra', 'convert_hawkey_reason',
     # classes
-    'Goal', 'NEVRA', 'NSVCAP', 'Package', 'Query', 'Sack', 'Selector', 'Subject']
+    'Goal', 'NEVRA', 'NSVCAP', 'Package', 'Query', 'Repo', 'Sack', 'Selector', 'Subject']
 
 NEVRA = _hawkey.NEVRA
 Query = _hawkey.Query
@@ -131,6 +131,7 @@ REFERENCE_VENDOR = _hawkey.REFERENCE_VENDOR
 
 Package = _hawkey.Package
 Reldep = _hawkey.Reldep
+Repo = _hawkey.Repo
 Sack = _hawkey.Sack
 
 Exception = _hawkey.Exception
diff --git a/python/hawkey/hawkeymodule.cpp b/python/hawkey/hawkeymodule.cpp
index 70659a8..72e7085 100644
--- a/python/hawkey/hawkeymodule.cpp
+++ b/python/hawkey/hawkeymodule.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012-2014 Red Hat, Inc.
+ * Copyright (C) 2012-2019 Red Hat, Inc.
  *
  * Licensed under the GNU Lesser General Public License Version 2.1
  *
@@ -46,6 +46,7 @@
 #include "packagedelta-py.hpp"
 #include "query-py.hpp"
 #include "reldep-py.hpp"
+#include "repo-py.hpp"
 #include "sack-py.hpp"
 #include "selector-py.hpp"
 #include "subject-py.hpp"
@@ -193,6 +194,11 @@ PYCOMP_MOD_INIT(_hawkey)
         return PYCOMP_MOD_ERROR_VAL;
     Py_INCREF(&selector_Type);
     PyModule_AddObject(m, "Selector", (PyObject *)&selector_Type);
+    /* _hawkey.Repo */
+    if (PyType_Ready(&repo_Type) < 0)
+        return PYCOMP_MOD_ERROR_VAL;
+    Py_INCREF(&repo_Type);
+    PyModule_AddObject(m, "Repo", (PyObject *)&repo_Type);
     /* _hawkey.NEVRA */
     if (PyType_Ready(&nevra_Type) < 0)
         return PYCOMP_MOD_ERROR_VAL;
diff --git a/python/hawkey/repo-py.cpp b/python/hawkey/repo-py.cpp
new file mode 100644
index 0000000..eff32be
--- /dev/null
+++ b/python/hawkey/repo-py.cpp
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2012-2019 Red Hat, Inc.
+ *
+ * Licensed under the GNU Lesser General Public License Version 2.1
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <Python.h>
+#include <stdint.h>
+
+// hawkey
+#include "hy-repo.h"
+
+// pyhawkey
+#include "hawkey-pysys.hpp"
+#include "repo-py.hpp"
+
+#include "pycomp.hpp"
+
+typedef struct {
+    PyObject_HEAD
+    HyRepo repo;
+} _RepoObject;
+
+typedef struct {
+    int (*getter)(HyRepo);
+    void (*setter)(HyRepo, int);
+} IntGetSetter;
+
+HyRepo repoFromPyObject(PyObject *o)
+{
+    if (!repoObject_Check(o)) {
+        //PyErr_SetString(PyExc_TypeError, "Expected a Repo object.");
+        return NULL;
+    }
+    return ((_RepoObject *)o)->repo;
+}
+
+PyObject *repoToPyObject(HyRepo repo)
+{
+    _RepoObject *self = (_RepoObject *)repo_Type.tp_alloc(&repo_Type, 0);
+    if (self)
+        self->repo = repo;
+    return (PyObject *)self;
+}
+
+/* functions on the type */
+
+static PyObject *
+repo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+    _RepoObject *self = (_RepoObject *)type->tp_alloc(type, 0);
+    if (self) {
+        self->repo = hy_repo_create("(default)");
+        if (self->repo == NULL) {
+            Py_DECREF(self);
+            return NULL;
+        }
+    }
+    return (PyObject *) self;
+}
+
+static int
+repo_init(_RepoObject *self, PyObject *args, PyObject *kwds)
+{
+    const char *name;
+    if (!PyArg_ParseTuple(args, "s", &name))
+        return -1;
+    hy_repo_set_string(self->repo, HY_REPO_NAME, name);
+    return 0;
+}
+
+static void
+repo_dealloc(_RepoObject *self)
+{
+    hy_repo_free(self->repo);
+    Py_TYPE(self)->tp_free(self);
+}
+
+/* getsetters */
+
+static PyObject *
+get_int(_RepoObject *self, void *closure)
+{
+    IntGetSetter *functions = (IntGetSetter*)closure;
+    return PyLong_FromLong(functions->getter(self->repo));
+}
+
+static int
+set_int(_RepoObject *self, PyObject *value, void *closure)
+{
+    IntGetSetter *functions = (IntGetSetter*)closure;
+    long num = PyLong_AsLong(value);
+    if (PyErr_Occurred())
+            return -1;
+    if (num > INT_MAX || num < INT_MIN) {
+        PyErr_SetString(PyExc_ValueError, "Value in the integer range expected.");
+        return -1;
+    }
+    functions->setter(self->repo, num);
+    return 0;
+}
+
+static PyObject *
+get_str(_RepoObject *self, void *closure)
+{
+    int str_key = (intptr_t)closure;
+    const char *str;
+    PyObject *ret;
+
+    str = hy_repo_get_string(self->repo, str_key);
+    if (str == NULL) {
+        ret = PyString_FromString("");
+    } else {
+        ret = PyString_FromString(str);
+    }
+    return ret; // NULL if PyString_FromString failed
+}
+
+static int
+set_str(_RepoObject *self, PyObject *value, void *closure)
+{
+    intptr_t str_key = (intptr_t)closure;
+    PycompString str_value(value);
+    if (!str_value.getCString())
+        return -1;
+    hy_repo_set_string(self->repo, str_key, str_value.getCString());
+    return 0;
+}
+
+static IntGetSetter hy_repo_cost{hy_repo_get_cost, hy_repo_set_cost};
+
+static IntGetSetter hy_repo_priority{hy_repo_get_priority, hy_repo_set_priority};
+
+static PyGetSetDef repo_getsetters[] = {
+    {(char*)"cost", (getter)get_int, (setter)set_int, (char*)"repository cost",
+     (void *)&hy_repo_cost},
+    {(char*)"name", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_NAME},
+    {(char*)"priority", (getter)get_int, (setter)set_int, (char*)"repository priority",
+     (void *)&hy_repo_priority},
+    {(char*)"repomd_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_MD_FN},
+    {(char*)"primary_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_PRIMARY_FN},
+    {(char*)"filelists_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_FILELISTS_FN},
+    {(char*)"modules_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)MODULES_FN},
+    {(char*)"presto_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_PRESTO_FN},
+    {(char*)"updateinfo_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_UPDATEINFO_FN},
+    {(char*)"other_fn", (getter)get_str, (setter)set_str, NULL,
+     (void *)HY_REPO_OTHER_FN},
+    {NULL}                        /* sentinel */
+};
+
+PyTypeObject repo_Type = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "_hawkey.Repo",                /*tp_name*/
+    sizeof(_RepoObject),        /*tp_basicsize*/
+    0,                                /*tp_itemsize*/
+    (destructor) repo_dealloc,  /*tp_dealloc*/
+    0,                                /*tp_print*/
+    0,                                /*tp_getattr*/
+    0,                                /*tp_setattr*/
+    0,                                /*tp_compare*/
+    0,                                /*tp_repr*/
+    0,                                /*tp_as_number*/
+    0,                                /*tp_as_sequence*/
+    0,                                /*tp_as_mapping*/
+    0,                                /*tp_hash */
+    0,                                /*tp_call*/
+    0,                                /*tp_str*/
+    0,                                /*tp_getattro*/
+    0,                                /*tp_setattro*/
+    0,                                /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT,                /*tp_flags*/
+    "Repo object",                /* tp_doc */
+    0,                                /* tp_traverse */
+    0,                                /* tp_clear */
+    0,                                /* tp_richcompare */
+    0,                                /* tp_weaklistoffset */
+    PyObject_SelfIter,                /* tp_iter */
+    0,                                 /* tp_iternext */
+    0,                                /* tp_methods */
+    0,                                /* tp_members */
+    repo_getsetters,                /* tp_getset */
+    0,                                /* tp_base */
+    0,                                /* tp_dict */
+    0,                                /* tp_descr_get */
+    0,                                /* tp_descr_set */
+    0,                                /* tp_dictoffset */
+    (initproc)repo_init,        /* tp_init */
+    0,                                /* tp_alloc */
+    repo_new,                        /* tp_new */
+    0,                                /* tp_free */
+    0,                                /* tp_is_gc */
+};
diff --git a/python/hawkey/repo-py.hpp b/python/hawkey/repo-py.hpp
new file mode 100644
index 0000000..cb3f014
--- /dev/null
+++ b/python/hawkey/repo-py.hpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2012-2019 Red Hat, Inc.
+ *
+ * Licensed under the GNU Lesser General Public License Version 2.1
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef REPO_PY_H
+#define REPO_PY_H
+
+#include "hy-types.h"
+
+extern PyTypeObject repo_Type;
+
+#define repoObject_Check(v)        ((v)->ob_type == &repo_Type)
+
+HyRepo repoFromPyObject(PyObject *o);
+PyObject *repoToPyObject(HyRepo repo);
+
+#endif // REPO_PY_H
diff --git a/python/hawkey/sack-py.cpp b/python/hawkey/sack-py.cpp
index 11f9d7c..63012c7 100644
--- a/python/hawkey/sack-py.cpp
+++ b/python/hawkey/sack-py.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012-2015 Red Hat, Inc.
+ * Copyright (C) 2012-2019 Red Hat, Inc.
  *
  * Licensed under the GNU Lesser General Public License Version 2.1
  *
@@ -37,6 +37,7 @@
 #include "hawkey-pysys.hpp"
 #include "iutil-py.hpp"
 #include "package-py.hpp"
+#include "repo-py.hpp"
 #include "sack-py.hpp"
 
 #include "pycomp.hpp"
@@ -641,16 +642,23 @@ load_system_repo(_SackObject *self, PyObject *args, PyObject *kwds)
         return 0;
 
     if (repoPyObj) {
-        auto repoSwigPyObj = reinterpret_cast<RepoSwigPyObject *>(PyObject_GetAttrString(repoPyObj, "this"));
-        if (!repoSwigPyObj) {
-            PyErr_SetString(PyExc_SystemError, "Unable to parse repoSwigPyObject");
-            return NULL;
-        }
 
-        crepo = repoSwigPyObj->ptr;
+        // Is it old deprecated _hawkey.Repo object?
+        crepo = repoFromPyObject(repoPyObj);
+
+        // Or is it swig object?
         if (!crepo) {
-            PyErr_SetString(PyExc_SystemError, "Unable to parse repo swig object");
-            return NULL;
+            auto repoSwigPyObj = reinterpret_cast<RepoSwigPyObject *>(PyObject_GetAttrString(repoPyObj, "this"));
+            if (!repoSwigPyObj) {
+                PyErr_SetString(PyExc_SystemError, "Unable to parse repoSwigPyObject");
+                return NULL;
+            }
+
+            crepo = repoSwigPyObj->ptr;
+            if (!crepo) {
+                PyErr_SetString(PyExc_SystemError, "Unable to parse repo swig object");
+                return NULL;
+            }
         }
     }
 
@@ -678,16 +686,22 @@ load_repo(_SackObject *self, PyObject *args, PyObject *kwds)
                                      &load_presto, &load_updateinfo, &load_other))
         return 0;
 
-    auto repoSwigPyObj = reinterpret_cast<RepoSwigPyObject *>(PyObject_GetAttrString(repoPyObj, "this"));
-    if (!repoSwigPyObj) {
-        PyErr_SetString(PyExc_SystemError, "Unable to parse repoSwigPyObject");
-        return NULL;
-    }
+    // Is it old deprecated _hawkey.Repo object?
+    libdnf::Repo * crepo = repoFromPyObject(repoPyObj);
 
-    libdnf::Repo * crepo = repoSwigPyObj->ptr;
+    // Or is it swig object?
     if (!crepo) {
-        PyErr_SetString(PyExc_SystemError, "Unable to parse repo swig object");
-        return NULL;
+        auto repoSwigPyObj = reinterpret_cast<RepoSwigPyObject *>(PyObject_GetAttrString(repoPyObj, "this"));
+        if (!repoSwigPyObj) {
+            PyErr_SetString(PyExc_SystemError, "Unable to parse repoSwigPyObject");
+            return NULL;
+        }
+
+        crepo = repoSwigPyObj->ptr;
+        if (!crepo) {
+            PyErr_SetString(PyExc_SystemError, "Unable to parse repo swig object");
+            return NULL;
+        }
     }
 
     int flags = 0;
--
libgit2 0.27.7