socsvn commit: r256666 - in soc2013/mattbw/backend: . jobs query

mattbw at FreeBSD.org mattbw at FreeBSD.org
Wed Aug 28 18:39:25 UTC 2013


Author: mattbw
Date: Wed Aug 28 18:39:24 2013
New Revision: 256666
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256666

Log:
  Fix the failing unit test (but not Resolve).
  
  There seems to be some sort of memory corruption coming off Resolve; the
  packagekitd log showed a broken PackageID with a malformed repo spewing
  non-ASCII characters.
  

Added:
  soc2013/mattbw/backend/namever.c
  soc2013/mattbw/backend/namever.h
Modified:
  soc2013/mattbw/backend/Makefile
  soc2013/mattbw/backend/jobs/check.c
  soc2013/mattbw/backend/pkgutils.c
  soc2013/mattbw/backend/pkgutils.h
  soc2013/mattbw/backend/query.h
  soc2013/mattbw/backend/query/check.c
  soc2013/mattbw/backend/utils.c
  soc2013/mattbw/backend/utils.h

Modified: soc2013/mattbw/backend/Makefile
==============================================================================
--- soc2013/mattbw/backend/Makefile	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/Makefile	Wed Aug 28 18:39:24 2013	(r256666)
@@ -29,6 +29,7 @@
 		group_map.c			\
 		jobs.c				\
 		licenses.c			\
+		namever.c			\
 		pkgutils.c			\
 		search.c			\
 		utils.c
@@ -51,6 +52,7 @@
 		actions/update_system.c
 
 SRCS+=						\
+		query/check.c			\
 		query/depends.c			\
 		query/do.c			\
 		query/find.c			\
@@ -67,8 +69,9 @@
 PKGS= 		pkg gio-2.0 gio-unix-2.0
 
 # ATF test flags
-TESTSRCS=					\
-		query/id_test.c
+TESTPROGS=					\
+		query/id_test			\
+		query/check_test		\
 
 TESTCFLAGS=	`pkgconf --cflags atf-c`
 TESTLDFLAGS=	`pkgconf --libs-only-L --libs-only-other atf-c`
@@ -76,13 +79,13 @@
 
 # 0.6.* versions of PackageKit do not export pkgconf information, so here's a
 # bodge.
-USE_PK_PKGCONF=	0	# Set to 1 if using recent PackageKit
-.if USE_PK_PKGCONF
-PKGS+=		packagekit-glib2
-.else
+#USE_PK_PKGCONF=	0	# Set to 1 if using recent PackageKit
+#.if USE_PK_PKGCONF
+#PKGS+=		packagekit-glib2
+#.else
 CFLAGS+=	-I/usr/local/include/PackageKit -I/usr/local/include/PackageKit/backend
 LDFLAGS+=	-L/usr/local/lib -lpackagekit-glib2
-.endif
+#.endif
 
 CFLAGS+=	`pkg-config --cflags ${PKGS}`
 CFLAGS+=	-DPK_COMPILATION
@@ -92,11 +95,20 @@
 group_map.c: groups group_map.awk
 	sort groups | awk -f group_map.awk > group_map.c
 
+tests: ${TESTPROGS}
+
 # TODO: Find a more BSD way of doing this
-query/id_test: query/id_test.o query/id.o
+query/id_test: query/id_test.o query/id.o namever.o
 	${CC} ${LDFLAGS} ${TESTLDFLAGS} -o ${.TARGET} ${.ALLSRC} ${LIBS} ${TESTLIBS}
 
 query/id_test.o: query/id_test.c
-	${CC} ${CFLAGS} ${TESTCFLAGS} -o query/id_test.o -c query/id_test.c
+	${CC} ${CFLAGS} ${TESTCFLAGS} -o ${.TARGET} -c ${.ALLSRC}
+
+query/check_test: query/check_test.o query/check.o query/id.o query/packages.o query/find.o namever.o
+	${CC} ${LDFLAGS} ${TESTLDFLAGS} -o ${.TARGET} ${.ALLSRC} ${LIBS} ${TESTLIBS}
+
+query/check_test.o: query/check_test.c
+	${CC} ${CFLAGS} ${TESTCFLAGS} -o ${.TARGET} -c ${.ALLSRC}
+
 
 .include <bsd.lib.mk>

Modified: soc2013/mattbw/backend/jobs/check.c
==============================================================================
--- soc2013/mattbw/backend/jobs/check.c	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/jobs/check.c	Wed Aug 28 18:39:24 2013	(r256666)
@@ -27,6 +27,7 @@
 #include "../pk-backend.h"	/* pk_..., Pk... */
 #include "pkg.h"		/* pkg_... */
 
+#include "../namever.h"		/* namever_... */
 #include "../utils.h"		/* ERR */
 #include "../pkgutils.h"	/* pkgutils_... */
 #include "../query.h"		/* query_... */
