socsvn commit: r253461 - in soc2013/mattbw: backend dummy tests tests/licence

mattbw at FreeBSD.org mattbw at FreeBSD.org
Tue Jun 25 00:08:27 UTC 2013


Author: mattbw
Date: Tue Jun 25 00:08:26 2013
New Revision: 253461
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253461

Log:
  get rid of dummy; add in testing for the licence part of get-details

Added:
  soc2013/mattbw/tests/
  soc2013/mattbw/tests/licence/
  soc2013/mattbw/tests/licence/Makefile
  soc2013/mattbw/tests/licence/lictest.c
Deleted:
  soc2013/mattbw/dummy/
Modified:
  soc2013/mattbw/backend/get-details.c
  soc2013/mattbw/backend/groups.c

Modified: soc2013/mattbw/backend/get-details.c
==============================================================================
--- soc2013/mattbw/backend/get-details.c	Mon Jun 24 23:41:16 2013	(r253460)
+++ soc2013/mattbw/backend/get-details.c	Tue Jun 25 00:08:26 2013	(r253461)
@@ -29,6 +29,7 @@
 #include "get-details.h"	/* get_details_thread prototype */
 
 /* TODO: move out of get-details? */
+const char     *null_if_empty(const char *in);
 gboolean	string_match(const char *left, const char *right);
 static gboolean
 get_details_query(const gchar *name,
@@ -190,6 +191,18 @@
 	return success;
 }
 
