From ab61bd2cb0ae458aae7c8e4ff7081bd2ab2094f5 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel 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 +#include + +// 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(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(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(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(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