socsvn commit: r253466 - soc2013/mattbw/backend
mattbw at FreeBSD.org
mattbw at FreeBSD.org
Tue Jun 25 01:12:25 UTC 2013
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 <mattbw at FreeBSD.org>
+ *
+ * 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 <mattbw at FreeBSD.org>
+ *
+ * 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 <mattbw at FreeBSD.org>
+ *
+ * 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)
More information about the svn-soc-all
mailing list