diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt index 06ba81d4..690e3f48 100644 --- a/doc/pacman.conf.5.txt +++ b/doc/pacman.conf.5.txt @@ -68,6 +68,10 @@ Options Instructs pacman to ignore any upgrades for this package when performing a '\--sysupgrade'. +*IgnoreGroup =* group ...:: + Instructs pacman to ignore any upgrades for all packages in this + group when performing a '\--sysupgrade'. + *Include =* path:: Include another config file. This file can include repositories or general configuration options. diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 20d77876..f8558e1b 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -130,6 +130,10 @@ alpm_list_t *alpm_option_get_holdpkgs(); void alpm_option_add_holdpkg(const char *pkg); void alpm_option_set_holdpkgs(alpm_list_t *holdpkgs); +alpm_list_t *alpm_option_get_ignoregrps(); +void alpm_option_add_ignoregrp(const char *grp); +void alpm_option_set_ignoregrps(alpm_list_t *ignoregrps); + time_t alpm_option_get_upgradedelay(); void alpm_option_set_upgradedelay(time_t delay); diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c index af549498..78ac1171 100644 --- a/lib/libalpm/handle.c +++ b/lib/libalpm/handle.c @@ -100,6 +100,7 @@ void _alpm_handle_free(pmhandle_t *handle) FREELIST(handle->noextract); FREELIST(handle->ignorepkg); FREELIST(handle->holdpkg); + FREELIST(handle->ignoregrp); FREE(handle); } @@ -211,6 +212,15 @@ alpm_list_t SYMEXPORT *alpm_option_get_holdpkgs() return handle->holdpkg; } +alpm_list_t SYMEXPORT *alpm_option_get_ignoregrps() +{ + if (handle == NULL) { + pm_errno = PM_ERR_HANDLE_NULL; + return NULL; + } + return handle->ignoregrp; +} + time_t SYMEXPORT alpm_option_get_upgradedelay() { if (handle == NULL) { @@ -461,6 +471,17 @@ void SYMEXPORT alpm_option_set_holdpkgs(alpm_list_t *holdpkgs) if(holdpkgs) handle->holdpkg = holdpkgs; } +void SYMEXPORT alpm_option_add_ignoregrp(const char *grp) +{ + handle->ignoregrp = alpm_list_add(handle->ignoregrp, strdup(grp)); +} + +void alpm_option_set_ignoregrps(alpm_list_t *ignoregrps) +{ + if(handle->ignoregrp) FREELIST(handle->ignoregrp); + if(ignoregrps) handle->ignoregrp = ignoregrps; +} + void SYMEXPORT alpm_option_set_upgradedelay(time_t delay) { handle->upgradedelay = delay; diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h index 0874ecd3..63a46884 100644 --- a/lib/libalpm/handle.h +++ b/lib/libalpm/handle.h @@ -55,6 +55,7 @@ typedef struct _pmhandle_t { alpm_list_t *noextract; /* List of packages NOT to extract */ /*TODO is this used?*/ alpm_list_t *ignorepkg; /* List of packages to ignore */ alpm_list_t *holdpkg; /* List of packages which 'hold' pacman */ + alpm_list_t *ignoregrp; /* List of groups to ignore */ /* options */ unsigned short usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */ diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 9c650f21..2f916e2d 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -309,6 +309,7 @@ static int parseargs(int argc, char *argv[]) {"cachedir", required_argument, 0, 1007}, {"asdeps", no_argument, 0, 1008}, {"logfile", required_argument, 0, 1009}, + {"ignoregroup", required_argument, 0, 1010}, {0, 0, 0, 0} }; @@ -369,6 +370,7 @@ static int parseargs(int argc, char *argv[]) } config->have_logfile = 1; break; + case 1010: alpm_option_add_ignoregrp(strdup(optarg)); break; case 'A': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_ADD); break; case 'F': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_UPGRADE); @@ -627,6 +629,19 @@ static int _parseconfig(const char *file, const char *givensection, } alpm_option_add_ignorepkg(p); pm_printf(PM_LOG_DEBUG, "config: ignorepkg: %s\n", p); + } else if(strcmp(key, "IgnoreGroup") == 0 || strcmp(upperkey, "IGNOREGROUP") == 0) { + char *p = ptr; + char *q; + + while((q = strchr(p, ' '))) { + *q = '\0'; + alpm_option_add_ignoregrp(p); + pm_printf(PM_LOG_DEBUG, "config: ignoregroup: %s", p); + p = q; + p++; + } + alpm_option_add_ignoregrp(p); + pm_printf(PM_LOG_DEBUG, "config: ignoregroup: %s\n", p); } else if(strcmp(key, "HoldPkg") == 0 || strcmp(upperkey, "HOLDPKG") == 0) { char *p = ptr; char *q;