]>
Commit | Line | Data |
---|---|---|
b8a51cb6 MT |
1 | /*############################################################################# |
2 | # # | |
3 | # Pakfire - The IPFire package management system # | |
233c5276 | 4 | # Copyright (C) 2011 Pakfire development team # |
b8a51cb6 MT |
5 | # # |
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. # | |
10 | # # | |
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. # | |
15 | # # | |
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/>. # | |
18 | # # | |
19 | #############################################################################*/ | |
20 | ||
21 | #include <Python.h> | |
22 | ||
233c5276 | 23 | #include <pakfire/file.h> |
5e9463ec | 24 | #include <pakfire/filelist.h> |
233c5276 | 25 | #include <pakfire/package.h> |
843fcc66 | 26 | #include <pakfire/repo.h> |
233c5276 MT |
27 | #include <pakfire/util.h> |
28 | ||
b8a51cb6 | 29 | #include "package.h" |
cbed1552 | 30 | #include "pakfire.h" |
233c5276 | 31 | #include "repo.h" |
e1d77c57 | 32 | #include "util.h" |
b8a51cb6 | 33 | |
31480bee | 34 | PyObject* new_package(PyTypeObject* type, struct pakfire_package* pkg) { |
6029ca33 MT |
35 | PackageObject* self = (PackageObject *)type->tp_alloc(type, 0); |
36 | if (self) { | |
37 | self->package = pakfire_package_ref(pkg); | |
38 | } | |
233c5276 | 39 | |
6029ca33 | 40 | return (PyObject *)self; |
233c5276 MT |
41 | } |
42 | ||
43 | static PyObject* Package_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { | |
44 | PackageObject* self = (PackageObject *)type->tp_alloc(type, 0); | |
45 | if (self) { | |
233c5276 MT |
46 | self->package = NULL; |
47 | } | |
48 | ||
49 | return (PyObject *)self; | |
50 | } | |
51 | ||
52 | static void Package_dealloc(PackageObject* self) { | |
cbed1552 | 53 | pakfire_package_unref(self->package); |
233c5276 MT |
54 | |
55 | Py_TYPE(self)->tp_free((PyObject *)self); | |
56 | } | |
57 | ||
58 | static int Package_init(PackageObject* self, PyObject* args, PyObject* kwds) { | |
cbed1552 | 59 | PakfireObject* pakfire; |
0e7800fb MT |
60 | RepoObject* repo; |
61 | const char* name = NULL; | |
62 | const char* evr = NULL; | |
63 | const char* arch = NULL; | |
233c5276 | 64 | |
0e7800fb MT |
65 | if (!PyArg_ParseTuple(args, "O!O!sss", &PakfireType, &pakfire, &RepoType, &repo, |
66 | &name, &evr, &arch)) | |
233c5276 MT |
67 | return -1; |
68 | ||
0e7800fb MT |
69 | self->package = pakfire_package_create(pakfire->pakfire, repo->repo, name, evr, arch); |
70 | if (!self->package) { | |
71 | PyErr_SetFromErrno(PyExc_OSError); | |
72 | return -1; | |
73 | } | |
233c5276 MT |
74 | |
75 | return 0; | |
76 | } | |
77 | ||
233c5276 | 78 | static PyObject* Package_repr(PackageObject* self) { |
4a9cbd3c | 79 | const char* nevra = pakfire_package_get_nevra(self->package); |
233c5276 | 80 | |
4a9cbd3c | 81 | return PyUnicode_FromFormat("<_pakfire.Package %s>", nevra); |
233c5276 MT |
82 | } |
83 | ||
84 | static PyObject* Package_str(PackageObject* self) { | |
4a9cbd3c | 85 | const char* nevra = pakfire_package_get_nevra(self->package); |
233c5276 | 86 | |
4a9cbd3c | 87 | return PyUnicode_FromString(nevra); |
233c5276 MT |
88 | } |
89 | ||
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"); | |
93 | return NULL; | |
94 | } | |
95 | ||
96 | PackageObject* other = (PackageObject *)_other; | |
97 | ||
98 | long result = pakfire_package_cmp(self->package, other->package); | |
99 | ||
100 | switch (op) { | |
101 | case Py_EQ: | |
102 | if (result == 0) | |
103 | Py_RETURN_TRUE; | |
104 | break; | |
105 | ||
106 | case Py_NE: | |
107 | if (result != 0) | |
108 | Py_RETURN_TRUE; | |
109 | break; | |
110 | ||
111 | case Py_LE: | |
112 | if (result <= 0) | |
113 | Py_RETURN_TRUE; | |
114 | break; | |
115 | ||
116 | case Py_GE: | |
117 | if (result >= 0) | |
118 | Py_RETURN_TRUE; | |
119 | break; | |
120 | ||
121 | case Py_LT: | |
122 | if (result < 0) | |
123 | Py_RETURN_TRUE; | |
124 | break; | |
125 | ||
126 | case Py_GT: | |
127 | if (result > 0) | |
128 | Py_RETURN_TRUE; | |
129 | break; | |
130 | ||
131 | default: | |
132 | PyErr_BadArgument(); | |
133 | return NULL; | |
134 | } | |
135 | ||
136 | Py_RETURN_FALSE; | |
137 | } | |
138 | ||
139 | static const char* PyUnicode_FromValue(PyObject* value) { | |
140 | if (value == Py_None) | |
141 | return NULL; | |
142 | ||
143 | return PyUnicode_AsUTF8(value); | |
144 | } | |
145 | ||
146 | static PyObject* Package_get_name(PackageObject* self) { | |
147 | const char* name = pakfire_package_get_name(self->package); | |
148 | if (!name) | |
149 | Py_RETURN_NONE; | |
150 | ||
151 | return PyUnicode_FromString(name); | |
152 | } | |
153 | ||
154 | static void Package_set_name(PackageObject* self, PyObject* value) { | |
155 | const char* name = PyUnicode_FromValue(value); | |
156 | ||
157 | pakfire_package_set_name(self->package, name); | |
158 | } | |
159 | ||
233c5276 MT |
160 | static PyObject* Package_get_evr(PackageObject* self) { |
161 | const char* evr = pakfire_package_get_evr(self->package); | |
162 | if (!evr) | |
163 | Py_RETURN_NONE; | |
164 | ||
165 | return PyUnicode_FromString(evr); | |
166 | } | |
167 | ||
168 | static PyObject* Package_get_arch(PackageObject* self) { | |
169 | const char* arch = pakfire_package_get_arch(self->package); | |
170 | if (!arch) | |
171 | Py_RETURN_NONE; | |
172 | ||
173 | return PyUnicode_FromString(arch); | |
174 | } | |
175 | ||
176 | static void Package_set_arch(PackageObject* self, PyObject* value) { | |
177 | const char* arch = PyUnicode_FromValue(value); | |
178 | ||
179 | pakfire_package_set_arch(self->package, arch); | |
180 | } | |
181 | ||
182 | static PyObject* Package_get_uuid(PackageObject* self) { | |
183 | const char* uuid = pakfire_package_get_uuid(self->package); | |
184 | if (!uuid) | |
185 | Py_RETURN_NONE; | |
186 | ||
187 | return PyUnicode_FromString(uuid); | |
188 | } | |
189 | ||
190 | static void Package_set_uuid(PackageObject* self, PyObject* value) { | |
191 | const char* uuid = PyUnicode_FromValue(value); | |
192 | ||
193 | pakfire_package_set_uuid(self->package, uuid); | |
194 | } | |
195 | ||
196 | static PyObject* Package_get_checksum(PackageObject* self) { | |
197 | const char* checksum = pakfire_package_get_checksum(self->package); | |
198 | if (!checksum) | |
199 | Py_RETURN_NONE; | |
200 | ||
201 | return PyUnicode_FromString(checksum); | |
202 | } | |
203 | ||
204 | static void Package_set_checksum(PackageObject* self, PyObject* value) { | |
205 | const char* checksum = PyUnicode_FromValue(value); | |
206 | ||
207 | pakfire_package_set_checksum(self->package, checksum); | |
208 | } | |
209 | ||
210 | static PyObject* Package_get_summary(PackageObject* self) { | |
211 | const char* summary = pakfire_package_get_summary(self->package); | |
212 | if (!summary) | |
213 | Py_RETURN_NONE; | |
214 | ||
215 | return PyUnicode_FromString(summary); | |
216 | } | |
217 | ||
218 | static void Package_set_summary(PackageObject* self, PyObject* value) { | |
219 | const char* summary = PyUnicode_FromValue(value); | |
220 | ||
221 | pakfire_package_set_summary(self->package, summary); | |
222 | } | |
223 | ||
224 | static PyObject* Package_get_description(PackageObject* self) { | |
225 | const char* description = pakfire_package_get_description(self->package); | |
226 | if (!description) | |
227 | Py_RETURN_NONE; | |
228 | ||
229 | return PyUnicode_FromString(description); | |
230 | } | |
231 | ||
232 | static void Package_set_description(PackageObject* self, PyObject* value) { | |
233 | const char* description = PyUnicode_FromValue(value); | |
234 | ||
235 | pakfire_package_set_description(self->package, description); | |
236 | } | |
237 | ||
238 | static PyObject* Package_get_license(PackageObject* self) { | |
239 | const char* license = pakfire_package_get_license(self->package); | |
240 | if (!license) | |
241 | Py_RETURN_NONE; | |
242 | ||
243 | return PyUnicode_FromString(license); | |
244 | } | |
245 | ||
246 | static void Package_set_license(PackageObject* self, PyObject* value) { | |
247 | const char* license = PyUnicode_FromValue(value); | |
248 | ||
249 | pakfire_package_set_summary(self->package, license); | |
250 | } | |
251 | ||
252 | static PyObject* Package_get_url(PackageObject* self) { | |
253 | const char* url = pakfire_package_get_url(self->package); | |
254 | if (!url) | |
255 | Py_RETURN_NONE; | |
256 | ||
257 | return PyUnicode_FromString(url); | |
258 | } | |
259 | ||
260 | static void Package_set_url(PackageObject* self, PyObject* value) { | |
261 | const char* url = PyUnicode_FromValue(value); | |
262 | ||
263 | pakfire_package_set_url(self->package, url); | |
264 | } | |
265 | ||
266 | static PyObject* Package_get_groups(PackageObject* self) { | |
7ccc9d74 | 267 | const char* s = pakfire_package_get_groups(self->package); |
233c5276 | 268 | |
603ca1e0 | 269 | return PyUnicode_FromString(s); |
233c5276 MT |
270 | } |
271 | ||
272 | static int Package_set_groups(PackageObject* self, PyObject* value) { | |
7ccc9d74 | 273 | const char* groups = PyUnicode_AsUTF8(value); |
233c5276 | 274 | |
7ccc9d74 MT |
275 | if (groups) |
276 | pakfire_package_set_groups(self->package, groups); | |
233c5276 MT |
277 | |
278 | return 0; | |
279 | } | |
280 | ||
281 | static PyObject* Package_get_vendor(PackageObject* self) { | |
282 | const char* vendor = pakfire_package_get_vendor(self->package); | |
283 | if (!vendor) | |
284 | Py_RETURN_NONE; | |
285 | ||
286 | return PyUnicode_FromString(vendor); | |
287 | } | |
288 | ||
289 | static void Package_set_vendor(PackageObject* self, PyObject* value) { | |
290 | const char* vendor = PyUnicode_FromValue(value); | |
291 | ||
292 | pakfire_package_set_vendor(self->package, vendor); | |
293 | } | |
294 | ||
295 | static PyObject* Package_get_maintainer(PackageObject* self) { | |
296 | const char* maintainer = pakfire_package_get_maintainer(self->package); | |
297 | if (!maintainer) | |
298 | Py_RETURN_NONE; | |
299 | ||
300 | return PyUnicode_FromString(maintainer); | |
301 | } | |
302 | ||
303 | static void Package_set_maintainer(PackageObject* self, PyObject* value) { | |
304 | const char* maintainer = PyUnicode_FromValue(value); | |
305 | ||
306 | pakfire_package_set_maintainer(self->package, maintainer); | |
307 | } | |
308 | ||
309 | static PyObject* Package_get_filename(PackageObject* self) { | |
310 | const char* filename = pakfire_package_get_filename(self->package); | |
311 | if (!filename) | |
312 | Py_RETURN_NONE; | |
313 | ||
314 | return PyUnicode_FromString(filename); | |
315 | } | |
316 | ||
317 | static void Package_set_filename(PackageObject* self, PyObject* value) { | |
318 | const char* filename = PyUnicode_FromValue(value); | |
319 | ||
320 | pakfire_package_set_filename(self->package, filename); | |
321 | } | |
322 | ||
323 | static PyObject* Package_get_installed(PackageObject* self) { | |
324 | int installed = pakfire_package_is_installed(self->package); | |
325 | ||
326 | return PyBool_FromLong(installed); | |
327 | } | |
328 | ||
329 | static PyObject* Package_get_downloadsize(PackageObject* self) { | |
330 | unsigned long long size = pakfire_package_get_downloadsize(self->package); | |
331 | ||
332 | return PyLong_FromUnsignedLongLong(size); | |
333 | } | |
334 | ||
335 | static void Package_set_downloadsize(PackageObject* self, PyObject* value) { | |
336 | unsigned long downloadsize = PyLong_AsUnsignedLong(value); | |
337 | ||
338 | pakfire_package_set_downloadsize(self->package, downloadsize); | |
339 | } | |
340 | ||
341 | static PyObject* Package_get_installsize(PackageObject* self) { | |
342 | unsigned long long size = pakfire_package_get_installsize(self->package); | |
343 | ||
344 | return PyLong_FromUnsignedLongLong(size); | |
345 | } | |
346 | ||
347 | static void Package_set_installsize(PackageObject* self, PyObject* value) { | |
348 | unsigned long installsize = PyLong_AsUnsignedLong(value); | |
349 | ||
350 | pakfire_package_set_installsize(self->package, installsize); | |
351 | } | |
352 | ||
353 | static PyObject* Package_get_size(PackageObject* self) { | |
354 | unsigned long long size = pakfire_package_get_size(self->package); | |
355 | ||
356 | return PyLong_FromUnsignedLongLong(size); | |
357 | } | |
358 | ||
359 | static PyObject* Package_get_buildhost(PackageObject* self) { | |
2ffc704d MT |
360 | const char* build_host = pakfire_package_get_build_host(self->package); |
361 | if (!build_host) | |
233c5276 MT |
362 | Py_RETURN_NONE; |
363 | ||
2ffc704d | 364 | return PyUnicode_FromString(build_host); |
233c5276 MT |
365 | } |
366 | ||
367 | static void Package_set_buildhost(PackageObject* self, PyObject* value) { | |
2ffc704d | 368 | const char* build_host = PyUnicode_FromValue(value); |
233c5276 | 369 | |
2ffc704d | 370 | pakfire_package_set_build_host(self->package, build_host); |
b8a51cb6 | 371 | } |
233c5276 MT |
372 | |
373 | static PyObject* Package_get_buildtime(PackageObject* self) { | |
2ffc704d | 374 | time_t build_time = pakfire_package_get_build_time(self->package); |
233c5276 | 375 | |
2ffc704d | 376 | return PyLong_FromUnsignedLongLong(build_time); |
233c5276 MT |
377 | } |
378 | ||
379 | static void Package_set_buildtime(PackageObject* self, PyObject* value) { | |
2ffc704d | 380 | time_t build_time = PyLong_AsUnsignedLongLong(value); |
233c5276 | 381 | |
2ffc704d | 382 | pakfire_package_set_build_time(self->package, build_time); |
233c5276 MT |
383 | } |
384 | ||
233c5276 | 385 | static PyObject* Package_get_repo(PackageObject* self) { |
4651122b | 386 | struct pakfire_repo* repo = pakfire_package_get_repo(self->package); |
233c5276 | 387 | if (!repo) |
8ef6c388 | 388 | Py_RETURN_NONE; |
233c5276 | 389 | |
8ef6c388 | 390 | PyObject* obj = new_repo(&RepoType, repo); |
3ff6aee6 | 391 | pakfire_repo_unref(repo); |
233c5276 | 392 | |
8ef6c388 | 393 | return obj; |
233c5276 MT |
394 | } |
395 | ||
b12a5d7d MT |
396 | static PyObject* Package_get_path(PackageObject* self) { |
397 | const char* path = pakfire_package_get_path(self->package); | |
398 | if (!path) { | |
399 | PyErr_SetFromErrno(PyExc_OSError); | |
400 | return NULL; | |
401 | } | |
233c5276 | 402 | |
b12a5d7d | 403 | return PyUnicode_FromString(path); |
233c5276 MT |
404 | } |
405 | ||
452d3833 | 406 | static PyObject* PyList_FromRelationList(char** deps) { |
233c5276 MT |
407 | PyObject* list = PyList_New(0); |
408 | if (list == NULL) | |
409 | return NULL; | |
410 | ||
452d3833 MT |
411 | // Empty list? |
412 | if (!deps) | |
413 | return list; | |
233c5276 | 414 | |
452d3833 MT |
415 | for (char** dep = deps; *dep; dep++) { |
416 | PyObject* obj = PyUnicode_FromString(*dep); | |
417 | if (!obj) | |
418 | break; | |
233c5276 | 419 | |
452d3833 MT |
420 | PyList_Append(list, obj); |
421 | Py_DECREF(obj); | |
233c5276 MT |
422 | } |
423 | ||
424 | return list; | |
233c5276 MT |
425 | } |
426 | ||
452d3833 MT |
427 | static PyObject* Package_get_provides(PackageObject* self) { |
428 | char** deps = pakfire_package_get_provides(self->package); | |
233c5276 | 429 | |
452d3833 | 430 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 431 | |
452d3833 MT |
432 | if (deps) { |
433 | for (char** dep = deps; *dep; dep++) | |
434 | free(*dep); | |
435 | free(deps); | |
233c5276 MT |
436 | } |
437 | ||
233c5276 MT |
438 | return list; |
439 | } | |
440 | ||
233c5276 | 441 | static PyObject* Package_get_requires(PackageObject* self) { |
452d3833 | 442 | char** deps = pakfire_package_get_requires(self->package); |
233c5276 | 443 | |
452d3833 | 444 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 445 | |
452d3833 MT |
446 | if (deps) { |
447 | for (char** dep = deps; *dep; dep++) | |
448 | free(*dep); | |
449 | free(deps); | |
450 | } | |
233c5276 MT |
451 | |
452 | return list; | |
453 | } | |
454 | ||
452d3833 MT |
455 | static PyObject* Package_get_obsoletes(PackageObject* self) { |
456 | char** deps = pakfire_package_get_obsoletes(self->package); | |
233c5276 | 457 | |
452d3833 | 458 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 459 | |
452d3833 MT |
460 | if (deps) { |
461 | for (char** dep = deps; *dep; dep++) | |
462 | free(*dep); | |
463 | free(deps); | |
464 | } | |
233c5276 MT |
465 | |
466 | return list; | |
467 | } | |
468 | ||
452d3833 MT |
469 | static PyObject* Package_get_conflicts(PackageObject* self) { |
470 | char** deps = pakfire_package_get_conflicts(self->package); | |
233c5276 | 471 | |
452d3833 | 472 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 473 | |
452d3833 MT |
474 | if (deps) { |
475 | for (char** dep = deps; *dep; dep++) | |
476 | free(*dep); | |
477 | free(deps); | |
478 | } | |
233c5276 MT |
479 | |
480 | return list; | |
481 | } | |
482 | ||
452d3833 MT |
483 | static PyObject* Package_get_recommends(PackageObject* self) { |
484 | char** deps = pakfire_package_get_recommends(self->package); | |
233c5276 | 485 | |
452d3833 | 486 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 487 | |
452d3833 MT |
488 | if (deps) { |
489 | for (char** dep = deps; *dep; dep++) | |
490 | free(*dep); | |
491 | free(deps); | |
492 | } | |
233c5276 MT |
493 | |
494 | return list; | |
495 | } | |
496 | ||
452d3833 MT |
497 | static PyObject* Package_get_suggests(PackageObject* self) { |
498 | char** deps = pakfire_package_get_suggests(self->package); | |
233c5276 | 499 | |
452d3833 | 500 | PyObject* list = PyList_FromRelationList(deps); |
233c5276 | 501 | |
452d3833 MT |
502 | if (deps) { |
503 | for (char** dep = deps; *dep; dep++) | |
504 | free(*dep); | |
505 | free(deps); | |
506 | } | |
233c5276 | 507 | |
452d3833 | 508 | return list; |
233c5276 MT |
509 | } |
510 | ||
e1d77c57 MT |
511 | static PyObject* Package_get_reverse_requires(PackageObject* self) { |
512 | struct pakfire_packagelist* list = NULL; | |
513 | ||
514 | int r = pakfire_package_get_reverse_requires(self->package, &list); | |
515 | if (r) { | |
516 | PyErr_SetFromErrno(PyExc_OSError); | |
517 | return NULL; | |
518 | } | |
519 | ||
520 | PyObject* object = PyList_FromPackageList(list); | |
521 | pakfire_packagelist_unref(list); | |
522 | ||
523 | return object; | |
524 | } | |
525 | ||
233c5276 MT |
526 | static PyObject* Package_get_filelist(PackageObject* self, PyObject* args) { |
527 | PyObject* list = PyList_New(0); | |
528 | if (list == NULL) | |
529 | return NULL; | |
530 | ||
1bbbfb9e | 531 | struct pakfire_filelist* filelist = pakfire_package_get_filelist(self->package); |
5e9463ec | 532 | for (unsigned int i = 0; i < pakfire_filelist_size(filelist); i++) { |
5803b5f6 | 533 | struct pakfire_file* file = pakfire_filelist_get(filelist, i); |
32485f6c | 534 | const char* path = pakfire_file_get_path(file); |
5e9463ec | 535 | pakfire_file_unref(file); |
233c5276 | 536 | |
32485f6c | 537 | PyObject* obj = PyUnicode_FromString(path); |
233c5276 MT |
538 | |
539 | int ret = PyList_Append(list, obj); | |
540 | Py_DECREF(obj); | |
541 | ||
5e9463ec MT |
542 | if (ret) { |
543 | pakfire_filelist_unref(filelist); | |
544 | Py_DECREF(list); | |
233c5276 | 545 | |
5e9463ec MT |
546 | return NULL; |
547 | } | |
233c5276 MT |
548 | } |
549 | ||
5e9463ec | 550 | pakfire_filelist_unref(filelist); |
233c5276 | 551 | |
5e9463ec | 552 | return list; |
233c5276 MT |
553 | } |
554 | ||
555 | static int Package_set_filelist(PackageObject* self, PyObject* value) { | |
556 | if (!PySequence_Check(value)) { | |
557 | PyErr_SetString(PyExc_AttributeError, "Expected a sequence."); | |
558 | return -1; | |
559 | } | |
560 | ||
883b3be9 MT |
561 | Pakfire pakfire = pakfire_package_get_pakfire(self->package); |
562 | ||
5e9463ec | 563 | // Create a new filelist |
1bbbfb9e | 564 | struct pakfire_filelist* filelist; |
5e9463ec | 565 | |
883b3be9 | 566 | int r = pakfire_filelist_create(&filelist, pakfire); |
5e9463ec | 567 | if (r) { |
883b3be9 | 568 | pakfire_unref(pakfire); |
5e9463ec MT |
569 | errno = -r; |
570 | PyErr_SetFromErrno(PyExc_OSError); | |
571 | ||
572 | return -1; | |
573 | } | |
233c5276 MT |
574 | |
575 | const int length = PySequence_Length(value); | |
576 | for (int i = 0; i < length; i++) { | |
577 | PyObject* item = PySequence_GetItem(value, i); | |
578 | ||
579 | if (!PyUnicode_Check(item)) { | |
580 | Py_DECREF(item); | |
5e9463ec | 581 | pakfire_filelist_unref(filelist); |
883b3be9 | 582 | pakfire_unref(pakfire); |
233c5276 MT |
583 | |
584 | PyErr_SetString(PyExc_AttributeError, "Expected a string"); | |
585 | return -1; | |
586 | } | |
587 | ||
32485f6c | 588 | const char* path = PyUnicode_AsUTF8(item); |
5e9463ec MT |
589 | Py_DECREF(item); |
590 | ||
591 | // Create a new file | |
5803b5f6 | 592 | struct pakfire_file* file; |
233c5276 | 593 | |
883b3be9 | 594 | r = pakfire_file_create(&file, pakfire); |
5e9463ec MT |
595 | if (r) { |
596 | errno = -r; | |
597 | PyErr_SetFromErrno(PyExc_OSError); | |
598 | pakfire_filelist_unref(filelist); | |
883b3be9 | 599 | pakfire_unref(pakfire); |
5e9463ec MT |
600 | return -1; |
601 | } | |
233c5276 | 602 | |
32485f6c MT |
603 | // Set the path |
604 | pakfire_file_set_path(file, path); | |
233c5276 | 605 | |
5e9463ec MT |
606 | // Append the file to the filelist |
607 | pakfire_filelist_append(filelist, file); | |
608 | pakfire_file_unref(file); | |
609 | } | |
610 | ||
611 | // Set filelist | |
612 | r = pakfire_package_set_filelist(self->package, filelist); | |
613 | pakfire_filelist_unref(filelist); | |
614 | ||
615 | if (r) { | |
883b3be9 MT |
616 | pakfire_unref(pakfire); |
617 | ||
5e9463ec MT |
618 | errno = -r; |
619 | PyErr_SetFromErrno(PyExc_OSError); | |
620 | ||
621 | return -1; | |
233c5276 MT |
622 | } |
623 | ||
883b3be9 MT |
624 | pakfire_unref(pakfire); |
625 | ||
233c5276 MT |
626 | return 0; |
627 | } | |
628 | ||
629 | static PyObject* Package_dump(PackageObject* self, PyObject *args, PyObject* kwds) { | |
630 | static char* kwlist[] = {"long", "filelist", NULL}; | |
631 | ||
632 | int long_format = 0; | |
633 | int filelist = 0; | |
634 | ||
635 | if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &long_format, &filelist)) | |
636 | return NULL; | |
637 | ||
638 | int flags = 0; | |
639 | if (long_format) | |
640 | flags |= PAKFIRE_PKG_DUMP_LONG; | |
641 | ||
642 | if (filelist) | |
643 | flags |= PAKFIRE_PKG_DUMP_FILELIST; | |
644 | ||
645 | char* package_dump = pakfire_package_dump(self->package, flags); | |
646 | ||
647 | if (!package_dump) | |
648 | Py_RETURN_NONE; | |
649 | ||
650 | return PyUnicode_FromString(package_dump); | |
651 | } | |
652 | ||
653 | static struct PyMethodDef Package_methods[] = { | |
233c5276 MT |
654 | { |
655 | "dump", | |
656 | (PyCFunction)Package_dump, | |
657 | METH_VARARGS|METH_KEYWORDS, | |
658 | NULL | |
659 | }, | |
660 | { NULL }, | |
661 | }; | |
662 | ||
663 | static struct PyGetSetDef Package_getsetters[] = { | |
664 | { | |
665 | "name", | |
666 | (getter)Package_get_name, | |
667 | (setter)Package_set_name, | |
668 | NULL, | |
669 | NULL | |
670 | }, | |
233c5276 MT |
671 | { |
672 | "evr", | |
673 | (getter)Package_get_evr, | |
674 | NULL, | |
675 | NULL, | |
676 | NULL | |
677 | }, | |
678 | { | |
679 | "arch", | |
680 | (getter)Package_get_arch, | |
681 | (setter)Package_set_arch, | |
682 | NULL, | |
683 | NULL | |
684 | }, | |
685 | { | |
686 | "uuid", | |
687 | (getter)Package_get_uuid, | |
688 | (setter)Package_set_uuid, | |
689 | NULL, | |
690 | NULL | |
691 | }, | |
692 | { | |
693 | "checksum", | |
694 | (getter)Package_get_checksum, | |
695 | (setter)Package_set_checksum, | |
696 | NULL, | |
697 | NULL | |
698 | }, | |
699 | { | |
700 | "summary", | |
701 | (getter)Package_get_summary, | |
702 | (setter)Package_set_summary, | |
703 | NULL, | |
704 | NULL | |
705 | }, | |
706 | { | |
707 | "description", | |
708 | (getter)Package_get_description, | |
709 | (setter)Package_set_description, | |
710 | NULL, | |
711 | NULL | |
712 | }, | |
713 | { | |
714 | "license", | |
715 | (getter)Package_get_license, | |
716 | (setter)Package_set_license, | |
717 | NULL, | |
718 | NULL | |
719 | }, | |
720 | { | |
721 | "url", | |
722 | (getter)Package_get_url, | |
723 | (setter)Package_set_url, | |
724 | NULL, | |
725 | NULL | |
726 | }, | |
727 | { | |
728 | "groups", | |
729 | (getter)Package_get_groups, | |
730 | (setter)Package_set_groups, | |
731 | NULL, | |
732 | NULL | |
733 | }, | |
734 | { | |
735 | "vendor", | |
736 | (getter)Package_get_vendor, | |
737 | (setter)Package_set_vendor, | |
738 | NULL, | |
739 | NULL | |
740 | }, | |
741 | { | |
742 | "maintainer", | |
743 | (getter)Package_get_maintainer, | |
744 | (setter)Package_set_maintainer, | |
745 | NULL, | |
746 | NULL | |
747 | }, | |
748 | { | |
749 | "filename", | |
750 | (getter)Package_get_filename, | |
751 | (setter)Package_set_filename, | |
752 | NULL, | |
753 | NULL | |
754 | }, | |
755 | { | |
756 | "installed", | |
757 | (getter)Package_get_installed, | |
758 | NULL, | |
759 | NULL, | |
760 | NULL | |
761 | }, | |
762 | { | |
763 | "downloadsize", | |
764 | (getter)Package_get_downloadsize, | |
765 | (setter)Package_set_downloadsize, | |
766 | NULL, | |
767 | NULL | |
768 | }, | |
769 | { | |
770 | "installsize", | |
771 | (getter)Package_get_installsize, | |
772 | (setter)Package_set_installsize, | |
773 | NULL, | |
774 | NULL | |
775 | }, | |
776 | { | |
777 | "size", | |
778 | (getter)Package_get_size, | |
779 | NULL, | |
780 | NULL, | |
781 | NULL | |
782 | }, | |
783 | { | |
784 | "buildhost", | |
785 | (getter)Package_get_buildhost, | |
786 | (setter)Package_set_buildhost, | |
787 | NULL, | |
788 | NULL | |
789 | }, | |
790 | { | |
791 | "buildtime", | |
792 | (getter)Package_get_buildtime, | |
793 | (setter)Package_set_buildtime, | |
794 | NULL, | |
795 | NULL | |
796 | }, | |
233c5276 MT |
797 | |
798 | // Dependencies | |
799 | { | |
800 | "provides", | |
801 | (getter)Package_get_provides, | |
452d3833 | 802 | NULL, |
233c5276 MT |
803 | NULL, |
804 | NULL | |
805 | }, | |
806 | { | |
807 | "requires", | |
808 | (getter)Package_get_requires, | |
452d3833 | 809 | NULL, |
233c5276 MT |
810 | NULL, |
811 | NULL | |
812 | }, | |
813 | { | |
814 | "obsoletes", | |
815 | (getter)Package_get_obsoletes, | |
452d3833 | 816 | NULL, |
233c5276 MT |
817 | NULL, |
818 | NULL | |
819 | }, | |
820 | { | |
821 | "conflicts", | |
822 | (getter)Package_get_conflicts, | |
452d3833 | 823 | NULL, |
233c5276 MT |
824 | NULL, |
825 | NULL | |
826 | }, | |
827 | { | |
828 | "recommends", | |
829 | (getter)Package_get_recommends, | |
452d3833 | 830 | NULL, |
233c5276 MT |
831 | NULL, |
832 | NULL | |
833 | }, | |
834 | { | |
835 | "suggests", | |
836 | (getter)Package_get_suggests, | |
452d3833 | 837 | NULL, |
233c5276 MT |
838 | NULL, |
839 | NULL | |
840 | }, | |
e1d77c57 MT |
841 | { |
842 | "reverse_requires", | |
843 | (getter)Package_get_reverse_requires, | |
844 | NULL, | |
845 | NULL, | |
846 | NULL | |
847 | }, | |
233c5276 MT |
848 | |
849 | // Repository | |
850 | { | |
851 | "repo", | |
852 | (getter)Package_get_repo, | |
1b551e42 | 853 | NULL, |
233c5276 MT |
854 | NULL, |
855 | NULL | |
856 | }, | |
857 | { | |
b12a5d7d MT |
858 | "path", |
859 | (getter)Package_get_path, | |
233c5276 MT |
860 | NULL, |
861 | NULL, | |
862 | NULL | |
863 | }, | |
864 | ||
865 | // Filelist | |
866 | { | |
867 | "filelist", | |
868 | (getter)Package_get_filelist, | |
869 | (setter)Package_set_filelist, | |
870 | NULL, | |
871 | NULL | |
872 | }, | |
873 | ||
874 | { NULL } | |
875 | }; | |
876 | ||
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, | |
882 | tp_new: Package_new, | |
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, | |
233c5276 MT |
888 | tp_repr: (reprfunc)Package_repr, |
889 | tp_str: (reprfunc)Package_str, | |
890 | tp_richcompare: (richcmpfunc)Package_richcompare, | |
891 | }; |