Index: .depend =================================================================== RCS file: /var/cvsroot/gentoo-projects/portage-utils/.depend,v retrieving revision 1.25 diff -u -b -B -w -p -r1.25 .depend --- .depend 19 May 2006 19:34:56 -0000 1.25 +++ .depend 26 May 2006 01:00:57 -0000 @@ -4,4 +4,4 @@ main.o: main.c libq/libq.c libq/busybox. libq/atom_explode.c libq/atom_compare.c libq/vdb_get_next_dir.c \ libq/virtuals.c applets.h include_applets.h q.c qcheck.c qdepends.c \ qfile.c qlist.c qlop.c qsearch.c qsize.c qtbz2.c quse.c qxpak.c qpkg.c \ - qgrep.c qatom.c qmerge.c qcache.c qglsa.c + qgrep.c qatom.c qmerge.c qcache.c qpy.c qglsa.c Index: Makefile =================================================================== RCS file: /var/cvsroot/gentoo-projects/portage-utils/Makefile,v retrieving revision 1.46 diff -u -b -B -w -p -r1.46 Makefile --- Makefile 23 Feb 2006 04:05:21 -0000 1.46 +++ Makefile 26 May 2006 01:00:57 -0000 @@ -36,6 +36,11 @@ PF := portage-utils-$(PV) endif DOCS := TODO README qsync +ifdef PYTHON +PYFLAGS ?= $(shell python-config) -DWANT_PYTHON +LDFLAGS += -ldl -pthread -lutil /usr/lib/libpython2.4.so +endif + ##################################################### APPLETS := $(shell sed -n '/^DECLARE_APPLET/s:.*(\(.*\))$$:\1:p' applets.h|sort) SRC := $(APPLETS:%=%.c) main.c @@ -51,9 +56,9 @@ debug: q: $(SRC) libq/*.c *.h libq/*.h ifeq ($(subst s,,$(MAKEFLAGS)),$(MAKEFLAGS)) - @echo $(CC) $(CFLAGS) $(LDFLAGS) main.c -o q + @echo $(CC) $(CFLAGS) $(PYFLAGS) $(LDFLAGS) main.c -o q endif - @$(CC) $(WFLAGS) $(LDFLAGS) $(CFLAGS) $(HFLAGS) main.c -o q + @$(CC) $(WFLAGS) $(PYFLAGS) $(LDFLAGS) $(CFLAGS) $(HFLAGS) main.c -o q .depend: $(SRC) sed -n '/^DECLARE_APPLET/s:.*(\(.*\)).*:#include "\1.c":p' applets.h > include_applets.h Index: applets.h =================================================================== RCS file: /var/cvsroot/gentoo-projects/portage-utils/applets.h,v retrieving revision 1.20 diff -u -b -B -w -p -r1.20 applets.h --- applets.h 19 May 2006 19:34:56 -0000 1.20 +++ applets.h 26 May 2006 01:00:57 -0000 @@ -31,6 +31,7 @@ DECLARE_APPLET(qgrep) DECLARE_APPLET(qatom) DECLARE_APPLET(qmerge) DECLARE_APPLET(qcache) +DECLARE_APPLET(qpy) DECLARE_APPLET(qglsa) /* disable */ #undef DECLARE_APPLET @@ -58,6 +59,7 @@ struct applet_t { {"qlop", qlop_main, "", "emerge log analyzer"}, {"qmerge", qmerge_main, "", "fetch and merge binary package"}, {"qpkg", qpkg_main, "", "manipulate Gentoo binpkgs"}, + {"qpy", qpy_main, "", "python interface"}, {"qsearch", qsearch_main, "", "search pkgname/desc"}, {"qsize", qsize_main, "", "calculate size usage"}, {"qtbz2", qtbz2_main, "", "manipulate tbz2 packages"}, Index: include_applets.h =================================================================== RCS file: /var/cvsroot/gentoo-projects/portage-utils/include_applets.h,v retrieving revision 1.3 diff -u -b -B -w -p -r1.3 include_applets.h --- include_applets.h 19 May 2006 19:34:56 -0000 1.3 +++ include_applets.h 26 May 2006 01:00:57 -0000 @@ -14,4 +14,5 @@ #include "qatom.c" #include "qmerge.c" #include "qcache.c" +#include "qpy.c" #include "qglsa.c" Index: qmerge.c =================================================================== RCS file: /var/cvsroot/gentoo-projects/portage-utils/qmerge.c,v retrieving revision 1.47 diff -u -b -B -w -p -r1.47 qmerge.c --- qmerge.c 15 May 2006 00:49:02 -0000 1.47 +++ qmerge.c 26 May 2006 01:00:58 -0000 @@ -830,7 +830,7 @@ int pkg_unmerge(char *cat, char *pkgname int argc; char **argv; - if ((strstr(pkgname, " ") != NULL) || (strstr(cat, " ") != NULL)) { + if ((strchr(pkgname, ' ') != NULL) || (strchr(cat, ' ') != NULL)) { #if 0 queue *vdb = NULL; free_sets(vdb); @@ -867,7 +867,7 @@ int pkg_unmerge(char *cat, char *pkgname protected = config_protected(e->name, argc, argv); snprintf(zing, sizeof(zing), "%s%s%s", protected ? YELLOW : GREEN, protected ? "***" : "<<<" , NORM); - + /* Should we remove in order symlinks,objects,dirs ? */ switch (e->type) { case CONTENTS_DIR: if (!protected) { rmdir(e->name); } Index: qpy.c =================================================================== RCS file: qpy.c diff -N qpy.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ qpy.c 26 May 2006 01:00:58 -0000 @@ -0,0 +1,128 @@ +/* + * Copyright 2005-2006 Gentoo Foundation + * Distributed under the terms of the GNU General Public License v2 + * $Header: $ + * + * Copyright 2005-2006 Ned Ludd - + * Copyright 2005-2006 Mike Frysinger - + */ + +#if defined(APPLET_qpy) && defined(WANT_PYTHON) + +#include + +#define QPY_FLAGS "e" COMMON_FLAGS +static struct option const qpy_long_opts[] = { + {"envvar", no_argument, NULL, 'e'}, + COMMON_LONG_OPTS +}; +static const char *qpy_opts_help[] = { + "environment variables", + COMMON_OPTS_HELP +}; + +static const char qpy_rcsid[] = "$Id: $"; +#define qpy_usage(ret) usage(ret, QPY_FLAGS, qpy_long_opts, qpy_opts_help, lookup_applet_idx("qpy")) + +struct portage_t { + PyObject *interp; + PyObject *settings; +} portage; + + +/* the (hopefully) right way: create and access python/portage objects from c */ +char *portage_setting(char *envvar); +char *portage_setting(char *envvar) +{ + char *value = NULL; + PyObject *result; + + if (!(result = PyMapping_GetItemString(portage.settings, envvar))) { + Py_DECREF(portage.interp); + if (verbose) + fprintf(stderr, "could not get %s, bailing\n", envvar); + return NULL; + } + if (!PyString_Check(result)) { + if (verbose) + fprintf(stderr, "got a non-string, bailing\n"); + Py_DECREF(result); + Py_DECREF(portage.interp); + return NULL; + } + asprintf(&value, "%s", PyString_AsString(result)); + Py_DECREF(result); + return value; +} + +int qpy_envvar(char *envvar); +int qpy_envvar(char *envvar) +{ + char *value; + if ((value = portage_setting(envvar)) != NULL) { + printf("%s%s%s%s\n", verbose ? envvar : "", verbose ? "='" : "", value, verbose ? "'" : ""); + free(value); + return 0; + } + return 1; +} + +int import_portage_settings(void); +int import_portage_settings(void) +{ + if (!(portage.interp = PyImport_ImportModule((char *) "portage"))) { + fprintf(stderr, "could not import portage, bailing\n"); + return 1; + } + if (!(portage.settings = PyObject_GetAttrString(portage.interp, (char *) "settings"))) { + Py_DECREF(portage.interp); + fprintf(stderr, "getting settings failed"); + return 1; + } + return 0; +} + +#if 0 +void portage_reload(void); +void portage_reload(void) { + Py_Finalize(); + Py_Initialize(); + import_portage_settings(); +} +#endif + +int qpy_main(int argc, char **argv); +int qpy_main(int argc, char **argv) +{ + char do_env = 0; + int i, result; + + DBG("argc=%d argv[0]=%s argv[1]=%s", + argc, argv[0], argc > 1 ? argv[1] : "NULL?"); + + while ((i = GETOPT_LONG(QPY, qpy, "")) != -1) { + switch (i) { + case 'e': + do_env = 1; + break; + COMMON_GETOPTS_CASES(qpy) + } + } + + if (argc == optind) + qpy_usage(EXIT_FAILURE); + + Py_Initialize(); + result = import_portage_settings(); + + while (optind < argc) { + if (do_env) qpy_envvar(argv[optind]); + optind++; + } + Py_Finalize(); + return result; +} + +#else +DEFINE_APPLET_STUB(qpy) +#endif