Merge branch 'jk/send-pack'
* jk/send-pack: (24 commits) send-pack: cluster ref status reporting send-pack: fix "everything up-to-date" message send-pack: tighten remote error reporting make "find_ref_by_name" a public function Fix warning about bitfield in struct ref send-pack: assign remote errors to each ref send-pack: check ref->status before updating tracking refs send-pack: track errors for each ref git-push: add documentation for the newly added --mirror mode Add tests for git push'es mirror mode Update the tracking references only if they were succesfully updated on remote Add a test checking if send-pack updated local tracking branches correctly git-push: plumb in --mirror mode Teach send-pack a mirror mode send-pack: segfault fix on forced push Reteach builtin-ls-remote to understand remotes send-pack: require --verbose to show update of tracking refs receive-pack: don't mention successful updates more terse push output Build in ls-remote ...
This commit is contained in:
53
t/t5404-tracking-branches.sh
Executable file
53
t/t5404-tracking-branches.sh
Executable file
@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='tracking branch update checks for git push'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
echo 1 >file &&
|
||||
git add file &&
|
||||
git commit -m 1 &&
|
||||
git branch b1 &&
|
||||
git branch b2 &&
|
||||
git clone . aa &&
|
||||
git checkout b1 &&
|
||||
echo b1 >>file &&
|
||||
git commit -a -m b1 &&
|
||||
git checkout b2 &&
|
||||
echo b2 >>file &&
|
||||
git commit -a -m b2
|
||||
'
|
||||
|
||||
test_expect_success 'prepare pushable branches' '
|
||||
cd aa &&
|
||||
b1=$(git rev-parse origin/b1) &&
|
||||
b2=$(git rev-parse origin/b2) &&
|
||||
git checkout -b b1 origin/b1 &&
|
||||
echo aa-b1 >>file &&
|
||||
git commit -a -m aa-b1 &&
|
||||
git checkout -b b2 origin/b2 &&
|
||||
echo aa-b2 >>file &&
|
||||
git commit -a -m aa-b2 &&
|
||||
git checkout master &&
|
||||
echo aa-master >>file &&
|
||||
git commit -a -m aa-master
|
||||
'
|
||||
|
||||
test_expect_success 'mixed-success push returns error' '! git push'
|
||||
|
||||
test_expect_success 'check tracking branches updated correctly after push' '
|
||||
test "$(git rev-parse origin/master)" = "$(git rev-parse master)"
|
||||
'
|
||||
|
||||
test_expect_success 'check tracking branches not updated for failed refs' '
|
||||
test "$(git rev-parse origin/b1)" = "$b1" &&
|
||||
test "$(git rev-parse origin/b2)" = "$b2"
|
||||
'
|
||||
|
||||
test_expect_success 'deleted branches have their tracking branches removed' '
|
||||
git push origin :b1 &&
|
||||
test "$(git rev-parse origin/b1)" = "origin/b1"
|
||||
'
|
||||
|
||||
test_done
|
42
t/t5405-send-pack-rewind.sh
Executable file
42
t/t5405-send-pack-rewind.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='forced push to replace commit we do not have'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
>file1 && git add file1 && test_tick &&
|
||||
git commit -m Initial &&
|
||||
|
||||
mkdir another && (
|
||||
cd another &&
|
||||
git init &&
|
||||
git fetch .. master:master
|
||||
) &&
|
||||
|
||||
>file2 && git add file2 && test_tick &&
|
||||
git commit -m Second
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'non forced push should die not segfault' '
|
||||
|
||||
(
|
||||
cd another &&
|
||||
git push .. master:master
|
||||
test $? = 1
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'forced push should succeed' '
|
||||
|
||||
(
|
||||
cd another &&
|
||||
git push .. +master:master
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_done
|
24
t/t5406-remote-rejects.sh
Executable file
24
t/t5406-remote-rejects.sh
Executable file
@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='remote push rejects are reported by client'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
mkdir .git/hooks &&
|
||||
(echo "#!/bin/sh" ; echo "exit 1") >.git/hooks/update &&
|
||||
chmod +x .git/hooks/update &&
|
||||
echo 1 >file &&
|
||||
git add file &&
|
||||
git commit -m 1 &&
|
||||
git clone . child &&
|
||||
cd child &&
|
||||
echo 2 >file &&
|
||||
git commit -a -m 2
|
||||
'
|
||||
|
||||
test_expect_success 'push reports error' '! git push 2>stderr'
|
||||
|
||||
test_expect_success 'individual ref reports error' 'grep rejected stderr'
|
||||
|
||||
test_done
|
52
t/t5512-ls-remote.sh
Executable file
52
t/t5512-ls-remote.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='git ls-remote'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
>file &&
|
||||
git add file &&
|
||||
test_tick &&
|
||||
git commit -m initial &&
|
||||
git tag mark &&
|
||||
git show-ref --tags -d | sed -e "s/ / /" >expected.tag &&
|
||||
(
|
||||
echo "$(git rev-parse HEAD) HEAD"
|
||||
git show-ref -d | sed -e "s/ / /"
|
||||
) >expected.all &&
|
||||
|
||||
git remote add self $(pwd)/.git
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'ls-remote --tags .git' '
|
||||
|
||||
git ls-remote --tags .git >actual &&
|
||||
diff -u expected.tag actual
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'ls-remote .git' '
|
||||
|
||||
git ls-remote .git >actual &&
|
||||
diff -u expected.all actual
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'ls-remote --tags self' '
|
||||
|
||||
git ls-remote --tags self >actual &&
|
||||
diff -u expected.tag actual
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'ls-remote self' '
|
||||
|
||||
git ls-remote self >actual &&
|
||||
diff -u expected.all actual
|
||||
|
||||
'
|
||||
|
||||
test_done
|
228
t/t5517-push-mirror.sh
Executable file
228
t/t5517-push-mirror.sh
Executable file
@ -0,0 +1,228 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='pushing to a mirror repository'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
D=`pwd`
|
||||
|
||||
invert () {
|
||||
if "$@"; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
mk_repo_pair () {
|
||||
rm -rf master mirror &&
|
||||
mkdir mirror &&
|
||||
(
|
||||
cd mirror &&
|
||||
git init
|
||||
) &&
|
||||
mkdir master &&
|
||||
(
|
||||
cd master &&
|
||||
git init &&
|
||||
git config remote.up.url ../mirror
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
# BRANCH tests
|
||||
test_expect_success 'push mirror creates new branches' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror updates existing branches' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git push --mirror up &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror force updates existing branches' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git push --mirror up &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git push --mirror up &&
|
||||
git reset --hard HEAD^
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror removes branches' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git branch remove master &&
|
||||
git push --mirror up &&
|
||||
git branch -D remove
|
||||
git push --mirror up
|
||||
) &&
|
||||
(
|
||||
cd mirror &&
|
||||
invert git show-ref -s --verify refs/heads/remove
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror adds, updates and removes branches together' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git branch remove master &&
|
||||
git push --mirror up &&
|
||||
git branch -D remove &&
|
||||
git branch add master &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
|
||||
master_add=$(cd master && git show-ref -s --verify refs/heads/add) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
|
||||
mirror_add=$(cd mirror && git show-ref -s --verify refs/heads/add) &&
|
||||
test "$master_master" = "$mirror_master" &&
|
||||
test "$master_add" = "$mirror_add" &&
|
||||
(
|
||||
cd mirror &&
|
||||
invert git show-ref -s --verify refs/heads/remove
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
|
||||
# TAG tests
|
||||
test_expect_success 'push mirror creates new tags' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror updates existing tags' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror force updates existing tags' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up &&
|
||||
git reset --hard HEAD^
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
test "$master_master" = "$mirror_master"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror removes tags' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git tag -f tremove master &&
|
||||
git push --mirror up &&
|
||||
git tag -d tremove
|
||||
git push --mirror up
|
||||
) &&
|
||||
(
|
||||
cd mirror &&
|
||||
invert git show-ref -s --verify refs/tags/tremove
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push mirror adds, updates and removes tags together' '
|
||||
|
||||
mk_repo_pair &&
|
||||
(
|
||||
cd master &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
git tag -f tmaster master &&
|
||||
git tag -f tremove master &&
|
||||
git push --mirror up &&
|
||||
git tag -d tremove &&
|
||||
git tag tadd master &&
|
||||
echo two >foo && git add foo && git commit -m two &&
|
||||
git tag -f tmaster master &&
|
||||
git push --mirror up
|
||||
) &&
|
||||
master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
master_add=$(cd master && git show-ref -s --verify refs/tags/tadd) &&
|
||||
mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
|
||||
mirror_add=$(cd mirror && git show-ref -s --verify refs/tags/tadd) &&
|
||||
test "$master_master" = "$mirror_master" &&
|
||||
test "$master_add" = "$mirror_add" &&
|
||||
(
|
||||
cd mirror &&
|
||||
invert git show-ref -s --verify refs/tags/tremove
|
||||
)
|
||||
|
||||
'
|
||||
|
||||
test_done
|
Reference in New Issue
Block a user