From 611360443ef4d9e2f4def1e2c97727dd04e0d244 Mon Sep 17 00:00:00 2001 From: James Bowes Date: Tue, 5 Jun 2007 19:25:23 -0400 Subject: remote: add 'rm' subcommand Introduce git-remote rm which will: - Remove the remote config entry for . - Remove any config entries for tracking branches of . - Remove any stored remote branches of . Signed-off-by: James Bowes Signed-off-by: Junio C Hamano --- git-remote.perl | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'git-remote.perl') diff --git a/git-remote.perl b/git-remote.perl index f6f283ea4f..f513a8ad99 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -316,6 +316,34 @@ sub update_remote { } } +sub rm_remote { + my ($name) = @_; + if (!exists $remote->{$name}) { + print STDERR "No such remote $name\n"; + return; + } + + $git->command('config', '--remove-section', "remote.$name"); + + eval { + my @trackers = $git->command('config', '--get-regexp', + 'branch.*.remote', $name); + for (@trackers) { + /^branch\.(.*)?\.remote/; + $git->config('--unset', "branch.$1.remote"); + $git->config('--unset', "branch.$1.merge"); + } + }; + + + my @refs = $git->command('for-each-ref', + '--format=%(refname) %(objectname)', "refs/remotes/$name"); + for (@refs) { + ($ref, $object) = split; + $git->command(qw(update-ref -d), $ref, $object); + } +} + sub add_usage { print STDERR "Usage: git remote add [-f] [-t track]* [-m master] \n"; exit(1); @@ -422,9 +450,19 @@ elsif ($ARGV[0] eq 'add') { } add_remote($ARGV[1], $ARGV[2], \%opts); } +elsif ($ARGV[0] eq 'rm') { + if (@ARGV <= 1) { + print STDERR "Usage: git remote rm \n"; + } + else { + rm_remote($ARGV[1]); + } + exit(1); +} else { print STDERR "Usage: git remote\n"; print STDERR " git remote add \n"; + print STDERR " git remote rm \n"; print STDERR " git remote show \n"; print STDERR " git remote prune \n"; print STDERR " git remote update [group]\n"; -- cgit v1.2.3 From 683b56791b4e8a29ff9bc98c7faff69d7854d845 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 23 Sep 2007 22:29:12 -0700 Subject: git-remote rm: add tests and minor fix-ups This fixes "git remote rm" which always exited with a failure, corrects indentation, and adds tests. Signed-off-by: Junio C Hamano --- git-remote.perl | 10 +++--- t/t5505-remote.sh | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 6 deletions(-) create mode 100755 t/t5505-remote.sh (limited to 'git-remote.perl') diff --git a/git-remote.perl b/git-remote.perl index f513a8ad99..b7c1e01d7d 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -317,7 +317,7 @@ sub update_remote { } sub rm_remote { - my ($name) = @_; + my ($name) = @_; if (!exists $remote->{$name}) { print STDERR "No such remote $name\n"; return; @@ -336,7 +336,7 @@ sub rm_remote { }; - my @refs = $git->command('for-each-ref', + my @refs = $git->command('for-each-ref', '--format=%(refname) %(objectname)', "refs/remotes/$name"); for (@refs) { ($ref, $object) = split; @@ -453,11 +453,9 @@ elsif ($ARGV[0] eq 'add') { elsif ($ARGV[0] eq 'rm') { if (@ARGV <= 1) { print STDERR "Usage: git remote rm \n"; + exit(1); } - else { - rm_remote($ARGV[1]); - } - exit(1); + rm_remote($ARGV[1]); } else { print STDERR "Usage: git remote\n"; diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh new file mode 100755 index 0000000000..636aec2f71 --- /dev/null +++ b/t/t5505-remote.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +test_description='git remote porcelain-ish' + +. ./test-lib.sh + +GIT_CONFIG=.git/config +export GIT_CONFIG + +setup_repository () { + mkdir "$1" && ( + cd "$1" && + git init && + >file && + git add file && + git commit -m "Initial" && + git checkout -b side && + >elif && + git add elif && + git commit -m "Second" && + git checkout master + ) +} + +tokens_match () { + echo "$1" | tr ' ' '\012' | sort | sed -e '/^$/d' >expect && + echo "$2" | tr ' ' '\012' | sort | sed -e '/^$/d' >actual && + diff -u expect actual +} + +check_remote_track () { + actual=$(git remote show "$1" | sed -n -e '$p') && + shift && + tokens_match "$*" "$actual" +} + +check_tracking_branch () { + f="" && + r=$(git for-each-ref "--format=%(refname)" | + sed -ne "s|^refs/remotes/$1/||p") && + shift && + tokens_match "$*" "$r" +} + +test_expect_success setup ' + + setup_repository one && + setup_repository two && + ( + cd two && git branch another + ) && + git clone one test + +' + +test_expect_success 'remote information for the origin' ' +( + cd test && + tokens_match origin "$(git remote)" && + check_remote_track origin master side && + check_tracking_branch origin HEAD master side +) +' + +test_expect_success 'add another remote' ' +( + cd test && + git remote add -f second ../two && + tokens_match "origin second" "$(git remote)" && + check_remote_track origin master side && + check_remote_track second master side another && + check_tracking_branch second master side another && + git for-each-ref "--format=%(refname)" refs/remotes | + sed -e "/^refs\/remotes\/origin\//d" \ + -e "/^refs\/remotes\/second\//d" >actual && + >expect && + diff -u expect actual +) +' + +test_expect_success 'remove remote' ' +( + cd test && + git remote rm second +) +' + +test_expect_success 'remove remote' ' +( + cd test && + tokens_match origin "$(git remote)" && + check_remote_track origin master side && + git for-each-ref "--format=%(refname)" refs/remotes | + sed -e "/^refs\/remotes\/origin\//d" >actual && + >expect && + diff -u expect actual +) +' + +test_done -- cgit v1.2.3 From f4bb20cc99fe18ba0e7dd421f1d95a05c1cbbc93 Mon Sep 17 00:00:00 2001 From: Jari Aalto Date: Sat, 29 Sep 2007 23:29:43 -0700 Subject: git-remote: exit with non-zero status after detecting errors. Some subcommands of "git-remote" detected and issued error messages but did not signal that to the calling process with exit status. Signed-off-by: Jari Aalto Signed-off-by: Junio C Hamano --- git-remote.perl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'git-remote.perl') diff --git a/git-remote.perl b/git-remote.perl index 01cf480221..8e2dc4de73 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -218,7 +218,7 @@ sub prune_remote { my ($name, $ls_remote) = @_; if (!exists $remote->{$name}) { print STDERR "No such remote $name\n"; - return; + return 1; } my $info = $remote->{$name}; update_ls_remote($ls_remote, $info); @@ -229,13 +229,14 @@ sub prune_remote { my @v = $git->command(qw(rev-parse --verify), "$prefix/$to_prune"); $git->command(qw(update-ref -d), "$prefix/$to_prune", $v[0]); } + return 0; } sub show_remote { my ($name, $ls_remote) = @_; if (!exists $remote->{$name}) { print STDERR "No such remote $name\n"; - return; + return 1; } my $info = $remote->{$name}; update_ls_remote($ls_remote, $info); @@ -265,6 +266,7 @@ sub show_remote { print " Local branch(es) pushed with 'git push'\n"; print " @pushed\n"; } + return 0; } sub add_remote { @@ -351,9 +353,11 @@ elsif ($ARGV[0] eq 'show') { print STDERR "Usage: git remote show \n"; exit(1); } + my $status = 0; for (; $i < @ARGV; $i++) { - show_remote($ARGV[$i], $ls_remote); + $status |= show_remote($ARGV[$i], $ls_remote); } + exit($status); } elsif ($ARGV[0] eq 'update') { if (@ARGV <= 1) { @@ -379,9 +383,11 @@ elsif ($ARGV[0] eq 'prune') { print STDERR "Usage: git remote prune \n"; exit(1); } + my $status = 0; for (; $i < @ARGV; $i++) { - prune_remote($ARGV[$i], $ls_remote); + $status |= prune_remote($ARGV[$i], $ls_remote); } + exit($status); } elsif ($ARGV[0] eq 'add') { my %opts = (); -- cgit v1.2.3 From 6982ccecaf32ebf8adfcb66b4225da3b46255621 Mon Sep 17 00:00:00 2001 From: Jari Aalto Date: Sat, 29 Sep 2007 23:34:19 -0700 Subject: git-remote: exit with non-zero status after detecting error in "rm". Exit with non-zero status when "git remote rm" was told to remove a non-existing remote. Signed-off-by: Jari Aalto Signed-off-by: Junio C Hamano --- git-remote.perl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'git-remote.perl') diff --git a/git-remote.perl b/git-remote.perl index 79941e40fa..9ca3e7ef37 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -322,7 +322,7 @@ sub rm_remote { my ($name) = @_; if (!exists $remote->{$name}) { print STDERR "No such remote $name\n"; - return; + return 1; } $git->command('config', '--remove-section', "remote.$name"); @@ -337,13 +337,13 @@ sub rm_remote { } }; - my @refs = $git->command('for-each-ref', '--format=%(refname) %(objectname)', "refs/remotes/$name"); for (@refs) { ($ref, $object) = split; $git->command(qw(update-ref -d), $ref, $object); } + return 0; } sub add_usage { @@ -461,7 +461,7 @@ elsif ($ARGV[0] eq 'rm') { print STDERR "Usage: git remote rm \n"; exit(1); } - rm_remote($ARGV[1]); + exit(rm_remote($ARGV[1])); } else { print STDERR "Usage: git remote\n"; -- cgit v1.2.3