Date: Sat, 6 Jul 2013 09:03:22 GMT From: mattbw@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r254230 - in soc2013/mattbw/backend: . actions Message-ID: <201307060903.r6693MES014168@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mattbw Date: Sat Jul 6 09:03:22 2013 New Revision: 254230 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=254230 Log: split off package utility functions; properly determine info enum from package; for some silly reason this seems to be failing to unlock the database Added: soc2013/mattbw/backend/pkgutils.c soc2013/mattbw/backend/pkgutils.h Modified: soc2013/mattbw/backend/Makefile soc2013/mattbw/backend/actions/install-packages.c soc2013/mattbw/backend/db.c soc2013/mattbw/backend/query.c Modified: soc2013/mattbw/backend/Makefile ============================================================================== --- soc2013/mattbw/backend/Makefile Sat Jul 6 08:59:27 2013 (r254229) +++ soc2013/mattbw/backend/Makefile Sat Jul 6 09:03:22 2013 (r254230) @@ -2,8 +2,16 @@ LIB= pk_backend_pkgng SHLIB_MAJOR= 1 -SRCS= pk-backend-pkgng.c groups.c db.c licenses.c query.c utils.c -SRCS+= actions/get-details.c \ +SRCS= pk-backend-pkgng.c +SRCS+= \ + db.c \ + groups.c \ + licenses.c \ + pkgutils.c \ + query.c \ + utils.c +SRCS+= \ + actions/get-details.c \ actions/get-files.c \ actions/get-repo-list.c \ actions/install-packages.c Modified: soc2013/mattbw/backend/actions/install-packages.c ============================================================================== --- soc2013/mattbw/backend/actions/install-packages.c Sat Jul 6 08:59:27 2013 (r254229) +++ soc2013/mattbw/backend/actions/install-packages.c Sat Jul 6 09:03:22 2013 (r254230) @@ -23,6 +23,7 @@ #include "pkg.h" #include "../hash_traverse.h" /* HASH_FOR */ +#include "../pkgutils.h" /* pkgutils_... */ #include "../query.h" /* Package querying */ #include "../utils.h" /* INTENTIONALLY_IGNORE */ @@ -90,39 +91,28 @@ pk_backend_set_status(backend, PK_STATUS_ENUM_DEP_RESOLVE); err = pkg_jobs_solve(jobs); - if (err == EPKG_OK) { - char *desc; - gchar *id; - struct pkg *pkg; - - pkg = NULL; - id = NULL; - if (pkg_jobs_count(jobs) == 0) - pk_backend_error_code(backend, - PK_ERROR_ENUM_INTERNAL_ERROR, - "job contains no packages"); - else { - while (pkg_jobs(jobs, &pkg) == EPKG_OK) { - pkg_get(pkg, PKG_COMMENT, &desc); - query_pkg_to_id(pkg, &id); - pk_backend_package(backend, - PK_INFO_ENUM_INSTALLING, - id, - desc); - } - g_free(id); - } - } else + if (err != EPKG_OK) pk_backend_error_code(backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "could not solve the job"); - - /* TODO: actual install */ - if (err == EPKG_OK && simulate == FALSE) + else if (pkg_jobs_count(jobs) == 0) pk_backend_error_code(backend, - PK_ERROR_ENUM_NOT_SUPPORTED, - "not implemented yet"); + PK_ERROR_ENUM_INTERNAL_ERROR, + "job contains no packages"); + else { + struct pkg *pkg; + + pkg = NULL; + while (pkg_jobs(jobs, &pkg) == EPKG_OK) + pkgutils_emit(pkg, + backend, + pkgutils_pkg_install_state(pkg)); + if (simulate == FALSE) + pk_backend_error_code(backend, + PK_ERROR_ENUM_NOT_SUPPORTED, + "not implemented yet"); + } } /* Modified: soc2013/mattbw/backend/db.c ============================================================================== --- soc2013/mattbw/backend/db.c Sat Jul 6 08:59:27 2013 (r254229) +++ soc2013/mattbw/backend/db.c Sat Jul 6 09:03:22 2013 (r254230) @@ -47,24 +47,28 @@ success = FALSE; + pk_backend_set_status(backend, PK_STATUS_ENUM_WAITING_FOR_AUTH); access_return = pkgdb_access(PKGDB_MODE_READ | PKGDB_MODE_WRITE, PKGDB_DB_LOCAL | PKGDB_DB_REPO); if (access_return != EPKG_OK) pk_backend_error_code(backend, - PK_ERROR_ENUM_INTERNAL_ERROR, + PK_ERROR_ENUM_NOT_AUTHORIZED, "cannot access database"); else { + pk_backend_set_status(backend, PK_STATUS_ENUM_WAITING_FOR_LOCK); open_return = pkgdb_open(db, PKGDB_REMOTE); if (open_return != EPKG_OK) pk_backend_error_code(backend, - PK_ERROR_ENUM_INTERNAL_ERROR, - "pkgdb_open returned an error"); + PK_ERROR_ENUM_CANNOT_GET_LOCK, + "cannot open database"); else if (*db == NULL) pk_backend_error_code(backend, PK_ERROR_ENUM_INTERNAL_ERROR, "pkgdb_open gave us a null pointer"); - else + else { + pk_backend_set_status(backend, PK_STATUS_ENUM_RUNNING); success = TRUE; + } } return success; Added: soc2013/mattbw/backend/pkgutils.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/mattbw/backend/pkgutils.c Sat Jul 6 09:03:22 2013 (r254230) @@ -0,0 +1,182 @@ +/*- + * Copyright (C) 2013 Matt Windsor <mattbw@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 <string.h> +#include <glib.h> +#include "pk-backend.h" +#include "pkg.h" + +#include "pkgutils.h" /* Prototypes */ + +static const char *repo_of_remote(struct pkg *pkg); + +/* + * Infers the correct PkInfoEnum to emit for this package if it is being + * installed, mainly from its current installation information. + */ +PkInfoEnum +pkgutils_pkg_install_state(struct pkg *pkg) +{ + PkInfoEnum info; + const char *old; + + /* Sane default */ + info = PK_INFO_ENUM_INSTALLING; + + /* Does this package already have a version installed? */ + old = NULL; + pkg_get(pkg, PKG_OLD_VERSION, &old); + + if (old != NULL) { + /* Yes, but how does it compare to the new one? */ + switch (pkg_version_change(pkg)) { + case PKG_DOWNGRADE: + info = PK_INFO_ENUM_DOWNGRADING; + break; + case PKG_REINSTALL: + info = PK_INFO_ENUM_REINSTALLING; + break; + case PKG_UPGRADE: + info = PK_INFO_ENUM_UPDATING; + break; + default: + /* Stick with the above default. */ + break; + } + } + return info; +} + +/* + * Gets the PackageKit repository name for the package. + */ +const char * +pkgutils_pk_repo_of(struct pkg *pkg) +{ + const char *repo; + + switch (pkg_type(pkg)) { + case PKG_FILE: + repo = "local"; + break; + case PKG_INSTALLED: + repo = "installed"; + break; + case PKG_REMOTE: + repo = repo_of_remote(pkg); + break; + default: + repo = "unknown"; + break; + } + + return repo; +} + +/* + * Emits a package through the backend with the given info enum. + */ +void +pkgutils_emit(struct pkg *pkg, PkBackend *backend, PkInfoEnum info) +{ + char *comment; + gchar *id; + + pkg_get(pkg, PKG_COMMENT, &comment); + id = pkgutils_pkg_to_id(pkg); + pk_backend_package(backend, info, id, comment); + g_free(id); +} + +/* + * Converts a package to a PackageID. + */ +gchar * +pkgutils_pkg_to_id(struct pkg *pkg) +{ + gchar *id; + const gchar **id_bits; + + /* Make sure the initial string vector's pointers are all NULL */ + id_bits = g_new0(const gchar *, 4); + + /* + * This is split through an intermediate function so the same code + * can be used for the ID-checking logic. + */ + id = pkgutils_pkg_to_id_through(pkg, id_bits); + + /* we don't own any of the strings, so we don't use g_strfreev. */ + g_free(id_bits); + + return id; +} + +/* + * Converts a package to a PackageID, dumping the intermediate information + * into the pointed-to string vector (which must have at least 4 places, and + * they should be NULL). + */ +gchar * +pkgutils_pkg_to_id_through(struct pkg *pkg, const gchar **strv) +{ + pkg_get(pkg, + PKG_NAME, strv + PK_PACKAGE_ID_NAME, + PKG_VERSION, strv + PK_PACKAGE_ID_VERSION, + PKG_ARCH, strv + PK_PACKAGE_ID_ARCH); + + strv[PK_PACKAGE_ID_DATA] = pkgutils_pk_repo_of(pkg); + + return pk_package_id_build(strv[PK_PACKAGE_ID_NAME], + strv[PK_PACKAGE_ID_VERSION], + strv[PK_PACKAGE_ID_ARCH], + strv[PK_PACKAGE_ID_DATA]); +} + +/* + * Gets the PackageKit repository name for the (remote) package. + * + * Currently this is actually the pkgng repository ident. This might change. + * + * This does not need to be freed (possibly, TODO: check). + */ +static const char * +repo_of_remote(struct pkg *pkg) +{ + const char *repo; + const char *repo_name; + struct pkg_repo *repo_struct; + + repo = NULL; + + /* + * We can get the repo NAME directly, but we need the repo IDENT. + * Short of chopping bits of the string off in the assumption that + * the name is repo-IDENT, we'll have to grab it from the repo + * structure itself. + */ + pkg_get(pkg, PKG_REPONAME, &repo_name); + + repo_struct = pkg_repo_find_name(repo_name); + if (repo_struct) + repo = pkg_repo_ident(repo_struct); + + return repo; +} Added: soc2013/mattbw/backend/pkgutils.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2013/mattbw/backend/pkgutils.h Sat Jul 6 09:03:22 2013 (r254230) @@ -0,0 +1,34 @@ +/*- + * Copyright (C) 2013 Matt Windsor <mattbw@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_PKGUTILS_H_ +#define _PKGNG_BACKEND_PKGUTILS_H_ + +#include <glib.h> +#include "pk-backend.h" +#include "pkg.h" + +PkInfoEnum pkgutils_pkg_install_state(struct pkg *pkg); +const char *pkgutils_pk_repo_of(struct pkg *pkg); +gchar *pkgutils_pkg_to_id(struct pkg *pkg); +gchar *pkgutils_pkg_to_id_through(struct pkg *pkg, const gchar **strv); +void pkgutils_emit(struct pkg *pkg, PkBackend *backend, PkInfoEnum info); + +#endif /* !_PKGNG_BACKEND_PKGUTILS_H_ */ Modified: soc2013/mattbw/backend/query.c ============================================================================== --- soc2013/mattbw/backend/query.c Sat Jul 6 08:59:27 2013 (r254229) +++ soc2013/mattbw/backend/query.c Sat Jul 6 09:03:22 2013 (r254230) @@ -28,6 +28,7 @@ #include "db.h" /* open_remote_db */ #include "hash_traverse.h" /* HASH_FOR */ #include "utils.h" /* string_match */ +#include "pkgutils.h" /* pkgutils_... */ struct query { int load_flags; @@ -43,14 +44,11 @@ gboolean local_repo; }; -static const char *get_repo_of(struct pkg *pkg); -static const char *get_repo_of_remote(struct pkg *pkg); static gboolean match(struct query *q, gchar **match_id_p, struct pkg **match_pkg_p); static gboolean match_id_in_it(struct pkgdb_it *it, struct query *q, gchar **match_id_p, struct pkg **match_pkg_p); static gboolean try_id_match(struct pkg *pkg, struct query *q, gchar **match_id); static int jobs_add_pkg(struct pkg_jobs *jobs, match_t type, struct pkg *pkg); static void query_free_contents(struct query *q); -static void query_pkg_to_id_through(struct pkg *pkg, gchar **name_p, const gchar **strv); /* Returns the backend stored inside the struct query. */ PkBackend * @@ -105,6 +103,7 @@ db = NULL; q = NULL; + no_error_yet = open_remote_db(&db, backend); pk_backend_set_percentage(backend, 0); @@ -118,6 +117,7 @@ no_error_yet = body(q); pk_backend_set_percentage(backend, ((i * 100) / len)); } + query_free(q); pkgdb_close(db); pk_backend_finished(backend); @@ -169,7 +169,7 @@ q->local_repo = TRUE; else if (pkg_repo_find_ident(q->data) == NULL) { pk_backend_error_code(backend, - PK_ERROR_ENUM_PACKAGE_ID_INVALID, + PK_ERROR_ENUM_REPO_NOT_FOUND, "no such repository"); success = FALSE; } @@ -229,7 +229,6 @@ "could not init pkg_jobs"); pkg_jobs_free(jobs); - } /* Deallocates a struct query and any contents it owns. */ @@ -242,80 +241,6 @@ } } -/* Converts a package to a PackageID. */ -void -query_pkg_to_id(struct pkg *pkg, gchar **id_p) -{ - const gchar **id_bits; - - /* Make sure the initial string vector's pointers are all NULL */ - id_bits = g_new0(const gchar *, 4); - - /* - * This is split through an intermediate function so the same code - * can be used for the ID-checking logic. - */ - query_pkg_to_id_through(pkg, id_p, id_bits); - - /* we don't own any of the strings, so we don't use g_strfreev. */ - g_free(id_bits); -} - -/* Gets the PackageKit repository name for the package. */ -static const char * -get_repo_of(struct pkg *pkg) -{ - const char *repo; - - switch (pkg_type(pkg)) { - case PKG_FILE: - repo = "local"; - break; - case PKG_INSTALLED: - repo = "installed"; - break; - case PKG_REMOTE: - repo = get_repo_of_remote(pkg); - break; - default: - repo = "unknown"; - break; - } - - return repo; -} - -/* - * Gets the PackageKit repository name for the (remote) package. - * - * Currently this is actually the pkgng repository ident. This might change. - * - * This does not need to be freed (possibly, TODO: check). - */ -static const char * -get_repo_of_remote(struct pkg *pkg) -{ - const char *repo; - const char *repo_name; - struct pkg_repo *repo_struct; - - repo = NULL; - - /* - * We can get the repo NAME directly, but we need the repo IDENT. - * Short of chopping bits of the string off in the assumption that - * the name is repo-IDENT, we'll have to grab it from the repo - * structure itself. - */ - pkg_get(pkg, PKG_REPONAME, &repo_name); - - repo_struct = pkg_repo_find_name(repo_name); - if (repo_struct) - repo = pkg_repo_ident(repo_struct); - - return repo; -} - /* * Performs a package database query against a (potentially partial) * PackageID, retrieving the matched package and its full PackageID. @@ -403,7 +328,9 @@ const gchar **pkg_id_bits; pkg_id_bits = g_new0(const gchar *, 4); - query_pkg_to_id_through(pkg, match_id, pkg_id_bits); + + g_free(*match_id); + *match_id = pkgutils_pkg_to_id_through(pkg, pkg_id_bits); /* * Succeed if this package's PackageID fields match the original @@ -432,30 +359,6 @@ return pkg_jobs_add(jobs, type, &name, 1); } -/* - * Converts a package to a PackageID, dumping the intermediate information - * into the pointed-to string vector (which must have at least 4 places, and - * they should be NULL). - */ -static void -query_pkg_to_id_through(struct pkg *pkg, gchar **id_p, const gchar **strv) -{ - - pkg_get(pkg, - PKG_NAME, strv + PK_PACKAGE_ID_NAME, - PKG_VERSION, strv + PK_PACKAGE_ID_VERSION, - PKG_ARCH, strv + PK_PACKAGE_ID_ARCH); - - strv[PK_PACKAGE_ID_DATA] = get_repo_of(pkg); - - if (*id_p != NULL) - g_free(*id_p); - *id_p = pk_package_id_build(strv[PK_PACKAGE_ID_NAME], - strv[PK_PACKAGE_ID_VERSION], - strv[PK_PACKAGE_ID_ARCH], - strv[PK_PACKAGE_ID_DATA]); -} - static void query_free_contents(struct query *q) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307060903.r6693MES014168>