From owner-svn-soc-all@FreeBSD.ORG Sun Jul 28 13:56:59 2013 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D3CA179E for ; Sun, 28 Jul 2013 13:56:59 +0000 (UTC) (envelope-from mattbw@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B1AF42D96 for ; Sun, 28 Jul 2013 13:56:59 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r6SDux4N054387 for ; Sun, 28 Jul 2013 13:56:59 GMT (envelope-from mattbw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r6SDuxoa054382 for svn-soc-all@FreeBSD.org; Sun, 28 Jul 2013 13:56:59 GMT (envelope-from mattbw@FreeBSD.org) Date: Sun, 28 Jul 2013 13:56:59 GMT Message-Id: <201307281356.r6SDuxoa054382@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: r255264 - 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: Sun, 28 Jul 2013 13:56:59 -0000 Author: mattbw Date: Sun Jul 28 13:56:59 2013 New Revision: 255264 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255264 Log: (untested) Add jobs.c features to add a full batch of PackageIDs to jobs. This will hopefully replace the jobs-from-query situation shortly, once the counterpart check-solution-for-PackageID-deficiencies comes along. Modified: soc2013/mattbw/backend/jobs.c soc2013/mattbw/backend/jobs.h soc2013/mattbw/backend/pkgutils.c soc2013/mattbw/backend/pkgutils.h Modified: soc2013/mattbw/backend/jobs.c ============================================================================== --- soc2013/mattbw/backend/jobs.c Sun Jul 28 12:29:10 2013 (r255263) +++ soc2013/mattbw/backend/jobs.c Sun Jul 28 13:56:59 2013 (r255264) @@ -21,6 +21,7 @@ /* Helpers for jobs that don't rely on the query system. */ #include /* assert */ +#include /* gchar, g_... */ #include /* bool, true, false */ #include "pk-backend.h" /* pk_..., Pk... */ #include "pkg.h" /* pkg_... */ @@ -30,24 +31,6 @@ #include "pkgutils.h" /* pkgutils_... */ #include "jobs.h" /* jobs_... */ -/* Emits each package queued up in a (solved) job. */ -void -jobs_emit_packages(struct pkg_jobs *jobs, PkBackend *backend, - pkg_info_ptr info) -{ - struct pkg *pkg; - - assert(jobs != NULL); - assert(backend != NULL); - assert(info != NULL); - - pkg = NULL; - while (pkg_jobs(jobs, &pkg) == EPKG_OK) { - assert(pkg != NULL); - pkgutils_emit(pkg, backend, info(pkg)); - } -} - /* Applies a job with the given error enums and the standard event callback. */ bool jobs_apply(struct pkg_jobs *jobs, PkBackend *backend, @@ -71,3 +54,75 @@ return success; } + +/* Adds each PackageID into an already created job. Returns NULL on failure + * and a vector of added package name-versions to be freed after solution + * on success. + */ +char ** +jobs_add_package_ids(struct pkg_jobs *jobs, gchar **package_ids) +{ + bool success; + char **namevers; + guint count; + guint i; + + assert(jobs != NULL); + assert(package_ids != NULL); + + namevers = NULL; + success = false; + + count = g_strv_length(package_ids); + if (count == 0) + goto cleanup; + + /* Need to convert PackageIDs into name-version pairs. */ + namevers = calloc(count, sizeof(gchar *)); + if (namevers == NULL) + goto cleanup; + + for (i = 0; i < count; i++) { + namevers[i] = pkgutils_package_id_namever(package_ids[i]); + if (namevers[i] != NULL) + break; + } + + /* Make sure we successfully fished out every namever */ + if (i < count) + goto cleanup; + + if (pkg_jobs_add(jobs, MATCH_EXACT, namevers, (int)count) == EPKG_OK) + success = true; + +cleanup: + if (!success) { + if (namevers != NULL) { + for (i = 0; i < count; i++) + free(namevers[i]); + free(namevers); + } + namevers = NULL; + } + + return namevers; +} + +/* Emits each package queued up in a (solved) job. */ +void +jobs_emit_packages(struct pkg_jobs *jobs, PkBackend *backend, + pkg_info_ptr info) +{ + struct pkg *pkg; + + assert(jobs != NULL); + assert(backend != NULL); + assert(info != NULL); + + pkg = NULL; + while (pkg_jobs(jobs, &pkg) == EPKG_OK) { + assert(pkg != NULL); + pkgutils_emit(pkg, backend, info(pkg)); + } +} + Modified: soc2013/mattbw/backend/jobs.h ============================================================================== --- soc2013/mattbw/backend/jobs.h Sun Jul 28 12:29:10 2013 (r255263) +++ soc2013/mattbw/backend/jobs.h Sun Jul 28 13:56:59 2013 (r255264) @@ -26,7 +26,8 @@ typedef PkInfoEnum (*pkg_info_ptr) (struct pkg *pkg); -void jobs_emit_packages(struct pkg_jobs *jobs, PkBackend *backend, pkg_info_ptr info); -bool jobs_apply(struct pkg_jobs *jobs, PkBackend *backend, PkErrorEnum no_jobs, PkErrorEnum job_failed); +bool jobs_apply(struct pkg_jobs *jobs, PkBackend *backend, PkErrorEnum no_jobs, PkErrorEnum job_failed); +char **jobs_add_package_ids(struct pkg_jobs *jobs, gchar **package_ids); +void jobs_emit_packages(struct pkg_jobs *jobs, PkBackend *backend, pkg_info_ptr info); #endif /* !_PKGNG_BACKEND_JOBS_H_ */ Modified: soc2013/mattbw/backend/pkgutils.c ============================================================================== --- soc2013/mattbw/backend/pkgutils.c Sun Jul 28 12:29:10 2013 (r255263) +++ soc2013/mattbw/backend/pkgutils.c Sun Jul 28 13:56:59 2013 (r255264) @@ -101,6 +101,31 @@ } /* + * Allocates and returns a string of the form "name-version" that contains + * the name and version elements of a PackageID. + * + * To be freed using free(3). + */ +char * +pkgutils_package_id_namever(gchar *package_id) +{ + char *result; + gchar **id_splits; + + assert(package_id != NULL); + + id_splits = pk_package_id_split(package_id); + assert(id_splits != NULL); + + result = NULL; + asprintf(&result, "%s-%s", 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. * Modified: soc2013/mattbw/backend/pkgutils.h ============================================================================== --- soc2013/mattbw/backend/pkgutils.h Sun Jul 28 12:29:10 2013 (r255263) +++ soc2013/mattbw/backend/pkgutils.h Sun Jul 28 13:56:59 2013 (r255264) @@ -24,10 +24,11 @@ #include #include "pk-backend.h" #include "pkg.h" - + PkInfoEnum pkgutils_pkg_current_state(struct pkg *pkg); 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);