1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package urpm::cfg;
use strict;
use warnings;
use urpm::util;
=head1 NAME
urpm::cfg - routines to handle the urpmi configuration files
=head1 SYNOPSIS
=head1 DESCRIPTION
=over
=item load_config($file)
Reads an urpmi configuration file and return its contents in a hash ref :
{
'medium name 1' => {
url => 'http://...',
option => 'value',
...
}
'' => {
# global options go here
},
}
Returns undef() in case of parsing error (and sets C<$urpm::cfg::err> to the
appropriate error message.)
=item dump_config($file, $config)
=cut
our $err;
sub _syntax_error () { $err = N("syntax error in config file at line %s" }
sub load_config ($) {
my ($file) = @_;
my %config;
my $medium = undef;
$err = '';
open my $f, $file or do { $err = "Can't read $file: $!\n"; return }
local $_;
while (<$f>) {
chomp;
next if /^\s*#/; #- comments
s/^\s+//; s/\s+$//;
if ($_ eq '}') { #-{
if (!defined $medium) {
_syntax_error;
return;
}
undef $medium;
next;
}
if (defined $medium && /{$/) { #-}
_syntax_error;
return;
}
if ($_ eq '{') { #-} Entering a global block
$medium = '';
next;
}
if (/^(.*?[^\\])\s+(?:(.*?[^\\])\s+)?{$/ { #-} medium definition
$config{ $medium = unquotespace $1 }{url} = unquotespace $2;
next;
}
#- config values
/^(hdlist
|list
|with_hdlist
|removable
|md5sum
|limit-rate
|excludepath
|key[\-_]ids
|split-(?:level|length)
|priority-upgrade
|downloader
)\s*:\s*(.*)$/x
and $config{$medium}{$1} = $2, next;
#- positive flags
/^(update|ignore|synthesis|virtual)$/
and $config{$medium}{$1} = 1, next;
my ($no, $k, $v);
#- boolean options
if (($no, $k, $v) = /^(no-)?(
verify-rpm
|fuzzy
|allow-(?:force|nodeps)
|(?:pre|post)-clean
|excludedocs
|compress
|keep
|auto
|resume)(?:\s*:\s*(.*))?$/x
) {
my $yes = !$no;
$config{$medium}{$k} = $v =~ /^(yes|on|1|)$/i ? $yes : !$yes;
next;
}
#- obsolete
/^modified$/ and next;
}
close $f;
return \%config;
}
sub dump_config ($$) {
my ($file, $config) = @_;
}
__END__
=back
=cut
|