X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/7e8f0bc28dcf77eb881b9455332da32027f2b228..f3c86673c180d69dba1658f2b3dcc083b0593642:/scripts/feeds diff --git a/scripts/feeds b/scripts/feeds index 8ec0799f7..4b53fd117 100755 --- a/scripts/feeds +++ b/scripts/feeds @@ -48,64 +48,93 @@ sub parse_config() { close FEEDS; } -sub update_index($) +sub update_location($$) { my $name = shift; + my $url = shift; + my $old_url; -d "./feeds/$name.tmp" or mkdir "./feeds/$name.tmp" or return 1; - -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("ln -sf $name.tmp/.packageinfo ./feeds/$name.index"); - return 0; -} - -sub update_svn($$) { - my $name = shift; - my $src = shift; + if( open LOC, "< ./feeds/$name.tmp/location" ) + { + chomp($old_url = readline LOC); + close LOC; + } - if (-d "./feeds/$name/.svn" ) { - system("(cd \"./feeds/$name\"; svn up)") == 0 or return 1; - } else { - system("rm -rf \"./feeds/$name\""); - system("svn co $src \"./feeds/$name\"") == 0 or return 1; + 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; + return 0; } -sub update_cpy($$) { +sub update_index($) +{ my $name = shift; - my $src = shift; - system("mkdir -p ./feeds/$name"); - system("cp -Rf $src ./feeds"); + -d "./feeds/$name.tmp" or mkdir "./feeds/$name.tmp" or return 1; + -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=5 SCAN_EXTRA=\"\" TMP_DIR=\"$ENV{TOPDIR}/feeds/$name.tmp\""); + system("ln -sf $name.tmp/.packageinfo ./feeds/$name.index"); return 0; } -sub update_link($$) { - my $name = shift; - my $src = abs_path(shift); +my %update_method = ( + 'src-svn' => { + 'init' => "svn checkout '%s' '%s'", + 'update' => "svn update", + 'controldir' => ".svn"}, + 'src-cpy' => { + 'init' => "cp -Rf '%s' '%s'", + 'update' => ""}, + 'src-link' => { + 'init' => "ln -s '%s' '%s'", + 'update' => ""}, + 'src-git' => { + 'init' => "git clone --depth 1 '%s' '%s'", + 'update' => "git pull", + 'controldir' => ".git"}, + 'src-bzr' => { + 'init' => "bzr checkout --lightweight '%s' '%s'", + 'update' => "bzr update", + 'controldir' => ".bzr"}, + 'src-hg' => { + 'init' => "hg clone '%s' '%s'", + 'update' => "hg pull --update", + 'controldir' => ".hg"} +); - system("rm -f ./feeds/$name; ln -s $src ./feeds/$name"); +# src-git: pull broken +# src-cpy: broken if `basename $src` != $name - return 0; -} - -sub update_git($$) { +sub update_feed_via($$$$) { + my $type = shift; my $name = shift; my $src = shift; - - if (-d "./feeds/$name/.git" ) { - system("GIT_DIR=./feeds/$name/.git git pull") == 0 or return 1; + my $relocate = shift; + + my $m = $update_method{$type}; + my $localpath = "./feeds/$name"; + my $safepath = $localpath; + $safepath =~ s/'/'\\''/; + + if( $relocate || !$m->{'update'} || !-d "$localpath/$m->{'controldir'}" ) { + system("rm -rf '$safepath'"); + system(sprintf($m->{'init'}, $src, $safepath)) == 0 or return 1; } else { - system("rm -rf \"./feeds/$name\""); - system("git clone --depth 1 $src ./feeds/$name") == 0 or return 1; + system("cd '$safepath'; $m->{'update'}") == 0 or return 1; } - + return 0; } @@ -144,7 +173,7 @@ sub search_feed { foreach my $substr (@substr) { my $match; - foreach my $key (qw(name title description)) { + foreach my $key (qw(name title description src)) { $pkg->{$key} and $substr and $pkg->{$key} =~ m/$substr/i and $match = 1; } $match or undef $pkgmatch; @@ -227,6 +256,8 @@ my %install_method = ( 'src-cpy' => \&install_generic, 'src-link' => \&install_generic, 'src-git' => \&install_generic, + 'src-bzr' => \&install_generic, + 'src-hg' => \&install_generic, ); my %feed; @@ -290,8 +321,9 @@ sub install_package { foreach my $vpkg (@{$srcpackage{$src}}, $pkg) { foreach my $dep (@{$vpkg->{depends}}, @{$vpkg->{builddepends}}) { next if $dep =~ /@/; - next if $dep =~ /:/; $dep =~ s/^\+//; + $dep =~ s/^.+://; + next unless $dep; install_package($feed, $dep) == 0 or $ret = 1; } } @@ -402,20 +434,17 @@ sub uninstall { return 0; } -my %update_method = ( - 'src-svn' => \&update_svn, - 'src-cpy' => \&update_cpy, - 'src-link' => \&update_link, - 'src-git' => \&update_git -); - sub update_feed($$$$) { my $type=shift; 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; @@ -424,7 +453,7 @@ sub update_feed($$$$) my $failed = 1; foreach my $feedsrc (@$src) { warn "Updating feed '$name' from '$feedsrc' ...\n"; - next unless &{$update_method{$type}}($name, $feedsrc) == 0; + next unless update_feed_via($type, $name, $feedsrc, $force_relocate) == 0; $failed = 0; last; }