X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-remote.perl;h=c56c5a84a4ac67648efd3c5ccf690e9cb21dd54f;hb=9e2586ff2f8b2b3f5bbdd7ad47af0db6abf0f6f8;hp=059c141b68e829c7114d09ed9f4541b9db4c3d66;hpb=c326246accf36bc070b326773df2b9ec1c336037;p=git.git diff --git a/git-remote.perl b/git-remote.perl index 059c141b6..c56c5a84a 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -64,7 +64,7 @@ sub list_remote { my ($git) = @_; my %seen = (); my @remotes = eval { - $git->command(qw(repo-config --get-regexp), '^remote\.'); + $git->command(qw(config --get-regexp), '^remote\.'); }; for (@remotes) { if (/^remote\.([^.]*)\.(\S*)\s+(.*)$/) { @@ -103,7 +103,7 @@ sub list_branch { my ($git) = @_; my %seen = (); my @branches = eval { - $git->command(qw(repo-config --get-regexp), '^branch\.'); + $git->command(qw(config --get-regexp), '^branch\.'); }; for (@branches) { if (/^branch\.([^.]*)\.(\S*)\s+(.*)$/) { @@ -130,7 +130,7 @@ sub update_ls_remote { $info->{'LS_REMOTE'} = \@ref; } -sub show_wildcard_mapping { +sub list_wildcard_mapping { my ($forced, $ours, $ls) = @_; my %refs; for (@$ls) { @@ -156,25 +156,14 @@ sub show_wildcard_mapping { push @tracked, $_; } } - if (@new) { - print " New remote branches (next fetch will store in remotes/$ours)\n"; - print " @new\n"; - } - if (@stale) { - print " Stale tracking branches in remotes/$ours (you'd better remove them)\n"; - print " @stale\n"; - } - if (@tracked) { - print " Tracked remote branches\n"; - print " @tracked\n"; - } + return \@new, \@stale, \@tracked; } -sub show_mapping { +sub list_mapping { my ($name, $info) = @_; my $fetch = $info->{'FETCH'}; my $ls = $info->{'LS_REMOTE'}; - my (@stale, @tracked); + my (@new, @stale, @tracked); for (@$fetch) { next unless (/(\+)?([^:]+):(.*)/); @@ -182,7 +171,11 @@ sub show_mapping { if ($theirs eq 'refs/heads/*' && $ours =~ /^refs\/remotes\/(.*)\/\*$/) { # wildcard mapping - show_wildcard_mapping($forced, $1, $ls); + my ($w_new, $w_stale, $w_tracked) + = list_wildcard_mapping($forced, $1, $ls); + push @new, @$w_new; + push @stale, @$w_stale; + push @tracked, @$w_tracked; } elsif ($theirs =~ /\*/ || $ours =~ /\*/) { print STDERR "Warning: unrecognized mapping in remotes.$name.fetch: $_\n"; @@ -196,13 +189,40 @@ sub show_mapping { } } } - if (@stale) { - print " Stale tracking branches in remotes/$name (you'd better remove them)\n"; - print " @stale\n"; + return \@new, \@stale, \@tracked; +} + +sub show_mapping { + my ($name, $info) = @_; + my ($new, $stale, $tracked) = list_mapping($name, $info); + if (@$new) { + print " New remote branches (next fetch will store in remotes/$name)\n"; + print " @$new\n"; + } + if (@$stale) { + print " Stale tracking branches in remotes/$name (use 'git remote prune')\n"; + print " @$stale\n"; } - if (@tracked) { + if (@$tracked) { print " Tracked remote branches\n"; - print " @tracked\n"; + print " @$tracked\n"; + } +} + +sub prune_remote { + my ($name, $ls_remote) = @_; + if (!exists $remote->{$name}) { + print STDERR "No such remote $name\n"; + return; + } + my $info = $remote->{$name}; + update_ls_remote($ls_remote, $info); + + my ($new, $stale, $tracked) = list_mapping($name, $info); + my $prefix = "refs/remotes/$name"; + foreach my $to_prune (@$stale) { + my @v = $git->command(qw(rev-parse --verify), "$prefix/$to_prune"); + $git->command(qw(update-ref -d), "$prefix/$to_prune", $v[0]); } } @@ -233,14 +253,30 @@ sub show_remote { } sub add_remote { - my ($name, $url) = @_; + my ($name, $url, $opts) = @_; if (exists $remote->{$name}) { print STDERR "remote $name already exists.\n"; exit(1); } - $git->command('repo-config', "remote.$name.url", $url); - $git->command('repo-config', "remote.$name.fetch", - "+refs/heads/*:refs/remotes/$name/*"); + $git->command('config', "remote.$name.url", $url); + my $track = $opts->{'track'} || ["*"]; + + for (@$track) { + $git->command('config', '--add', "remote.$name.fetch", + "+refs/heads/$_:refs/remotes/$name/$_"); + } + if ($opts->{'fetch'}) { + $git->command('fetch', $name); + } + if (exists $opts->{'master'}) { + $git->command('symbolic-ref', "refs/remotes/$name/HEAD", + "refs/remotes/$name/$opts->{'master'}"); + } +} + +sub add_usage { + print STDERR "Usage: git remote add [-f] [-t track]* [-m master] \n"; + exit(1); } if (!@ARGV) { @@ -267,11 +303,62 @@ elsif ($ARGV[0] eq 'show') { show_remote($ARGV[$i], $ls_remote); } } +elsif ($ARGV[0] eq 'prune') { + my $ls_remote = 1; + my $i; + for ($i = 1; $i < @ARGV; $i++) { + if ($ARGV[$i] eq '-n') { + $ls_remote = 0; + } + else { + last; + } + } + if ($i >= @ARGV) { + print STDERR "Usage: git remote prune \n"; + exit(1); + } + for (; $i < @ARGV; $i++) { + prune_remote($ARGV[$i], $ls_remote); + } +} elsif ($ARGV[0] eq 'add') { + my %opts = (); + while (1 < @ARGV && $ARGV[1] =~ /^-/) { + my $opt = $ARGV[1]; + shift @ARGV; + if ($opt eq '-f' || $opt eq '--fetch') { + $opts{'fetch'} = 1; + next; + } + if ($opt eq '-t' || $opt eq '--track') { + if (@ARGV < 1) { + add_usage(); + } + $opts{'track'} ||= []; + push @{$opts{'track'}}, $ARGV[1]; + shift @ARGV; + next; + } + if ($opt eq '-m' || $opt eq '--master') { + if ((@ARGV < 1) || exists $opts{'master'}) { + add_usage(); + } + $opts{'master'} = $ARGV[1]; + shift @ARGV; + next; + } + add_usage(); + } if (@ARGV != 3) { - print STDERR "Usage: git remote add \n"; - exit(1); + add_usage(); } - add_remote($ARGV[1], $ARGV[2]); + add_remote($ARGV[1], $ARGV[2], \%opts); +} +else { + print STDERR "Usage: git remote\n"; + print STDERR " git remote add \n"; + print STDERR " git remote show \n"; + print STDERR " git remote prune \n"; + exit(1); } -