summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-12-31 14:52:10 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-12-31 14:52:10 +0000
commit39eb535cdc3d288c1f7c011409b9172905f68b47 (patch)
treedb24b894a84e3ee96f6d1796c3c2ea0e36ae1c87 /scripts
parent8424277c622b52cd527b3ee67973d7a19aabf027 (diff)
scripts/feeds update:
* Fix feed update via git. * Add support for bzr and hg. * Proper escaping of command line arguments handed to system. * Reduced code duplication. Patch by Justus Winter git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13782 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/feeds92
1 files changed, 42 insertions, 50 deletions
diff --git a/scripts/feeds b/scripts/feeds
index 115fe46f32..dd0a6c2fcd 100755
--- a/scripts/feeds
+++ b/scripts/feeds
@@ -89,55 +89,52 @@ sub update_index($)
return 0;
}
-sub update_svn($$$) {
- my $name = shift;
- my $src = shift;
- my $relocate = shift;
-
- if ( !$relocate && -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;
- }
-
- return 0;
-}
-
-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($$$) {
- my $name = shift;
- my $src = abs_path(shift);
- my $relocate = shift; # no-op
-
- system("rm -f ./feeds/$name; ln -s $src ./feeds/$name");
+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"}
+);
- return 0;
-}
+# src-git: pull broken
+# src-cpy: broken if `basename $src` != $name
-sub update_git($$$) {
+sub update_feed_via($$$$) {
+ my $type = shift;
my $name = shift;
my $src = shift;
my $relocate = shift;
-
- if ( !$relocate && -d "./feeds/$name/.git" ) {
- system("GIT_DIR=./feeds/$name/.git git pull") == 0 or return 1;
+
+ 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;
}
@@ -259,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;
@@ -435,13 +434,6 @@ 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;
@@ -461,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, $force_relocate) == 0;
+ next unless update_feed_via($type, $name, $feedsrc, $force_relocate) == 0;
$failed = 0;
last;
}