scripts/feeds: cache feed metadata instead of re-reading it on every get_feed() call
SVN-Revision: 22814
This commit is contained in:
		@@ -26,6 +26,10 @@ $valid_mk or die "Unsupported version of make found: $mk\n";
 | 
				
			|||||||
my @feeds;
 | 
					my @feeds;
 | 
				
			||||||
my %build_packages;
 | 
					my %build_packages;
 | 
				
			||||||
my %installed;
 | 
					my %installed;
 | 
				
			||||||
 | 
					my %feed_cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $feed_package = {};
 | 
				
			||||||
 | 
					my $feed_src = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub parse_config() {
 | 
					sub parse_config() {
 | 
				
			||||||
	my $line = 0;
 | 
						my $line = 0;
 | 
				
			||||||
@@ -148,16 +152,22 @@ sub update_feed_via($$$$) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
sub get_feed($) {
 | 
					sub get_feed($) {
 | 
				
			||||||
	my $feed = shift;
 | 
						my $feed = shift;
 | 
				
			||||||
	my $file = "./feeds/$feed.index";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clear_packages();
 | 
						if (!defined($feed_cache{$feed})) {
 | 
				
			||||||
 | 
							my $file = "./feeds/$feed.index";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-f $file or do {
 | 
							clear_packages();
 | 
				
			||||||
		print "Ignoring feed '$feed' - index missing\n";
 | 
							-f $file or do {
 | 
				
			||||||
		return;
 | 
								print "Ignoring feed '$feed' - index missing\n";
 | 
				
			||||||
	};
 | 
								return;
 | 
				
			||||||
	parse_package_metadata($file) or return;
 | 
							};
 | 
				
			||||||
	return { %package };
 | 
							parse_package_metadata($file) or return;
 | 
				
			||||||
 | 
							$feed_cache{$feed} = [ { %package }, { %srcpackage } ];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$feed_package = $feed_cache{$feed}->[0];
 | 
				
			||||||
 | 
						$feed_src = $feed_cache{$feed}->[1];
 | 
				
			||||||
 | 
						return $feed_cache{$feed}->[0];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub get_installed() {
 | 
					sub get_installed() {
 | 
				
			||||||
@@ -174,8 +184,8 @@ sub search_feed {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return unless @substr > 0;
 | 
						return unless @substr > 0;
 | 
				
			||||||
	get_feed($feed);
 | 
						get_feed($feed);
 | 
				
			||||||
	foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
 | 
						foreach my $name (sort { lc($a) cmp lc($b) } keys %$feed_package) {
 | 
				
			||||||
		my $pkg = $package{$name};
 | 
							my $pkg = $feed_package->{$name};
 | 
				
			||||||
		my $substr;
 | 
							my $substr;
 | 
				
			||||||
		my $pkgmatch = 1;
 | 
							my $pkgmatch = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -212,7 +222,7 @@ sub list_feed {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	get_feed($feed);
 | 
						get_feed($feed);
 | 
				
			||||||
	foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
 | 
						foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
 | 
				
			||||||
		my $pkg = $package{$name};
 | 
							my $pkg = $feed_package->{$name};
 | 
				
			||||||
		next if $pkg->{vdepends};
 | 
							next if $pkg->{vdepends};
 | 
				
			||||||
		if($pkg->{name}) {
 | 
							if($pkg->{name}) {
 | 
				
			||||||
			printf "\%-32s\t\%s\n", $pkg->{name}, $pkg->{title};
 | 
								printf "\%-32s\t\%s\n", $pkg->{name}, $pkg->{title};
 | 
				
			||||||
@@ -293,7 +303,7 @@ sub install_package {
 | 
				
			|||||||
	$feed or do {
 | 
						$feed or do {
 | 
				
			||||||
		$installed{$name} and return 0;
 | 
							$installed{$name} and return 0;
 | 
				
			||||||
		# TODO: check if it's already installed within ./package directory
 | 
							# TODO: check if it's already installed within ./package directory
 | 
				
			||||||
		$srcpackage{$name} or -d "./package/$name" or warn "WARNING: No feed for package '$name' found, maybe it's already part of the standard packages?\n";
 | 
							$feed_src->{$name} or -d "./package/$name" or warn "WARNING: No feed for package '$name' found, maybe it's already part of the standard packages?\n";
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -328,7 +338,7 @@ sub install_package {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# install all dependencies
 | 
						# install all dependencies
 | 
				
			||||||
	foreach my $vpkg (@{$srcpackage{$src}}, $pkg) {
 | 
						foreach my $vpkg (@{$feed_src->{$src}}, $pkg) {
 | 
				
			||||||
		foreach my $dep (@{$vpkg->{depends}}, @{$vpkg->{builddepends}}, @{$vpkg->{"builddepends/host"}}) {
 | 
							foreach my $dep (@{$vpkg->{depends}}, @{$vpkg->{builddepends}}, @{$vpkg->{"builddepends/host"}}) {
 | 
				
			||||||
			next if $dep =~ /@/;
 | 
								next if $dep =~ /@/;
 | 
				
			||||||
			$dep =~ s/^\+//;
 | 
								$dep =~ s/^\+//;
 | 
				
			||||||
@@ -385,7 +395,7 @@ sub install {
 | 
				
			|||||||
				printf "Installing all packages from feed %s.\n", $f->[1];
 | 
									printf "Installing all packages from feed %s.\n", $f->[1];
 | 
				
			||||||
				get_feed($f->[1]);
 | 
									get_feed($f->[1]);
 | 
				
			||||||
				foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
 | 
									foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
 | 
				
			||||||
					my $p = $package{$name};
 | 
										my $p = $feed_package->{$name};
 | 
				
			||||||
					next if $p->{vdepends};
 | 
										next if $p->{vdepends};
 | 
				
			||||||
					if( $p->{name} ) {
 | 
										if( $p->{name} ) {
 | 
				
			||||||
						install_package($feed, $p->{name}) == 0 or $ret = 1;
 | 
											install_package($feed, $p->{name}) == 0 or $ret = 1;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user