From owner-svn-soc-all@FreeBSD.ORG Tue Jun 25 01:12:25 2013 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id C3F0F7B8 for ; Tue, 25 Jun 2013 01:12:25 +0000 (UTC) (envelope-from mattbw@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) by mx1.freebsd.org (Postfix) with ESMTP id B4C6219C9 for ; Tue, 25 Jun 2013 01:12:25 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r5P1CPm4014366 for ; Tue, 25 Jun 2013 01:12:25 GMT (envelope-from mattbw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r5P1CPQH014360 for svn-soc-all@FreeBSD.org; Tue, 25 Jun 2013 01:12:25 GMT (envelope-from mattbw@FreeBSD.org) Date: Tue, 25 Jun 2013 01:12:25 GMT Message-Id: <201306250112.r5P1CPQH014360@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mattbw@FreeBSD.org using -f From: mattbw@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r253466 - soc2013/mattbw/backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Jun 2013 01:12:25 -0000 Author: mattbw Date: Tue Jun 25 01:12:25 2013 New Revision: 253466 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253466 Log: adds license mapping (unused and untested at the moment). Added: soc2013/mattbw/backend/licenses.c soc2013/mattbw/backend/licenses.h soc2013/mattbw/backend/mappings.h Modified: soc2013/mattbw/backend/Makefile soc2013/mattbw/backend/groups.c Modified: soc2013/mattbw/backend/Makefile ============================================================================== --- soc2013/mattbw/backend/Makefile Tue Jun 25 00:29:59 2013 (r253465) +++ soc2013/mattbw/backend/Makefile Tue Jun 25 01:12:25 2013 (r253466) @@ -2,7 +2,7 @@ LIB= pk_backend_pkgng SHLIB_MAJOR= 1 -SRCS= pk-backend-pkgng.c get-details.c groups.c db.c +SRCS= pk-backend-pkgng.c get-details.c groups.c db.c licenses.c LIBDIR= /usr/local/lib/packagekit-backend Modified: soc2013/mattbw/backend/groups.c ============================================================================== --- soc2013/mattbw/backend/groups.c Tue Jun 25 00:29:59 2013 (r253465) +++ soc2013/mattbw/backend/groups.c Tue Jun 25 01:12:25 2013 (r253466) @@ -25,11 +25,12 @@ #include "pk-backend.h" /* PkGroupEnum, PK_* */ #include "groups.h" /* prototypes */ +#include "mappings.h" /* mapping macros */ const char ORIGIN_SEPARATOR = '/'; struct group_mapping { - const char *dir; + const char *key; PkGroupEnum group; }; @@ -40,7 +41,7 @@ * Some of these mappings are a bit iffy, peer review would be greatly * appreciated. * - * These should ALWAYS be in alphabetical order of ports directories. This is + * These should ALWAYS be in ASCIIbetical order of ports directories. This is * in case anything relies on this property when searching this list (for * example binary searching) */ @@ -122,7 +123,7 @@ PkBitfield bits; bits = 0; - for (i = 0; group_mappings[i].dir != NULL; i++) + for (i = 0; group_mappings[i].key != NULL; i++) pk_bitfield_add(bits, group_mappings[i].group); return bits; @@ -132,13 +133,10 @@ PkGroupEnum group_from_port_dir(const char *port_dir) { - int i; - - i = 0; - while (group_mappings[i].dir != NULL && - g_strcmp0(group_mappings[i].dir, port_dir) != 0) - i++; - return group_mappings[i].group; + struct group_mapping *result; + + MAPPING_FIND(port_dir, &result, group_mappings); + return result->group; } /* Maps from package origins to PackageKit groups. */ Added: soc2013/mattbw/backend/licenses.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/mattbw/backend/licenses.c Tue Jun 25 01:12:25 2013 (r253466) @@ -0,0 +1,92 @@ +/*- + * Copyright (C) 2013 Matt Windsor + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "pkg.h" /* struct pkg, etc */ +#include "pk-backend.h" /* PkLicenseEnum, PK_* */ + +#include "licenses.h" /* prototypes */ +#include "mappings.h" /* mapping macros */ + +static const char * license_name_from_pkg(struct pkg *pkg); + +struct license_mapping { + const char *key; + PkLicenseEnum license; +}; + +/* + * Mappings between the output of "pkg_license_name" and the closest available + * PackageKit license. + * + * These should ALWAYS be in ASCIIbetical order of license names. This is in + * case anything relies on this property when searching the list (for example + * binary searching). + */ +static struct license_mapping license_mappings[] = { + {"BSD", PK_LICENSE_ENUM_BSD}, + {NULL, PK_LICENSE_ENUM_UNKNOWN} +}; + +/* Returns the closest approximation packagekit has to this package's license. + * + * PackageKit only has a simple concept of licencing, so this is inherently a + * very lossy mapping. + */ +PkLicenseEnum +license_from_pkg(struct pkg *pkg) +{ + const char *pkg_license_name; + struct license_mapping *map; + PkLicenseEnum result; + + pkg_license_name = license_name_from_pkg(pkg); + + /* Is it in our manual license mapping? + * If not, then try interpreting it as a PackageKit license name and + * convert it back (messy, but hopefully safe), but only if it isn't + * NULL. + */ + MAPPING_FIND(pkg_license_name, &map, license_mappings); + if (pkg_license_name != NULL && map->key == NULL) + result = pk_license_enum_from_string(pkg_license_name); + else + result = map->license; + + return result; +} + +/* Retrieves the name of the FIRST license attached to the package. */ +static const char * +license_name_from_pkg(struct pkg *pkg) +{ + int err; + const char *match; + struct pkg_license *lic; + + lic = NULL; + match = NULL; + do { + err = pkg_licenses(pkg, &lic); + if (err == EPKG_OK) + match = pkg_license_name(lic); + } while (err == EPKG_OK && match == NULL); + + return match; +} Added: soc2013/mattbw/backend/licenses.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/mattbw/backend/licenses.h Tue Jun 25 01:12:25 2013 (r253466) @@ -0,0 +1,28 @@ +/*- + * Copyright (C) 2013 Matt Windsor + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _PKGNG_BACKEND_LICENSES_H_ +#define _PKGNG_BACKEND_LICENSES_H_ + +#include "pk-backend.h" + +PkLicenseEnum license_from_pkg(struct pkg *pkg); + +#endif /* _PKGNG_BACKEND_LICENSES_H_ */ Added: soc2013/mattbw/backend/mappings.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/mattbw/backend/mappings.h Tue Jun 25 01:12:25 2013 (r253466) @@ -0,0 +1,39 @@ +/*- + * Copyright (C) 2013 Matt Windsor + * + * Licensed under the GNU General Public License Version 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* Macros for dealing with string-key-to-enum-value mapping lists. */ + +#include "glib.h" /* g_strcmp0 */ + +/* + * Finds a mapping entry given its string key "sk", and sets the pointer + * pointed to by "vp" to reference it. Expects the last (fallthrough) entry + * to have a string value of NULL, will point to it if no other match was + * found. + * + * Currently a linear search, could be improved. Any way to make this not a + * horrible macro would also be welcomed (it's a macro to make it work across + * different types of mapping, at the moment). + */ +#define MAPPING_FIND(sk, vp, map) do { \ + for (*(vp) = map; \ + (*(vp))->key != NULL && g_strcmp0((*(vp))->key, (sk)) != 0;\ + (*(vp)) += 1); \ +} while(0)