--- toast 2005/09/09 20:37:45 1.403 +++ toast 2005/09/12 04:08:07 1.404 @@ -2227,7 +2227,8 @@ } } - return ($name, $matchver, $matches[0]) if @matches; + # TODO: return an ordered list of candidates, not just the best match + return ([$name, $matchver, undef, $matches[0]]) if @matches; } @links = grep(/^\Q$url\E/, @links); @@ -2271,8 +2272,16 @@ $build && error; $name || @urls || error; - ($name, $version, @urls) = findnewpkg($name, $version) - unless @urls || !autofind; + if(!@urls && autofind) + { + my(@pkgs) = reverse(findnewpkg($name, $version)); + error unless @pkgs; + ($name, $version, undef, @urls) = @{$pkgs[0]}; + error unless $name; + error unless $version; + error unless @urls; + } + @urls || error("autofind is disabled; please specify URL(s) for " . pkgname($name, $version)); @@ -4365,12 +4374,11 @@ ############################################################################## -sub upgrade(@) +sub findnewerpkg($$@) { my($name, $version, $build, @urls) = @_; error unless defined($name); error unless defined($version); - error if defined($build); @urls = pkgurls($name, $version) unless @urls; error unless @urls; @@ -4412,12 +4420,16 @@ } } - my($newver); - for(reverse(sort cmpab keys(%candidates))) + my($pkgname) = pkgname($name, $version); + error("URLs for $pkgname don't seem version-specific") unless $hasver; + + my(@result); + for(sort cmpab keys(%candidates)) { my($candidate) = $_; my($ok) = true; - for(@newurls) + my(@curls) = @newurls; + for(@curls) { next unless ref; my(%vermap) = %$_; @@ -4426,30 +4438,58 @@ $ok = false; last; } + $_ = $vermap{$candidate}; } - if($ok) - { - $newver = $candidate; - last; - } + push(@result, [$name, $candidate, undef, @curls]) if $ok; } + error("can't find consistent URLs for $pkgname") unless @result; + return @result; +} + +sub find(@) +{ + my($name, $version, $build, @urls) = @_; + error unless defined($name); + error if defined($build); + + my(@pkgs) = isadded($name, $version) + ? findnewerpkg($name, $version, @urls) + : findnewpkg($name, $version); + + error unless @pkgs; + $name = ${$pkgs[0]}[0]; + $name eq ${$pkgs[$_]}[0] or error for 0..$#pkgs; + + say("\n"); + + print("$name\n"); + for(@pkgs) + { + (undef, $version, undef, @urls) = @$_; + print(" version $version: found\n"); + print(" urls:\n"); + print(" $_\n") for(@urls); + } + + return true; +} + +sub upgrade(@) +{ + my($name, $version, $build, @urls) = @_; + error if defined($build); + + my(@pkgs) = reverse(findnewerpkg($name, $version, @urls)); + my(@cmdargs) = @{$pkgs[0]}; + my($newver) = $cmdargs[1]; + my($pkgname) = pkgname($name, $version); - error("URLs for $pkgname don't look version-specific") unless $hasver; - error("can't find consistent URLs for $pkgname") unless defined($newver); error("$pkgname appears to be the latest available version") if $version eq $newver; my(@sortvers) = sort cmpab ($version, $newver); error("only found older versions of $pkgname") if $sortvers[1] eq $version; - for(@newurls) - { - next unless ref; - my(%vermap) = %$_; - $_ = $vermap{$newver}; - } - - my(@cmdargs) = ($name, $newver, undef, @newurls); if(autoarm && isarmedmatch($name, $version)) { return arm(@cmdargs); @@ -5312,6 +5352,7 @@ ############################################################################## +sub parse_find(@) { uselatestversion(emptytoall(rejectbuilds(parse(@_)))); } sub parse_add(@) { rejectempty(parse(@_)); } sub parse_get(@) { uselatestversion(emptytoall(rejectbuilds(parse(@_)))); } sub parse_build(@) { uselatestversion(emptytoall(rejectbuilds(parse(@_)))); } @@ -6733,8 +6774,7 @@ For example, B<toast remove> will never remove an armed build without completely disarming it first, even if thie build is mismatched and this option is enabled. When B<skipmismatched> is disabled, mismatched builds -are never treated specially. See also the B<disarmmismatched> option. -Default: enabled. +are never treated specially. Default: enabled. =item S<B<--preload> | B<--nopreload>> @@ -7016,8 +7056,8 @@ - "toast edit" leaves things in an odd state if you hang up on it - "toast rename" is more case-sensitive than it ought to be - "toast get" prevents wget from truncating output if transfer restarts + - "toast find" is undocumented and shows only best match for new pkgs - "toast env" doesn't set PYTHONPATH - - "toast man" refers to nonexistent disarmmismatched option Wish list: @@ -7041,9 +7081,12 @@ - store checksums after build for later tripwire-like verification - find a way to rebuild indices for apropos by default - allow package name/version as URL; expand w/ autofind iff missing - - add "toast find" and/or have autofind/upgrade prompt for version (?) + - have autofind/upgrade prompt for version (?) + - optionally have toast add imply change, then make get+build smarter + - toast status/env should allow multiple read-only storedirs/armdirs - fold archives by URL and/or hash? - zsh completions! + - ccache Questions left unanswered by this documentation: