increased SCAN_DEPTH for feeds/ by 1
[openwrt.git] / scripts / feeds
index 8e18855..115fe46 100755 (executable)
@@ -31,22 +31,50 @@ sub parse_config() {
                s/#.+$//;
                next unless /\S/;
                my @line = split /\s+/, $_, 3;
+               my @src;
                $line++;
 
                my $valid = 1;
                $line[0] =~ /^src-\w+$/ or $valid = 0;
                $line[1] =~ /^\w+$/ or $valid = 0;
-               $line[2] =~ /\s/ and $valid = 0;
+               @src = split /\s+/, $line[2];
                $valid or die "Syntax error in feeds.list, line: $line\n";
 
                $name{$line[1]} and die "Duplicate feed name '$line[1]', line: $line\n";
                $name{$line[1]} = 1;
 
-               push @feeds, [@line];
+               push @feeds, [$line[0], $line[1], \@src];
        }
        close FEEDS;
 }
 
+sub update_location($$)
+{
+       my $name = shift;
+       my $url  = shift;
+       my $old_url;
+
+       -d "./feeds/$name.tmp" or mkdir "./feeds/$name.tmp" or return 1;
+
+       if( open LOC, "< ./feeds/$name.tmp/location" )
+       {
+               chomp($old_url = readline LOC);
+               close LOC;
+       }
+
+       if( !$old_url || $old_url ne $url )
+       {
+               if( open LOC, "> ./feeds/$name.tmp/location" )
+               {
+                       print LOC $url, "\n";
+                       close LOC;
+               }
+               return $old_url ? 1 : 0;
+       }
+
+       return 0;       
+}
+
 sub update_index($)
 {
        my $name = shift;
@@ -55,17 +83,18 @@ sub update_index($)
        -d "./feeds/$name.tmp/info" or mkdir "./feeds/$name.tmp/info" or return 1;
 
        system("$mk -s prepare-mk TMP_DIR=\"$ENV{TOPDIR}/feeds/$name.tmp\"");
-       system("$mk -s -f include/scan.mk IS_TTY=1 SCAN_TARGET=\"packageinfo\" SCAN_DIR=\"feeds/$name\" SCAN_NAME=\"package\" SCAN_DEPS=\"$ENV{TOPDIR}/include/package*.mk\" SCAN_DEPTH=4 SCAN_EXTRA=\"\" TMP_DIR=\"$ENV{TOPDIR}/feeds/$name.tmp\"");
+       system("$mk -s -f include/scan.mk IS_TTY=1 SCAN_TARGET=\"packageinfo\" SCAN_DIR=\"feeds/$name\" SCAN_NAME=\"package\" SCAN_DEPS=\"$ENV{TOPDIR}/include/package*.mk\" SCAN_DEPTH=5 SCAN_EXTRA=\"\" TMP_DIR=\"$ENV{TOPDIR}/feeds/$name.tmp\"");
        system("ln -sf $name.tmp/.packageinfo ./feeds/$name.index");
 
        return 0;
 }
 
-sub update_svn($$) {
+sub update_svn($$$) {
        my $name = shift;
        my $src = shift;
+       my $relocate = shift;
 
-       if (-d "./feeds/$name/.svn" ) {
+       if ( !$relocate && -d "./feeds/$name/.svn" ) {
                system("(cd \"./feeds/$name\"; svn up)") == 0 or return 1;
        } else {
                system("rm -rf \"./feeds/$name\"");
@@ -75,30 +104,34 @@ sub update_svn($$) {
        return 0;
 }
 
-sub update_cpy($$) {
+sub update_cpy($$$) {
        my $name = shift;
        my $src = shift;
+       my $relocate = shift;
 
+       $relocate && system("rm -rf \"./feeds/$name\"");
        system("mkdir -p ./feeds/$name");
        system("cp -Rf $src ./feeds");
 
        return 0;
 }
 
-sub update_link($$) {
+sub update_link($$$) {
        my $name = shift;
        my $src = abs_path(shift);
+       my $relocate = shift;   # no-op
 
        system("rm -f ./feeds/$name; ln -s $src ./feeds/$name");
 
        return 0;
 }
 
-sub update_git($$) {
+sub update_git($$$) {
        my $name = shift;
        my $src = shift;
+       my $relocate = shift;
 
-       if (-d "./feeds/$name/.git" ) {
+       if ( !$relocate && -d "./feeds/$name/.git" ) {
                system("GIT_DIR=./feeds/$name/.git git pull") == 0 or return 1;
        } else {
                system("rm -rf \"./feeds/$name\"");
@@ -192,7 +225,7 @@ sub list {
        }
        if ($opts{s}) {
                foreach my $feed (@feeds) {
-                       printf "\%-32s\tURL: %s\n", $feed->[1], $feed->[2];
+                       printf "\%-32s\tURL: %s\n", $feed->[1], join(", ", @{$feed->[2]});
                }
                return 0;
        }
@@ -286,10 +319,12 @@ sub install_package {
        };
 
        # install all dependencies
-       foreach my $vpkg (@{$srcpackage{$src}}) {
+       foreach my $vpkg (@{$srcpackage{$src}}, $pkg) {
                foreach my $dep (@{$vpkg->{depends}}, @{$vpkg->{builddepends}}) {
                        next if $dep =~ /@/;
                        $dep =~ s/^\+//;
+                       $dep =~ s/^.+://;
+                       next unless $dep;
                        install_package($feed, $dep) == 0 or $ret = 1;
                }
        }
@@ -413,14 +448,24 @@ sub update_feed($$$$)
        my $name=shift;
        my $src=shift;
        my $perform_update=shift;
+       my $force_relocate=update_location( $name, "@$src" );
 
+       if( $force_relocate ) {
+               warn "Source of feed $name has changed, replacing copy\n";
+       }
        $update_method{$type} or do {
                warn "Unknown type '$type' in feed $name\n";
                return 1;
        };
        $perform_update and do {
-               warn "Updating feed '$name' from '$src' ...\n";
-               &{$update_method{$type}}($name, $src) == 0 or do {
+               my $failed = 1;
+               foreach my $feedsrc (@$src) {
+                       warn "Updating feed '$name' from '$feedsrc' ...\n";
+                       next unless &{$update_method{$type}}($name, $feedsrc, $force_relocate) == 0;
+                       $failed = 0;
+                       last;
+               }
+               $failed and do {
                        warn "failed.\n";
                        return 1;
                };