I'm attempting to write a lens for the LVM config file. One of the fun things 
about the file is that within a given section (contained within { }) is that 
the closing curly brace is not necessarily preceded by a newline. e.g.:

config { myoption = "test"}

is perfectly valid as is

config { myoption = "test"
}

I'm having a really hard time getting augeas to properly deal with that 
optional newline. Here's a simplified version of my lens so far. For now I'm 
ignoring the section name and just focusing on the block itself excluding the 
curly brackets:

module Lvm =
  let eol = Util.eol
  let empty = Util.empty
  let comment = Util.comment
  let indent = del /[ \t]*/ ""
  let eq = del /=/ "="
  let opt_nl = del /\n?/ "\n"
  let lns1 =
     [ indent . key /[a-zA-Z][a-zA-Z0-9_]+/ . indent . eq . indent . store 
/[0-9]+/ . opt_nl]

  let empty_generic_re = /\n[ \t]*#?[ \t]*/
  let empty2 =
    [ del empty_generic_re "\n" . Util.del_str "\n" ]

  let lns =
     empty* . (( lns1 | comment ) . (lns1 | comment | empty2 )* )?

  test lns get "foo=0" = ?
  test lns get "foo=0\n" = ?

  test lns get "foo=0bar=9" = ?
  test lns get "foo=0bar=9\n" = ?

  test lns put "\n\n#baz\nfoo=0\n" after set "/foo2" "8" = ?

  test lns get "foo=0\n#hello\nbar=9" = ?
  test lns get "foo=0\n#hello\nbar=9\n" = ?

  test lns get "foo=0\n\n\n\nbar=9" = ?
  test lns get "foo=0\n\n\nbar=9\n" = ?

This works OK -- it matches comments and it matches directives smushed on the 
same line (valid lvm.conf syntax) and handles optional trailing newlines 
without a problem. I've also half way got it handling empty lines, however as 
the last 2 tests demonstrate it only handles empty lines in groups of 2. In the 
empty2 lens I was attempting to match any \n followed by another \n the idea 
being that this would catch a newline that appears after a configuration line 
since it's newline is optional. If I remove the optional newline match from the 
lns1 lens then the put methods don't generate output that contains a newline 
for new trees. 

Any help here would be greatly appreciated!

Thanks,
Aaron

_______________________________________________
augeas-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to