+/*
+ * If the input pointer points to a string that is empty, return the null
+ * pointer; else pass through the pointer unmolested.
+ * 
+ * This does NOT free anything!
+ */
+const char     *
+null_if_empty(const char *in)
+{
+	return (in != NULL && strlen(in) == 0) ? NULL : in;
+}
+
 gboolean
 get_details_for(gchar *package_id, PkBackend *backend, struct pkgdb *db)
 {
@@ -205,28 +218,19 @@
 				      "invalid package id");
 	else {
 		/* Parts of the package ID */
-		gchar          *name;
-		gchar          *version;
-		gchar          *arch;
-		gchar          *data;
-
-		name = parts[PK_PACKAGE_ID_NAME];
-		if (name != NULL && strlen(name) == 0)
-			name = NULL;
-
-		version = parts[PK_PACKAGE_ID_VERSION];
-		if (version != NULL && strlen(version) == 0)
-			version = NULL;
-
-		arch = parts[PK_PACKAGE_ID_ARCH];
-		if (arch != NULL && strlen(arch) == 0)
-			arch = NULL;
-
-		data = parts[PK_PACKAGE_ID_DATA];
-		if (data != NULL && strlen(data) == 0)
-			data = NULL;
-
+		const gchar    *name;
+		const gchar    *version;
+		const gchar    *arch;
+		const gchar    *data;
 
+		/*
+		 * Make really really REALLY sure that the PackageID fields
+		 * either have sensible data in them, or are NULL.
+		 */
+		name = null_if_empty(parts[PK_PACKAGE_ID_NAME]);
+		version = null_if_empty(parts[PK_PACKAGE_ID_VERSION]);
+		arch = null_if_empty(parts[PK_PACKAGE_ID_ARCH]);
+		data = null_if_empty(parts[PK_PACKAGE_ID_DATA]);
 
 		/*
 		 * If the PackageID has a repository specified (even if it's

Modified: soc2013/mattbw/backend/groups.c
==============================================================================
--- soc2013/mattbw/backend/groups.c	Mon Jun 24 23:41:16 2013	(r253460)
+++ soc2013/mattbw/backend/groups.c	Tue Jun 25 00:08:26 2013	(r253461)
@@ -26,7 +26,7 @@
 
 #include "groups.h"		/* prototypes */
 
-const char ORIGIN_SEPARATOR = '/';
+const char	ORIGIN_SEPARATOR = '/';
 
 struct group_mapping {
 	const char     *dir;
@@ -39,6 +39,10 @@
  * 
  * 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
+ * in case anything relies on this property when searching this list (for
+ * example binary searching)
  */
 static struct group_mapping group_mappings[] = {
 	{"accessibility", PK_GROUP_ENUM_ACCESSIBILITY},
@@ -142,16 +146,17 @@
 group_from_origin(const char *origin)
 {
 	char           *dir;
-	char	       *sep;
+	char           *sep;
 	PkGroupEnum	group;
 
 	/* Find the separation between dir and port name */
 	sep = strchr(origin, ORIGIN_SEPARATOR);
 
-	/* Is this a valid origin (did it have a separator)?
-	 * If not, we want the default group.
-	 * If so, then the number of chars between the origin start and the
-	 * separator mark the port directory name we want to use.
+	/*
+	 * Is this a valid origin (did it have a separator)? If not, we want
+	 * the default group. If so, then the number of chars between the
+	 * origin start and the separator mark the port directory name we
+	 * want to use.
 	 */
 	dir = (sep == NULL ? NULL : strndup(origin, sep - origin));
 	group = group_from_port_dir(dir);

Added: soc2013/mattbw/tests/licence/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/tests/licence/Makefile	Tue Jun 25 00:08:26 2013	(r253461)
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+PROG=		lictest
+CFLAGS+=	`pkgconf --cflags pkg`
+LDFLAGS+=	`pkgconf --libs pkg`
+
+.include <bsd.prog.mk>

Added: soc2013/mattbw/tests/licence/lictest.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/tests/licence/lictest.c	Tue Jun 25 00:08:26 2013	(r253461)
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "pkg.h"
+
+void handle_it(struct pkgdb_it *it);
+int getdb(struct pkgdb **db);
+
+int
+getdb(struct pkgdb **db)
+{
+	int err;
+
+	/* err = pkgdb_access(PKGDB_MODE_READ, PKGDB_DB_REPO);
+
+	if (err == EPKG_ENOACCESS)
+		fprintf(stderr, "check your privilege\n", err);
+	else if (err != EPKG_OK)
+		fprintf(stderr, "access error: %i\n", err);
+	else */{
+		err = pkgdb_open(db, PKGDB_REMOTE);
+		if (err != EPKG_OK)
+			fprintf(stderr, "open error: %i\n", err);
+	}
+	return err;
+}
+
+int
+main(int argc, char **argv)
+{
+	struct pkgdb *db;
+	int err;
+
+	db = NULL;
+
+	err = (argc == 2 ? EPKG_OK : EPKG_FATAL);
+	if (err == EPKG_OK) {
+		err = pkg_init(NULL);
+		if (err != EPKG_OK)
+			fprintf(stderr, "could not parse config file\n");
+	} else
+		fprintf(stderr, "usage: %s name\n", argv[0]);
+
+	if (err == EPKG_OK)
+		err = getdb(&db);
+
+	if (err == EPKG_OK) {
+		struct pkgdb_it *it;
+
+		it = pkgdb_query(db, argv[1], MATCH_EXACT);
+		if (it == NULL)
+			printf("no local matches!\n");
+		else handle_it(it);
+
+		it = pkgdb_rquery(db, argv[1], MATCH_EXACT, NULL);
+		if (it == NULL)
+			printf("no remote matches!\n");
+		else handle_it(it);
+
+		printf("shutting down\n");
+		pkgdb_it_free(it);
+		pkgdb_close(db);
+		pkg_shutdown();
+		printf("shutdown\n");
+	}
+}
+
+
+void
+handle_it(struct pkgdb_it *it)
+{
+	int err;
+	struct pkg *match;
+
+	match = NULL;
+	do {
+		err = pkgdb_it_next(it, &match, PKG_LOAD_BASIC | PKG_LOAD_LICENSES);
+		if (err == EPKG_OK) {
+			const char *name;
+			struct pkg_license *lic;
+			int err2;
+
+			lic = NULL;
+
+			pkg_get(match, PKG_NAME, &name);
+			printf("name: %s\n", name);
+
+			do {
+				err2 = pkg_licenses(match, &lic);
+				if (err2 == EPKG_OK)
+					printf("  licence: %s\n", pkg_license_name(lic));
+			} while (err2 == EPKG_OK);
+		}
+
+	} while (err == EPKG_OK);
+
+	pkg_free(match);
+}


More information about the svn-soc-all mailing list