[augeas/f16] Version 0.9.0-2

Matthew Booth mdbooth at fedoraproject.org
Fri Nov 25 16:38:13 UTC 2011


commit 00c1a63b911b1c41fc0c3723f9290bb362980568
Author: Matthew Booth <mbooth at redhat.com>
Date:   Fri Nov 25 16:37:17 2011 +0000

    Version 0.9.0-2
    
    Adds mdadm_conf lens.

 augeas-0.9.0-00-b82149e2.patch |  393 ++++++++++++++++++++++++++++++++++++++++
 augeas-0.9.0-01-f591ddde.patch |  173 ++++++++++++++++++
 augeas-0.9.0-02-7f92c1be.patch |  149 +++++++++++++++
 augeas-0.9.0-03-59d5c537.patch |   19 ++
 augeas.spec                    |   15 ++
 mdadm_conf-test.patch          |   12 ++
 6 files changed, 761 insertions(+), 0 deletions(-)
---
diff --git a/augeas-0.9.0-00-b82149e2.patch b/augeas-0.9.0-00-b82149e2.patch
new file mode 100644
index 0000000..8fcd191
--- /dev/null
+++ b/augeas-0.9.0-00-b82149e2.patch
@@ -0,0 +1,393 @@
+commit b82149e2e30793047c0404669f6727b71263f91c
+Author: Matthew Booth <mbooth at redhat.com>
+Date:   Mon Nov 7 16:53:16 2011 +0000
+
+    Mdadm_conf: new lens for /etc/mdadm.conf
+
+diff --git a/lenses/mdadm_conf.aug b/lenses/mdadm_conf.aug
+new file mode 100644
+index 0000000..0cd1ac4
+--- /dev/null
++++ b/lenses/mdadm_conf.aug
+@@ -0,0 +1,281 @@
++(******************************************************************************
++Mdadm_conf module for Augeas
++
++Author: Matthew Booth <mbooth at redhat.com>
++
++Copyright (C):
++    2011 Red Hat Inc.
++
++Reference:
++    mdadm(5)
++    config.c and policy.c from mdadm-3.2.2
++
++License:
++    This file is licensed under the LGPLv2+.
++
++This is a lens for /etc/mdadm.conf. It aims to parse every valid configuration
++file as of version 3.2.2, and many invalid ones too. This last point is a
++feature, not a bug! madm will generate warnings for invalid configuration which
++do not prevent correct operation of the tool. Wherever possible, we try to
++allow for this behaviour.
++
++Keywords in mdadm.conf are matched with a case-insensitive prefix match of at
++least 3 characters. Keys in key/value pairs are also matched case-insensitively,
++but require a full match. The exception is POLICY and PART-POLICY, where keys
++are matched case-sensitively.
++
++N.B. We can't use case-insensitive regular expressions in most places due to bug
++#147.
++*******************************************************************************)
++
++module Mdadm_conf =
++
++   autoload xfm
++
++
++(******************************************************************************
++ * PRIMITIVES
++ ******************************************************************************)
++
++let eol             = Util.comment_or_eol
++let comment         = Util.comment
++let empty           = Util.empty
++let value           = /[^ \t\n#]+/
++let value_no_eq     = /[^ \t\n#=]+/
++let value_no_eq_sl  = /[^ \t\n#=\/]+/
++
++let continuation = /\n[ \t]+/
++let space = /[ \t]+/
++let value_sep = ( del ( continuation | space . continuation? ) " "
++                  | comment . del space " " )
++
++(* We parse specific keys rather than having a catch-all owing to the varying
++case of the syntax. This means the user can rely on 'array/uuid' rather than
++additionally testing for 'array/UUID'.
++
++It would be good to have an additional catchall, but I haven't been able to make
++that work.
++*)
++let keyvalue (r:regexp) (lc:string) (uc:string) =
++    [ del ( r . /=/ ) ( uc . "=" ) . label lc . store value ]
++
++let simplevalue (r:regexp) (lc:string) (uc:string) =
++    [ del r uc . label lc
++      . ( value_sep . [ label "value" . store value ] )* . eol ]
++
++
++(******************************************************************************
++ * DEVICES
++ ******************************************************************************)
++
++let dev_re = /[dD][eE][vV]([iI]([cC][eE]?)?)?/
++
++let dev_containers_re = /[cC][oO][nN][tT][aA][iI][nN][eE][rR][sS]/
++let dev_partitions_re = /[pP][aA][rR][tT][iI][tT][iI][oO][nN][sS]/
++
++let dev_containers = [ del dev_containers_re "containers" . label "containers" ]
++let dev_partitions = [ del dev_partitions_re "partitions" . label "partitions" ]
++let dev_device = [ label "name". store ( value
++                                         - dev_containers_re
++                                         - dev_partitions_re ) ]
++
++(* Strictly there must be at least 1 device, but we err on the side of parsing
++*)
++let dev_devices = ( value_sep . ( dev_containers
++                                  | dev_partitions
++                                  | dev_device ) )*
++
++let device = [ del dev_re "DEVICE" . label "device" . dev_devices . eol ]
++
++
++(******************************************************************************
++ * ARRAY
++ ******************************************************************************)
++
++let array_re  = /[aA][rR][rR]([aA][yY]?)?/
++
++let arr_auto_re         = /[aA][uU][tT][oO]/
++let arr_bitmap_re       = /[bB][iI][tT][mM][aA][pP]/
++let arr_container_re    = /[cC][oO][nN][tT][aA][iI][nN][eE][rR]/
++let arr_devices_re      = /[dD][eE][vV][iI][cC][eE][sS]/
++let arr_disks_re        = /[dD][iI][sS][kK][sS]/ (* Undocumented *)
++let arr_level_re        = /[lL][eE][vV][eE][lL]/
++let arr_member_re       = /[mM][eE][mM][bB][eE][rR]/
++let arr_metadata_re     = /[mM][eE][tT][aA][dD][aA][tT][aA]/
++let arr_name_re         = /[nN][aA][mM][eE]/
++let arr_num_devices_re  = /[nN][uU][mM]-[dD][eE][vV][iI][cC][eE][sS]/
++let arr_spare_group_re  = /[sS][pP][aA][rR][eE]-[gG][rR][oO][uU][pP]/
++let arr_spares_re       = /[sS][pP][aA][rR][eE][sS]/
++let arr_super_minor_re  = /[sS][uU][pP][eE][rR]-[mM][iI][nN][oO][rR]/
++let arr_uuid_re         = /[uU][uU][iI][dD]/
++
++let arr_devicename      = [ store value_no_eq . label "devicename" ]
++
++let arr_auto        = keyvalue arr_auto_re "auto" "AUTO"
++let arr_bitmap      = keyvalue arr_bitmap_re "bitmap" "BITMAP"
++let arr_container   = keyvalue arr_container_re "container" "CONTAINER"
++let arr_devices     = keyvalue arr_devices_re "devices" "DEVICES"
++let arr_disks       = keyvalue arr_disks_re "disks" "DISKS"
++let arr_level       = keyvalue arr_level_re "level" "LEVEL"
++let arr_member      = keyvalue arr_member_re "member" "MEMBER"
++let arr_metadata    = keyvalue arr_metadata_re "metadata" "METADATA"
++let arr_name        = keyvalue arr_name_re "name" "NAME"
++let arr_num_devices = keyvalue arr_num_devices_re "num-devices" "NUM-DEVICES"
++let arr_spare_group = keyvalue arr_spare_group_re "spare-group" "SPARE-GROUP"
++let arr_spares      = keyvalue arr_spares_re "spares" "SPARES"
++let arr_super_minor = keyvalue arr_super_minor_re "super-minor" "SUPER-MINOR"
++let arr_uuid        = keyvalue arr_uuid_re "uuid" "UUID"
++
++let arr_options = ( value_sep . ( arr_devicename
++                                  | arr_auto
++                                  | arr_bitmap
++                                  | arr_container
++                                  | arr_devices
++                                  | arr_disks
++                                  | arr_level
++                                  | arr_member
++                                  | arr_metadata
++                                  | arr_name
++                                  | arr_num_devices
++                                  | arr_spare_group
++                                  | arr_spares
++                                  | arr_super_minor
++                                  | arr_uuid ) )*
++
++let array  = [ del array_re "ARRAY" . label "array" . arr_options . eol ]
++
++
++(******************************************************************************
++ * MAILADDR
++ ******************************************************************************)
++
++let mailaddr_re = /[mM][aA][iI]([lL]([aA]([dD]([dD][rR]?)?)?)?)?/
++
++(* We intentially allow multiple mailaddr values here, even though this is
++invalid and would produce a warning. This is better than not parsing the file.
++*)
++let mailaddr = simplevalue mailaddr_re "mailaddr" "MAILADDR"
++
++
++(******************************************************************************
++ * MAILFROM
++ ******************************************************************************)
++
++(* N.B. MAILFROM can only be abbreviated to 5 characters *)
++let mailfrom_re = /[mM][aA][iI][lL][fF]([rR]([oO][mM]?)?)?/
++
++let mailfrom = [ del mailfrom_re "MAILFROM" . label "mailfrom"
++                 . ( value_sep . [ label "value" . store value ] )* . eol ]
++
++
++(******************************************************************************
++ * PROGRAM
++ ******************************************************************************)
++
++let program_re = /[pP][rR][oO]([gG]([rR]([aA][mM]?)?)?)?/
++
++let program = simplevalue program_re "program" "PROGRAM"
++
++
++(******************************************************************************
++ * CREATE
++ ******************************************************************************)
++
++let create_re = /[cC][rR][eE]([aA]([tT][eE]?)?)?/
++
++let cre_auto_re     = /[aA][uU][tT][oO]/
++let cre_owner_re    = /[oO][wW][nN][eE][rR]/
++let cre_group_re    = /[gG][rR][oO][uU][pP]/
++let cre_mode_re     = /[mM][oO][dD][eE]/
++let cre_metadata_re = /[mM][eE][tT][aA][dD][aA][tT][aA]/
++let cre_symlinks_re = /[sS][yY][mM][lL][iI][nN][kK][sS]/
++
++let cre_auto        = keyvalue cre_auto_re "auto" "AUTO"
++let cre_group       = keyvalue cre_group_re "group" "GROUP"
++let cre_metadata    = keyvalue cre_metadata_re "metadata" "METADATA"
++let cre_mode        = keyvalue cre_mode_re "mode" "MODE"
++let cre_owner       = keyvalue cre_owner_re "owner" "OWNER"
++let cre_symlinks    = keyvalue cre_symlinks_re "symlinks" "SYMLINKS"
++
++let cre_options = ( value_sep . ( arr_auto
++                                  | cre_owner
++                                  | cre_group
++                                  | cre_mode
++                                  | cre_metadata
++                                  | cre_symlinks) )*
++
++let create  = [ del create_re "CREATE" . label "create" . cre_options . eol ]
++
++
++(******************************************************************************
++ * HOMEHOST
++ ******************************************************************************)
++
++let homehost_re = /[hH][oO][mM]([eE]([hH]([oO]([sS][tT]?)?)?)?)?/
++
++let homehost = simplevalue homehost_re "homehost" "HOMEHOST"
++
++
++(******************************************************************************
++ * AUTO
++ ******************************************************************************)
++
++let auto_re = /[aA][uU][tT][oO]?/
++
++let aut_plus        = [ key "+" . store value ]
++let aut_minus       = [ key "-" . store value ]
++let aut_homehost    = [ del /homehost/i "homehost" . label "homehost" ]
++
++let aut_list = ( value_sep . ( aut_plus | aut_minus | aut_homehost ) )*
++
++let auto = [ del auto_re "AUTO" . label "auto" . aut_list . eol ]
++
++
++(******************************************************************************
++ * POLICY and PART-POLICY
++ ******************************************************************************)
++
++(* PART-POLICY is undocumented. A cursory inspection of the parsing code
++suggests it's parsed the same way as POLICY, but treated slightly differently
++thereafter. *)
++
++let policy_re = /[pP][oO][lL]([iI]([cC][yY]?)?)?/
++let part_policy_re =
++    /[pP][aA][rR]([tT](-([pP]([oO]([lL]([iI]([cC][yY]?)?)?)?)?)?)?)?/
++
++(* Unlike everything else, policy keys are matched case sensitive. This means we
++don't have to mess around with explicit option matching, as the match string is
++fixed for a working configuration. *)
++
++let pol_option (act:string) =
++    [ del ( act . "=" ) ( act . "=" ) . label act . store value ]
++
++let pol_options = ( value_sep . [ key value_no_eq_sl . del "=" "="
++                                  . store value ] )*
++
++let policy      = [ del policy_re "POLICY" . label "policy"
++                    . pol_options . eol ]
++let part_policy = [ del part_policy_re "PART-POLICY" . label "part-policy"
++                    . pol_options . eol ]
++
++
++(******************************************************************************
++ * LENS
++ ******************************************************************************)
++
++let lns = (comment
++           | empty
++           | device
++           | array
++           | mailaddr
++           | mailfrom
++           | program
++           | create
++           | homehost
++           | auto
++           | policy
++           | part_policy )*
++
++let filter     = incl "/etc/mdadm.conf"
++
++let xfm        = transform lns filter
+diff --git a/lenses/tests/test_mdadm_conf.aug b/lenses/tests/test_mdadm_conf.aug
+new file mode 100644
+index 0000000..a7622cd
+--- /dev/null
++++ b/lenses/tests/test_mdadm_conf.aug
+@@ -0,0 +1,94 @@
++module Test_mdadm_conf =
++
++let conf = "
++# Comment
++device containers
++ # Comment
++DEVICE partitions  \ndev
++	/dev/hda*  \n  /dev/hdc*
++deVI
++ARRAY /dev/md0 UUID=c3d3134f-2aa9-4514-9da3-82ccd1cccc7b Name=foo=bar
++    supeR-minor=3 devicEs=/dev/hda,/dev/hdb Level=1 num-devices=5 spares=2
++    spare-group=bar auTo=yes BITMAP=/path/to/bitmap metadata=frob
++    container=/dev/sda member=1
++MAIL # Initial comment
++    user at example.com # End of line comment
++MAILF user at example.com # MAILFROM can only be abbreviated to 5 characters
++PROGRA /usr/sbin/handle-mdadm-events
++CREA group=system mode=0640 auto=part-8
++HOME <system>
++AUT +1.x Homehost -all
++POL domain=domain1 metadata=imsm path=pci-0000:00:1f.2-scsi-*
++           action=spare
++PART domain=domain1 metadata=imsm path=pci-0000:04:00.0-scsi-[01]*
++           action=include
++"
++
++test Mdadm_conf.lns get conf =
++    {}
++    { "#comment" = "Comment" }
++    { "device"
++        { "containers" }
++    }
++    { "#comment" = "Comment" }
++    { "device"
++        { "partitions" }
++    }
++    { "device"
++        { "name" = "/dev/hda*" }
++        { "name" = "/dev/hdc*" }
++    }
++    { "device" }
++    { "array"
++        { "devicename" = "/dev/md0" }
++        { "uuid" = "c3d3134f-2aa9-4514-9da3-82ccd1cccc7b" }
++        { "name" = "foo=bar" }
++        { "super-minor" = "3" }
++        { "devices" = "/dev/hda,/dev/hdb" }
++        { "level" = "1" }
++        { "num-devices" = "5" }
++        { "spares" = "2" }
++        { "spare-group" = "bar" }
++        { "auto" = "yes" }
++        { "bitmap" = "/path/to/bitmap" }
++        { "metadata" = "frob" }
++        { "container" = "/dev/sda" }
++        { "member" = "1" }
++    }
++    { "mailaddr"
++        { "#comment" = "Initial comment" }
++        { "value" = "user at example.com" }
++        { "#comment" = "End of line comment" }
++    }
++    { "mailfrom"
++        { "value" = "user at example.com" }
++        { "#comment" = "MAILFROM can only be abbreviated to 5 characters" }
++    }
++    { "program"
++        { "value" = "/usr/sbin/handle-mdadm-events" }
++    }
++    { "create"
++        { "group" = "system" }
++        { "mode" = "0640" }
++        { "auto" = "part-8" }
++    }
++    { "homehost"
++        { "value" = "<system>" }
++    }
++    { "auto"
++        { "+" = "1.x" }
++        { "homehost" }
++        { "-" = "all" }
++    }
++    { "policy"
++        { "domain" = "domain1" }
++        { "metadata" = "imsm" }
++        { "path" = "pci-0000:00:1f.2-scsi-*" }
++        { "action" = "spare" }
++    }
++    { "part-policy"
++        { "domain" = "domain1" }
++        { "metadata" = "imsm" }
++        { "path" = "pci-0000:04:00.0-scsi-[01]*" }
++        { "action" = "include" }
++    }
diff --git a/augeas-0.9.0-01-f591ddde.patch b/augeas-0.9.0-01-f591ddde.patch
new file mode 100644
index 0000000..34e4ebd
--- /dev/null
+++ b/augeas-0.9.0-01-f591ddde.patch
@@ -0,0 +1,173 @@
+commit f591ddde8913633972409b9ebb3967738007730e
+Author: David Lutterkort <lutter at redhat.com>
+Date:   Sun Nov 13 19:38:39 2011 -0800
+
+    * src/fa.c (totalize): handle case-insensitive FA's properly
+    
+    The convention for case-insensitive FA's is that they do not contain any
+    transitions on [A-Z], effectively removing upper case letters from the
+    alphabet.
+    
+    totalize used to create transitions into the crash state that did
+    transition on upper case letters, violating the convention.
+
+diff --git a/src/fa.c b/src/fa.c
+index ecfe8f4..40194e3 100644
+--- a/src/fa.c
++++ b/src/fa.c
+@@ -60,6 +60,10 @@ int fa_minimization_algorithm = FA_MIN_HOPCROFT;
+  * fa_as_regexp, we store regexps on transitions in the re field of each
+  * transition. TRANS_RE indicates that we do that, and is used by fa_dot to
+  * produce proper graphs of an automaton transitioning on regexps.
++ *
++ * For case-insensitive regexps (nocase == 1), the FA never has transitions
++ * on uppercase letters [A-Z], effectively removing these letters from the
++ * alphabet.
+  */
+ struct fa {
+     struct state *initial;
+@@ -2344,6 +2348,34 @@ int fa_contains(struct fa *fa1, struct fa *fa2) {
+     goto done;
+ }
+ 
++static int add_crash_trans(struct fa *fa, struct state *s, struct state *crash,
++                           int min, int max) {
++    int result;
++
++    if (fa->nocase) {
++        /* Never transition on anything in [A-Z] */
++        if (min > 'Z' || max < 'A') {
++            result = add_new_trans(s, crash, min, max);
++        } else if (min >= 'A' && max <= 'Z') {
++            result = 0;
++        } else if (max <= 'Z') {
++            /* min < 'A' */
++            result = add_new_trans(s, crash, min, 'A' - 1);
++        } else if (min >= 'A') {
++            /* max > 'Z' */
++            result = add_new_trans(s, crash, 'Z' + 1, max);
++        } else {
++            /* min < 'A' && max > 'Z' */
++            result = add_new_trans(s, crash, min, 'A' - 1);
++            if (result == 0)
++                result = add_new_trans(s, crash, 'Z' + 1, max);
++        }
++    } else {
++        result = add_new_trans(s, crash, min, max);
++    }
++    return result;
++}
++
+ static int totalize(struct fa *fa) {
+     int r;
+     struct state *crash = add_state(fa, 0);
+@@ -2352,42 +2384,25 @@ static int totalize(struct fa *fa) {
+     F(mark_reachable(fa));
+     sort_transition_intervals(fa);
+ 
+-    if (fa->nocase) {
+-        r = add_new_trans(crash, crash, UCHAR_MIN, 'A' - 1);
+-        if (r < 0)
+-            return -1;
+-        r = add_new_trans(crash, crash, 'Z' + 1, UCHAR_MAX);
+-        if (r < 0)
+-            return -1;
+-    } else {
+-        r = add_new_trans(crash, crash, UCHAR_MIN, UCHAR_MAX);
+-        if (r < 0)
+-            return -1;
+-    }
++    r = add_crash_trans(fa, crash, crash, UCHAR_MIN, UCHAR_MAX);
++    if (r < 0)
++        return -1;
+ 
+     list_for_each(s, fa->initial) {
+         int next = UCHAR_MIN;
+         int tused = s->tused;
+         for (int i=0; i < tused; i++) {
+             uchar min = s->trans[i].min, max = s->trans[i].max;
+-            if (fa->nocase) {
+-                /* Don't add transitions on [A-Z] into crash */
+-                if (isupper(min)) min = 'A';
+-                if (isupper(max)) max = 'Z';
+-            }
+             if (min > next) {
+-                r = add_new_trans(s, crash, next, min - 1);
++                r = add_crash_trans(fa, s, crash, next, min - 1);
+                 if (r < 0)
+                     return -1;
+             }
+-            if (max + 1 > next) {
++            if (max + 1 > next)
+                 next = max + 1;
+-                if (fa->nocase && isupper(next))
+-                    next = 'Z' + 1;
+-            }
+         }
+         if (next <= UCHAR_MAX) {
+-            r = add_new_trans(s, crash, next, UCHAR_MAX);
++            r = add_crash_trans(fa, s, crash, next, UCHAR_MAX);
+             if (r < 0)
+                 return -1;
+         }
+@@ -3019,6 +3034,10 @@ int fa_nocase(struct fa *fa) {
+                 /* t->min < 'A' */
+                 t->max = 'A' - 1;
+                 F(add_new_trans(s, t->to, lc_min, lc_max));
++            } else if (t->min >= 'A') {
++                /* t->max > 'Z' */
++                t->min = 'Z' + 1;
++                F(add_new_trans(s, t->to, lc_min, lc_max));
+             } else {
+                 /* t->min < 'A' && t->max > 'Z' */
+                 F(add_new_trans(s, t->to, 'Z' + 1, t->max));
+diff --git a/tests/fatest.c b/tests/fatest.c
+index be4460b..e3658ab 100644
+--- a/tests/fatest.c
++++ b/tests/fatest.c
+@@ -581,6 +581,24 @@ static void testExpandNoCase(CuTest *tc) {
+     free(s);
+ }
+ 
++static void testNoCaseComplement(CuTest *tc) {
++    const char *key_s = "keY";
++    struct fa *key = make_good_fa(tc, key_s);
++    struct fa *isect = NULL;
++
++    fa_nocase(key);
++
++    struct fa *comp = mark(fa_complement(key));
++
++    key = make_good_fa(tc, key_s);
++
++    /* We used to have a bug in totalize that caused the intersection
++     * to contain "keY" */
++    isect = fa_intersect(key, comp);
++
++    CuAssertIntEquals(tc, 1, fa_is_basic(isect, FA_EMPTY));
++}
++
+ int main(int argc, char **argv) {
+     if (argc == 1) {
+         char *output = NULL;
+@@ -605,6 +623,7 @@ int main(int argc, char **argv) {
+         SUITE_ADD_TEST(suite, testExpandCharRanges);
+         SUITE_ADD_TEST(suite, testNoCase);
+         SUITE_ADD_TEST(suite, testExpandNoCase);
++        SUITE_ADD_TEST(suite, testNoCaseComplement);
+ 
+         CuSuiteRun(suite);
+         CuSuiteSummary(suite, &output);
+diff --git a/tests/modules/pass_nocase.aug b/tests/modules/pass_nocase.aug
+index 6d254a3..ef248f4 100644
+--- a/tests/modules/pass_nocase.aug
++++ b/tests/modules/pass_nocase.aug
+@@ -10,7 +10,7 @@ test lns1 get "KEY" = { "1" = "KEY" }
+ test lns1 get "KeY" = { "1" = "KeY" }
+ 
+ let lns2 =
+-  let re = /[a-z]/i - /Key/i in
++  let re = /[A-Za-z]+/ - /Key/i in
+   [ label "1" . store re ] | [ label "2" . store /Key/i ]
+ 
+ test lns2 get "Key" = { "2" = "Key" }
diff --git a/augeas-0.9.0-02-7f92c1be.patch b/augeas-0.9.0-02-7f92c1be.patch
new file mode 100644
index 0000000..3d22779
--- /dev/null
+++ b/augeas-0.9.0-02-7f92c1be.patch
@@ -0,0 +1,149 @@
+commit 7f92c1be2d9b433b08797b81d2971455b4ee2772
+Author: David Lutterkort <lutter at redhat.com>
+Date:   Sun Nov 13 19:38:10 2011 -0800
+
+    Mdadm: use case-insensitive regexps
+
+diff --git a/lenses/mdadm_conf.aug b/lenses/mdadm_conf.aug
+index 0cd1ac4..1193c13 100644
+--- a/lenses/mdadm_conf.aug
++++ b/lenses/mdadm_conf.aug
+@@ -68,16 +68,14 @@ let simplevalue (r:regexp) (lc:string) (uc:string) =
+  * DEVICES
+  ******************************************************************************)
+ 
+-let dev_re = /[dD][eE][vV]([iI]([cC][eE]?)?)?/
++let dev_re = /dev(i(ce?)?)?/i
+ 
+-let dev_containers_re = /[cC][oO][nN][tT][aA][iI][nN][eE][rR][sS]/
+-let dev_partitions_re = /[pP][aA][rR][tT][iI][tT][iI][oO][nN][sS]/
++let dev_containers_re = /containers/i
++let dev_partitions_re = /partitions/i
+ 
+ let dev_containers = [ del dev_containers_re "containers" . label "containers" ]
+ let dev_partitions = [ del dev_partitions_re "partitions" . label "partitions" ]
+-let dev_device = [ label "name". store ( value
+-                                         - dev_containers_re
+-                                         - dev_partitions_re ) ]
++let dev_device = [ label "name". store ( value - dev_containers_re) ]
+ 
+ (* Strictly there must be at least 1 device, but we err on the side of parsing
+ *)
+@@ -92,22 +90,22 @@ let device = [ del dev_re "DEVICE" . label "device" . dev_devices . eol ]
+  * ARRAY
+  ******************************************************************************)
+ 
+-let array_re  = /[aA][rR][rR]([aA][yY]?)?/
+-
+-let arr_auto_re         = /[aA][uU][tT][oO]/
+-let arr_bitmap_re       = /[bB][iI][tT][mM][aA][pP]/
+-let arr_container_re    = /[cC][oO][nN][tT][aA][iI][nN][eE][rR]/
+-let arr_devices_re      = /[dD][eE][vV][iI][cC][eE][sS]/
+-let arr_disks_re        = /[dD][iI][sS][kK][sS]/ (* Undocumented *)
+-let arr_level_re        = /[lL][eE][vV][eE][lL]/
+-let arr_member_re       = /[mM][eE][mM][bB][eE][rR]/
+-let arr_metadata_re     = /[mM][eE][tT][aA][dD][aA][tT][aA]/
+-let arr_name_re         = /[nN][aA][mM][eE]/
+-let arr_num_devices_re  = /[nN][uU][mM]-[dD][eE][vV][iI][cC][eE][sS]/
+-let arr_spare_group_re  = /[sS][pP][aA][rR][eE]-[gG][rR][oO][uU][pP]/
+-let arr_spares_re       = /[sS][pP][aA][rR][eE][sS]/
+-let arr_super_minor_re  = /[sS][uU][pP][eE][rR]-[mM][iI][nN][oO][rR]/
+-let arr_uuid_re         = /[uU][uU][iI][dD]/
++let array_re  = /arr(ay?)?/i
++
++let arr_auto_re         = /auto/i
++let arr_bitmap_re       = /bitmap/i
++let arr_container_re    = /container/i
++let arr_devices_re      = /devices/i
++let arr_disks_re        = /disks/i (* Undocumented *)
++let arr_level_re        = /level/i
++let arr_member_re       = /member/i
++let arr_metadata_re     = /metadata/i
++let arr_name_re         = /name/i
++let arr_num_devices_re  = /num-devices/i
++let arr_spare_group_re  = /spare-group/i
++let arr_spares_re       = /spares/i
++let arr_super_minor_re  = /super-minor/i
++let arr_uuid_re         = /uuid/i
+ 
+ let arr_devicename      = [ store value_no_eq . label "devicename" ]
+ 
+@@ -149,7 +147,7 @@ let array  = [ del array_re "ARRAY" . label "array" . arr_options . eol ]
+  * MAILADDR
+  ******************************************************************************)
+ 
+-let mailaddr_re = /[mM][aA][iI]([lL]([aA]([dD]([dD][rR]?)?)?)?)?/
++let mailaddr_re = /mai(l(a(d(dr?)?)?)?)?/i
+ 
+ (* We intentially allow multiple mailaddr values here, even though this is
+ invalid and would produce a warning. This is better than not parsing the file.
+@@ -162,7 +160,7 @@ let mailaddr = simplevalue mailaddr_re "mailaddr" "MAILADDR"
+  ******************************************************************************)
+ 
+ (* N.B. MAILFROM can only be abbreviated to 5 characters *)
+-let mailfrom_re = /[mM][aA][iI][lL][fF]([rR]([oO][mM]?)?)?/
++let mailfrom_re = /mailf(r(om?)?)?/i
+ 
+ let mailfrom = [ del mailfrom_re "MAILFROM" . label "mailfrom"
+                  . ( value_sep . [ label "value" . store value ] )* . eol ]
+@@ -172,7 +170,7 @@ let mailfrom = [ del mailfrom_re "MAILFROM" . label "mailfrom"
+  * PROGRAM
+  ******************************************************************************)
+ 
+-let program_re = /[pP][rR][oO]([gG]([rR]([aA][mM]?)?)?)?/
++let program_re = /pro(g(r(am?)?)?)?/i
+ 
+ let program = simplevalue program_re "program" "PROGRAM"
+ 
+@@ -181,14 +179,14 @@ let program = simplevalue program_re "program" "PROGRAM"
+  * CREATE
+  ******************************************************************************)
+ 
+-let create_re = /[cC][rR][eE]([aA]([tT][eE]?)?)?/
++let create_re = /cre(a(te?)?)?/i
+ 
+-let cre_auto_re     = /[aA][uU][tT][oO]/
+-let cre_owner_re    = /[oO][wW][nN][eE][rR]/
+-let cre_group_re    = /[gG][rR][oO][uU][pP]/
+-let cre_mode_re     = /[mM][oO][dD][eE]/
+-let cre_metadata_re = /[mM][eE][tT][aA][dD][aA][tT][aA]/
+-let cre_symlinks_re = /[sS][yY][mM][lL][iI][nN][kK][sS]/
++let cre_auto_re     = /auto/i
++let cre_owner_re    = /owner/i
++let cre_group_re    = /group/i
++let cre_mode_re     = /mode/i
++let cre_metadata_re = /metadata/i
++let cre_symlinks_re = /symlinks/i
+ 
+ let cre_auto        = keyvalue cre_auto_re "auto" "AUTO"
+ let cre_group       = keyvalue cre_group_re "group" "GROUP"
+@@ -211,7 +209,7 @@ let create  = [ del create_re "CREATE" . label "create" . cre_options . eol ]
+  * HOMEHOST
+  ******************************************************************************)
+ 
+-let homehost_re = /[hH][oO][mM]([eE]([hH]([oO]([sS][tT]?)?)?)?)?/
++let homehost_re = /hom(e(h(o(st?)?)?)?)?/i
+ 
+ let homehost = simplevalue homehost_re "homehost" "HOMEHOST"
+ 
+@@ -220,7 +218,7 @@ let homehost = simplevalue homehost_re "homehost" "HOMEHOST"
+  * AUTO
+  ******************************************************************************)
+ 
+-let auto_re = /[aA][uU][tT][oO]?/
++let auto_re = /auto?/i
+ 
+ let aut_plus        = [ key "+" . store value ]
+ let aut_minus       = [ key "-" . store value ]
+@@ -239,9 +237,8 @@ let auto = [ del auto_re "AUTO" . label "auto" . aut_list . eol ]
+ suggests it's parsed the same way as POLICY, but treated slightly differently
+ thereafter. *)
+ 
+-let policy_re = /[pP][oO][lL]([iI]([cC][yY]?)?)?/
+-let part_policy_re =
+-    /[pP][aA][rR]([tT](-([pP]([oO]([lL]([iI]([cC][yY]?)?)?)?)?)?)?)?/
++let policy_re = /pol(i(cy?)?)?/i
++let part_policy_re = /par(t(-(p(o(l(i(cy?)?)?)?)?)?)?)?/i
+ 
+ (* Unlike everything else, policy keys are matched case sensitive. This means we
+ don't have to mess around with explicit option matching, as the match string is
diff --git a/augeas-0.9.0-03-59d5c537.patch b/augeas-0.9.0-03-59d5c537.patch
new file mode 100644
index 0000000..ec66921
--- /dev/null
+++ b/augeas-0.9.0-03-59d5c537.patch
@@ -0,0 +1,19 @@
+commit 59d5c537fe4ada10c0f1806716656ee6392f651c
+Author: Raphaƫl Pinson <raphink at gmail.com>
+Date:   Tue Nov 22 22:28:11 2011 +0100
+
+    mdadm.aug: dev_device cannot match dev_partitions_re
+
+diff --git a/lenses/mdadm_conf.aug b/lenses/mdadm_conf.aug
+index 1193c13..2f20158 100644
+--- a/lenses/mdadm_conf.aug
++++ b/lenses/mdadm_conf.aug
+@@ -75,7 +75,7 @@ let dev_partitions_re = /partitions/i
+ 
+ let dev_containers = [ del dev_containers_re "containers" . label "containers" ]
+ let dev_partitions = [ del dev_partitions_re "partitions" . label "partitions" ]
+-let dev_device = [ label "name". store ( value - dev_containers_re) ]
++let dev_device = [ label "name". store ( value - dev_containers_re - dev_partitions_re) ]
+ 
+ (* Strictly there must be at least 1 device, but we err on the side of parsing
+ *)
diff --git a/augeas.spec b/augeas.spec
index 3d0077d..1df6c83 100644
--- a/augeas.spec
+++ b/augeas.spec
@@ -12,6 +12,12 @@ Source0:        http://augeas.net/download/%{name}-%{version}.tar.gz
 # gives the first version where this patch was applied, NUMBER orders patches
 # against the same version, and HASH is the git commit hash from upstream
 
+Patch0:         augeas-0.9.0-00-b82149e2.patch
+Patch1:         augeas-0.9.0-01-f591ddde.patch
+Patch2:         augeas-0.9.0-02-7f92c1be.patch
+Patch3:         augeas-0.9.0-03-59d5c537.patch
+Patch4:         mdadm_conf-test.patch
+
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildRequires:  readline-devel libselinux-devel
@@ -49,6 +55,12 @@ The libraries for %{name}.
 %prep
 %setup -q
 
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+
 %build
 %configure --disable-static
 make %{?_smp_mflags}
@@ -90,6 +102,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_libdir}/pkgconfig/augeas.pc
 
 %changelog
+* Fri Nov 25 2011 Matthew Booth <mbooth at redhat.com> - 0.9.0-2
+- Include mdadm_conf lens from upstream
+
 * Mon Jul 25 2011 David Lutterkort <lutter at redhat.com> - 0.9.0-1
 - New version; removed patch pathx-whitespace-ea010d8
 
diff --git a/mdadm_conf-test.patch b/mdadm_conf-test.patch
new file mode 100644
index 0000000..468cf5c
--- /dev/null
+++ b/mdadm_conf-test.patch
@@ -0,0 +1,12 @@
+diff -up augeas-0.9.0/build/test-bug-1/etc/logrotate.d/test.orig augeas-0.9.0/build/test-bug-1/etc/logrotate.d/test
+diff -up augeas-0.9.0/tests/Makefile.am.orig augeas-0.9.0/tests/Makefile.am
+--- augeas-0.9.0/tests/Makefile.am.orig	2011-11-25 16:27:44.265508345 +0000
++++ augeas-0.9.0/tests/Makefile.am	2011-11-25 16:28:07.363428944 +0000
+@@ -53,6 +53,7 @@ lens_tests =			\
+   lens-login_defs.sh 	\
+   lens-logrotate.sh		\
+   lens-lokkit.sh		\
++  lens-mdadm_conf.sh	\
+   lens-mke2fs.sh		\
+   lens-modprobe.sh		\
+   lens-modules_conf.sh	\


More information about the scm-commits mailing list