[augeas-devel] Difference between seq and label
Francis Giraldeau
Francis.Giraldeau at USherbrooke.ca
Thu Feb 17 23:49:13 UTC 2011
Hi,
Someone pointed out that it was harder to manipulate the tree with
"seq" and counter lens than with labels [1] in the case of fstab file.
Why does seq is used instead of a label lens? It's related to the
alignment problem in the put direction (tree -> string
transformation). When using label, the keys may be duplicated, and
then associating strings that were removed in the tree is done in node
order. So, if a node is inserted in the middle, all other nodes below
will be associated with the abstracted string from the next node, and
the last one will get the default string. The right behavior would be
that the new node should get default values. For this to happen, keys
in the tree must be unique. Then, even if the nodes are reordered or
new nodes are added, then every strings will be replaced exactly where
at their previous place and new nodes will get default string. This is
important for example in files that are line based. A seq lens to
identify uniquely every like is a good pattern to prevent a big diff
for a file in which we would insert something at the beginning of the
file.
An example of this behavior is provided in the attached align.aug lens.
Cheer,
Francis
[1]
http://mrpointy.wordpress.com/2010/05/01/augeas-and-appending-lines-to-etcfstab/
-------------- next part --------------
module Align =
let dels (s:string) = del s s
let align_sequence = [ label "entry" . store /[a-zA-Z]+/ . dels " " . del /[0-9]+/ "0" . dels "\n" ]*
let align_key = counter "entry" . [ seq "entry" . store /[a-zA-Z]+/ . dels " " . del /[0-9]+/ "0" . dels "\n" ]*
let input =
"Foo 1
Bar 2
"
(* keys are duplicated *)
test align_sequence get input =
{ "entry" = "Foo" }
{ "entry" = "Bar" }
(* keys are unique *)
test align_key get input =
{ "1" = "Foo" }
{ "2" = "Bar" }
(* Baz stoled the number from Bar, which is embarassing *)
test align_sequence put input after insa "entry" "/entry[1]"; set "/entry[2]" "Baz" =
"Foo 1
Baz 2
Bar 0
"
(* Baz gets the default value for the del lens and it makes life wonderful *)
test align_key put input after insa "3" "/1"; set "/3" "Baz" =
"Foo 1
Baz 0
Bar 2
"
More information about the augeas-devel
mailing list