[pacman-dev] [PATCH] pacman: don't error when a group exists but all packages are ignored
Currently when attempting to sync a group where all packages are ignored (either by ignorepkg, ignoregroup or --needed) pacman will error with "target not found". Instead, if a group has no packages, check if the group exists and only throw an error if it does not. Signed-off-by: morganamilo <morganamilo@gmail.com> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 2d3d198a..316853bb 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -1446,6 +1446,8 @@ int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier, alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name); +int alpm_group_exists(alpm_list_t *dbs, const char *name); + /* * Sync */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 05f58fad..57058782 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -313,6 +313,26 @@ alpm_list_t SYMEXPORT *alpm_find_group_pkgs(alpm_list_t *dbs, return pkgs; } +/** Check if a group exists across a list of databases. + * @param dbs the list of alpm_db_t * + * @param name the name of the group + * @return 1 if the group exists, 0 if it does not + */ +int SYMEXPORT alpm_group_exists(alpm_list_t *dbs, + const char *name) +{ + alpm_list_t *i; + for(i = dbs; i; i = i->next) { + alpm_db_t *db = i->data; + + if (alpm_db_get_group(db, name)) { + return 1; + } + } + + return 0; +} + /** Compute the size of the files that will be downloaded to install a * package. * @param newpkg the new package to upgrade to diff --git a/src/pacman/sync.c b/src/pacman/sync.c index ef8faedf..32df6e04 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -543,6 +543,10 @@ static int process_group(alpm_list_t *dbs, const char *group, int error) int count = alpm_list_count(pkgs); if(!count) { + if(alpm_group_exists(dbs, group)) { + return 0; + } + pm_printf(ALPM_LOG_ERROR, _("target not found: %s\n"), group); return 1; } -- 2.19.1
On 10/18/18 at 08:45pm, morganamilo wrote:
Currently when attempting to sync a group where all packages are ignored (either by ignorepkg, ignoregroup or --needed) pacman will error with "target not found".
Instead, if a group has no packages, check if the group exists and only throw an error if it does not.
Signed-off-by: morganamilo <morganamilo@gmail.com>
Let's put group_exists in the front-end. We may want to modify it to take usage or other factors into account and I don't want to have to figure out how to fit that into a public API, and it's a lot easier to move it from the front-end to the back-end if we do decide to in the future than the other way around.
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 2d3d198a..316853bb 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -1446,6 +1446,8 @@ int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier,
alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name);
+int alpm_group_exists(alpm_list_t *dbs, const char *name); + /* * Sync */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 05f58fad..57058782 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -313,6 +313,26 @@ alpm_list_t SYMEXPORT *alpm_find_group_pkgs(alpm_list_t *dbs, return pkgs; }
+/** Check if a group exists across a list of databases. + * @param dbs the list of alpm_db_t * + * @param name the name of the group + * @return 1 if the group exists, 0 if it does not + */ +int SYMEXPORT alpm_group_exists(alpm_list_t *dbs, + const char *name)
No need to break lines under 80 characters.
+{ + alpm_list_t *i; + for(i = dbs; i; i = i->next) { + alpm_db_t *db = i->data; + + if (alpm_db_get_group(db, name)) {
No space between if and (.
+ return 1; + } + } + + return 0; +} + /** Compute the size of the files that will be downloaded to install a * package. * @param newpkg the new package to upgrade to diff --git a/src/pacman/sync.c b/src/pacman/sync.c index ef8faedf..32df6e04 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -543,6 +543,10 @@ static int process_group(alpm_list_t *dbs, const char *group, int error) int count = alpm_list_count(pkgs);
if(!count) { + if(alpm_group_exists(dbs, group)) { + return 0; + } + pm_printf(ALPM_LOG_ERROR, _("target not found: %s\n"), group); return 1; } -- 2.19.1
Currently when attempting to sync a group where all packages are ignored, either by ignorepkg, ignoregroup or --needed, pacman will error with "target not found". Instead, if a group has no packages check if the group exists before throwing an error. Signed-off-by: morganamilo <morganamilo@gmail.com> --- v2: Move to frontend + fix formatting. diff --git a/src/pacman/sync.c b/src/pacman/sync.c index ef8faedf..57e92266 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -535,6 +535,20 @@ static int process_pkg(alpm_pkg_t *pkg) return 0; } +static int alpm_group_exists(alpm_list_t *dbs, const char *name) +{ + alpm_list_t *i; + for(i = dbs; i; i = i->next) { + alpm_db_t *db = i->data; + + if(alpm_db_get_group(db, name)) { + return 1; + } + } + + return 0; +} + static int process_group(alpm_list_t *dbs, const char *group, int error) { int ret = 0; @@ -543,6 +557,10 @@ static int process_group(alpm_list_t *dbs, const char *group, int error) int count = alpm_list_count(pkgs); if(!count) { + if(alpm_group_exists(dbs, group)) { + return 0; + } + pm_printf(ALPM_LOG_ERROR, _("target not found: %s\n"), group); return 1; } -- 2.19.1
Currently when attempting to sync a group where all packages are ignored, either by ignorepkg, ignoregroup or --needed, pacman will error with "target not found". Instead, if a group has no packages check if the group exists before throwing an error. Signed-off-by: morganamilo <morganamilo@gmail.com> --- v2: Move to frontend + fix formatting. v3: Strip alpm_ prefix diff --git a/src/pacman/sync.c b/src/pacman/sync.c index ef8faedf..57677a42 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -535,6 +535,20 @@ static int process_pkg(alpm_pkg_t *pkg) return 0; } +static int group_exists(alpm_list_t *dbs, const char *name) +{ + alpm_list_t *i; + for(i = dbs; i; i = i->next) { + alpm_db_t *db = i->data; + + if(alpm_db_get_group(db, name)) { + return 1; + } + } + + return 0; +} + static int process_group(alpm_list_t *dbs, const char *group, int error) { int ret = 0; @@ -543,6 +557,10 @@ static int process_group(alpm_list_t *dbs, const char *group, int error) int count = alpm_list_count(pkgs); if(!count) { + if(group_exists(dbs, group)) { + return 0; + } + pm_printf(ALPM_LOG_ERROR, _("target not found: %s\n"), group); return 1; } -- 2.19.1
participants (2)
-
Andrew Gregory
-
morganamilo