]> err.no Git - dpkg/commitdiff
Update all scripts to use Dpkg::Substvars, Dpkg::Cdata, Dpkg::Control and Dpkg::Field...
authorRaphael Hertzog <hertzog@debian.org>
Mon, 31 Dec 2007 16:29:00 +0000 (17:29 +0100)
committerRaphael Hertzog <hertzog@debian.org>
Tue, 1 Jan 2008 19:27:10 +0000 (20:27 +0100)
ChangeLog
scripts/dpkg-checkbuilddeps.pl
scripts/dpkg-genchanges.pl
scripts/dpkg-gencontrol.pl
scripts/dpkg-gensymbols.pl
scripts/dpkg-shlibdeps.pl
scripts/dpkg-source.pl

index 5a71bec40d93c9b54ac6ab8127c7e93f7d868fb8..deaa9252bb0c38c2556bed73fc7366bacee09f9f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * scripts/t/600_Dpkg_Control.t,
        scripts/t/600_Dpkg_Control/control-1: Add non-regression tests for
        Dpkg::Control and Dpkg::Cdata.
+       * scripts/dpkg-checkbuilddeps.pl, scripts/dpkg-genchanges.pl,
+       scripts/dpkg-gencontrol.pl, scripts/dpkg-gensymbols.pl,
+       scripts/dpkg-shlibdeps.pl, scripts/dpkg-source.pl: Update scripts
+       to use the new modules Dpkg::Cdata, Dpkg::Control,
+       Dpkg::Fields::Object and Dpkg::Substvars.
 
 2007-12-28  Raphael Hertzog  <hertzog@debian.org>
 
index 57c1a300aaa87a985d250271c1699d9eefcc1e6c..eea28fe2876e9fe13dfe374ac75ac10c5e568cac 100755 (executable)
@@ -10,12 +10,11 @@ use Dpkg::Gettext;
 use Dpkg::ErrorHandling qw(error);
 use Dpkg::Arch qw(get_host_arch);
 use Dpkg::Deps;
+use Dpkg::Control;
 
 push(@INC,$dpkglibdir);
 require 'controllib.pl';
 
