-
- my $remove_added = sub {
- my @added = grep { $_ ne $opt } PVE::Tools::split_list(delete($ci->{added}) // '');
- my $added = join(',', @added);
- $ci->{added} = $added if length($added);
- };
-
- my $record_added = sub {
- my %added = map { $_ => 1 } PVE::Tools::split_list(delete($ci->{added}) // '');
- $added{$opt} = 1;
- $ci->{added} = join(',', keys %added);
- };
-
- if (defined($recorded)) {
- # cloud-init already had a version of this key
- if (!defined($new)) {
- # the option existed temporarily and was now removed:
- $remove_added->();
- } elsif ($new eq $recorded) {
- # it was reverted to the state in cloud-init
- delete $ci->{$opt};
+ my %added = map { $_ => 1 } PVE::Tools::split_list(delete($ci->{added}) // '');
+
+ if (defined($new)) {
+ if (defined($old)) {
+ # an existing value is being modified
+ if (defined($recorded)) {
+ # the value was already not in sync
+ if ($new eq $recorded) {
+ # a value is being reverted to the cloud-init state:
+ delete $ci->{$opt};
+ delete $added{$opt};
+ } else {
+ # the value was changed multiple times, do nothing
+ }
+ } elsif ($added{$opt}) {
+ # the value had been marked as added and is being changed, do nothing
+ } else {
+ # the value is new, record it:
+ $ci->{$opt} = $old;
+ }