Hook up a per-repo 'Disabled' flag in the config for users to mark repos
as disabled. This can take a boolean value such as 'yes', 'true', or
'1', or the similar negated 'no', 'false', or '0'.

Signed-off-by: Dave Reisner <[email protected]>
---
It's possible that I'm blowing smoke with my strcasecmp commment...

 doc/pacman.conf.5.txt |  7 +++++++
 src/pacman/conf.c     | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index a9c5db3..cc2d88f 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -226,6 +226,13 @@ 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.
 
+*Disabled =* boolean::
+       Allows a repository to be marked as disabled. Disabled repositories will
+       not be searched when looking for updates, but will continue to be 
refreshed.
+       This option takes a boolean true or false value.  True can be the string
+       ``1'', ``yes'', or ``true'', case insensitive. False can be the string 
``0'',
+       ``no'', or ``false'', case insensitive.
+
 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..4d042aa 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;
+       int disabled;
 };
 
 /**
@@ -669,6 +670,8 @@ static int finish_section(struct section_t *section, int 
parse_options)
                goto cleanup;
        }
 
+       alpm_db_set_disabled(db, section->disabled);
+
        for(i = section->servers; i; i = alpm_list_next(i)) {
                char *value = i->data;
                if(_add_mirror(db, value) != 0) {
@@ -687,9 +690,29 @@ cleanup:
        section->siglevel = ALPM_SIG_USE_DEFAULT;
        free(section->name);
        section->name = NULL;
+       section->disabled = 0;
        return ret;
 }
 
+static int string_to_boolean(const char *string)
+{
+       /* usage of strcasecmp here is allowed since we're comparing
+        * against fixed strings */
+       if(strcasecmp(string, "1") == 0 ||
+                strcasecmp(string, "true") == 0 ||
+                strcasecmp(string, "yes") == 0) {
+               return 1;
+       }
+
+       if(strcasecmp(string, "0") == 0 ||
+                strcasecmp(string, "false") == 0 ||
+                strcasecmp(string, "no") == 0) {
+               return 0;
+       }
+
+       return -1;
+}
+
 /** The "real" parseconfig. Each "Include" directive will recall this method so
  * recursion and stack depth are limited to 10 levels. The publicly visible
  * parseconfig calls this with a NULL section argument so we can recall from
@@ -856,6 +879,21 @@ static int _parseconfig(const char *file, struct section_t 
*section,
                                        }
                                        FREELIST(values);
                                }
+                       } else if(strcmp(key, "Disabled") == 0) {
+                               if(value == NULL) {
+                                       pm_printf(ALPM_LOG_ERROR, _("config 
file %s, line %d: directive '%s' needs a value\n"),
+                                                       file, linenum, key);
+                                       ret = 1;
+                                       goto cleanup;
+                               }
+                               section->disabled = string_to_boolean(value);
+                               if (section->disabled < 0) {
+                                       pm_printf(ALPM_LOG_ERROR, _("config 
file %s, line %d: directive '%s' has "
+                                                               "invalid 
boolean value %s\n"),
+                                                       file, linenum, key, 
value);
+                                       ret = 1;
+                                       goto cleanup;
+                               }
                        } else {
                                pm_printf(ALPM_LOG_WARNING,
                                                _("config file %s, line %d: 
directive '%s' in section '%s' not recognized.\n"),
-- 
1.7.11.1


Reply via email to