+ if ($field=~/^enable\./) {
+ # rebuild is overkill for many plugins,
+ # but no good way to tell which
+ $rebuild{$field}=1; # TODO only if state changed tho
+ # TODO plugin enable/disable
+ next;
+ }
+
+ my %info=%{$fields{$field}->[1]};
+ my $key=$fields{$field}->[0];
+ my @value=$form->field($field);
+
+ if (! $info{safe}) {
+ error("unsafe field $key"); # should never happen
+ }
+
+ next unless @value;
+ # Avoid setting fields to empty strings,
+ # if they were not set before.
+ next if ! defined $config{$key} && ! grep { length $_ } @value;
+
+ if (ref $config{$key} eq "ARRAY" || ref $info{example} eq "ARRAY") {
+ if ($info{rebuild} && (! defined $config{$key} || (@{$config{$key}}) != (@value))) {
+ $rebuild{$field}=1;
+ }
+ $config{$key}=\@value;
+ }
+ elsif (ref $config{$key} || ref $info{example}) {
+ error("complex field $key"); # should never happen
+ }
+ else {
+ if ($info{rebuild} && (! defined $config{$key} || $config{$key} ne $value[0])) {
+ $rebuild{$field}=1;
+ }
+ $config{$key}=$value[0];
+ }
+ }
+
+ if (%rebuild && $form->submitted eq 'Save Setup') {
+ $form->text(gettext("The configuration changes shown below require a wiki rebuild to take effect."));
+ foreach my $field ($form->field) {
+ next if $rebuild{$field};
+ $form->field(name => $field, type => "hidden",
+ force => 1);
+ }
+ $form->reset(0); # doesn't really make sense here
+ $buttons=["Rebuild Wiki", "Cancel"];
+ }
+ else {
+ # TODO save to real path
+ IkiWiki::Setup::dump("/tmp/s");
+ $form->text(gettext("Setup saved."));
+
+ if (%rebuild) {
+ # TODO rebuild
+ }