431 lines
14 KiB
Diff
431 lines
14 KiB
Diff
|
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
|
||
|
|