X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=636305ebf3e8dc59025291b4393a5c5d2a3d5176;hb=89b0ec4188faf550bcf9dad4222e8fc44eaae914;hp=f24b522ced215cb87c6983a57ac6b4a614e4c982;hpb=79809b6629b561a897b1459a3ec6d40d2c8d57e7;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index f24b522..636305e 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -118,6 +118,7 @@ my %options = "merge-sources" => { mode => "merge-sources" }, "pretend-avail" => { short => "p", mode => "pretend-avail" }, "merge-all" => { mode => "merge-all" }, + "merge-all-overlay" => { mode => "merge-all-overlay" }, info => { short => "i", mode => "info" }, 'binNMU' => { mode => 'set-binary-nmu', arg => \$binNMUver, code => sub { die "Invalid binNMU version: $binNMUver\n" @@ -381,7 +382,7 @@ sub process { if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); lock_table(); - parse_packages(); + parse_packages(0); last SWITCH; }; /^merge-sources/ && do { @@ -396,14 +397,14 @@ sub process { pretend_avail( @ARGV ); last SWITCH; }; - /^merge-all/ && do { + /^merge-all$/ && do { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); lock_table(); my @ARGS = @ARGV; @ARGV = ( $ARGS[0] ); - my $pkgs = parse_packages(); + my $pkgs = parse_packages(0); @ARGV = ( $ARGS[1] ); parse_quinn_diff(0); @ARGV = ( $ARGS[2] ); @@ -411,6 +412,23 @@ sub process { call_edos_depcheck( $ARGS[0], $srcs ); last SWITCH; }; + /^merge-all-overlay/ && do { + die "This operation is restricted to admin users\n" + if (defined @conf::admin_users and + !isin( $real_user, @conf::admin_users)); + lock_table(); + my @ARGS = @ARGV; + @ARGV = ( $ARGS[0] ); + my $pkgs = parse_packages(0); + @ARGV = ( $ARGS[3] ); + my $pkgs = parse_packages(1); + @ARGV = ( $ARGS[1] ); + parse_quinn_diff(0); + @ARGV = ( $ARGS[2] ); + my $srcs = parse_sources(1); + call_edos_depcheck( $ARGS[3], $srcs ); + last SWITCH; + }; /^import/ && do { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and @@ -1197,6 +1215,7 @@ sub parse_sources { "from database, because now Arch: all\n" if $verbose; del_source_info($name); + delete $db->{$name}; next; } @@ -1224,7 +1243,6 @@ sub parse_sources { } # remove installed packages that no longer have source available # or binaries installed - my $db = get_all_source_info(); foreach $name (keys %$db) { next if $name =~ /^_/; my $pkg = $db->{$name}; @@ -1236,6 +1254,7 @@ sub parse_sources { "not in Sources anymore\n" if $verbose; del_source_info($name); + delete $db->{$name}; } else { next if !isin( $pkg->{'state'}, qw(Installed) ); if ($full && not defined $merge_srcvers{$name}) { @@ -1246,6 +1265,7 @@ sub parse_sources { "binaries don't exist anymore\n" if $verbose; del_source_info($name); + delete $db->{$name}; } elsif ($full && version_less( $merge_srcvers{$name}, $pkg->{'version'})) { print "$name ($pkg->{'version'}): ". "package is Installed but binaries are from ". @@ -1260,6 +1280,7 @@ sub parse_sources { # This function looks through a Packages file and sets the state of # packages to 'Installed' sub parse_packages { + my depwait_only = shift; my $installed; my $pkgs = get_all_source_info(); @@ -1278,6 +1299,7 @@ sub parse_packages { next if (defined ($installed->{$name}) and $installed->{$name}{'version'} ne "" and version_lesseq( $version, $installed->{$name}{'version'} )); $installed->{$name}{'version'} = $version; + next if $depwait_only; $installed->{$name}{'depends'} = $depends; $installed->{$name}{'all'} = 1 if $architecture eq "all"; undef $installed->{$name}{'Provider'}; @@ -2136,59 +2158,6 @@ sub parse_deplist { return \%result; } -# for parsing Build-Depends from Sources -sub parse_srcdeplist { - my $pkg = shift; - my $deps = shift; - my $arch = shift; - my $dep; - my @results; - - foreach $dep (split( /\s*,\s*/, $deps )) { - my @alts = split( /\s*\|\s*/, $dep ); - # Anything with an | is ignored, as it can be configured on a - # per-buildd basis what will be installed - next if $#alts != 0; - $_ = shift @alts; - if (!/^([^\s([]+)\s*(\(\s*([<=>]+)\s*(\S+)\s*\))?(\s*\[([^]]+)\])?/) { - warn( "parse_srcdeplist: bad dependency $_\n" ); - next; - } - my($dep, $rel, $relv, $archlist) = ($1, $3, $4, $6); - if ($archlist) { - $archlist =~ s/^\s*(.*)\s*$/$1/; - my @archs = split( /\s+/, $archlist ); - my ($use_it, $ignore_it, $include) = (0, 0, 0); - foreach (@archs) { - if (/^!/) { - $ignore_it = 1 if substr($_, 1) eq $arch; - } else { - $use_it = 1 if $_ eq $arch; - $include = 1; - } - } - warn "Warning: inconsistent arch restriction on ", - "$pkg: $dep depedency\n" - if $ignore_it && $use_it; - next if $ignore_it || ($include && !$use_it); - } - my $neg = 0; - if ($dep =~ /^!/) { - $dep =~ s/^!\s*//; - $neg = 1; - } - my $result; - $result->{'package'} = $dep; - $result->{'Neg'} = $neg; - if ($rel && $relv) { - $result->{'rel'} = $rel; - $result->{'version'} = $relv; - } - push @results, $result; - } - return \@results; -} - sub build_deplist { my $list = shift; my($key, $result); @@ -2202,83 +2171,6 @@ sub build_deplist { return $result; } -sub get_unsatisfied_dep { - my $bd = shift; - my $pkgs = shift; - my $dep = shift; - my $savedep = shift; - - my $pkgname = $dep->{'package'}; - - if (defined $pkgs->{$pkgname}{'Provider'}) { - # provides. leave them for buildd/sbuild. - return ""; - } - - # check cache - return $pkgs->{$pkgname}{'Unsatisfied'} if $savedep and defined($pkgs->{$pkgname}{'Unsatisfied'}); - - # Return unsatisfied deps to a higher caller to process - if ((!defined($pkgs->{$pkgname})) or - (defined($dep->{'rel'}) and !version_compare( $pkgs->{$pkgname}{'version'}, $dep->{'rel'}, $dep->{'Version'} ) ) ) { - my %deplist; - $deplist{$pkgname} = $dep; - my $deps = build_deplist(\%deplist); - $pkgs->{$pkgname}{'Unsatisfied'} = $deps if $savedep; - return $deps; - } - - # set cache to "" to avoid infinite recursion - $pkgs->{$pkgname}{'Unsatisfied'} = "" if $savedep; - - if (defined $pkgs->{$dep->{'package'}}{'depends'}) { - my $deps = parse_deplist( $pkgs->{$dep->{'package'}}{'depends'} ); - foreach (keys %$deps) { - $dep = $$deps{$_}; - # recur on dep. - my $ret = get_unsatisfied_dep($bd,$pkgs,$dep,1); - if ($ret ne "") { - my $retdep = parse_deplist( $ret ); - foreach (keys %$retdep) { - $dep = $$retdep{$_}; - - $dep->{'rel'} = '>=' if defined($dep->{'rel'}) and $dep->{'rel'} =~ '^='; - - if (defined($dep->{'rel'}) and $dep->{'rel'} =~ '^>' and defined ($pkgs->{$dep->{'package'}}) and - version_compare($bd->{$pkgs->{$dep->{'package'}}{'Source'}}{'ver'},'>>',$pkgs->{$dep->{'package'}}{'Sourcev'})) { - if (not defined($merge_binsrc{$dep->{'package'}})) { - # the uninstallable package doesn't exist in the new source; look for something else that does. - delete $$retdep{$dep->{'package'}}; - foreach (sort (split( /\s*,\s*/, $bd->{$pkgs->{$dep->{'package'}}{'Source'}}{'bin'}))) { - next if ($pkgs->{$_}{'all'} or not defined $pkgs->{$_}{'version'}); - $dep->{'package'} = $_; - $dep->{'rel'} = '>>'; - $dep->{'version'} = $pkgs->{$_}{'Version'}; - $$retdep{$_} = $dep; - last; - } - } - } else { - # sanity check to make sure the depending binary still exists, and the depended binary exists and dep-wait on a new version of it - if ( defined($merge_binsrc{$pkgname}) and defined($pkgs->{$dep->{'package'}}{'version'}) ) { - delete $$retdep{$dep->{'package'}}; - $dep->{'package'} = $pkgname; - $dep->{'rel'} = '>>'; - $dep->{'version'} = $pkgs->{$pkgname}{'Version'}; - $$retdep{$pkgname} = $dep; - } - delete $$retdep{$dep->{'package'}} if (defined ($dep->{'rel'}) and $dep->{'rel'} =~ '^>'); - } - } - $ret = build_deplist($retdep); - $pkgs->{$pkgname}{'Unsatisfied'} = $ret if $savedep; - return $ret; - } - } - } - return ""; -} - sub call_edos_depcheck { my $packagesfile = shift; my $srcs = shift;