@@ -78,7 +79,7 @@
 	/* Does this package's name and version match a PackageID? */
 	if (strcmp(namever, query_id->namever) == 0) {
 		/* Does the rest of the PackageID match up? */
-		success = query_match_pkg_to_id(pkg, query_id);
+		success = query_check_package(pkg, query_id);
 	}
 
 	return success;
@@ -93,17 +94,17 @@
 	guint		i;
 	int		err;
 	char	       *namever;
-	struct pkg     *pkg;
+	struct pkg     *package;
 
 	assert(jobs != NULL);
 	assert(query_ids != NULL);
 	assert(0 < count);
 
 
-	pkg = NULL;
+	package = NULL;
 	success = true;
 	while (success) {
-		err = pkg_jobs(jobs, &pkg);
+		err = pkg_jobs(jobs, &package);
 		if (err != EPKG_OK) {
 			/* Did we reach the end of the job iterator? */
 			if (err != EPKG_END) {
@@ -112,9 +113,9 @@
 			break;
 		}
 
-		assert(pkg != NULL);
+		assert(package != NULL);
 
-		namever = pkgutils_pkg_namever(pkg);
+		namever = namever_from_package(package);
 		if (namever == NULL) {
 			success = false;
 		}
@@ -126,11 +127,12 @@
 			}
 
 			assert(success);
-			success = jobs_check_id_on_package(pkg, query_ids + i,
+			success = jobs_check_id_on_package(package,
+			    query_ids + i,
 			    namever);
 
 			if (success && reject_non_updates &&
-			    pkgutils_pkg_install_state(pkg) !=
+			    pkgutils_pkg_install_state(package) !=
 			    PK_INFO_ENUM_UPDATING) {
 				success = false;
 			}

Added: soc2013/mattbw/backend/namever.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/backend/namever.c	Wed Aug 28 18:39:24 2013	(r256666)
@@ -0,0 +1,66 @@
+/*-
+ * 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 <assert.h>		/* assert */
+#include <stdio.h>		/* asprintf */
+#include "pkg.h"		/* pkg_... */
+
+#include "namever.h"		/* namever_... */
+
+/*
+ * Functions for dealing with "namevers" (name-version strings).
+ *
+ * This file CANNOT depend on PackageKit.
+ */
+
+/*
+ * Joins a name and a version to form a namever.
+ *
+ * To be freed using free(3).  Result may be NULL.
+ */
+char	       *
+namever_from_name_and_version(const char *name, const char *version)
+{
+	char	       *result;
+
+	assert(name != NULL);
+	assert(version != NULL);
+
+	(void)asprintf(&result, "%s-%s", name, version);
+	return result;
+}
+
+/*
+ * Allocates and returns a string of the form "name-version" that identifies
+ * the given package's name and version.
+ *
+ * To be freed using free(3).  Result may be NULL.
+ */
+char	       *
+namever_from_package(struct pkg *package)
+{
+	char	       *result;
+
+	assert(package != NULL);
+
+	result = NULL;
+	(void)pkg_asprintf(&result, "%n-%v", package, package);
+	return result;
+}

Added: soc2013/mattbw/backend/namever.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/mattbw/backend/namever.h	Wed Aug 28 18:39:24 2013	(r256666)
@@ -0,0 +1,27 @@
+/*-
+ * 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_NAMEVER_H_
+#define _PKGNG_BACKEND_NAMEVER_H_
+
+char	       *namever_from_name_and_version(const char *name, const char *version);
+char	       *namever_from_package(struct pkg *package);
+
+#endif				/* !_PKGNG_BACKEND_NAMEVER_H_ */

Modified: soc2013/mattbw/backend/pkgutils.c
==============================================================================
--- soc2013/mattbw/backend/pkgutils.c	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/pkgutils.c	Wed Aug 28 18:39:24 2013	(r256666)
@@ -24,12 +24,15 @@
 #include "pk-backend.h"
 #include "pkg.h"
 
+#include "namever.h"		/* namever_... */
 #include "pkgutils.h"		/* Prototypes */
 #include "utils.h"		/* INTENTIONALLY_IGNORE */
 
 static bool	pkg_matches_filters(struct pkg *pkg, PkBitfield filters);
 static const char *repo_of_remote(struct pkg *pkg);
 
+/* Package utility functions that do not depend on PackageKit. */
+
 /*
  * Infers the correct PkInfoEnum to emit for this package for its current state.
  */
@@ -118,31 +121,14 @@
 	id_splits = pk_package_id_split(package_id);
 	assert(id_splits != NULL);
 
-	result = NULL;
-	asprintf(&result, "%s-%s", id_splits[PK_PACKAGE_ID_NAME],
+	result = namever_from_name_and_version(id_splits[PK_PACKAGE_ID_NAME],
 	    id_splits[PK_PACKAGE_ID_VERSION]);
 
 	g_strfreev(id_splits);
 	return result;
 }
 
-/*
- * Allocates and returns a string of the form "name-version" that identifies
- * the given package's name and version.
- *
- * To be freed using free(3).
- */
-char	       *
-pkgutils_pkg_namever(struct pkg *pkg)
-{
-	char	       *result;
-
-	assert(pkg != NULL);
 
-	result = NULL;
-	(void)pkg_asprintf(&result, "%n-%v", pkg, pkg);
-	return result;
-}
 
 /*
  * Gets the PackageKit repository name for the package.

Modified: soc2013/mattbw/backend/pkgutils.h
==============================================================================
--- soc2013/mattbw/backend/pkgutils.h	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/pkgutils.h	Wed Aug 28 18:39:24 2013	(r256666)
@@ -29,7 +29,6 @@
 PkInfoEnum	pkgutils_pkg_install_state(struct pkg *pkg);
 PkInfoEnum	pkgutils_pkg_remove_state(struct pkg *pkg);
 char	       *pkgutils_package_id_namever(gchar *package_id);
-char	       *pkgutils_pkg_namever(struct pkg *pkg);
 const char     *pkgutils_pk_repo_of(struct pkg *pkg);
 gchar          *pkgutils_pkg_to_id(struct pkg *pkg);
 void		pkgutils_add_old_version(struct pkgdb *db, struct pkg *pkg, struct pkg **old_p);

Modified: soc2013/mattbw/backend/query.h
==============================================================================
--- soc2013/mattbw/backend/query.h	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/query.h	Wed Aug 28 18:39:24 2013	(r256666)
@@ -23,6 +23,7 @@
 
 /* Meta-header for the public interfaces to the query system. */
 
+#include "query/check.h"	/* query_check_... */
 #include "query/depends.h"	/* query_depends_... */
 #include "query/do.h"		/* query_do_... */
 #include "query/match.h"	/* query_match_... */

Modified: soc2013/mattbw/backend/query/check.c
==============================================================================
--- soc2013/mattbw/backend/query/check.c	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/query/check.c	Wed Aug 28 18:39:24 2013	(r256666)
@@ -41,6 +41,7 @@
 	bool		matches;
 	char	       *namever;
 	const char     *arch;
+	const char     *name;
 	const char     *repo;
 
 	assert(package != NULL);
@@ -49,20 +50,36 @@
 
 
 	namever = namever_from_package(package);
-	(void)pkg_get(package, PKG_ARCH, &arch, PKG_REPONAME, &repo);
+	(void)pkg_get(package,
+	    PKG_ARCH, &arch,
+	    PKG_NAME, &name,
+	    PKG_REPONAME, &repo);
 
 	/* Be cautious and reject matches if the package fields aren't here. */
 	if (namever == NULL || arch == NULL || repo == NULL) {
 		matches = false;
 	} else {
 		bool		namever_matches;
+		bool		namever_matches_name;
+		bool		namever_matches_namever;
 		bool		arch_matches;
 		bool		repo_matches;
 
-		namever_matches = string_match(query_id->namever, namever);
+		/*
+		 * Allow raw names to match the Query ID namever, as well as
+		 * the full package namevers.
+		 * This allows Resolve to work properly.
+		 */
+		namever_matches_name = string_match(query_id->namever, name);
+		namever_matches_namever = string_match(query_id->namever,
+		    namever);
+		namever_matches = (namever_matches_name ||
+		    namever_matches_namever);
+
 		arch_matches = string_match(query_id->arch, arch);
 		repo_matches = string_match(query_id->repo, repo);
 
+
 		matches = (namever_matches && arch_matches && repo_matches);
 	}
 

Modified: soc2013/mattbw/backend/utils.c
==============================================================================
--- soc2013/mattbw/backend/utils.c	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/utils.c	Wed Aug 28 18:39:24 2013	(r256666)
@@ -30,26 +30,6 @@
 #include "utils.h"		/* prototypes */
 
 /*
- * Checks two strings with strcmp and emits TRUE if they match. If either
- * string is NULL or empty, emit TRUE as well (this is so that missing
- * PackageID elements trigger matches).
- */
-bool
-string_match(const char *left, const char *right)
-{
-	bool		result;
-
-	if (left == NULL || right == NULL)
-		result = true;
-	else if (*left == '\0' || *right == '\0')
-		result = true;
-	else
-		result = (strcmp(left, right) == 0);
-
-	return result;
-}
-
-/*
  * Finds the type of the given PackageKit repository name.
  */
 enum repo_type

Modified: soc2013/mattbw/backend/utils.h
==============================================================================
--- soc2013/mattbw/backend/utils.h	Wed Aug 28 17:58:30 2013	(r256665)
+++ soc2013/mattbw/backend/utils.h	Wed Aug 28 18:39:24 2013	(r256666)
@@ -38,7 +38,6 @@
 #define	ERR(backend, type, msg) \
 	(void)pk_backend_error_code((backend), (type), (msg))
 
-bool		string_match(const char *left, const char *right);
 enum repo_type	type_of_repo_name(const char *name);
 gchar	      **get_package_ids(PkBackend *backend, guint *count_p);
 gchar	      **get_strv_and_length(PkBackend *backend, const char *name, guint *count_p);


More information about the svn-soc-all mailing list