Merge branch 'master' of git://git.kernel.org/pub/scm/gitk/gitk
[gitweb.git] / git-remote.perl
index 6e473ecfd06b56524acca7d69dc0e8eff5b9c820..01cf480221be1e5860bd701d5d17ced25766d38d 100755 (executable)
@@ -15,6 +15,10 @@ sub add_remote_config {
                $hash->{$name}{'FETCH'} ||= [];
                push @{$hash->{$name}{'FETCH'}}, $value;
        }
+       elsif ($what eq 'push') {
+               $hash->{$name}{'PUSH'} ||= [];
+               push @{$hash->{$name}{'PUSH'}}, $value;
+       }
        if (!exists $hash->{$name}{'SOURCE'}) {
                $hash->{$name}{'SOURCE'} = 'config';
        }
@@ -44,7 +48,8 @@ sub add_remote_remotes {
                        }
                }
                elsif (/^Push:\s*(.*)$/) {
-                       ; # later
+                       $it->{'PUSH'} ||= [];
+                       push @{$it->{'PUSH'}}, $1;
                }
                elsif (/^Pull:\s*(.*)$/) {
                        $it->{'FETCH'} ||= [];
@@ -67,7 +72,7 @@ sub list_remote {
                $git->command(qw(config --get-regexp), '^remote\.');
        };
        for (@remotes) {
-               if (/^remote\.([^.]*)\.(\S*)\s+(.*)$/) {
+               if (/^remote\.(\S+?)\.([^.\s]+)\s+(.*)$/) {
                        add_remote_config(\%seen, $1, $2, $3);
                }
        }
@@ -250,6 +255,16 @@ sub show_remote {
        if ($info->{'LS_REMOTE'}) {
                show_mapping($name, $info);
        }
+       if ($info->{'PUSH'}) {
+               my @pushed = map {
+                       s|^refs/heads/||;
+                       s|^\+refs/heads/|+|;
+                       s|:refs/heads/|:|;
+                       $_;
+               } @{$info->{'PUSH'}};
+               print "  Local branch(es) pushed with 'git push'\n";
+               print "    @pushed\n";
+       }
 }
 
 sub add_remote {
@@ -274,14 +289,51 @@ sub add_remote {
        }
 }
 
+sub update_remote {
+       my ($name) = @_;
+
+        my $conf = $git->config("remotes." . $name);
+       if (defined($conf)) {
+               @remotes = split(' ', $conf);
+       } elsif ($name eq 'default') {
+               undef @remotes;
+               for (sort keys %$remote) {
+                       my $do_fetch = $git->config_bool("remote." . $_ .
+                                                   ".skipDefaultUpdate");
+                       unless ($do_fetch) {
+                               push @remotes, $_;
+                       }
+               }
+       } else {
+               print STDERR "Remote group $name does not exists.\n";
+               exit(1);
+       }
+       for (@remotes) {
+               print "Updating $_\n";
+               $git->command('fetch', "$_");
+       }
+}
+
 sub add_usage {
        print STDERR "Usage: git remote add [-f] [-t track]* [-m master] <name> <url>\n";
        exit(1);
 }
 
+local $VERBOSE = 0;
+@ARGV = grep {
+       if ($_ eq '-v' or $_ eq '--verbose') {
+               $VERBOSE=1;
+               0
+       } else {
+               1
+       }
+} @ARGV;
+
 if (!@ARGV) {
        for (sort keys %$remote) {
-               print "$_\n";
+               print "$_";
+               print "\t$remote->{$_}->{URL}" if $VERBOSE;
+               print "\n";
        }
 }
 elsif ($ARGV[0] eq 'show') {
@@ -304,15 +356,12 @@ sub add_usage {
        }
 }
 elsif ($ARGV[0] eq 'update') {
-        my $conf = $git->config("remote.fetch");
-       if (defined($conf)) {
-               @remotes = split(' ', $conf);
-       } else {
-               @remotes = sort keys %$remote;
+       if (@ARGV <= 1) {
+               update_remote("default");
+               exit(1);
        }
-       for (@remotes) {
-               print "Fetching $_\n";
-               $git->command('fetch', "$_");
+       for ($i = 1; $i < @ARGV; $i++) {
+               update_remote($ARGV[$i]);
        }
 }
 elsif ($ARGV[0] eq 'prune') {
@@ -372,6 +421,6 @@ sub add_usage {
        print STDERR "       git remote add <name> <url>\n";
        print STDERR "       git remote show <name>\n";
        print STDERR "       git remote prune <name>\n";
-       print STDERR "       git remote update\n";
+       print STDERR "       git remote update [group]\n";
        exit(1);
 }