[pacman-dev] Fix for FS#36097
Dave Reisner
d at falconindy.com
Thu Jul 11 20:32:15 EDT 2013
On Thu, Jul 11, 2013 at 11:42:38PM +0100, Ashley Whetter wrote:
> Hey everyone,
>
> I've attached (and pasted below) a couple of possible patches that fix
> FS#36097 (Wrong exit code for `pacman -Sg`).
Please start using git-send-email in the future if you expect these to
be reviewed and applied properly:
https://www.archlinux.org/pacman/submitting-patches.html
> From 045b58ada05747c6743e8bf68e7e7d8156016eee Mon Sep 17 00:00:00 2001
> From: Ashley Whetter <awhetter.2011 at my.bristol.ac.uk>
> Date: Fri, 12 Jul 2013 00:15:15 +0100
> Subject: [PATCH] Sg flag now returns correct return value for errors
>
> sync_group now returns non-zero if no groups are found
> in the (non-empty) list of groups to search for
>
> Fixes FS#36097
>
> Signed-off-by: Ashley Whetter <awhetter.2011 at my.bristol.ac.uk>
> ---
> src/pacman/sync.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/src/pacman/sync.c b/src/pacman/sync.c
> index fc1314b..af26ae4 100644
> --- a/src/pacman/sync.c
> +++ b/src/pacman/sync.c
> @@ -367,6 +367,7 @@ static int sync_search(alpm_list_t *syncs,
> alpm_list_t *targets)
> static int sync_group(int level, alpm_list_t *syncs, alpm_list_t *targets)
> {
> alpm_list_t *i, *j, *k, *s = NULL;
> + int found_group = 0;
>
> if(targets) {
> for(i = targets; i; i = alpm_list_next(i)) {
> @@ -376,6 +377,7 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> alpm_group_t *grp = alpm_db_get_group(db, grpname);
>
> if(grp) {
> + found_group = 1;
> /* get names of packages in group */
> for(k = grp->packages; k; k = alpm_list_next(k)) {
> if(!config->quiet) {
> @@ -396,6 +398,8 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> alpm_group_t *grp = j->data;
>
> if(level > 1) {
> + found_group |= (int)(intptr_t) grp->packages;
This cast doesn't buy you anything. Just compare the pointer to NULL...
> +
> for(k = grp->packages; k; k = alpm_list_next(k)) {
> printf("%s %s\n", grp->name,
> alpm_pkg_get_name(k->data));
> @@ -403,6 +407,7 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> } else {
> /* print grp names only, no package names */
> if(!alpm_list_find_str (s, grp->name)) {
> + found_group = 1;
> s = alpm_list_add (s, grp->name);
> printf("%s\n", grp->name);
> }
> @@ -412,7 +417,7 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> alpm_list_free(s);
> }
>
> - return 0;
> + return (found_group == 0);
> }
>
> static int sync_info(alpm_list_t *syncs, alpm_list_t *targets)
> --
> 1.8.3.2
>
> From 2b36585f5aeca8adbe15fc4609ff4bc5536af798 Mon Sep 17 00:00:00 2001
> From: Ashley Whetter <awhetter.2011 at my.bristol.ac.uk>
> Date: Fri, 12 Jul 2013 00:35:55 +0100
> Subject: [PATCH] Sg flag now returns correct return value for errors
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> sync_group now returns non-zero if no groups are found
> in the (non-empty) list of groups to search for
>
> Fixes FS#36097
>
> Signed-off-by: Ashley Whetter <awhetter.2011 at my.bristol.ac.uk>
> ---
> src/pacman/sync.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/src/pacman/sync.c b/src/pacman/sync.c
> index fc1314b..9d2dbd6 100644
> --- a/src/pacman/sync.c
> +++ b/src/pacman/sync.c
> @@ -367,6 +367,7 @@ static int sync_search(alpm_list_t *syncs,
> alpm_list_t *targets)
> static int sync_group(int level, alpm_list_t *syncs, alpm_list_t *targets)
> {
> alpm_list_t *i, *j, *k, *s = NULL;
> + int found = 0;
>
> if(targets) {
> for(i = targets; i; i = alpm_list_next(i)) {
> @@ -376,6 +377,7 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> alpm_group_t *grp = alpm_db_get_group(db, grpname);
>
> if(grp) {
> + found = 1;
> /* get names of packages in group */
> for(k = grp->packages; k; k = alpm_list_next(k)) {
> if(!config->quiet) {
> @@ -410,9 +412,13 @@ static int sync_group(int level, alpm_list_t
> *syncs, alpm_list_t *targets)
> }
> }
> alpm_list_free(s);
> +
> + /* Even if there are no groups we have still done everything we should
> + * have */
> + found = 1;
> }
>
> - return 0;
> + return (found == 0);
> }
>
> static int sync_info(alpm_list_t *syncs, alpm_list_t *targets)
> --
> 1.8.3.2
>
>
> With the first patch, the new double cast line is a bit weird but
> genuinely flags whether or not we found any groups.
> The second patch seems a bit more sane to me in terms of the
> functionality. It just marks there to be a group found if the user
> didn't search for a specific group, regardless of whether any groups
> were actually found. I think this makes sense because in the highly
> unlikely scenario that there are no groups and the user didn't search
> for any specifically, pacman has still done everything it should have
> done so shouldn't return an error.
>
> Regards,
> Ashley
>
More information about the pacman-dev
mailing list