OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Michael van Elst
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-re                       Date:   13-Nov-2002 09:39:32
  Branch: HEAD                             Handle: 2002111308393200

  Modified files:
    openpkg-re              openpkg-build

  Log:
    keep installed options when rebuilding installed packages
    rebuild packages when binary package in repository does not match options
    read options from openpkg-build.rc file

  Summary:
    Revision    Changes     Path
    1.7         +111 -36    openpkg-re/openpkg-build
  ____________________________________________________________________________

  Index: openpkg-re/openpkg-build
  ============================================================
  $ cvs diff -u -r1.6 -r1.7 openpkg-build
  --- openpkg-re/openpkg-build  12 Nov 2002 16:13:57 -0000      1.6
  +++ openpkg-re/openpkg-build  13 Nov 2002 08:39:32 -0000      1.7
  @@ -34,19 +34,23 @@
   ##########################################################################
   
   use Getopt::Std;
  -use vars qw/$opt_R $opt_r $opt_f $opt_u/;
  +use vars qw/$opt_R $opt_r $opt_f $opt_u $opt_U/;
   
   if (open(FH, "< $ENV{'HOME'}/.openpkg-build.rc")) {
       while (<FH>) {
  -        my($opt,$val) = /^\-([Rfru])\s*(.*?)\s*$/;
  -        $val = 1 unless defined $val;
  -        eval "\$opt_$opt = '$val';";
  +        if (my($opt,$val) = /^\-([Rfru])\s*(.*?)\s*$/) {
  +            $val = 1 unless defined $val;
  +            eval "\$opt_$opt = '$val';";
  +        } else {
  +            chomp;
  +            push(@ARGV, split(/\s+/, $_));
  +        }
       }
       close(FH);
   }
   
  -getopts('R:r:f:u');
  -die "usage: $0 [-R rpm] [-r repository] [-f index.rdf] [-u] package [with..]\n"
  +getopts('R:r:f:uU');
  +die "usage: $0 [-R rpm] [-r repository] [-f index.rdf] [-uU] package [with..]\n"
       unless $ARGV[0] =~ /^\S+$/;
   
   ##########################################################################
  @@ -132,10 +136,15 @@
       my($bv,$br) = $b =~ /^(.*?)(?:\-([\d\.]+))?$/;
       my($c);
   
  -    $c = version_cmp($av,$bv);
  -    return if $c;
  -    $c = release_cmp($ar,$br);
  -    return $c;
  +    if ((defined $ar) && (defined $br)) {
  +        $c = release_cmp($ar,$br);
  +        return $c if $c;
  +    }
  +    if ((defined $av) && (defined $bv)) {
  +        $c = version_cmp($av,$bv);
  +        return $c if $c;
  +    }
  +    return 0;
   }
   
   sub vs ($) {
  @@ -143,6 +152,11 @@
       return "$t->{version}-$t->{release}";
   }
   
  +sub vsn ($) {
  +    my($t) = @_;
  +    return "$t->{name}-$t->{version}-$t->{release}";
  +}
  +
   sub get_config ()
   {
       my($c,@q);
  @@ -195,9 +209,9 @@
       return \%map;
   }
   
  -sub get_with ($) {
  -    my($pkg) = @_;
  -    my(@l) = `$RPM -qi $pkg`;
  +sub get_with ($;$) {
  +    my($pkg,$fn) = @_;
  +    my(@l) = defined $fn ? `$RPM -qi -p $fn` : `$RPM -qi $pkg`;
       my(%with);
   
       %with = map { /--define\s*'(\S+)\s+(\S+?)'/ } @l;
  @@ -442,13 +456,13 @@
           print "# ambigous sources for $name\n";
           my($i) = 0;
           foreach (@$recs) {
  -            print "# $i: $_->{name}-$_->{version}\n";
  +            print "# $i: ".vsn($_)."\n";
               $i++;
           }
           die "ERROR: ambigous dependency\n";
       } else {
           $rec = $recs->[0];
  -        print "# source for $name is $rec->{name}-$rec->{version}\n";
  +        print "# source for $name is ".vsn($rec)."\n";
       }
   
       return $rec;
  @@ -507,9 +521,14 @@
   #
   sub target_suitable ($$) {
       my($target, $with) = @_;
  -    my($iwith) = get_with($target->{'name'});
  +    my($iwith);
       my($k,$v);
   
  +    unless ($target->{OPTIONS}) {
  +        $target->{OPTIONS} = get_with($target->{'name'});
  +    }
  +    $iwith = $target->{OPTIONS};
  +
       while (($k,$v) = each %$with) {
           if (exists $iwith->{$k}) {
               return 0 if $iwith->{$k} ne $with->{$k} 
  @@ -549,7 +568,9 @@
       if ($i && (@vers = get_versions($i, $cond))) {
           foreach (@vers) {
               if (target_suitable($i->{$_}->[0], $env->{with})) {
  -                return ($i->{$_}->[0], 1);
  +                if (!$env->{upgrade}) {
  +                    return ($i->{$_}->[0], 1);
  +                }
               }
           }
       }
  @@ -572,8 +593,10 @@
   
       if (target_exists($target, $env->{installed})) {
           if (target_suitable($target, $env->{with})) {
  -            print "# $target->{name} is already installed\n";
  -            return;
  +            if (!$env->{upgrade}) {
  +                print "# $target->{name} is already installed\n";
  +                return;
  +            }
           }
           print "# rebuilding $target->{name}\n";
           $target->{REBUILD} = 1;
  @@ -589,22 +612,22 @@
   
       foreach (keys %d) {
   
  -        # we are still missing a OpenPKG provider in the index... skip it
  +        # old index misses a OpenPKG provider in the index... skip it
           next if $_ eq 'OpenPKG';
   
           ($t,$old) = dep2target($_, $env);
           if ($t) {
               if ($old) {
  -                print "# $target->{name} uses $t->{name}-$t->{version} for $_\n";
  +                print "# $target->{name} uses ".vsn($t)." for $_\n";
                   next;
               }
   
               # record which targets to keep in blist
               if ($k{$_}) {
                   push(@$blist,$t);
  -                print "# $target->{name} installs $t->{name}-$t->{version} for 
$_\n";
  +                print "# $target->{name} installs ".vsn($t)." for $_\n";
               } else {
  -                print "# $target->{name} requires $t->{name}-$t->{version} for 
$_\n";
  +                print "# $target->{name} requires ".vsn($t)." for $_\n";
               }
               make_dep($t,$depth+1,$env,$list,$blist);
           } else {
  @@ -613,7 +636,7 @@
           }
       }
   
  -    print "# adding $target->{name}-$target->{version} to list\n";
  +    print "# adding ".vsn($target)." to list\n";
       push(@$list, $target);
       push(@{$env->{built}->{$target->{name}}->{vs($target)}}, $target);
   }
  @@ -633,17 +656,28 @@
       my($pattern, $env) = @_;
       my(@goals,@targets,@keeps,$bonly,$t);
       my($name,$r,@vers);
  +    my(@todo);
   
  -    if ($pattern =~ s/\*+$//) {
  -        $pattern = '^'.quotemeta($pattern).'';
  +    if ($pattern eq 'REFRESH') {
  +        @todo = grep {
  +                    my($n) = $_;
  +                    (ref $env->{installed}->{$n}) &&
  +                    grep { $_ ne '-' } keys %{$env->{installed}->{$n}}
  +                } keys %{$env->{repository}};
       } else {
  -        $pattern = '^'.quotemeta($pattern).'$';
  +        if ($pattern =~ s/\*+$//) {
  +            $pattern = '^'.quotemeta($pattern).'';
  +        } else {
  +            $pattern = '^'.quotemeta($pattern).'$';
  +        }
  +        @todo = grep(/$pattern/, keys %{$env->{repository}});
       }
   
  +
       #
  -    # chose maximum releases
  +    # chose maximum releases for goals
       #
  -    foreach $name (grep(/$pattern/, sort keys %{$env->{repository}})) {
  +    foreach $name (@todo) {
           $r = $env->{repository}->{$name};
           @vers = get_versions($r, sub { 1; });
           next unless @vers;
  @@ -654,7 +688,7 @@
       @targets = ();
       @keeps   = @goals;
       foreach $t (@goals) {
  -        print "# recursing over dependencies for $t->{name}-$t->{version}\n";
  +        print "# recursing over dependencies for ".vsn($t)."\n";
           make_dep($t,0,$env,\@targets,\@keeps);
       }
   
  @@ -678,20 +712,60 @@
   
   #######################################################################
   
  +sub binary_target ($$) {
  +    my($t, $fn) = @_;
  +    my(%target) = %$t;
  +
  +    $target{OPTIONS} = get_with($t->{name}, $fn);
  +
  +    return \%target;
  +}
  +
  +sub make_defines ($$) {
  +    my($old, $new) = @_;
  +    my(%result);
  +    my($k,$v);
  +    my($with);
  +
  +    if ($old) {
  +        $old = { %$old };
  +        while (($k,$v) = each %$new) {
  +            $old->{$k} = $v if exists $old->{$k};
  +        }
  +    } else {
  +        $old = $new;
  +    }
  +
  +    $with = join(' ',map { "--define '$_ $old->{$_}'" } keys %$old);
  +    $with = ' '.$with if $with ne '';
  +
  +    return $with;
  +}
  +
   sub print_list1 ($$$$@) {
       my($list,$c,$url,$uncond,$with) = @_;
       my($spkg,$bpkg);
  +    my($def);
   
       $url .= '/' unless $url =~ m{/$}s;
   
  -    $with = join(' ',map { "--define '$_ $with->{$_}'" } keys %$with);
  -    $with = ' '.$with if $with ne '';
  -
       foreach (@$list) {
           $spkg = $_->{href};
           $bpkg = target2rpm($_, $c);
  -        if ($uncond || $_->{REBUILD} || !-f $bpkg) {
  -            print "$RPM$with --rebuild $url$spkg || exit 1\n";
  +
  +        #
  +        # rebuild binary package IF
  +        #
  +        # 'unconditional' option
  +        # OR there is no binary package
  +        # OR dependency check found that installed package is not suitable
  +        # OR existing binary package doesn't satisfy wanted options
  +        #
  +        if ($uncond || !-f $bpkg || $_->{REBUILD} ||
  +            !target_suitable(binary_target($_, $bpkg),$with)) {
  +
  +            $def = make_defines($_->{OPTIONS}, $with);
  +            print "$RPM$def --rebuild $url$spkg || exit 1\n";
           }
           print "$RPM -Uvh $bpkg\n";
       }
  @@ -735,7 +809,8 @@
                         installed  => $installed,
                         repository => $repository,
                         built      => {},
  -                      with       => \%with
  +                      with       => \%with,
  +                      upgrade    => ($opt_U+0)
                     });
   
   die "FATAL: cannot find package\n" unless defined $list;
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to