diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-07-02 11:25:54 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2016-07-02 11:35:31 +0100 |
commit | 5beda194296368b661294809786b68221d521e63 (patch) | |
tree | c5f149591beaa53fb6aef04e5c355e9f5ad7e942 | |
parent | 312eeea6721530096c252d25f325762e96880cdb (diff) |
Test suite: tartree-edit: gitfetchinfo: Unmerge merged refs
The sequence
gitfetchinfo-merge A B
gitfetchinfo A
gitfetchinfo-merge A B
might leave inappropriate A+B refs, because nothing would delete them.
So, have gitfetchinfo A unmerge any A+B or B+A refs. (This does mean
that the user of gitfetchinfo A is now promising that any remotes A+B
or B+A were made with gitfetchinfo-merge.)
-rwxr-xr-x | tests/tartree-edit | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/tests/tartree-edit b/tests/tartree-edit index 1aeab3d..cecc142 100755 --- a/tests/tartree-edit +++ b/tests/tartree-edit @@ -116,6 +116,7 @@ gitfetchinfo_perhaps_commit () { tryat_gitfetchinfo () { git_manip_play + if test -d "$b.edit"; then cp -a "$b.edit"/. "$play"/. else @@ -123,7 +124,24 @@ tryat_gitfetchinfo () { tar -C $play -f - <&3 -x exec 3<&- fi - local innerwd=$play/* + + local innerwd="$(echo $play/*)" + + git for-each-ref --format='%(refname)' refs/remotes >$play/l + perl -ne ' + chomp; + next unless m#^refs/remotes/([^/]+)/#; + my $old = $_; + my $ab = $1; + my $rhs = $'\''; + my @ab = split /\+/, $ab; + next unless @ab == 2; + next unless grep { $_ eq "'"$remote"'" } @ab; + print "update refs/remotes/$_/$rhs $old\n" or die $! foreach @ab; + print "delete $old\n" or die $!; + ' <$play/l >$play/unmerge + git update-ref --stdin <$play/unmerge + git remote remove "$remote" 2>/dev/null ||: git remote add "$remote" $innerwd git fetch --no-tags -p "$remote" \ |