From owner-svn-soc-all@FreeBSD.ORG Wed Aug 7 15:59:58 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 5FEA0850 for ; Wed, 7 Aug 2013 15:59:58 +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 3F5BF2501 for ; Wed, 7 Aug 2013 15:59:58 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r77Fxwwc026882 for ; Wed, 7 Aug 2013 15:59:58 GMT (envelope-from mattbw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r77FxwZS026879 for svn-soc-all@FreeBSD.org; Wed, 7 Aug 2013 15:59:58 GMT (envelope-from mattbw@FreeBSD.org) Date: Wed, 7 Aug 2013 15:59:58 GMT Message-Id: <201308071559.r77FxwZS026879@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: r255644 - in soc2013/mattbw/backend: . jobs 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 15:59:58 -0000 Author: mattbw Date: Wed Aug 7 15:59:57 2013 New Revision: 255644 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255644 Log: Slightly cleaned up the checking code and factored out some more functions. (Pattern emerging here...) Also fixed a logical error in checking which would likely disable checking entirely. Modified: soc2013/mattbw/backend/jobs.c soc2013/mattbw/backend/jobs/check.c Modified: soc2013/mattbw/backend/jobs.c ============================================================================== --- soc2013/mattbw/backend/jobs.c Wed Aug 7 12:03:34 2013 (r255643) +++ soc2013/mattbw/backend/jobs.c Wed Aug 7 15:59:57 2013 (r255644) @@ -287,7 +287,7 @@ success = true; - if (package_ids == NULL) { + if (package_ids != NULL) { success = jobs_check_package_ids(jobs, package_ids, count, spec->reject_non_updates); } Modified: soc2013/mattbw/backend/jobs/check.c ============================================================================== --- soc2013/mattbw/backend/jobs/check.c Wed Aug 7 12:03:34 2013 (r255643) +++ soc2013/mattbw/backend/jobs/check.c Wed Aug 7 15:59:57 2013 (r255644) @@ -33,6 +33,8 @@ 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 gchar ***make_package_id_splits(gchar **package_ids, guint count); +static void free_package_id_splits(gchar ****id_splits_p, guint count); /* Checks a solved job against a string vector of PackageIDs to ensure any * packages that match the PackageIDs match them fully. @@ -42,50 +44,26 @@ guint count, bool reject_non_updates) { bool success; - bool split_success; - unsigned int i; gchar ***id_splits; assert(jobs != NULL); assert(package_ids != NULL); + assert(0 < count); success = false; id_splits = NULL; - count = g_strv_length(package_ids); - if (count == 0) - goto cleanup; - /* Split all the IDs first so we don't have to do it multiple times */ - id_splits = calloc(count, sizeof(gchar **)); - if (id_splits == NULL) - goto cleanup; - - split_success = true; - for (i = 0; i < count; i++) { - id_splits[i] = pk_package_id_split(package_ids[i]); - if (id_splits[i] == NULL) { - split_success = false; - break; - } - } - if (!split_success) { - goto cleanup; - } + id_splits = make_package_id_splits(package_ids, count); + if (id_splits != NULL) { - /* Now do the actual checking, per package. */ - success = jobs_check_split_package_ids(jobs, id_splits, count, - reject_non_updates); + /* Now do the actual checking, per package. */ + success = jobs_check_split_package_ids(jobs, id_splits, count, + reject_non_updates); -cleanup: - if (id_splits != NULL) { - for (i = 0; i < count; i++) - g_strfreev(id_splits[i]); - free(id_splits); + free_package_id_splits(&id_splits, count); } - /*pkg_free(pkg);*/ - return success; } @@ -135,11 +113,16 @@ assert(id_splits != NULL); assert(0 < count); + + pkg = NULL; success = true; while (success) { err = pkg_jobs(jobs, &pkg); if (err != EPKG_OK) { - success = false; + /* Did we reach the end of the job iterator? */ + if (err != EPKG_END) { + success = false; + } break; } @@ -150,6 +133,7 @@ for (i = 0; i < count; i++) { if (!success) { + /* Leave the for loop, not the while loop. */ break; } @@ -163,7 +147,60 @@ success = false; } } + + /* Do not free the struct pkg, we actually don't own it. */ } return success; - } +} + +static gchar *** +make_package_id_splits(gchar **package_ids, guint count) +{ + guint i; + gchar ***id_splits; + + id_splits = calloc(count, sizeof(gchar **)); + + if (id_splits != NULL) { + bool split_success; + + split_success = true; + for (i = 0; i < count; i++) { + id_splits[i] = pk_package_id_split(package_ids[i]); + if (id_splits[i] == NULL) { + split_success = false; + break; + } + } + + if (!split_success) { + free_package_id_splits(&id_splits, count); + } + + /* split_success if and only if id_splits != NULL */ + assert(split_success || id_splits == NULL); + assert(!split_success || id_splits != NULL); + } + + return id_splits; +} + +static void +free_package_id_splits(gchar ****id_splits_p, guint count) +{ + guint i; + + assert(id_splits_p != NULL); + + if (*id_splits_p != NULL) { + for (i = 0; i < count; i++) { + g_strfreev((*id_splits_p)[i]); + } + + free(*id_splits_p); + *id_splits_p = NULL; + } + + assert(*id_splits_p == NULL); +}