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 <[email protected]>
---
I'm wondering if there ought to be a way to specify 'None' here, which would
basically restrict you to only listing the contents of a repo and nothing else.

 doc/pacman.conf.5.txt | 16 ++++++++++++++++
 src/pacman/conf.c     | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index a9c5db3..4f50df9 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -226,6 +226,22 @@ even be used for different architectures.
        Set the signature verification level for this repository. For more
        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 can be any of the following:
+               *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.
+
+
 Package and Database Signature Checking
 ---------------------------------------
 The 'SigLevel' directive is valid in both the `[options]` and repository
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 4aaacb5..00df6f8 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -636,6 +636,7 @@ struct section_t {
        /* db section option gathering */
        alpm_siglevel_t siglevel;
        alpm_list_t *servers;
+       alpm_db_usage_t usage;
 };
 
 /**
@@ -669,6 +670,12 @@ static int finish_section(struct section_t *section, int 
parse_options)
                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)) {
                char *value = i->data;
                if(_add_mirror(db, value) != 0) {
@@ -687,6 +694,38 @@ cleanup:
        section->siglevel = ALPM_SIG_USE_DEFAULT;
        free(section->name);
        section->name = NULL;
+       section->usage = 0;
+       return ret;
+}
+
+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, "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_WARNING,
+                                       _("config file %s, line %d: directive 
'%s' in section '%s' not recognized.\n"),
+                                       file, linenum, key, "options");
+                       ret = 1;
+               }
+       }
+
+       *usage = level;
+
        return ret;
 }
 
@@ -856,6 +895,17 @@ static int _parseconfig(const char *file, struct section_t 
*section,
                                        }
                                        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, linenum)) {
+                                               FREELIST(values);
+                                               ret = 1;
+                                               goto cleanup;
+                                       }
+                                       FREELIST(values);
+                               }
                        } else {
                                pm_printf(ALPM_LOG_WARNING,
                                                _("config file %s, line %d: 
directive '%s' in section '%s' not recognized.\n"),
@@ -886,6 +936,7 @@ int parseconfig(const char *file)
        struct section_t section;
        memset(&section, 0, sizeof(struct section_t));
        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 [options] section so we can get all default and path options set.
         * Next, we go back and parse everything but [options]. */
-- 
1.7.11.1


Reply via email to