From f9ff9d02f69bb95da2e6665a11a3e399beeb89cb Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Thu, 26 Aug 2010 15:13:42 +0000
Subject: [PATCH] scripts/feeds: cache feed metadata instead of re-reading it
 on every get_feed() call

SVN-Revision: 22814
---
 scripts/feeds | 38 ++++++++++++++++++++++++--------------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/scripts/feeds b/scripts/feeds
index 3932a2d6d94..f2ffc3ef697 100755
--- a/scripts/feeds
+++ b/scripts/feeds
@@ -26,6 +26,10 @@ $valid_mk or die "Unsupported version of make found: $mk\n";
 my @feeds;
 my %build_packages;
 my %installed;
+my %feed_cache;
+
+my $feed_package = {};
+my $feed_src = {};
 
 sub parse_config() {
 	my $line = 0;
@@ -148,16 +152,22 @@ sub update_feed_via($$$$) {
 
 sub get_feed($) {
 	my $feed = shift;
-	my $file = "./feeds/$feed.index";
 
-	clear_packages();
+	if (!defined($feed_cache{$feed})) {
+		my $file = "./feeds/$feed.index";
 
-	-f $file or do {
-		print "Ignoring feed '$feed' - index missing\n";
-		return;
-	};
-	parse_package_metadata($file) or return;
-	return { %package };
+		clear_packages();
+		-f $file or do {
+			print "Ignoring feed '$feed' - index missing\n";
+			return;
+		};
+		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() {
@@ -174,8 +184,8 @@ sub search_feed {
 
 	return unless @substr > 0;
 	get_feed($feed);
-	foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
-		my $pkg = $package{$name};
+	foreach my $name (sort { lc($a) cmp lc($b) } keys %$feed_package) {
+		my $pkg = $feed_package->{$name};
 		my $substr;
 		my $pkgmatch = 1;
 
@@ -212,7 +222,7 @@ sub list_feed {
 
 	get_feed($feed);
 	foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
-		my $pkg = $package{$name};
+		my $pkg = $feed_package->{$name};
 		next if $pkg->{vdepends};
 		if($pkg->{name}) {
 			printf "\%-32s\t\%s\n", $pkg->{name}, $pkg->{title};
@@ -293,7 +303,7 @@ sub install_package {
 	$feed or do {
 		$installed{$name} and return 0;
 		# 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;
 	};
 
@@ -328,7 +338,7 @@ sub install_package {
 	};
 
 	# 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"}}) {
 			next if $dep =~ /@/;
 			$dep =~ s/^\+//;
@@ -385,7 +395,7 @@ sub install {
 				printf "Installing all packages from feed %s.\n", $f->[1];
 				get_feed($f->[1]);
 				foreach my $name (sort { lc($a) cmp lc($b) } keys %package) {
-					my $p = $package{$name};
+					my $p = $feed_package->{$name};
 					next if $p->{vdepends};
 					if( $p->{name} ) {
 						install_package($feed, $p->{name}) == 0 or $ret = 1;