[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