-our %fi;
-
 textdomain("dpkg-dev");
 
 sub usage {
@@ -46,30 +45,31 @@ if ($want_help) {
 
 my $controlfile = shift || "debian/control";
 
-parsecontrolfile($controlfile);
+my $control = Dpkg::Control->new($controlfile);
+my $fields = $control->get_source();
 
 my $facts = parse_status("$admindir/status");
 my (@unmet, @conflicts);
 
 my $dep_regex=qr/[ \t]*(([^\n]+|\n[ \t])*)\s/; # allow multi-line
-if (defined($fi{"C Build-Depends"})) {
+if (defined($fields->{"Build-Depends"})) {
        push @unmet, build_depends('Build-Depends',
-                                   Dpkg::Deps::parse($fi{"C Build-Depends"},
+                                   Dpkg::Deps::parse($fields->{"Build-Depends"},
                                         reduce_arch => 1), $facts);
 }
-if (defined($fi{"C Build-Conflicts"})) {
+if (defined($fields->{"C Build-Conflicts"})) {
        push @conflicts, build_conflicts('Build-Conflicts',
-                                         Dpkg::Deps::parse($fi{"C Build-Conflicts"},
+                                         Dpkg::Deps::parse($fields->{"Build-Conflicts"},
                                             reduce_arch => 1, union => 1), $facts);
 }
-if (! $binary_only && defined($fi{"C Build-Depends-Indep"})) {
+if (! $binary_only && defined($fields->{"Build-Depends-Indep"})) {
        push @unmet, build_depends('Build-Depends-Indep',
-                                   Dpkg::Deps::parse($fi{"C Build-Depends-Indep"},
+                                   Dpkg::Deps::parse($fields->{"Build-Depends-Indep"},
                                         reduce_arch => 1), $facts);
 }
-if (! $binary_only && defined($fi{"C Build-Conflicts-Indep"})) {
+if (! $binary_only && defined($fields->{"Build-Conflicts-Indep"})) {
        push @conflicts, build_conflicts('Build-Conflicts-Indep',
-                                         Dpkg::Deps::parse($fi{"C Build-Conflicts-Indep"},
+                                         Dpkg::Deps::parse($fields->{"Build-Conflicts-Indep"},
                                             reduce_arch => 1, union => 1), $facts);
 }
 
index c194ffb9bf07bab18efe456731ad7cd7f38d2204..972a288bdbf001b95a1cc67e49f4d44106fd4cf3 100755 (executable)
@@ -13,13 +13,14 @@ use Dpkg::ErrorHandling qw(warning error failure unknown internerr syserr
 use Dpkg::Arch qw(get_host_arch debarch_eq debarch_is);
 use Dpkg::Fields qw(capit set_field_importance sort_field_by_importance);
 use Dpkg::Compression;
+use Dpkg::Control;
+use Dpkg::Cdata;
+use Dpkg::Substvars;
 
 push(@INC,$dpkglibdir);
 require 'controllib.pl';
 
-our (%f, %fi);
-our %p2i;
-our %substvar;
+our (%fi);
 our $sourcepackage;
 
 textdomain("dpkg-dev");
@@ -36,6 +37,8 @@ my $varlistfile = 'debian/substvars';
 my $uploadfilesdir = '..';
 my $sourcestyle = 'i';
 my $quiet = 0;
+my $host_arch = get_host_arch();
+my $changes_format = "1.7";
 
 my %f2p;           # - file to package map
 my %p2f;           # - package to file map, has entries for "packagename"
@@ -64,6 +67,8 @@ my $forcemaint;
 my $forcechangedby;
 my $since;
 
+my $substvars = Dpkg::Substvars->new();
+
 use constant SOURCE     => 1;
 use constant ARCH_DEP   => 2;
 use constant ARCH_INDEP => 4;
@@ -169,7 +174,7 @@ while (@ARGV) {
     } elsif (m/^-U([^\=:]+)$/) {
         $remove{$1}= 1;
     } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) {
-       $substvar{$1}= $POSTMATCH;
+       $substvars->set($1, $POSTMATCH);
     } elsif (m/^-(h|-help)$/) {
         &usage; exit(0);
     } elsif (m/^--version$/) {
@@ -180,7 +185,9 @@ while (@ARGV) {
 }
 
 parsechangelog($changelogfile, $changelogformat, $since);
-parsecontrolfile($controlfile);
+my $control = Dpkg::Control->new($controlfile);
+my $fields = Dpkg::Fields::Object->new();
+$substvars->set_version_substvars($fi{"L Version"});
 
 if (not is_sourceonly) {
     open(FL,"<",$fileslistfile) || &syserr(_g("cannot read files list file"));
@@ -221,28 +228,30 @@ if (not is_sourceonly) {
     close(FL);
 }
 
-for $_ (keys %fi) {
-    my $v = $fi{$_};
-
-    if (s/^C //) {
-       if (m/^Source$/) {
-           setsourcepackage($v);
-       }
-       elsif (m/^Section$|^Priority$/i) { $sourcedefault{$_}= $v; }
-       elsif (m/^Maintainer$/i) { $f{$_}= $v; }
-       elsif (s/^X[BS]*C[BS]*-//i) { $f{$_}= $v; }
-       elsif (m/^X[BS]+-/i ||
-              m/^Build-(Depends|Conflicts)(-Indep)?$/i ||
-              m/^(Standards-Version|Uploaders|Homepage|Origin|Bugs)$/i ||
-              m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
-       }
-       else { &unknown(_g('general section of control info file')); }
-    } elsif (s/^C(\d+) //) {
-       my $i = $1;
-       my $p = $fi{"C$i Package"};
-       my $a = $fi{"C$i Architecture"};
-       my $host_arch = get_host_arch();
+# Scan control info of source package
+my $src_fields = $control->get_source();
+foreach $_ (keys %{$src_fields}) {
+    my $v = $src_fields->{$_};
+    if (m/^Source$/) {
+       setsourcepackage($v);
+    }
+    elsif (m/^Section$|^Priority$/i) { $sourcedefault{$_}= $v; }
+    elsif (m/^Maintainer$/i) { $fields->{$_} = $v; }
+    elsif (s/^X[BS]*C[BS]*-//i) { $fields->{$_} = $v; }
+    elsif (m/^X[BS]+-/i ||
+          m/^Build-(Depends|Conflicts)(-Indep)?$/i ||
+          m/^(Standards-Version|Uploaders|Homepage|Origin|Bugs)$/i ||
+          m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
+    }
+    else { &unknown(_g('general section of control info file')); }
+}
 
+# Scan control info of all binary packages
+foreach my $pkg ($control->get_packages()) {
+    my $p = $pkg->{"Package"};
+    my $a = $pkg->{"Architecture"};
+    foreach $_ (keys %{$pkg}) {
+       my $v = $pkg->{$_};
        if (!defined($p2f{$p}) && not is_sourceonly) {
            if ((debarch_eq('all', $a) and ($include & ARCH_INDEP)) ||
                (grep(debarch_is($host_arch, $_), split(/\s+/, $a))
@@ -271,14 +280,14 @@ for $_ (keys %fi) {
            } elsif (m/^Priority$/) {
                $f2pricf{$_} = $v foreach (@f);
            } elsif (s/^X[BS]*C[BS]*-//i) {
-               $f{$_}= $v;
+               $fields->{$_} = $v;
            } elsif (m/^Architecture$/) {
                if (not is_sourceonly) {
                    if (grep(debarch_is($host_arch, $_), split(/\s+/, $v))
                        and ($include & ARCH_DEP)) {
                        $v = $host_arch;
                    } elsif (!debarch_eq('all', $v)) {
-                       $v= '';
+                       $v = '';
                    }
                } else {
                    $v = '';
@@ -293,38 +302,40 @@ for $_ (keys %fi) {
                &unknown(_g("package's section of control info file"));
            }
        }
-    } elsif (s/^L //) {
+    }
+}
+
+for $_ (keys %fi) {
+    my $v = $fi{$_};
+
+    if (s/^L //) {
         if (m/^Source$/i) {
            setsourcepackage($v);
         } elsif (m/^Maintainer$/i) {
-           $f{"Changed-By"}=$v;
+           $fields->{"Changed-By"} = $v;
         } elsif (m/^(Version|Changes|Urgency|Distribution|Date|Closes)$/i) {
-            $f{$_}= $v;
+            $fields->{$_} = $v;
         } elsif (s/^X[BS]*C[BS]*-//i) {
-            $f{$_}= $v;
+            $fields->{$_} = $v;
         } elsif (!m/^X[BS]+-/i) {
             &unknown(_g("parsed version of changelog"));
         }
-    } elsif (m/^o:.*/) {
-    } else {
-       internerr("value from nowhere, with key >%s< and value >%s<",
-                  $_, $v);
     }
 }
 
 if ($changesdescription) {
-    $f{'Changes'}= '';
+    $fields->{'Changes'} = '';
     open(X,"<",$changesdescription) || &syserr(_g("read changesdescription"));
     while(<X>) {
         s/\s*\n$//;
         $_= '.' unless m/\S/;
-        $f{'Changes'}.= "\n $_";
+        $fields->{'Changes'}.= "\n $_";
     }
 }
 
 for my $pa (keys %pa2f) {
     my ($pp, $aa) = (split / /, $pa);
-    defined($p2i{"C $pp"}) ||
+    defined($control->get_pkg_by_name($pp)) ||
        warning(_g("package %s listed in files list but not in control info"),
                $pp);
 }
@@ -354,9 +365,6 @@ for my $p (keys %p2f) {
     }
 }
 
-&init_substvars;
-init_substvar_arch();
-
 my $origsrcmsg;
 
 if (!is_binaryonly) {
@@ -371,14 +379,15 @@ if (!is_binaryonly) {
        warning(_g("missing Priority for source files"));
     }
 
-    (my $sversion = $substvar{'source:Version'}) =~ s/^\d+://;
+    (my $sversion = $substvars->get('source:Version')) =~ s/^\d+://;
     $dsc= "$uploadfilesdir/${sourcepackage}_${sversion}.dsc";
     open(CDATA, "<", $dsc) || syserr(_g("cannot open .dsc file %s"), $dsc);
     push(@sourcefiles,"${sourcepackage}_${sversion}.dsc");
 
-    parsecdata(\*CDATA, 'S', -1, sprintf(_g("source control file %s"), $dsc));
+    my $dsc_fields = parsecdata(\*CDATA, sprintf(_g("source control file %s"), $dsc),
+                               allow_pgp => 1);
 
-    my $files = $fi{'S Files'};
+    my $files = $dsc_fields->{'Files'};
     for my $file (split(/\n /, $files)) {
         next if $file eq '';
         $file =~ m/^([0-9a-f]{32})[ \t]+\d+[ \t]+([0-9a-zA-Z][-+:.,=0-9a-zA-Z_~]+)$/
@@ -410,25 +419,25 @@ if (!is_binaryonly) {
 print(STDERR "$progname: $origsrcmsg\n") ||
     &syserr(_g("write original source message")) unless $quiet;
 
-$f{'Format'}= $substvar{'Format'};
+$fields->{'Format'} = $changes_format;
 
-if (!defined($f{'Date'})) {
+if (!defined($fields->{'Date'})) {
     chomp(my $date822 = `date -R`);
     $? && subprocerr("date -R");
-    $f{'Date'}= $date822;
+    $fields->{'Date'}= $date822;
 }
 
-$f{'Binary'}= join(' ',grep(s/C //,keys %p2i));
+$fields->{'Binary'} = join(' ', map { $_->{'Package'} } $control->get_packages());
 
 unshift(@archvalues,'source') unless is_binaryonly;
 @archvalues = ('all') if $include == ARCH_INDEP;
 @archvalues = grep {!debarch_eq('all',$_)} @archvalues
     unless $include & ARCH_INDEP;
-$f{'Architecture'}= join(' ',@archvalues);
+$fields->{'Architecture'} = join(' ',@archvalues);
 
-$f{'Description'}= "\n ".join("\n ",sort @descriptions);
+$fields->{'Description'} = "\n ".join("\n ",sort @descriptions);
 
-$f{'Files'}= '';
+$fields->{'Files'} = '';
 
 my %filedone;
 
@@ -451,34 +460,35 @@ for my $f (@sourcefiles, @fileslistfiles) {
     defined($md5sum{$f}) && $md5sum{$f} ne $md5sum &&
         error(_g("md5sum of source file %s (%s) is different from md5sum " .
                  "in %s (%s)"), $uf, $md5sum, $dsc, $md5sum{$f});
-    $f{'Files'}.= "\n $md5sum $size $f2sec{$f} $f2pri{$f} $f";
+    $fields->{'Files'}.= "\n $md5sum $size $f2sec{$f} $f2pri{$f} $f";
 }
 
-$f{'Source'}= $sourcepackage;
-if ($f{'Version'} ne $substvar{'source:Version'}) {
-    $f{'Source'} .= " ($substvar{'source:Version'})";
+$fields->{'Source'}= $sourcepackage;
+if ($fields->{'Version'} ne $substvars->get('source:Version')) {
+    $fields->{'Source'} .= " (" . $substvars->get('source:Version') . ")";
 }
 
-$f{'Maintainer'} = $forcemaint if defined($forcemaint);
-$f{'Changed-By'} = $forcechangedby if defined($forcechangedby);
+$fields->{'Maintainer'} = $forcemaint if defined($forcemaint);
+$fields->{'Changed-By'} = $forcechangedby if defined($forcechangedby);
 
 for my $f (qw(Version Distribution Maintainer Changes)) {
-    defined($f{$f}) ||
+    defined($fields->{$f}) ||
         error(_g("missing information for critical output field %s"), $f);
 }
 
 for my $f (qw(Urgency)) {
-    defined($f{$f}) ||
+    defined($fields->{$f}) ||
         warning(_g("missing information for output field %s"), $f);
 }
 
 for my $f (keys %override) {
-    $f{capit($f)} = $override{$f};
+    $fields->{$f} = $override{$f};
 }
 for my $f (keys %remove) {
-    delete $f{capit($f)};
+    delete $fields->{$f};
 }
 
 set_field_importance(@changes_fields);
-outputclose();
+$substvars->parse($varlistfile) if -e $varlistfile;
+tied(%{$fields})->output(\*STDOUT, $substvars);
 
index 61949081110e2b29533cf1927c9a0e0f76f194ae..a86baa84aa66bf5f39ce43ab4e50307249c54b8a 100755 (executable)
@@ -12,13 +12,13 @@ use Dpkg::ErrorHandling qw(warning error failure unknown internerr syserr
 use Dpkg::Arch qw(get_host_arch debarch_eq debarch_is);
 use Dpkg::Deps qw(@pkg_dep_fields %dep_field_type);
 use Dpkg::Fields qw(capit set_field_importance);
+use Dpkg::Control;
+use Dpkg::Substvars;
 
 push(@INC,$dpkglibdir);
 require 'controllib.pl';
 
-our %substvar;
-our (%f, %fi);
-our %p2i;
+our %fi;
 our $sourcepackage;
 
 textdomain("dpkg-dev");
@@ -44,6 +44,7 @@ my %remove;
 my %override;
 my $oppackage;
 my $package_type = 'deb';
+my $substvars = Dpkg::Substvars->new();
 
 
 sub version {
@@ -83,12 +84,6 @@ Options:
 "), $progname;
 }
 
-sub spfileslistvalue($)
-{
-    return $f{$_[0]} || '-';
-}
-
-
 while (@ARGV) {
     $_=shift(@ARGV);
     if (m/^-p([-+0-9a-z.]+)$/) {
@@ -116,7 +111,7 @@ while (@ARGV) {
     } elsif (m/^-U([^\=:]+)$/) {
         $remove{$1}= 1;
     } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) {
-        $substvar{$1}= $';
+        $substvars->set($1, $');
     } elsif (m/^-T/) {
         $varlistfile= $';
     } elsif (m/^-n/) {
@@ -131,119 +126,115 @@ while (@ARGV) {
 }
 
 parsechangelog($changelogfile, $changelogformat);
-parsesubstvars($varlistfile);
-parsecontrolfile($controlfile);
+$substvars->set_version_substvars($fi{"L Version"});
+$substvars->parse($varlistfile) if -e $varlistfile;
+my $control = Dpkg::Control->new($controlfile);
+my $fields = Dpkg::Fields::Object->new();
 
-my $myindex;
+my $pkg;
 
 if (defined($oppackage)) {
-    defined($p2i{"C $oppackage"}) ||
-        error(_g("package %s not in control info"), $oppackage);
-    $myindex= $p2i{"C $oppackage"};
+    $pkg = $control->get_pkg_by_name($oppackage);
+    defined($pkg) || error(_g("package %s not in control info"), $oppackage);
 } else {
-    my @packages = grep(m/^C /, keys %p2i);
+    my @packages = map { $_->{'Package'} } $control->get_packages();
     @packages==1 ||
         error(_g("must specify package since control info has many (%s)"),
               "@packages");
-    $myindex=1;
+    $pkg = $control->get_pkg_by_idx(1);
 }
 
-#print STDERR "myindex $myindex\n";
-
 my %pkg_dep_fields = map { $_ => 1 } @pkg_dep_fields;
 
+# Scan source package
+my $src_fields = $control->get_source();
+foreach $_ (keys %{$src_fields}) {
+    my $v = $src_fields->{$_};
+    if (m/^(Origin|Bugs|Maintainer)$/) {
+       $fields->{$_} = $v;
+    } elsif (m/^(Section|Priority|Homepage)$/) {
+       $fields->{$_} = $v;
+    } elsif (m/^Source$/) {
+       setsourcepackage($v);
+    }
+    elsif (s/^X[CS]*B[CS]*-//i) { $fields->{$_} = $v; }
+    elsif (m/^X[CS]+-/i ||
+          m/^Build-(Depends|Conflicts)(-Indep)?$/i ||
+          m/^(Standards-Version|Uploaders)$/i ||
+          m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
+    }
+    else { &unknown(_g('general section of control info file')); }
+}
+
+# Scan binary package
+foreach $_ (keys %{$pkg}) {
+    my $v = $pkg->{$_};
+    if (m/^(Package|Package-Type|Description|Homepage|Tag|Essential)$/ ||
+       m/^(Section$|Priority)$/ ||
+       m/^(Subarchitecture|Kernel-Version|Installer-Menu-Item)$/) {
+       $fields->{$_} = $v;
+    } elsif (exists($pkg_dep_fields{$_})) {
+       # Delay the parsing until later
+    } elsif (m/^Architecture$/) {
+       my $host_arch = get_host_arch();
+
+       if (debarch_eq('all', $v)) {
+           $fields->{$_} = $v;
+       } else {
+           my @archlist = split(/\s+/, $v);
+           my @invalid_archs = grep m/[^\w-]/, @archlist;
+           warning(ngettext("`%s' is not a legal architecture string.",
+                            "`%s' are not legal architecture strings.",
+                            scalar(@invalid_archs)),
+                   join("' `", @invalid_archs))
+               if @invalid_archs >= 1;
+           grep(debarch_is($host_arch, $_), @archlist) ||
+               error(_g("current host architecture '%s' does not " .
+                        "appear in package's architecture list (%s)"),
+                     $host_arch, "@archlist");
+           $fields->{$_} = $host_arch;
+       }
+    } elsif (s/^X[CS]*B[CS]*-//i) {
+       $fields->{$_}= $v;
+    } elsif (!m/^X[CS]+-/i) {
+       &unknown(_g("package's section of control info file"));
+    }
+}
+
 for $_ (keys %fi) {
     my $v = $fi{$_};
 
-    if (s/^C //) {
-#print STDERR "G key >$_< value >$v<\n";
-       if (m/^(Origin|Bugs|Maintainer)$/) {
-           $f{$_} = $v;
-       } elsif (m/^(Section|Priority|Homepage)$/) {
-           # Binary package stanzas can override these fields
-           $f{$_} ||= $v;
-       } elsif (m/^Source$/) {
-           setsourcepackage($v);
-       }
-        elsif (s/^X[CS]*B[CS]*-//i) { $f{$_}= $v; }
-       elsif (m/^X[CS]+-/i ||
-              m/^Build-(Depends|Conflicts)(-Indep)?$/i ||
-              m/^(Standards-Version|Uploaders)$/i ||
-              m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
-       }
-        else { $_ = "C $_"; &unknown(_g('general section of control info file')); }
-    } elsif (s/^C$myindex //) {
-#print STDERR "P key >$_< value >$v<\n";
-        if (m/^(Package|Package-Type|Description|Homepage|Tag|Essential)$/ ||
-            m/^(Section$|Priority)$/ ||
-            m/^(Subarchitecture|Kernel-Version|Installer-Menu-Item)$/) {
-            $f{$_}= $v;
-        } elsif (exists($pkg_dep_fields{$_})) {
-           # Delay the parsing until later
-        } elsif (m/^Architecture$/) {
-           my $host_arch = get_host_arch();
-
-            if (debarch_eq('all', $v)) {
-                $f{$_}= $v;
-            } else {
-               my @archlist = split(/\s+/, $v);
-               my @invalid_archs = grep m/[^\w-]/, @archlist;
-               warning(ngettext("`%s' is not a legal architecture string.",
-                                "`%s' are not legal architecture strings.",
-                                scalar(@invalid_archs)),
-                       join("' `", @invalid_archs))
-                   if @invalid_archs >= 1;
-               grep(debarch_is($host_arch, $_), @archlist) ||
-                   error(_g("current host architecture '%s' does not " .
-                            "appear in package's architecture list (%s)"),
-                         $host_arch, "@archlist");
-               $f{$_} = $host_arch;
-            }
-        } elsif (s/^X[CS]*B[CS]*-//i) {
-            $f{$_}= $v;
-        } elsif (!m/^X[CS]+-/i) {
-            $_ = "C$myindex $_"; &unknown(_g("package's section of control info file"));
-        }
-    } elsif (m/^C\d+ /) {
-#print STDERR "X key >$_< value not shown<\n";
-    } elsif (s/^L //) {
-#print STDERR "L key >$_< value >$v<\n";
+    if (s/^L //) {
         if (m/^Source$/) {
            setsourcepackage($v);
         } elsif (m/^Version$/) {
-            $sourceversion= $v;
-           $f{$_} = $v unless defined($forceversion);
+            $sourceversion = $v;
+           $fields->{$_} = $v unless defined($forceversion);
         } elsif (m/^(Maintainer|Changes|Urgency|Distribution|Date|Closes)$/) {
         } elsif (s/^X[CS]*B[CS]*-//i) {
-            $f{$_}= $v;
+            $fields->{$_} = $v;
         } elsif (!m/^X[CS]+-/i) {
             $_ = "L $_"; &unknown(_g("parsed version of changelog"));
         }
-    } elsif (m/o:/) {
-    } else {
-        internerr(_g("value from nowhere, with key >%s< and value >%s<"), $_, $v);
     }
 }
 
-$f{'Version'} = $forceversion if defined($forceversion);
-
-&init_substvars;
-init_substvar_arch();
+$fields->{'Version'} = $forceversion if defined($forceversion);
 
 # Process dependency fields in a second pass, now that substvars have been
 # initialized.
 
 my $facts = Dpkg::Deps::KnownFacts->new();
-$facts->add_installed_package($f{'Package'}, $f{'Version'});
-if (exists $fi{"C$myindex Provides"}) {
-    my $provides = Dpkg::Deps::parse(substvars($fi{"C$myindex Provides"}),
+$facts->add_installed_package($fields->{'Package'}, $fields->{'Version'});
+if (exists $pkg->{"Provides"}) {
+    my $provides = Dpkg::Deps::parse($substvars->substvars($pkg->{"Provides"}),
                                      reduce_arch => 1, union => 1);
     if (defined $provides) {
        foreach my $subdep ($provides->get_deps()) {
            if ($subdep->isa('Dpkg::Deps::Simple')) {
                $facts->add_provided_package($subdep->{package},
                         $subdep->{relation}, $subdep->{version},
-                        $f{'Package'});
+                        $fields->{'Package'});
            }
        }
     }
@@ -251,10 +242,9 @@ if (exists $fi{"C$myindex Provides"}) {
 
 my (@seen_deps);
 foreach my $field (@pkg_dep_fields) {
-    my $key = "C$myindex $field";
-    if (exists $fi{$key}) {
+    if (exists $pkg->{$field}) {
        my $dep;
-       my $field_value = substvars($fi{$key});
+       my $field_value = $substvars->substvars($pkg->{$field});
        if ($dep_field_type{$field} eq 'normal') {
            $dep = Dpkg::Deps::parse($field_value, use_arch => 1,
                                      reduce_arch => 1);
@@ -269,36 +259,36 @@ foreach my $field (@pkg_dep_fields) {
            $dep->simplify_deps($facts);
        }
        $dep->sort();
-       $f{$field} = $dep->dump();
-       delete $f{$field} unless $f{$field}; # Delete empty field
+       $fields->{$field} = $dep->dump();
+       delete $fields->{$field} unless $fields->{$field}; # Delete empty field
     }
 }
 
 for my $f (qw(Package Version)) {
-    defined($f{$f}) || error(_g("missing information for output field %s"), $f);
+    defined($fields->{$f}) || error(_g("missing information for output field %s"), $f);
 }
 for my $f (qw(Maintainer Description Architecture)) {
-    defined($f{$f}) || warning(_g("missing information for output field %s"), $f);
+    defined($fields->{$f}) || warning(_g("missing information for output field %s"), $f);
 }
-$oppackage= $f{'Package'};
+$oppackage = $fields->{'Package'};
 
-$package_type = $f{'Package-Type'} if (defined($f{'Package-Type'}));
+$package_type = $fields->{'Package-Type'} if (defined($fields->{'Package-Type'}));
 
 if ($package_type ne 'udeb') {
     for my $f (qw(Subarchitecture Kernel-Version Installer-Menu-Item)) {
         warning(_g("%s package with udeb specific field %s"), $package_type, $f)
-            if defined($f{$f});
+            if defined($fields->{$f});
     }
 }
 
-my $verdiff = $f{'Version'} ne $substvar{'source:Version'} ||
-              $f{'Version'} ne $sourceversion;
+my $verdiff = $fields->{'Version'} ne $substvars->get('source:Version') ||
+              $fields->{'Version'} ne $sourceversion;
 if ($oppackage ne $sourcepackage || $verdiff) {
-    $f{'Source'}= $sourcepackage;
-    $f{'Source'}.= " ($substvar{'source:Version'})" if $verdiff;
+    $fields->{'Source'} = $sourcepackage;
+    $fields->{'Source'} .= " (" . $substvars->get('source:Version') . ")" if $verdiff;
 }
 
-if (!defined($substvar{'Installed-Size'})) {
+if (!defined($substvars->get('Installed-Size'))) {
     defined(my $c = open(DU, "-|")) || syserr(_g("fork for du"));
     if (!$c) {
         chdir("$packagebuilddir") ||
@@ -313,20 +303,21 @@ if (!defined($substvar{'Installed-Size'})) {
     $? && subprocerr(_g("du in \`%s'"), $packagebuilddir);
     $duo =~ m/^(\d+)\s+\.$/ ||
         failure(_g("du gave unexpected output \`%s'"), $duo);
-    $substvar{'Installed-Size'}= $1;
+    $substvars->set('Installed-Size', $1);
 }
-if (defined($substvar{'Extra-Size'})) {
-    $substvar{'Installed-Size'} += $substvar{'Extra-Size'};
+if (defined($substvars->get('Extra-Size'))) {
+    my $size = $substvars->get('Extra-Size') + $substvars->get('Installed-Size');
+    $substvars->set('Installed-Size', $size);
 }
-if (defined($substvar{'Installed-Size'})) {
-    $f{'Installed-Size'}= $substvar{'Installed-Size'};
+if (defined($substvars->get('Installed-Size'))) {
+    $fields->{'Installed-Size'} = $substvars->get('Installed-Size');
 }
 
 for my $f (keys %override) {
-    $f{capit($f)} = $override{$f};
+    $fields->{$f} = $override{$f};
 }
 for my $f (keys %remove) {
-    delete $f{capit($f)};
+    delete $fields->{$f};
 }
 
 $fileslistfile="./$fileslistfile" if $fileslistfile =~ m/^\s/;
@@ -341,7 +332,7 @@ if (open(X,"< $fileslistfile")) {
         next if m/^([-+0-9a-z.]+)_[^_]+_([\w-]+)\.(a-z+) /
                 && ($1 eq $oppackage)
                && ($3 eq $package_type)
-               && (debarch_eq($2, $f{'Architecture'})
+               && (debarch_eq($2, $fields->{'Architecture'})
                    || debarch_eq($2, 'all'));
         print(Y "$_\n") || &syserr(_g("copy old entry to new files list file"));
     }
@@ -349,13 +340,14 @@ if (open(X,"< $fileslistfile")) {
 } elsif ($! != ENOENT) {
     &syserr(_g("read old files list file"));
 }
-my $sversion = $f{'Version'};
+my $sversion = $fields->{'Version'};
 $sversion =~ s/^\d+://;
-$forcefilename = sprintf("%s_%s_%s.%s", $oppackage, $sversion, $f{'Architecture'},
+$forcefilename = sprintf("%s_%s_%s.%s", $oppackage, $sversion, $fields->{'Architecture'},
                         $package_type)
           unless ($forcefilename);
-print(Y &substvars(sprintf("%s %s %s\n", $forcefilename, 
-                           &spfileslistvalue('Section'), &spfileslistvalue('Priority'))))
+print(Y $substvars->substvars(sprintf("%s %s %s\n", $forcefilename,
+                                     $fields->{'Section'} || '-',
+                                     $fields->{'Priority'} || '-')))
     || &syserr(_g("write new entry to new files list file"));
 close(Y) || &syserr(_g("close new files list file"));
 rename("$fileslistfile.new",$fileslistfile) || &syserr(_g("install new files list file"));
@@ -370,10 +362,11 @@ if (!$stdout) {
 }
 
 set_field_importance(@control_fields);
-outputclose($varlistfile);
+tied(%{$fields})->output(\*STDOUT, $substvars);
 
 if (!$stdout) {
     rename("$cf.new", "$cf") ||
         syserr(_g("cannot install output control file \`%s'"), $cf);
 }
 
+
index 77d11d295a55cac3593bdde27c0e92a974aab2cd..309950fb4f754f29383661791553ac28b12f3033 100755 (executable)
@@ -10,16 +10,16 @@ use Dpkg::Shlibs::Objdump;
 use Dpkg::Shlibs::SymbolFile;
 use Dpkg::Gettext;
 use Dpkg::ErrorHandling qw(warning error syserr usageerr);
+use Dpkg::Control;
 
 textdomain("dpkg-dev");
 
 push(@INC, $dpkglibdir);
 require 'controllib.pl';
 
-our (%f, %fi);
+our %fi;
 our %p2i;
 
-my $controlfile = 'debian/control';
 my $changelogfile = 'debian/changelog';
 my $packagebuilddir = 'debian/tmp';
 
@@ -118,13 +118,12 @@ if (not defined($sourceversion)) {
     $sourceversion = $fi{"L Version"};
 }
 if (not defined($oppackage)) {
-    parsecontrolfile($controlfile);
-    my @packages = grep(m/^C /, keys %p2i);
+    my $control = Dpkg::Control->new();
+    my @packages = map { $_->{'Package'} } $control->get_packages();
     @packages == 1 ||
        error(_g("must specify package since control info has many (%s)"),
              "@packages");
     $oppackage = $packages[0];
-    $oppackage =~ s/^C //;
 }
 
 my $symfile = Dpkg::Shlibs::SymbolFile->new();
index 07d84581b5cb5b41a06f42ec12cf1feaf2e53a32..eefec12ca295a4fdbd14cfcb69e876f634ada0e4 100755 (executable)
@@ -18,9 +18,7 @@ use Dpkg::Shlibs::SymbolFile;
 use Dpkg::Arch qw(get_host_arch);
 use Dpkg::Fields qw(capit);
 use Dpkg::Deps;
-
-push(@INC,$dpkglibdir);
-require 'controllib.pl';
+use Dpkg::Control;
 
 # By increasing importance
 my @depfields = qw(Suggests Recommends Depends Pre-Depends);
@@ -87,10 +85,10 @@ foreach (@ARGV) {
 
 scalar keys %exec || usageerr(_g("need at least one executable"));
 
-our %fi;
-parsecontrolfile("debian/control");
-my $build_depends = defined($fi{"C Build-Depends"}) ?
-                   $fi{"C Build-Depends"} : "";
+my $control = Dpkg::Control->new();
+my $fields = $control->get_source();
+my $build_depends = defined($fields->{"Build-Depends"}) ?
+                   $fields->{"Build-Depends"} : "";
 my $build_deps = Dpkg::Deps::parse($build_depends, reduce_arch => 1);
 
 my %dependencies;
index 0acf61ffd1a63dc6ef16a832f29d129391a5d3bc..142c94c5f6ac046c5eea88fabb4b7fbed24f5a6b 100755 (executable)
@@ -12,6 +12,9 @@ use Dpkg::Arch qw(debarch_eq);
 use Dpkg::Deps qw(@src_dep_fields %dep_field_type);
 use Dpkg::Fields qw(capit set_field_importance);
 use Dpkg::Compression;
+use Dpkg::Cdata;
+use Dpkg::Control;
+use Dpkg::Substvars;
 
 my @filesinarchive;
 my %dirincluded;
@@ -19,7 +22,7 @@ my %notfileobject;
 my $fn;
 my $ur;
 
-my $varlistfile;
+my $varlistfile = "debian/substvars";
 my $controlfile;
 my $changelogfile;
 my $changelogformat;
@@ -100,6 +103,8 @@ my %dirtocreate;     # used by checkdiff
 
 my @tar_ignore;
 
+my $substvars = Dpkg::Substvars->new();
+
 use POSIX;
 use Fcntl qw (:mode);
 use English;
@@ -109,9 +114,8 @@ use Cwd;
 push (@INC, $dpkglibdir);
 require 'controllib.pl';
 
-our (%f, %fi);
+our (%fi);
 our $sourcepackage;
-our %substvar;
 our @src_dep_fields;
 
 textdomain("dpkg-dev");
@@ -250,9 +254,9 @@ while (@ARGV && $ARGV[0] =~ m/^-/) {
             $tar_ignore_default_pattern_done = 1;
         }
     } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) {
-        $substvar{$1}= $POSTMATCH;
+        $substvars->set($1, $POSTMATCH);
     } elsif (m/^-T/) {
-        $varlistfile= $POSTMATCH;
+       $varlistfile = $POSTMATCH;
     } elsif (m/^-(h|-help)$/) {
         &usage; exit(0);
     } elsif (m/^--version$/) {
@@ -292,44 +296,48 @@ if ($opmode eq 'build') {
     $controlfile= "$dir/debian/control" unless defined($controlfile);
     
     parsechangelog($changelogfile, $changelogformat);
-    parsecontrolfile($controlfile);
-    $f{"Format"}= $compression eq 'gzip' ? $def_dscformat : '2.0';
-    &init_substvars;
+    my $control = Dpkg::Control->new($controlfile);
+    my $fields = Dpkg::Fields::Object->new();
+
+    $fields->{"Format"} = $compression eq 'gzip' ? $def_dscformat : '2.0';
 
     my @sourcearch;
     my %archadded;
     my $archspecific = 0; # XXX: Not used?!
-    my %packageadded;
     my @binarypackages;
 
-    for $_ (keys %fi) {
-        my $v = $fi{$_};
+    # Scan control info of source package
+    my $src_fields = $control->get_source();
+    foreach $_ (keys %{$src_fields}) {
+       my $v = $src_fields->{$_};
+       if (m/^Source$/i) {
+           setsourcepackage($v);
+       } elsif (m/^(Standards-Version|Origin|Maintainer|Homepage)$/i ||
+                m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
+           $fields->{$_} = $v;
+       }
+       elsif (m/^Uploaders$/i) { ($fields->{$_} = $v) =~ s/[\r\n]//g; }
+       elsif (m/^Build-(Depends|Conflicts)(-Indep)?$/i) {
+           my $dep;
+           my $type = $dep_field_type{capit($_)};
+           $dep = Dpkg::Deps::parse($v, union =>  $type eq 'union');
+           error(_g("error occurred while parsing %s"), $_) unless defined $dep;
+           my $facts = Dpkg::Deps::KnownFacts->new();
+           $dep->simplify_deps($facts);
+           $dep->sort();
+           $fields->{$_} = $dep->dump();
+       }
+       elsif (s/^X[BC]*S[BC]*-//i) { $fields->{$_} = $v; }
+       elsif (m/^(Section|Priority|Files|Bugs)$/i || m/^X[BC]+-/i) { }
+       else { &unknown(_g('general section of control info file')); }
+    }
 
-        if (s/^C //) {
-           if (m/^Source$/i) {
-               setsourcepackage($v);
-           } elsif (m/^(Standards-Version|Origin|Maintainer|Homepage)$/i ||
-                    m/^Vcs-(Browser|Arch|Bzr|Cvs|Darcs|Git|Hg|Mtn|Svn)$/i) {
-               $f{$_}= $v;
-           }
-           elsif (m/^Uploaders$/i) { ($f{$_}= $v) =~ s/[\r\n]//g; }
-           elsif (m/^Build-(Depends|Conflicts)(-Indep)?$/i) {
-               my $dep;
-               my $type = $dep_field_type{capit($_)};
-               $dep = Dpkg::Deps::parse($v, union =>  $type eq 'union');
-               error(_g("error occurred while parsing %s"), $_) unless defined $dep;
-               my $facts = Dpkg::Deps::KnownFacts->new();
-               $dep->simplify_deps($facts);
-               $dep->sort();
-               $f{$_}= $dep->dump();
-           }
-            elsif (s/^X[BC]*S[BC]*-//i) { $f{$_}= $v; }
-            elsif (m/^(Section|Priority|Files|Bugs)$/i || m/^X[BC]+-/i) { }
-            else { &unknown(_g('general section of control info file')); }
-        } elsif (s/^C(\d+) //) {
-           my $i = $1;
-           my $p = $fi{"C$i Package"};
-            push(@binarypackages,$p) unless $packageadded{$p}++;
+    # Scan control info of binary packages
+    foreach my $pkg ($control->get_packages()) {
+       my $p = $pkg->{'Package'};
+       push(@binarypackages,$p);
+       foreach $_ (keys %{$pkg}) {
+           my $v = $pkg->{$_};
             if (m/^Architecture$/) {
                if (debarch_eq($v, 'any')) {
                     @sourcearch= ('any');
@@ -355,9 +363,9 @@ if ($opmode eq 'build') {
                         }
                 }
                 }
-                $f{'Architecture'}= join(' ',@sourcearch);
+                $fields->{'Architecture'}= join(' ',@sourcearch);
             } elsif (s/^X[BC]*S[BC]*-//i) {
-                $f{$_}= $v;
+                $fields->{$_} = $v;
             } elsif (m/^(Package|Package-Type|Essential|Kernel-Version)$/ ||
                      m/^(Subarchitecture|Installer-Menu-Item)$/i ||
                      m/^(Pre-Depends|Depends|Provides)$/i ||
@@ -367,46 +375,48 @@ if ($opmode eq 'build') {
             } else {
                 &unknown(_g("package's section of control info file"));
             }
-        } elsif (s/^L //) {
+       }
+    }
+
+    for $_ (keys %fi) {
+        my $v = $fi{$_};
+
+        if (s/^L //) {
             if (m/^Source$/) {
                setsourcepackage($v);
             } elsif (m/^Version$/) {
                checkversion( $v );
-                $f{$_}= $v;
+                $fields->{$_} = $v;
             } elsif (s/^X[BS]*C[BS]*-//i) {
-                $f{$_}= $v;
+                $fields->{$_} = $v;
             } elsif (m/^(Maintainer|Changes|Urgency|Distribution|Date|Closes)$/i ||
                      m/^X[BS]+-/i) {
             } else {
                 &unknown(_g("parsed version of changelog"));
             }
-        } elsif (m/^o:.*/) {
-        } else {
-           internerr(_g("value from nowhere, with key >%s< and value >%s<"),
-                     $_, $v);
-        }
+       }
     }
 
-    $f{'Binary'}= join(', ',@binarypackages);
-    for my $f (keys %override) {
-       $f{capit($f)} = $override{$f};
+    $fields->{'Binary'}= join(', ', @binarypackages);
+    foreach my $f (keys %override) {
+       $fields->{$f} = $override{$f};
     }
 
     for my $f (qw(Version)) {
-       defined($f{$f}) ||
+       defined($fields->{$f}) ||
            error(_g("missing information for critical output field %s"), $f);
     }
     for my $f (qw(Maintainer Architecture Standards-Version)) {
-       defined($f{$f}) ||
+       defined($fields->{$f}) ||
            warning(_g("missing information for output field %s"), $f);
     }
     defined($sourcepackage) || &error(_g("unable to determine source package name !"));
-    $f{'Source'}= $sourcepackage;
+    $fields->{'Source'} = $sourcepackage;
     for my $f (keys %remove) {
-       delete $f{capit($f)};
+       delete $fields->{$f};
     }
 
-    my $version = $f{'Version'};
+    my $version = $fields->{'Version'};
     $version =~ s/^\d+://;
     my $upstreamversion = $version;
     $upstreamversion =~ s/-[^-]*$//;
@@ -507,7 +517,7 @@ if ($opmode eq 'build') {
 
        $tarname= $origtargz || "$basename.orig.tar.$comp_ext";
        if ($tarname =~ /\Q$basename\E\.orig\.tar\.($comp_regex)/) {
-           if (($1 ne 'gz') && ($f{'Format'} < 2)) { $f{'Format'} = '2.0' };
+           if (($1 ne 'gz') && ($fields->{'Format'} < 2)) { $fields->{'Format'} = '2.0' };
        } else {
            warning(_g(".orig.tar name %s is not <package>_<upstreamversion>" .
                       ".orig.tar (wanted %s)"),
@@ -560,7 +570,7 @@ if ($opmode eq 'build') {
         
     }
     
-    addfile("$tarname");
+    addfile($fields, "$tarname");
 
     if ($sourcestyle =~ m/[kpKP]/) {
 
@@ -750,7 +760,7 @@ if ($opmode eq 'build') {
         }
         close(FIND); $? && subprocerr("find on $dirname");
 
-       &addfile($diffname);
+       addfile($fields, $diffname);
 
     }
 
@@ -765,7 +775,8 @@ if ($opmode eq 'build') {
         syserr(_g("create %s"), "$basenamerev.dsc");
 
     set_field_importance(@dsc_fields);
-    outputclose($varlistfile);
+    $substvars->parse($varlistfile) if -e $varlistfile;
+    tied(%{$fields})->output(\*STDOUT, $substvars);
 
     if ($ur) {
         printf(STDERR _g("%s: unrepresentable changes to source")."\n",
@@ -829,27 +840,28 @@ if ($opmode eq 'build') {
        warning(_g("extracting unsigned source package (%s)"), $dsc);
     }
 
-    open(CDATA, "< $dsc") || error(_g("cannot open .dsc file %s: %s"), $dsc, $!);
-    parsecdata(\*CDATA, 'S', -1, sprintf(_g("source control file %s"), $dsc));
+    open(CDATA, "<", $dsc) || error(_g("cannot open .dsc file %s: %s"), $dsc, $!);
+    my $fields = parsecdata(\*CDATA, sprintf(_g("source control file %s"), $dsc),
+                           allow_pgp => 1);
     close(CDATA);
 
     for my $f (qw(Source Version Files)) {
-        defined($fi{"S $f"}) ||
+        defined($fields->{$f}) ||
             error(_g("missing critical source control field %s"), $f);
     }
 
     my $dscformat = $def_dscformat;
-    if (defined $fi{'S Format'}) {
-       if (not handleformat($fi{'S Format'})) {
-           error(_g("Unsupported format of .dsc file (%s)"), $fi{'S Format'});
+    if (defined $fields->{'Format'}) {
+       if (not handleformat($fields->{'Format'})) {
+           error(_g("Unsupported format of .dsc file (%s)"), $fields->{'Format'});
        }
-        $dscformat=$fi{'S Format'};
+        $dscformat=$fields->{'Format'};
     }
 
-    $sourcepackage = $fi{'S Source'}; # XXX: should use setsourcepackage??
+    $sourcepackage = $fields->{'Source'}; # XXX: should use setsourcepackage??
     checkpackagename( $sourcepackage );
 
-    my $version = $fi{'S Version'};
+    my $version = $fields->{'Version'};
     my $baseversion;
     my $revision;
 
@@ -861,7 +873,7 @@ if ($opmode eq 'build') {
         $baseversion= $version; $revision= '';
     }
 
-    my $files = $fi{'S Files'};
+    my $files = $fields->{'Files'};
     my @tarfiles;
     my $difffile;
     my $debianfile;
@@ -1625,7 +1637,7 @@ sub reapgzip {
 
 my %added_files;
 sub addfile {
-    my ($filename)= @_;
+    my ($fields, $filename)= @_;
     $added_files{$filename}++ &&
         internerr(_g("tried to add file `%s' twice"), $filename);
     stat($filename) || syserr(_g("could not stat output file `%s'"), $filename);
@@ -1633,7 +1645,7 @@ sub addfile {
     my $md5sum= `md5sum <$filename`;
     $? && &subprocerr("md5sum $filename");
     $md5sum = readmd5sum( $md5sum );
-    $f{'Files'}.= "\n $md5sum $size $filename";
+    $fields->{'Files'}.= "\n $md5sum $size $filename";
 }
 
 # replace \ddd with their corresponding character, refuse \ddd > \377