From b8ea1456a156ffe54b2d8a972b14f89cc8f014eb Mon Sep 17 00:00:00 2001 From: Dominic Cleal Date: Tue, 9 Sep 2014 11:29:25 +0100 Subject: [PATCH] Systemd: parse semicolons inside entry values, not as EOL comments Fixes RHBZ#1139498 (cherry picked from commit 414f049a8e65d84eb579d1e40dbf75045ed8d3bd) Conflicts: NEWS --- lenses/systemd.aug | 24 ++++++++++++++---------- lenses/tests/test_systemd.aug | 29 +++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lenses/systemd.aug b/lenses/systemd.aug index 370945b..e1d9e5a 100644 --- a/lenses/systemd.aug +++ b/lenses/systemd.aug @@ -29,9 +29,13 @@ autoload xfm (* View: eol *) let eol = Util.eol -(* View: comment - An entry *) -let comment = IniFile.comment IniFile.comment_re "#" +(* View: eol_comment + An entry for standalone comment lines (; or #) *) +let comment = IniFile.comment IniFile.comment_re "#" + +(* View: eol_comment + An entry for end of line comments (# only) *) +let eol_comment = IniFile.comment "#" "#" (* View: sep An entry *) @@ -52,7 +56,7 @@ let entry_multi_kw = in /[A-Za-z][A-Za-z0-9._-]+/ - forbidden (* Variable: value_single_re *) -let value_single_re = /[^;# \t\n\\][^;#\n\\]*[^;# \t\n\\]|[^;# \t\n\\]/ +let value_single_re = /[^# \t\n\\][^#\n\\]*[^# \t\n\\]|[^# \t\n\\]/ (* View: sto_value_single Support multiline values with a backslash *) @@ -61,7 +65,7 @@ let sto_value_single = Util.del_opt_ws "" . (/\\\\\n/ . value_single_re)*) (* View: sto_value *) -let sto_value = store /[^;# \t\n]*[^;# \t\n\\]/ +let sto_value = store /[^# \t\n]*[^# \t\n\\]/ (* Variable: value_sep Multi-value entries separated by whitespace or backslash and newline *) @@ -69,7 +73,7 @@ let value_sep = del /[ \t]+|[ \t]*\\\\[ \t]*\n[ \t]*/ " " (* Variable: value_cmd_re Don't parse @ and - prefix flags *) -let value_cmd_re = /[^;#@ \t\n\\-][^;#@ \t\n\\-][^;# \t\n\\]*/ +let value_cmd_re = /[^#@ \t\n\\-][^#@ \t\n\\-][^# \t\n\\]*/ (* Variable: env_key *) let env_key = /[A-Za-z0-9_]+(\[[0-9]+\])?/ @@ -89,7 +93,7 @@ Supported entry features, selected by key names: (* View: entry_fn Prototype for our various key=value lines, with optional comment *) let entry_fn (kw:regexp) (val:lens) = - [ key kw . sep . val . (comment|eol) ] + [ key kw . sep . val . (eol_comment|eol) ] (* View: entry_value Store a value that doesn't contain spaces *) @@ -127,9 +131,9 @@ let entry_command = let entry_env = let envkv (env_val:lens) = key env_key . Util.del_str "=" . env_val (* bare has no spaces, and is optionally quoted *) - in let bare = Quote.do_quote_opt (envkv (store /[^;#'" \t\n]*[^;#'" \t\n\\]/)?) + in let bare = Quote.do_quote_opt (envkv (store /[^#'" \t\n]*[^#'" \t\n\\]/)?) (* quoted has at least one space, and must be quoted *) - in let quoted = Quote.do_quote (envkv (store /[^;#"'\n]*[ \t]+[^;#"'\n]*/)) + in let quoted = Quote.do_quote (envkv (store /[^#"'\n]*[ \t]+[^#"'\n]*/)) in let envkv_quoted = [ bare ] | [ quoted ] in entry_fn entry_env_kw ( Build.opt_list envkv_quoted value_sep ) @@ -145,7 +149,7 @@ let entry = entry_single | entry_multi | entry_command | entry_env | comment (* View: include Includes another file at this position *) let include = [ key ".include" . Util.del_ws_spc . sto_value - . (comment|eol) ] + . (eol_comment|eol) ] (* View: title An *) diff --git a/lenses/tests/test_systemd.aug b/lenses/tests/test_systemd.aug index b1574e1..82516b3 100644 --- a/lenses/tests/test_systemd.aug +++ b/lenses/tests/test_systemd.aug @@ -307,3 +307,32 @@ test Systemd.entry_command get "ExecStart=/usr/bin/find /var/lib/sudo -exec /usr { "7" = "\073" } } } + +let exec_tmux = "ExecStart=/usr/bin/tmux unbind-key -a; \ + kill-window -t anaconda:shell; \ + bind-key ? list-keys\n" + +(* Test: Systemd.lns + Semicolons are permitted in entry values, e.g. as part of a command *) +test Systemd.entry_command get exec_tmux = + { "ExecStart" + { "command" = "/usr/bin/tmux" } + { "arguments" + { "1" = "unbind-key" } + { "2" = "-a;" } + { "3" = "kill-window" } + { "4" = "-t" } + { "5" = "anaconda:shell;" } + { "6" = "bind-key" } + { "7" = "?" } + { "8" = "list-keys" } } } + +(* Test: Systemd.lns + # and ; are OK for standalone comments, but # only for EOL comments *) +test Systemd.lns get "[Service]\n# hash\n; semicolon\nExecStart=/bin/echo # hash\n" = + { "Service" + { "#comment" = "hash" } + { "#comment" = "semicolon" } + { "ExecStart" + { "command" = "/bin/echo" } + { "#comment" = "hash" } } }