1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-23 00:08:50 -05:00

pacman: add front end support for repo usage level

Add a "Usage" key to the repo section of the config which allows for the
tokens "Search", "Install", "Upgrade", "All", which correspond to values
in the alpm_db_usage_t enum. Users can specify "Usage" multiple times
for a given repo, or multiple flags per "Usage" line and they will be
OR'd together. If unspecified, the default is full usage of the repo.

Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Dave Reisner 2012-07-02 17:16:58 -04:00 committed by Allan McRae
parent 106d0fc541
commit c0ee713704
3 changed files with 85 additions and 0 deletions

View File

@ -243,6 +243,27 @@ even be used for different architectures.
Set the signature verification level for this repository. For more Set the signature verification level for this repository. For more
information, see <<SC,Package and Database Signature Checking>> below. information, see <<SC,Package and Database Signature Checking>> below.
*Usage =* ...::
Set the usage level for this repository. This option takes a list of tokens
which must be at least one of the following:
*Sync*;;
Enables refreshes for this repository.
*Search*;;
Enables searching for this repository.
*Install*;;
Enables installation of packages from this repository during a '\--sync'
operation.
*Upgrade*;;
Allows this repository to be a valid source of packages when performing
a '\--sysupgrade'.
*All*;;
Enables all of the above features for the repository. This is the default
if not specified.
+
Note that an enabled repository can be operated on explicitly, regardless of the Usage
level set.
Package and Database Signature Checking[[SC]] Package and Database Signature Checking[[SC]]
--------------------------------------------- ---------------------------------------------
The 'SigLevel' directive is valid in both the `[options]` and repository The 'SigLevel' directive is valid in both the `[options]` and repository

View File

@ -750,8 +750,43 @@ struct section_t {
/* db section option gathering */ /* db section option gathering */
alpm_siglevel_t siglevel; alpm_siglevel_t siglevel;
alpm_list_t *servers; alpm_list_t *servers;
alpm_db_usage_t usage;
}; };
static int process_usage(alpm_list_t *values, alpm_db_usage_t *usage,
const char *file, int linenum)
{
alpm_list_t *i;
alpm_db_usage_t level = *usage;
int ret = 0;
for(i = values; i; i = i->next) {
char *key = i->data;
if(strcmp(key, "Sync") == 0) {
level |= ALPM_DB_USAGE_SYNC;
} else if(strcmp(key, "Search") == 0) {
level |= ALPM_DB_USAGE_SEARCH;
} else if(strcmp(key, "Install") == 0) {
level |= ALPM_DB_USAGE_INSTALL;
} else if(strcmp(key, "Upgrade") == 0) {
level |= ALPM_DB_USAGE_UPGRADE;
} else if(strcmp(key, "All") == 0) {
level |= ALPM_DB_USAGE_ALL;
} else {
pm_printf(ALPM_LOG_ERROR,
_("config file %s, line %d: '%s' option '%s' not recognized\n"),
file, linenum, "Usage", key);
ret = 1;
}
}
*usage = level;
return ret;
}
static int _parse_repo(const char *key, char *value, const char *file, static int _parse_repo(const char *key, char *value, const char *file,
int line, struct section_t *section) int line, struct section_t *section)
{ {
@ -780,6 +815,16 @@ static int _parse_repo(const char *key, char *value, const char *file,
FREELIST(values); FREELIST(values);
} }
} }
} else if(strcmp(key, "Usage") == 0) {
alpm_list_t *values = NULL;
setrepeatingoption(value, "Usage", &values);
if(values) {
if(process_usage(values, &section->usage, file, line)) {
FREELIST(values);
return 1;
}
FREELIST(values);
}
} else { } else {
pm_printf(ALPM_LOG_WARNING, pm_printf(ALPM_LOG_WARNING,
_("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"), _("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"),
@ -820,6 +865,12 @@ static int finish_section(struct section_t *section)
goto cleanup; goto cleanup;
} }
pm_printf(ALPM_LOG_DEBUG,
"setting usage of %d for %s repoistory\n",
section->usage == 0 ? ALPM_DB_USAGE_ALL : section->usage,
section->name);
alpm_db_set_usage(db, section->usage == 0 ? ALPM_DB_USAGE_ALL : section->usage);
for(i = section->servers; i; i = alpm_list_next(i)) { for(i = section->servers; i; i = alpm_list_next(i)) {
char *value = i->data; char *value = i->data;
if(_add_mirror(db, value) != 0) { if(_add_mirror(db, value) != 0) {
@ -837,6 +888,7 @@ cleanup:
section->servers = NULL; section->servers = NULL;
section->siglevel = ALPM_SIG_USE_DEFAULT; section->siglevel = ALPM_SIG_USE_DEFAULT;
section->name = NULL; section->name = NULL;
section->usage = 0;
return ret; return ret;
} }
@ -883,6 +935,7 @@ int parseconfig(const char *file)
struct section_t section; struct section_t section;
memset(&section, 0, sizeof(struct section_t)); memset(&section, 0, sizeof(struct section_t));
section.siglevel = ALPM_SIG_USE_DEFAULT; section.siglevel = ALPM_SIG_USE_DEFAULT;
section.usage = 0;
/* the config parse is a two-pass affair. We first parse the entire thing for /* the config parse is a two-pass affair. We first parse the entire thing for
* the [options] section so we can get all default and path options set. * the [options] section so we can get all default and path options set.
* Next, we go back and parse everything but [options]. */ * Next, we go back and parse everything but [options]. */

View File

@ -672,6 +672,7 @@ static int process_target(const char *target, int error)
if(targname && targname != targstring) { if(targname && targname != targstring) {
alpm_db_t *db; alpm_db_t *db;
const char *dbname; const char *dbname;
alpm_db_usage_t usage;
*targname = '\0'; *targname = '\0';
targname++; targname++;
@ -683,9 +684,19 @@ static int process_target(const char *target, int error)
ret = 1; ret = 1;
goto cleanup; goto cleanup;
} }
/* explicitly mark this repo as valid for installs since
* a repo name was given with the target */
alpm_db_get_usage(db, &usage);
alpm_db_set_usage(db, usage|ALPM_DB_USAGE_INSTALL);
dblist = alpm_list_add(NULL, db); dblist = alpm_list_add(NULL, db);
ret = process_targname(dblist, targname, error); ret = process_targname(dblist, targname, error);
alpm_list_free(dblist); alpm_list_free(dblist);
/* restore old usage so we don't possibly disturb later
* targets */
alpm_db_set_usage(db, usage);
} else { } else {
targname = targstring; targname = targstring;
dblist = alpm_get_syncdbs(config->handle); dblist = alpm_get_syncdbs(config->handle);