summaryrefslogtreecommitdiffstats
path: root/urpm/cfg.pm
diff options
context:
space:
mode:
Diffstat (limited to 'urpm/cfg.pm')
-rw-r--r--urpm/cfg.pm63
1 files changed, 63 insertions, 0 deletions
diff --git a/urpm/cfg.pm b/urpm/cfg.pm
index a1c24d3f..634a188d 100644
--- a/urpm/cfg.pm
+++ b/urpm/cfg.pm
@@ -252,6 +252,69 @@ sub dump_config_raw {
1;
}
+sub load_ini_config_file_raw {
+ my ($file, $b_norewrite) = @_;
+
+ require Config::IniFiles;
+ my $cfg = Config::IniFiles->new('-file' => $file);
+ [ map {
+ my $section = $_;
+ my %h = map {
+ my $v = $cfg->val($section, $_);
+ $v = expand_line($v) if !$b_norewrite;
+ $_ => $v;
+ } $cfg->Parameters($section);
+ { conf_file__rel_media => $section, %h };
+ } $cfg->Sections ];
+}
+
+sub write_ini_config {
+ my ($file, $blocks) = @_;
+
+ if (@$blocks == 0) {
+ unlink $file;
+ return;
+ }
+ my $modified;
+
+ require Config::IniFiles;
+ my $cfg = Config::IniFiles->new('-file' => $file);
+ if ($cfg) {
+ # remove dropped blocks
+ foreach (difference2([ $cfg->Sections ], [ map { $_->{name} } @$blocks ])) {
+ $cfg->DeleteSection($_);
+ $modified = 1;
+ }
+ } else {
+ $cfg = Config::IniFiles->new;
+ }
+
+ my %uniq;
+
+ foreach (@$blocks) {
+ my %h = %$_;
+ my $section = delete $h{conf_file__rel_media} || '_';
+ $uniq{$section}++ or die "conflicting conf_file__rel_media value\n";
+
+ foreach (difference2([ $cfg->Parameters($section) ], [ keys %h ])) {
+ # remove those options which are no more wanted
+ $cfg->delval($section, $_);
+ $modified = 1;
+ }
+ foreach (keys %h) {
+ my $old_v = $cfg->getval($section, $_);
+ my $v = substitute_back($h{$_}, $old_v);
+ if ($old_v ne $v) {
+ $cfg->setval($section, $_, $v);
+ $modified = 1;
+ }
+ }
+ }
+ if ($modified) {
+ $cfg->RewriteConfig;
+ }
+}
+
#- routines to handle mirror list location
#- Default mirror list