mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-04-08 09:41:43 +00:00
Implemented buildSystem, removeBinary and addBinary for the c extension; added a sample python script.
This commit is contained in:
parent
6add268c45
commit
a0dc325294
@ -1,10 +0,0 @@
|
||||
assert.o: assert.c
|
||||
britney-py.o: britney-py.c dpkg.h templates.h memory.h
|
||||
checklib.o: checklib.c dpkg.h templates.h memory.h
|
||||
dpkg.o: dpkg.c dpkg.h templates.h memory.h
|
||||
freelist.o: freelist.c templates.h memory.h
|
||||
memory2.o: memory2.c
|
||||
memory3.o: memory3.c memory.h templates.h freelist.h
|
||||
memory.o: memory.c memory.h templates.h freelist.h
|
||||
dpkg-lib.o: dpkg-lib.cpp dpkg.h templates.h memory.h
|
||||
Makefile.dep : Makefile assert.c britney-py.c checklib.c dpkg.c freelist.c memory2.c memory3.c memory.c dpkg.h freelist.h memory.h templates.h
|
166
lib/britney-py.c
166
lib/britney-py.c
@ -852,6 +852,168 @@ static PyObject *apt_versioncmp(PyObject *self, PyObject *args) {
|
||||
return Py_BuildValue("i", res);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* britney.buildSystem() -- build a fake package system, with the only purpose of
|
||||
* calling the is_installable method on the packages.
|
||||
******************************************************/
|
||||
|
||||
static PyObject *build_system(PyObject *self, PyObject *args) {
|
||||
int pos = 0;
|
||||
char *arch;
|
||||
PyObject *pkgs, *key, *value, *pyString;
|
||||
|
||||
(void)self; /* unused */
|
||||
|
||||
if (!PyArg_ParseTuple(args, "sO", &arch, &pkgs) ||
|
||||
!PyDict_Check(pkgs)) return NULL;
|
||||
|
||||
/* Fields and positions for the binary package:
|
||||
# VERSION = 0
|
||||
# SECTION = 1
|
||||
# SOURCE = 2
|
||||
# SOURCEVER = 3
|
||||
# ARCHITECTURE = 4
|
||||
# PREDEPENDS = 5
|
||||
# DEPENDS = 6
|
||||
# CONFLICTS = 7
|
||||
# PROVIDES = 8
|
||||
# RDEPENDS = 9
|
||||
# RCONFLICTS = 10
|
||||
*/
|
||||
|
||||
dpkg_packages *dpkg_pkgs = new_packages(arch);
|
||||
|
||||
/* loop on the dictionary keys to build the packages */
|
||||
while (PyDict_Next(pkgs, &pos, &key, &value)) {
|
||||
|
||||
/* initialize the new package */
|
||||
dpkg_package *pkg;
|
||||
pkg = block_malloc(sizeof(dpkg_package));
|
||||
pkg->package = PyString_AsString(key);
|
||||
pkg->priority = 0;
|
||||
pkg->details = NULL;
|
||||
pkg->depends[2] = NULL;
|
||||
pkg->depends[3] = NULL;
|
||||
|
||||
pyString = PyList_GetItem(value, 0);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->version = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 2);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->source = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 3);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->source_ver = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 4);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->arch_all = (!strcmp(PyString_AsString(pyString), "all") ? 1 : 0);
|
||||
|
||||
pyString = PyList_GetItem(value, 5);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->depends[0] = read_dep_andor(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 6);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->depends[1] = read_dep_andor(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 7);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->conflicts = read_dep_and(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 8);
|
||||
if (pyString == NULL) continue;
|
||||
pkg->provides = read_packagenames(PyString_AsString(pyString));
|
||||
|
||||
add_package(dpkg_pkgs, pkg);
|
||||
}
|
||||
|
||||
dpkgpackages *res;
|
||||
res = PyObject_NEW(dpkgpackages, &Packages_Type);
|
||||
if (res == NULL) return NULL;
|
||||
|
||||
res->pkgs = dpkg_pkgs;
|
||||
res->freeme = FREE;
|
||||
res->ref = NULL;
|
||||
|
||||
return (PyObject *)res;
|
||||
}
|
||||
|
||||
static PyObject *remove_binary(PyObject *self, PyObject *args) {
|
||||
char *pkg_name;
|
||||
dpkgpackages *pkgs;
|
||||
|
||||
(void)self; /* unused */
|
||||
|
||||
if (!PyArg_ParseTuple(args, "Os", &pkgs, &pkg_name))
|
||||
return NULL;
|
||||
|
||||
dpkg_collected_package *cpkg = lookup_packagetbl(pkgs->pkgs->packages, pkg_name);
|
||||
if (cpkg == NULL) return Py_BuildValue("i", 0);
|
||||
|
||||
remove_package(pkgs->pkgs, cpkg);
|
||||
return Py_BuildValue("i", 1);
|
||||
}
|
||||
|
||||
static PyObject *add_binary(PyObject *self, PyObject *args) {
|
||||
char *pkg_name;
|
||||
dpkgpackages *pkgs;
|
||||
PyObject *value, *pyString;
|
||||
|
||||
(void)self; /* unused */
|
||||
|
||||
if (!PyArg_ParseTuple(args, "OsO", &pkgs, &pkg_name, &value) ||
|
||||
!PyList_Check(value)) return NULL;
|
||||
|
||||
/* initialize the new package */
|
||||
dpkg_package *pkg;
|
||||
pkg = block_malloc(sizeof(dpkg_package));
|
||||
pkg->package = pkg_name;
|
||||
pkg->priority = 0;
|
||||
pkg->details = NULL;
|
||||
pkg->depends[2] = NULL;
|
||||
pkg->depends[3] = NULL;
|
||||
|
||||
pyString = PyList_GetItem(value, 0);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->version = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 2);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->source = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 3);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->source_ver = PyString_AsString(pyString);
|
||||
|
||||
pyString = PyList_GetItem(value, 4);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->arch_all = (!strcmp(PyString_AsString(pyString), "all") ? 1 : 0);
|
||||
|
||||
pyString = PyList_GetItem(value, 5);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->depends[0] = read_dep_andor(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 6);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->depends[1] = read_dep_andor(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 7);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->conflicts = read_dep_and(PyString_AsString(pyString));
|
||||
|
||||
pyString = PyList_GetItem(value, 8);
|
||||
if (pyString == NULL) return NULL;
|
||||
pkg->provides = read_packagenames(PyString_AsString(pyString));
|
||||
|
||||
add_package(pkgs->pkgs, pkg);
|
||||
|
||||
return Py_BuildValue("i", 1);
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* module initialisation
|
||||
***********************/
|
||||
@ -862,6 +1024,10 @@ static PyMethodDef britneymethods[] = {
|
||||
|
||||
{ "versioncmp", apt_versioncmp, METH_VARARGS, NULL },
|
||||
|
||||
{ "buildSystem", build_system, METH_VARARGS, NULL },
|
||||
{ "removeBinary", remove_binary, METH_VARARGS, NULL },
|
||||
{ "addBinary", add_binary, METH_VARARGS, NULL },
|
||||
|
||||
{ NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
|
20
lib/dpkg.c
20
lib/dpkg.c
@ -19,9 +19,9 @@ static dpkg_package *read_package( FILE *f );
|
||||
static collpackagelist **get_matching_low(collpackagelist **addto,
|
||||
dpkg_packages *pkgs, dependency *dep, int line);
|
||||
static collpackagelist *get_matching(dpkg_packages *pkgs, deplist *depopts, int line);
|
||||
static deplist *read_dep_and(char *buf);
|
||||
static deplistlist *read_dep_andor(char *buf);
|
||||
static ownedpackagenamelist *read_packagenames(char *buf);
|
||||
deplist *read_dep_and(char *buf);
|
||||
deplistlist *read_dep_andor(char *buf);
|
||||
ownedpackagenamelist *read_packagenames(char *buf);
|
||||
static dpkg_sources *read_sources_file(char *filename, int n_arches);
|
||||
static dpkg_source *new_source(dpkg_sources *owner);
|
||||
static dpkg_source *read_source(FILE *f, dpkg_sources *owner);
|
||||
@ -33,8 +33,8 @@ static void remove_virtualpackage(virtualpkgtbl *vpkgs, char *pkgname,
|
||||
dpkg_collected_package *cpkg);
|
||||
static char *read_packagename(char **buf, char *end);
|
||||
static char *read_until_char(char **buf, char *end);
|
||||
static void add_package(dpkg_packages *pkgs, dpkg_package *pkg);
|
||||
static void remove_package(dpkg_packages *pkgs, dpkg_collected_package *pkg);
|
||||
void add_package(dpkg_packages *pkgs, dpkg_package *pkg);
|
||||
void remove_package(dpkg_packages *pkgs, dpkg_collected_package *pkg);
|
||||
static dpkg_source_note *copy_source_note(dpkg_source_note *srcn);
|
||||
|
||||
#if 0
|
||||
@ -483,7 +483,7 @@ dpkg_packages *new_packages(char *arch) {
|
||||
return result;
|
||||
}
|
||||
|
||||
static void add_package(dpkg_packages *pkgs, dpkg_package *pkg)
|
||||
void add_package(dpkg_packages *pkgs, dpkg_package *pkg)
|
||||
{
|
||||
ownedpackagenamelist *v;
|
||||
dpkg_collected_package *cpkg;
|
||||
@ -502,7 +502,7 @@ static void add_package(dpkg_packages *pkgs, dpkg_package *pkg)
|
||||
}
|
||||
}
|
||||
|
||||
static void remove_package(dpkg_packages *pkgs, dpkg_collected_package *cpkg) {
|
||||
void remove_package(dpkg_packages *pkgs, dpkg_collected_package *cpkg) {
|
||||
ownedpackagenamelist *v;
|
||||
packagenamelist *aff;
|
||||
dpkg_collected_package *p;
|
||||
@ -626,7 +626,7 @@ static void add_virtualpackage(virtualpkgtbl *vpkgs, char *package,
|
||||
* Parsing Helper Functions
|
||||
*/
|
||||
|
||||
static ownedpackagenamelist *read_packagenames(char *buf) {
|
||||
ownedpackagenamelist *read_packagenames(char *buf) {
|
||||
ownedpackagenamelist *result = NULL;
|
||||
ownedpackagenamelist **addto = &result;
|
||||
|
||||
@ -688,7 +688,7 @@ static char *read_packagename(char **buf, char *end) {
|
||||
return read_until_char(buf, end);
|
||||
}
|
||||
|
||||
static deplist *read_dep_and(char *buf) {
|
||||
deplist *read_dep_and(char *buf) {
|
||||
return read_deplist(&buf, ',', '\0');
|
||||
}
|
||||
|
||||
@ -723,7 +723,7 @@ static deplist *read_deplist(char **buf, char sep, char end) {
|
||||
return result;
|
||||
}
|
||||
|
||||
static deplistlist *read_dep_andor(char *buf) {
|
||||
deplistlist *read_dep_andor(char *buf) {
|
||||
deplistlist *result = NULL;
|
||||
deplistlist **addto = &result;
|
||||
|
||||
|
@ -204,4 +204,11 @@ void commit_changes(dpkg_sources_note *srcsn);
|
||||
int versioncmp(char *left, char *right);
|
||||
int cmpversions(char *left, int op, char *right);
|
||||
|
||||
void add_package(dpkg_packages *pkgs, dpkg_package *pkg);
|
||||
void remove_package(dpkg_packages *pkgs, dpkg_collected_package *pkg);
|
||||
deplist *read_dep_and(char *buf);
|
||||
deplistlist *read_dep_andor(char *buf);
|
||||
ownedpackagenamelist *read_packagenames(char *buf);
|
||||
dpkg_packages *new_packages(char *arch);
|
||||
|
||||
#endif
|
||||
|
27
lib/example.py
Executable file
27
lib/example.py
Executable file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import britney
|
||||
|
||||
# VERSION = 0
|
||||
# SECTION = 1
|
||||
# SOURCE = 2
|
||||
# SOURCEVER = 3
|
||||
# ARCHITECTURE = 4
|
||||
# PREDEPENDS = 5
|
||||
# DEPENDS = 6
|
||||
# CONFLICTS = 7
|
||||
# PROVIDES = 8
|
||||
# RDEPENDS = 9
|
||||
# RCONFLICTS = 10
|
||||
|
||||
packages = {'phpldapadmin': ['1.0', 'web', 'phpldapadmin', '1.0', 'all', '', 'apache2 (>= 2.0)', '', '', [], []],
|
||||
'apache2': ['2.0', 'web', 'apache2', '2.0', 'i386', '', '', 'phpldapadmin (<= 1.0~)', '', [], []],
|
||||
}
|
||||
|
||||
system = britney.buildSystem('i386', packages)
|
||||
print system.is_installable('phpldapadmin'), system.packages
|
||||
britney.removeBinary(system, 'apache2')
|
||||
print system.is_installable('phpldapadmin'), system.packages
|
||||
britney.addBinary(system, 'apache2', ['2.0', 'web', 'apache2', '2.0', 'i386', '', '', 'phpldapadmin (<= 1.0~)', '', [], []])
|
||||
print system.is_installable('phpldapadmin'), system.packages
|
Loading…
x
Reference in New Issue
Block a user