scripts/feeds update:
[openwrt/staging/florian.git] / scripts / feeds
index 76d83af9a3e8a8acc71172a1e1c4878c2ecd6f7d..dd0a6c2fcd04f70731d5a4e9f2ba3f41e1c354be 100755 (executable)
@@ -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;
 }
 
@@ -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;
@@ -403,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;
@@ -425,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;
                }