From owner-svn-soc-all@FreeBSD.ORG Wed Aug 7 11:02:28 2013 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6CC55BDD for ; Wed, 7 Aug 2013 11:02:28 +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 5984A215B for ; Wed, 7 Aug 2013 11:02:28 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r77B2SQY003996 for ; Wed, 7 Aug 2013 11:02:28 GMT (envelope-from mattbw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r77B2SYl003994 for svn-soc-all@FreeBSD.org; Wed, 7 Aug 2013 11:02:28 GMT (envelope-from mattbw@FreeBSD.org) Date: Wed, 7 Aug 2013 11:02:28 GMT Message-Id: <201308071102.r77B2SYl003994@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: r255636 - 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: Wed, 07 Aug 2013 11:02:28 -0000 Author: mattbw Date: Wed Aug 7 11:02:28 2013 New Revision: 255636 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255636 Log: More splitting up of functions in jobs.c. Some functions are starting to look more or less maintainable now, for example jobs_do_same_repo. However, jobs.c is now getting large enough where I'm contemplating splitting it along the lines of query.c. I'm currently thinking a split of (check, do, core), and there might be some functions that would work better in pkgutils. Modified: soc2013/mattbw/backend/jobs.c Modified: soc2013/mattbw/backend/jobs.c ============================================================================== --- soc2013/mattbw/backend/jobs.c Wed Aug 7 10:15:54 2013 (r255635) +++ soc2013/mattbw/backend/jobs.c Wed Aug 7 11:02:28 2013 (r255636) @@ -35,14 +35,18 @@ static bool jobs_check_id_on_package(struct pkg *pkg, gchar **split_id, const char *name, const char *version); static bool jobs_check_split_package_ids(struct pkg_jobs *jobs, gchar ***id_splits, guint count, bool reject_non_updates); +static bool jobs_do_apply(const struct jobs_spec *spec, struct pkg_jobs *jobs); static bool jobs_do_check(const struct jobs_spec *spec, struct pkg_jobs *jobs, gchar **package_ids, guint count); static bool jobs_do_multiple_repos(struct pkgdb *db, const struct jobs_spec *spec, gchar **package_ids, guint count); -static bool jobs_do_set_repo(const struct jobs_spec *spec, struct pkg_jobs *jobs, const char *reponame); static bool jobs_do_same_repo(struct pkgdb *db, const struct jobs_spec *spec, gchar **package_ids, guint count, const char *reponame); +static bool jobs_do_set_repo(const struct jobs_spec *spec, struct pkg_jobs *jobs, const char *reponame); +static bool jobs_do_solve(const struct jobs_spec *spec, struct pkg_jobs *jobs); static char **jobs_do_populate(const struct jobs_spec *spec, struct pkg_jobs *jobs, gchar **package_ids, guint count); static char **namevers_from_package_ids(gchar **package_ids, guint count); static struct pkg_jobs *jobs_do_allocate(const struct jobs_spec *spec, struct pkgdb *db); +static struct pkg_jobs *jobs_do_initialise(const struct jobs_spec *spec, struct pkgdb *db, const char *reponame); static void free_namevers(char ***namevers_p, guint count); +static void jobs_free(struct pkg_jobs **jobs_p); /* Applies a job with the given error enums and the standard event callback. */ bool @@ -291,59 +295,46 @@ jobs_do_same_repo(struct pkgdb *db, const struct jobs_spec *spec, gchar **package_ids, guint count, const char *reponame) { - bool check_success; - bool repo_success; bool success; struct pkg_jobs *jobs; - char **namevers; assert(db != NULL); assert(spec != NULL); assert(package_ids != NULL || 0 == count); assert(package_ids == NULL || 0 < count); - success = NULL; - namevers = NULL; - - jobs = jobs_do_allocate(spec, db); - if (jobs == NULL) - goto cleanup; + success = false; - repo_success = jobs_do_set_repo(spec, jobs, reponame); - if (!repo_success) - goto cleanup; + jobs = jobs_do_initialise(spec, db, reponame); + if (jobs != NULL) { + bool populated; + bool solved; + bool valid; + char **namevers; - namevers = jobs_do_populate(spec, jobs, package_ids, count); - if (package_ids != NULL && namevers == NULL) - goto cleanup; + solved = valid = false; - if (pkg_jobs_solve(jobs) != EPKG_OK) { - ERR(spec->backend, - PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, - "could not solve the job"); - goto cleanup; - } + namevers = jobs_do_populate(spec, jobs, package_ids, count); + populated = (package_ids == NULL || namevers != NULL); - check_success = jobs_do_check(spec, jobs, package_ids, count); - if (!check_success) - goto cleanup; + if (populated) { + solved = jobs_do_solve(spec, jobs); + } - STATUS(spec->backend, spec->status); + if (populated && solved) { + valid = jobs_do_check(spec, jobs, package_ids, count); + } - if (spec->simulate) { - success = true; - jobs_emit_packages(jobs, spec->backend, spec->info); - } else - success = jobs_apply(jobs, spec->backend, - PK_ERROR_ENUM_NO_PACKAGES_TO_UPDATE, - PK_ERROR_ENUM_PACKAGE_FAILED_TO_INSTALL); + if (populated && solved && valid) { + success = jobs_do_apply(spec, jobs); + } -cleanup: - pkg_jobs_free(jobs); - free_namevers(&namevers, count); + pkg_jobs_free(jobs); + free_namevers(&namevers, count); + } 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 @@ -392,6 +383,28 @@ } static bool +jobs_do_apply(const struct jobs_spec *spec, struct pkg_jobs *jobs) +{ + bool success; + + assert(spec != NULL); + assert(jobs != NULL); + + STATUS(spec->backend, spec->status); + + if (spec->simulate) { + success = true; + jobs_emit_packages(jobs, spec->backend, spec->info); + } else { + success = jobs_apply(jobs, spec->backend, + spec->no_jobs_error, + spec->jobs_failed_error); + } + + return success; +} + +static bool jobs_do_check(const struct jobs_spec *spec, struct pkg_jobs *jobs, gchar **package_ids, guint count) { @@ -458,6 +471,25 @@ return success; } +static bool +jobs_do_solve(const struct jobs_spec *spec, struct pkg_jobs *jobs) +{ + bool solved; + int err; + + err = pkg_jobs_solve(jobs); + if (err == EPKG_OK) { + solved = true; + } else { + solved = false; + ERR(spec->backend, + PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, + "could not solve the job"); + } + + return solved; +} + static char ** jobs_do_populate(const struct jobs_spec *spec, struct pkg_jobs *jobs, gchar **package_ids, guint count) @@ -486,6 +518,29 @@ return namevers; } +static struct pkg_jobs * +jobs_do_initialise(const struct jobs_spec *spec, struct pkgdb *db, + const char *reponame) +{ + struct pkg_jobs *jobs; + + assert(spec != NULL); + assert(db != NULL); + /* reponame may be NULL */ + + jobs = jobs_do_allocate(spec, db); + if (jobs != NULL) { + bool repo_success; + + repo_success = jobs_do_set_repo(spec, jobs, reponame); + if (!repo_success) { + jobs_free(&jobs); + } + } + + return jobs; +} + static void free_namevers(char ***namevers_p, guint count) { @@ -501,6 +556,16 @@ } } +/* Overly safe wrapper around pkg_jobs_free. */ +void +jobs_free(struct pkg_jobs **jobs_p) +{ + + assert(jobs_p != NULL); + free(*jobs_p); + *jobs_p = NULL; +} + static char ** namevers_from_package_ids(gchar **package_ids, guint count) {