1 /*#############################################################################
3 # Pakfire - The IPFire package management system #
4 # Copyright (C) 2011 Pakfire development team #
6 # This program is free software: you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation, either version 3 of the License, or #
9 # (at your option) any later version. #
11 # This program is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
16 # You should have received a copy of the GNU General Public License #
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
19 #############################################################################*/
23 #include <pakfire/file.h>
24 #include <pakfire/filelist.h>
25 #include <pakfire/package.h>
26 #include <pakfire/repo.h>
27 #include <pakfire/util.h>
34 PyObject
* new_package(PyTypeObject
* type
, struct pakfire_package
* pkg
) {
35 PackageObject
* self
= (PackageObject
*)type
->tp_alloc(type
, 0);
37 self
->package
= pakfire_package_ref(pkg
);
40 return (PyObject
*)self
;
43 static PyObject
* Package_new(PyTypeObject
* type
, PyObject
* args
, PyObject
* kwds
) {
44 PackageObject
* self
= (PackageObject
*)type
->tp_alloc(type
, 0);
49 return (PyObject
*)self
;
52 static void Package_dealloc(PackageObject
* self
) {
53 pakfire_package_unref(self
->package
);
55 Py_TYPE(self
)->tp_free((PyObject
*)self
);
58 static int Package_init(PackageObject
* self
, PyObject
* args
, PyObject
* kwds
) {
59 PakfireObject
* pakfire
;
61 const char* name
= NULL
;
62 const char* evr
= NULL
;
63 const char* arch
= NULL
;
65 if (!PyArg_ParseTuple(args
, "O!O!sss", &PakfireType
, &pakfire
, &RepoType
, &repo
,
69 self
->package
= pakfire_package_create(pakfire
->pakfire
, repo
->repo
, name
, evr
, arch
);
71 PyErr_SetFromErrno(PyExc_OSError
);
78 static PyObject
* Package_repr(PackageObject
* self
) {
79 const char* nevra
= pakfire_package_get_nevra(self
->package
);
81 return PyUnicode_FromFormat("<_pakfire.Package %s>", nevra
);
84 static PyObject
* Package_str(PackageObject
* self
) {
85 const char* nevra
= pakfire_package_get_nevra(self
->package
);
87 return PyUnicode_FromString(nevra
);
90 static PyObject
* Package_richcompare(PackageObject
* self
, PyObject
* _other
, int op
) {
91 if (!PyType_IsSubtype(_other
->ob_type
, &PackageType
)) {
92 PyErr_SetString(PyExc_TypeError
, "Expected a Package object");
96 PackageObject
* other
= (PackageObject
*)_other
;
98 long result
= pakfire_package_cmp(self
->package
, other
->package
);
139 static const char* PyUnicode_FromValue(PyObject
* value
) {
140 if (value
== Py_None
)
143 return PyUnicode_AsUTF8(value
);
146 static PyObject
* Package_get_name(PackageObject
* self
) {
147 const char* name
= pakfire_package_get_name(self
->package
);
151 return PyUnicode_FromString(name
);
154 static void Package_set_name(PackageObject
* self
, PyObject
* value
) {
155 const char* name
= PyUnicode_FromValue(value
);
157 pakfire_package_set_name(self
->package
, name
);
160 static PyObject
* Package_get_evr(PackageObject
* self
) {
161 const char* evr
= pakfire_package_get_evr(self
->package
);
165 return PyUnicode_FromString(evr
);
168 static PyObject
* Package_get_arch(PackageObject
* self
) {
169 const char* arch
= pakfire_package_get_arch(self
->package
);
173 return PyUnicode_FromString(arch
);
176 static void Package_set_arch(PackageObject
* self
, PyObject
* value
) {
177 const char* arch
= PyUnicode_FromValue(value
);
179 pakfire_package_set_arch(self
->package
, arch
);
182 static PyObject
* Package_get_uuid(PackageObject
* self
) {
183 const char* uuid
= pakfire_package_get_uuid(self
->package
);
187 return PyUnicode_FromString(uuid
);
190 static void Package_set_uuid(PackageObject
* self
, PyObject
* value
) {
191 const char* uuid
= PyUnicode_FromValue(value
);
193 pakfire_package_set_uuid(self
->package
, uuid
);
196 static PyObject
* Package_get_checksum(PackageObject
* self
) {
197 const char* checksum
= pakfire_package_get_checksum(self
->package
);
201 return PyUnicode_FromString(checksum
);
204 static void Package_set_checksum(PackageObject
* self
, PyObject
* value
) {
205 const char* checksum
= PyUnicode_FromValue(value
);
207 pakfire_package_set_checksum(self
->package
, checksum
);
210 static PyObject
* Package_get_summary(PackageObject
* self
) {
211 const char* summary
= pakfire_package_get_summary(self
->package
);
215 return PyUnicode_FromString(summary
);
218 static void Package_set_summary(PackageObject
* self
, PyObject
* value
) {
219 const char* summary
= PyUnicode_FromValue(value
);
221 pakfire_package_set_summary(self
->package
, summary
);
224 static PyObject
* Package_get_description(PackageObject
* self
) {
225 const char* description
= pakfire_package_get_description(self
->package
);
229 return PyUnicode_FromString(description
);
232 static void Package_set_description(PackageObject
* self
, PyObject
* value
) {
233 const char* description
= PyUnicode_FromValue(value
);
235 pakfire_package_set_description(self
->package
, description
);
238 static PyObject
* Package_get_license(PackageObject
* self
) {
239 const char* license
= pakfire_package_get_license(self
->package
);
243 return PyUnicode_FromString(license
);
246 static void Package_set_license(PackageObject
* self
, PyObject
* value
) {
247 const char* license
= PyUnicode_FromValue(value
);
249 pakfire_package_set_summary(self
->package
, license
);
252 static PyObject
* Package_get_url(PackageObject
* self
) {
253 const char* url
= pakfire_package_get_url(self
->package
);
257 return PyUnicode_FromString(url
);
260 static void Package_set_url(PackageObject
* self
, PyObject
* value
) {
261 const char* url
= PyUnicode_FromValue(value
);
263 pakfire_package_set_url(self
->package
, url
);
266 static PyObject
* Package_get_groups(PackageObject
* self
) {
267 const char* s
= pakfire_package_get_groups(self
->package
);
269 return PyUnicode_FromString(s
);
272 static int Package_set_groups(PackageObject
* self
, PyObject
* value
) {
273 const char* groups
= PyUnicode_AsUTF8(value
);
276 pakfire_package_set_groups(self
->package
, groups
);
281 static PyObject
* Package_get_vendor(PackageObject
* self
) {
282 const char* vendor
= pakfire_package_get_vendor(self
->package
);
286 return PyUnicode_FromString(vendor
);
289 static void Package_set_vendor(PackageObject
* self
, PyObject
* value
) {
290 const char* vendor
= PyUnicode_FromValue(value
);
292 pakfire_package_set_vendor(self
->package
, vendor
);
295 static PyObject
* Package_get_maintainer(PackageObject
* self
) {
296 const char* maintainer
= pakfire_package_get_maintainer(self
->package
);
300 return PyUnicode_FromString(maintainer
);
303 static void Package_set_maintainer(PackageObject
* self
, PyObject
* value
) {
304 const char* maintainer
= PyUnicode_FromValue(value
);
306 pakfire_package_set_maintainer(self
->package
, maintainer
);
309 static PyObject
* Package_get_filename(PackageObject
* self
) {
310 const char* filename
= pakfire_package_get_filename(self
->package
);
314 return PyUnicode_FromString(filename
);
317 static void Package_set_filename(PackageObject
* self
, PyObject
* value
) {
318 const char* filename
= PyUnicode_FromValue(value
);
320 pakfire_package_set_filename(self
->package
, filename
);
323 static PyObject
* Package_get_installed(PackageObject
* self
) {
324 int installed
= pakfire_package_is_installed(self
->package
);
326 return PyBool_FromLong(installed
);
329 static PyObject
* Package_get_downloadsize(PackageObject
* self
) {
330 unsigned long long size
= pakfire_package_get_downloadsize(self
->package
);
332 return PyLong_FromUnsignedLongLong(size
);
335 static void Package_set_downloadsize(PackageObject
* self
, PyObject
* value
) {
336 unsigned long downloadsize
= PyLong_AsUnsignedLong(value
);
338 pakfire_package_set_downloadsize(self
->package
, downloadsize
);
341 static PyObject
* Package_get_installsize(PackageObject
* self
) {
342 unsigned long long size
= pakfire_package_get_installsize(self
->package
);
344 return PyLong_FromUnsignedLongLong(size
);
347 static void Package_set_installsize(PackageObject
* self
, PyObject
* value
) {
348 unsigned long installsize
= PyLong_AsUnsignedLong(value
);
350 pakfire_package_set_installsize(self
->package
, installsize
);
353 static PyObject
* Package_get_size(PackageObject
* self
) {
354 unsigned long long size
= pakfire_package_get_size(self
->package
);
356 return PyLong_FromUnsignedLongLong(size
);
359 static PyObject
* Package_get_buildhost(PackageObject
* self
) {
360 const char* build_host
= pakfire_package_get_build_host(self
->package
);
364 return PyUnicode_FromString(build_host
);
367 static void Package_set_buildhost(PackageObject
* self
, PyObject
* value
) {
368 const char* build_host
= PyUnicode_FromValue(value
);
370 pakfire_package_set_build_host(self
->package
, build_host
);
373 static PyObject
* Package_get_buildtime(PackageObject
* self
) {
374 time_t build_time
= pakfire_package_get_build_time(self
->package
);
376 return PyLong_FromUnsignedLongLong(build_time
);
379 static void Package_set_buildtime(PackageObject
* self
, PyObject
* value
) {
380 time_t build_time
= PyLong_AsUnsignedLongLong(value
);
382 pakfire_package_set_build_time(self
->package
, build_time
);
385 static PyObject
* Package_get_repo(PackageObject
* self
) {
386 struct pakfire_repo
* repo
= pakfire_package_get_repo(self
->package
);
390 PyObject
* obj
= new_repo(&RepoType
, repo
);
391 pakfire_repo_unref(repo
);
396 static PyObject
* Package_get_path(PackageObject
* self
) {
397 const char* path
= pakfire_package_get_path(self
->package
);
399 PyErr_SetFromErrno(PyExc_OSError
);
403 return PyUnicode_FromString(path
);
406 static PyObject
* PyList_FromRelationList(char** deps
) {
407 PyObject
* list
= PyList_New(0);
415 for (char** dep
= deps
; *dep
; dep
++) {
416 PyObject
* obj
= PyUnicode_FromString(*dep
);
420 PyList_Append(list
, obj
);
427 static PyObject
* Package_get_provides(PackageObject
* self
) {
428 char** deps
= pakfire_package_get_provides(self
->package
);
430 PyObject
* list
= PyList_FromRelationList(deps
);
433 for (char** dep
= deps
; *dep
; dep
++)
441 static PyObject
* Package_get_requires(PackageObject
* self
) {
442 char** deps
= pakfire_package_get_requires(self
->package
);
444 PyObject
* list
= PyList_FromRelationList(deps
);
447 for (char** dep
= deps
; *dep
; dep
++)
455 static PyObject
* Package_get_obsoletes(PackageObject
* self
) {
456 char** deps
= pakfire_package_get_obsoletes(self
->package
);
458 PyObject
* list
= PyList_FromRelationList(deps
);
461 for (char** dep
= deps
; *dep
; dep
++)
469 static PyObject
* Package_get_conflicts(PackageObject
* self
) {
470 char** deps
= pakfire_package_get_conflicts(self
->package
);
472 PyObject
* list
= PyList_FromRelationList(deps
);
475 for (char** dep
= deps
; *dep
; dep
++)
483 static PyObject
* Package_get_recommends(PackageObject
* self
) {
484 char** deps
= pakfire_package_get_recommends(self
->package
);
486 PyObject
* list
= PyList_FromRelationList(deps
);
489 for (char** dep
= deps
; *dep
; dep
++)
497 static PyObject
* Package_get_suggests(PackageObject
* self
) {
498 char** deps
= pakfire_package_get_suggests(self
->package
);
500 PyObject
* list
= PyList_FromRelationList(deps
);
503 for (char** dep
= deps
; *dep
; dep
++)
511 static PyObject
* Package_get_reverse_requires(PackageObject
* self
) {
512 struct pakfire_packagelist
* list
= NULL
;
514 int r
= pakfire_package_get_reverse_requires(self
->package
, &list
);
516 PyErr_SetFromErrno(PyExc_OSError
);
520 PyObject
* object
= PyList_FromPackageList(list
);
521 pakfire_packagelist_unref(list
);
526 static PyObject
* Package_get_filelist(PackageObject
* self
, PyObject
* args
) {
527 PyObject
* list
= PyList_New(0);
531 struct pakfire_filelist
* filelist
= pakfire_package_get_filelist(self
->package
);
532 for (unsigned int i
= 0; i
< pakfire_filelist_size(filelist
); i
++) {
533 struct pakfire_file
* file
= pakfire_filelist_get(filelist
, i
);
534 const char* path
= pakfire_file_get_path(file
);
535 pakfire_file_unref(file
);
537 PyObject
* obj
= PyUnicode_FromString(path
);
539 int ret
= PyList_Append(list
, obj
);
543 pakfire_filelist_unref(filelist
);
550 pakfire_filelist_unref(filelist
);
555 static int Package_set_filelist(PackageObject
* self
, PyObject
* value
) {
556 if (!PySequence_Check(value
)) {
557 PyErr_SetString(PyExc_AttributeError
, "Expected a sequence.");
561 Pakfire pakfire
= pakfire_package_get_pakfire(self
->package
);
563 // Create a new filelist
564 struct pakfire_filelist
* filelist
;
566 int r
= pakfire_filelist_create(&filelist
, pakfire
);
568 pakfire_unref(pakfire
);
570 PyErr_SetFromErrno(PyExc_OSError
);
575 const int length
= PySequence_Length(value
);
576 for (int i
= 0; i
< length
; i
++) {
577 PyObject
* item
= PySequence_GetItem(value
, i
);
579 if (!PyUnicode_Check(item
)) {
581 pakfire_filelist_unref(filelist
);
582 pakfire_unref(pakfire
);
584 PyErr_SetString(PyExc_AttributeError
, "Expected a string");
588 const char* path
= PyUnicode_AsUTF8(item
);
592 struct pakfire_file
* file
;
594 r
= pakfire_file_create(&file
, pakfire
);
597 PyErr_SetFromErrno(PyExc_OSError
);
598 pakfire_filelist_unref(filelist
);
599 pakfire_unref(pakfire
);
604 pakfire_file_set_path(file
, path
);
606 // Append the file to the filelist
607 pakfire_filelist_append(filelist
, file
);
608 pakfire_file_unref(file
);
612 r
= pakfire_package_set_filelist(self
->package
, filelist
);
613 pakfire_filelist_unref(filelist
);
616 pakfire_unref(pakfire
);
619 PyErr_SetFromErrno(PyExc_OSError
);
624 pakfire_unref(pakfire
);
629 static PyObject
* Package_dump(PackageObject
* self
, PyObject
*args
, PyObject
* kwds
) {
630 static char* kwlist
[] = {"long", "filelist", NULL
};
635 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|ii", kwlist
, &long_format
, &filelist
))
640 flags
|= PAKFIRE_PKG_DUMP_LONG
;
643 flags
|= PAKFIRE_PKG_DUMP_FILELIST
;
645 char* package_dump
= pakfire_package_dump(self
->package
, flags
);
650 return PyUnicode_FromString(package_dump
);
653 static struct PyMethodDef Package_methods
[] = {
656 (PyCFunction
)Package_dump
,
657 METH_VARARGS
|METH_KEYWORDS
,
663 static struct PyGetSetDef Package_getsetters
[] = {
666 (getter
)Package_get_name
,
667 (setter
)Package_set_name
,
673 (getter
)Package_get_evr
,
680 (getter
)Package_get_arch
,
681 (setter
)Package_set_arch
,
687 (getter
)Package_get_uuid
,
688 (setter
)Package_set_uuid
,
694 (getter
)Package_get_checksum
,
695 (setter
)Package_set_checksum
,
701 (getter
)Package_get_summary
,
702 (setter
)Package_set_summary
,
708 (getter
)Package_get_description
,
709 (setter
)Package_set_description
,
715 (getter
)Package_get_license
,
716 (setter
)Package_set_license
,
722 (getter
)Package_get_url
,
723 (setter
)Package_set_url
,
729 (getter
)Package_get_groups
,
730 (setter
)Package_set_groups
,
736 (getter
)Package_get_vendor
,
737 (setter
)Package_set_vendor
,
743 (getter
)Package_get_maintainer
,
744 (setter
)Package_set_maintainer
,
750 (getter
)Package_get_filename
,
751 (setter
)Package_set_filename
,
757 (getter
)Package_get_installed
,
764 (getter
)Package_get_downloadsize
,
765 (setter
)Package_set_downloadsize
,
771 (getter
)Package_get_installsize
,
772 (setter
)Package_set_installsize
,
778 (getter
)Package_get_size
,
785 (getter
)Package_get_buildhost
,
786 (setter
)Package_set_buildhost
,
792 (getter
)Package_get_buildtime
,
793 (setter
)Package_set_buildtime
,
801 (getter
)Package_get_provides
,
808 (getter
)Package_get_requires
,
815 (getter
)Package_get_obsoletes
,
822 (getter
)Package_get_conflicts
,
829 (getter
)Package_get_recommends
,
836 (getter
)Package_get_suggests
,
843 (getter
)Package_get_reverse_requires
,
852 (getter
)Package_get_repo
,
859 (getter
)Package_get_path
,
868 (getter
)Package_get_filelist
,
869 (setter
)Package_set_filelist
,
877 PyTypeObject PackageType
= {
878 PyVarObject_HEAD_INIT(NULL
, 0)
879 tp_name
: "_pakfire.Package",
880 tp_basicsize
: sizeof(PackageObject
),
881 tp_flags
: Py_TPFLAGS_DEFAULT
|Py_TPFLAGS_BASETYPE
,
883 tp_dealloc
: (destructor
)Package_dealloc
,
884 tp_init
: (initproc
)Package_init
,
885 tp_doc
: "Package object",
886 tp_methods
: Package_methods
,
887 tp_getset
: Package_getsetters
,
888 tp_repr
: (reprfunc
)Package_repr
,
889 tp_str
: (reprfunc
)Package_str
,
890 tp_richcompare
: (richcmpfunc
)Package_richcompare
,