[augeas-devel] [PATCH] Shellvars: much improved handling

David Lutterkort lutter at redhat.com
Sat Aug 16 01:19:34 UTC 2008


2 files changed, 56 insertions(+), 4 deletions(-)
lenses/shellvars.aug            |   26 ++++++++++++++++++++++----
lenses/tests/test_shellvars.aug |   34 ++++++++++++++++++++++++++++++++++


# HG changeset patch
# User David Lutterkort <dlutter at redhat.com>
# Date 1218849567 25200
# Node ID e51031ce0bd562c9a2a9c41948d7a01390ba5479
# Parent  d40be43078f3873971c8bf4036d6185088adb9cb
Shellvars: much improved handling

- handle single and double quoted strings correctly
- parse arrays into a subtree

Inspired by a chat and preliminary work by nahamu

diff -r d40be43078f3 -r e51031ce0bd5 lenses/shellvars.aug
--- a/lenses/shellvars.aug	Fri Aug 15 18:16:00 2008 -0700
+++ b/lenses/shellvars.aug	Fri Aug 15 18:19:27 2008 -0700
@@ -4,13 +4,31 @@
 
   let eol = Util.del_str "\n"
 
-  let key_re = /[][A-Za-z0-9_]+/
+  let key_re = /[A-Za-z0-9_]+(\[[0-9]+\])?/
   let eq = Util.del_str "="
-  let value = /[^\n]*/
-
   let comment = [ del /(#.*)?[ \t]*\n/ "# \n" ]
 
-  let kv = [ key key_re . eq . store value . eol ]
+  let char  = /[^() '"\t\n]/           (* " Emacs, relax *)
+  let dquot = /\"([^"\n]|\\\\\")*\"/   (* " Emacs, relax *)
+  let squot = /'[^'\n]*'/
+
+  (* Array values of the form '(val1 val2 val3)'. We do not handle empty *)
+  (* arrays here because of typechecking headaches. Instead, they are    *)
+  (* treated as a simple value                                           *)
+  let array =
+    let array_value = store (char+ | dquot | squot) in
+    del "(" "(" . counter "values" .
+      [ seq "values" . array_value . del /[ \t]+/ " " ] * .
+      [ seq "values" . array_value ]
+      . del ")" ")"
+  
+  (* Treat an empty list () as a value '()'; that's not quite correct *)
+  (* but fairly close.                                                *)
+  let simple_value = 
+    let empty_array = /\([ \t]*\)/ in
+   store (char* | dquot | squot | empty_array)
+
+  let kv = [ key key_re . eq . (simple_value | array) . eol ]
 
   let source = 
     [ 
diff -r d40be43078f3 -r e51031ce0bd5 lenses/tests/test_shellvars.aug
--- a/lenses/tests/test_shellvars.aug	Fri Aug 15 18:16:00 2008 -0700
+++ b/lenses/tests/test_shellvars.aug	Fri Aug 15 18:19:27 2008 -0700
@@ -53,6 +53,40 @@
   test Shellvars.lns get ". /etc/java/java.conf\n" = 
     { ".source" = "/etc/java/java.conf" }
 
+  (* Quoted strings and other oddities *)
+  test Shellvars.lns get "var=\"foo 'bar'\"\n" = 
+    { "var" = "\"foo 'bar'\"" }
+
+  test Shellvars.lns get "var='Some \"funny\" value'\n" =
+    { "var" = "'Some \"funny\" value'" }
+
+  test Shellvars.lns get "var=\"\\\"\"\n" = 
+    { "var" = "\"\\\"\"" }
+
+  test Shellvars.lns get "var=ab#c\n" = 
+    { "var" = "ab#c" }
+
+  (* We don't handle comments at the end of a line yet *)
+  test Shellvars.lns get "var=ab #c\n" = *
+
+  (* Handling of arrays *)
+  test Shellvars.lns get "var=(val1 \"val\\\"2\\\"\" val3)\n" = 
+    { "var"
+        { "1" = "val1" }
+        { "2" = "\"val\\\"2\\\"\"" }
+        { "3" = "val3" } }
+
+  test Shellvars.lns get "var=()\n" = { "var" = "()" }
+
+  test Shellvars.lns put "var=()\n" after
+      set "var" "value"
+  = "var=value\n"
+
+  test Shellvars.lns put "var=(v1 v2)\n" after
+      rm "var/*" ;
+      set "var" "value"
+  = "var=value\n"
+  
 (* Local Variables: *)
 (* mode: caml       *)
 (* End:             *)




More information about the augeas-devel mailing list