diff options
Diffstat (limited to 'third_party/git/t/t6050-replace.sh')
-rwxr-xr-x | third_party/git/t/t6050-replace.sh | 507 |
1 files changed, 0 insertions, 507 deletions
diff --git a/third_party/git/t/t6050-replace.sh b/third_party/git/t/t6050-replace.sh deleted file mode 100755 index c80dc10b8f12..000000000000 --- a/third_party/git/t/t6050-replace.sh +++ /dev/null @@ -1,507 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2008 Christian Couder -# -test_description='Tests replace refs functionality' - -. ./test-lib.sh -. "$TEST_DIRECTORY/lib-gpg.sh" - -add_and_commit_file () -{ - _file="$1" - _msg="$2" - - git add $_file || return $? - test_tick || return $? - git commit --quiet -m "$_file: $_msg" -} - -commit_buffer_contains_parents () -{ - git cat-file commit "$1" >payload && - sed -n -e '/^$/q' -e '/^parent /p' <payload >actual && - shift && - for _parent - do - echo "parent $_parent" - done >expected && - test_cmp expected actual -} - -commit_peeling_shows_parents () -{ - _parent_number=1 - _commit="$1" - shift && - for _parent - do - _found=$(git rev-parse --verify $_commit^$_parent_number) || return 1 - test "$_found" = "$_parent" || return 1 - _parent_number=$(( $_parent_number + 1 )) - done && - test_must_fail git rev-parse --verify $_commit^$_parent_number 2>err && - test_i18ngrep "Needed a single revision" err -} - -commit_has_parents () -{ - commit_buffer_contains_parents "$@" && - commit_peeling_shows_parents "$@" -} - -HASH1= -HASH2= -HASH3= -HASH4= -HASH5= -HASH6= -HASH7= - -test_expect_success 'set up buggy branch' ' - echo "line 1" >>hello && - echo "line 2" >>hello && - echo "line 3" >>hello && - echo "line 4" >>hello && - add_and_commit_file hello "4 lines" && - HASH1=$(git rev-parse --verify HEAD) && - echo "line BUG" >>hello && - echo "line 6" >>hello && - echo "line 7" >>hello && - echo "line 8" >>hello && - add_and_commit_file hello "4 more lines with a BUG" && - HASH2=$(git rev-parse --verify HEAD) && - echo "line 9" >>hello && - echo "line 10" >>hello && - add_and_commit_file hello "2 more lines" && - HASH3=$(git rev-parse --verify HEAD) && - echo "line 11" >>hello && - add_and_commit_file hello "1 more line" && - HASH4=$(git rev-parse --verify HEAD) && - sed -e "s/BUG/5/" hello >hello.new && - mv hello.new hello && - add_and_commit_file hello "BUG fixed" && - HASH5=$(git rev-parse --verify HEAD) && - echo "line 12" >>hello && - echo "line 13" >>hello && - add_and_commit_file hello "2 more lines" && - HASH6=$(git rev-parse --verify HEAD) && - echo "line 14" >>hello && - echo "line 15" >>hello && - echo "line 16" >>hello && - add_and_commit_file hello "again 3 more lines" && - HASH7=$(git rev-parse --verify HEAD) -' - -test_expect_success 'replace the author' ' - git cat-file commit $HASH2 | grep "author A U Thor" && - R=$(git cat-file commit $HASH2 | sed -e "s/A U/O/" | git hash-object -t commit --stdin -w) && - git cat-file commit $R | grep "author O Thor" && - git update-ref refs/replace/$HASH2 $R && - git show HEAD~5 | grep "O Thor" && - git show $HASH2 | grep "O Thor" -' - -test_expect_success 'test --no-replace-objects option' ' - git cat-file commit $HASH2 | grep "author O Thor" && - git --no-replace-objects cat-file commit $HASH2 | grep "author A U Thor" && - git show $HASH2 | grep "O Thor" && - git --no-replace-objects show $HASH2 | grep "A U Thor" -' - -test_expect_success 'test GIT_NO_REPLACE_OBJECTS env variable' ' - GIT_NO_REPLACE_OBJECTS=1 git cat-file commit $HASH2 | grep "author A U Thor" && - GIT_NO_REPLACE_OBJECTS=1 git show $HASH2 | grep "A U Thor" -' - -test_expect_success 'test core.usereplacerefs config option' ' - test_config core.usereplacerefs false && - git cat-file commit $HASH2 | grep "author A U Thor" && - git show $HASH2 | grep "A U Thor" -' - -cat >tag.sig <<EOF -object $HASH2 -type commit -tag mytag -tagger T A Gger <> 0 +0000 - -EOF - -test_expect_success 'tag replaced commit' ' - git mktag <tag.sig >.git/refs/tags/mytag 2>message -' - -test_expect_success '"git fsck" works' ' - git fsck master >fsck_master.out && - test_i18ngrep "dangling commit $R" fsck_master.out && - test_i18ngrep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_master.out && - test -z "$(git fsck)" -' - -test_expect_success 'repack, clone and fetch work' ' - git repack -a -d && - git clone --no-hardlinks . clone_dir && - ( - cd clone_dir && - git show HEAD~5 | grep "A U Thor" && - git show $HASH2 | grep "A U Thor" && - git cat-file commit $R && - git repack -a -d && - test_must_fail git cat-file commit $R && - git fetch ../ "refs/replace/*:refs/replace/*" && - git show HEAD~5 | grep "O Thor" && - git show $HASH2 | grep "O Thor" && - git cat-file commit $R - ) -' - -test_expect_success '"git replace" listing and deleting' ' - test "$HASH2" = "$(git replace -l)" && - test "$HASH2" = "$(git replace)" && - aa=${HASH2%??????????????????????????????????????} && - test "$HASH2" = "$(git replace --list "$aa*")" && - test_must_fail git replace -d $R && - test_must_fail git replace --delete && - test_must_fail git replace -l -d $HASH2 && - git replace -d $HASH2 && - git show $HASH2 | grep "A U Thor" && - test -z "$(git replace -l)" -' - -test_expect_success '"git replace" replacing' ' - git replace $HASH2 $R && - git show $HASH2 | grep "O Thor" && - test_must_fail git replace $HASH2 $R && - git replace -f $HASH2 $R && - test_must_fail git replace -f && - test "$HASH2" = "$(git replace)" -' - -test_expect_success '"git replace" resolves sha1' ' - SHORTHASH2=$(git rev-parse --short=8 $HASH2) && - git replace -d $SHORTHASH2 && - git replace $SHORTHASH2 $R && - git show $HASH2 | grep "O Thor" && - test_must_fail git replace $HASH2 $R && - git replace -f $HASH2 $R && - test_must_fail git replace --force && - test "$HASH2" = "$(git replace)" -' - -# This creates a side branch where the bug in H2 -# does not appear because P2 is created by applying -# H2 and squashing H5 into it. -# P3, P4 and P6 are created by cherry-picking H3, H4 -# and H6 respectively. -# -# At this point, we should have the following: -# -# P2--P3--P4--P6 -# / -# H1-H2-H3-H4-H5-H6-H7 -# -# Then we replace H6 with P6. -# -test_expect_success 'create parallel branch without the bug' ' - git replace -d $HASH2 && - git show $HASH2 | grep "A U Thor" && - git checkout $HASH1 && - git cherry-pick $HASH2 && - git show $HASH5 | git apply && - git commit --amend -m "hello: 4 more lines WITHOUT the bug" hello && - PARA2=$(git rev-parse --verify HEAD) && - git cherry-pick $HASH3 && - PARA3=$(git rev-parse --verify HEAD) && - git cherry-pick $HASH4 && - PARA4=$(git rev-parse --verify HEAD) && - git cherry-pick $HASH6 && - PARA6=$(git rev-parse --verify HEAD) && - git replace $HASH6 $PARA6 && - git checkout master && - cur=$(git rev-parse --verify HEAD) && - test "$cur" = "$HASH7" && - git log --pretty=oneline | grep $PARA2 && - git remote add cloned ./clone_dir -' - -test_expect_success 'push to cloned repo' ' - git push cloned $HASH6^:refs/heads/parallel && - ( - cd clone_dir && - git checkout parallel && - git log --pretty=oneline | grep $PARA2 - ) -' - -test_expect_success 'push branch with replacement' ' - git cat-file commit $PARA3 | grep "author A U Thor" && - S=$(git cat-file commit $PARA3 | sed -e "s/A U/O/" | git hash-object -t commit --stdin -w) && - git cat-file commit $S | grep "author O Thor" && - git replace $PARA3 $S && - git show $HASH6~2 | grep "O Thor" && - git show $PARA3 | grep "O Thor" && - git push cloned $HASH6^:refs/heads/parallel2 && - ( - cd clone_dir && - git checkout parallel2 && - git log --pretty=oneline | grep $PARA3 && - git show $PARA3 | grep "A U Thor" - ) -' - -test_expect_success 'fetch branch with replacement' ' - git branch tofetch $HASH6 && - ( - cd clone_dir && - git fetch origin refs/heads/tofetch:refs/heads/parallel3 && - git log --pretty=oneline parallel3 >output.txt && - ! grep $PARA3 output.txt && - git show $PARA3 >para3.txt && - grep "A U Thor" para3.txt && - git fetch origin "refs/replace/*:refs/replace/*" && - git log --pretty=oneline parallel3 >output.txt && - grep $PARA3 output.txt && - git show $PARA3 >para3.txt && - grep "O Thor" para3.txt - ) -' - -test_expect_success 'bisect and replacements' ' - git bisect start $HASH7 $HASH1 && - test "$PARA3" = "$(git rev-parse --verify HEAD)" && - git bisect reset && - GIT_NO_REPLACE_OBJECTS=1 git bisect start $HASH7 $HASH1 && - test "$HASH4" = "$(git rev-parse --verify HEAD)" && - git bisect reset && - git --no-replace-objects bisect start $HASH7 $HASH1 && - test "$HASH4" = "$(git rev-parse --verify HEAD)" && - git bisect reset -' - -test_expect_success 'index-pack and replacements' ' - git --no-replace-objects rev-list --objects HEAD | - git --no-replace-objects pack-objects test- && - git index-pack test-*.pack -' - -test_expect_success 'not just commits' ' - echo replaced >file && - git add file && - REPLACED=$(git rev-parse :file) && - mv file file.replaced && - - echo original >file && - git add file && - ORIGINAL=$(git rev-parse :file) && - git update-ref refs/replace/$ORIGINAL $REPLACED && - mv file file.original && - - git checkout file && - test_cmp file.replaced file -' - -test_expect_success 'replaced and replacement objects must be of the same type' ' - test_must_fail git replace mytag $HASH1 && - test_must_fail git replace HEAD^{tree} HEAD~1 && - BLOB=$(git rev-parse :file) && - test_must_fail git replace HEAD^ $BLOB -' - -test_expect_success '-f option bypasses the type check' ' - git replace -f mytag $HASH1 && - git replace --force HEAD^{tree} HEAD~1 && - git replace -f HEAD^ $BLOB -' - -test_expect_success 'git cat-file --batch works on replace objects' ' - git replace | grep $PARA3 && - echo $PARA3 | git cat-file --batch -' - -test_expect_success 'test --format bogus' ' - test_must_fail git replace --format bogus >/dev/null 2>&1 -' - -test_expect_success 'test --format short' ' - git replace --format=short >actual && - git replace >expected && - test_cmp expected actual -' - -test_expect_success 'test --format medium' ' - H1=$(git --no-replace-objects rev-parse HEAD~1) && - HT=$(git --no-replace-objects rev-parse HEAD^{tree}) && - MYTAG=$(git --no-replace-objects rev-parse mytag) && - { - echo "$H1 -> $BLOB" && - echo "$BLOB -> $REPLACED" && - echo "$HT -> $H1" && - echo "$PARA3 -> $S" && - echo "$MYTAG -> $HASH1" - } | sort >expected && - git replace -l --format medium | sort >actual && - test_cmp expected actual -' - -test_expect_success 'test --format long' ' - { - echo "$H1 (commit) -> $BLOB (blob)" && - echo "$BLOB (blob) -> $REPLACED (blob)" && - echo "$HT (tree) -> $H1 (commit)" && - echo "$PARA3 (commit) -> $S (commit)" && - echo "$MYTAG (tag) -> $HASH1 (commit)" - } | sort >expected && - git replace --format=long | sort >actual && - test_cmp expected actual -' - -test_expect_success 'setup fake editors' ' - write_script fakeeditor <<-\EOF && - sed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new" - mv "$1.new" "$1" - EOF - write_script failingfakeeditor <<-\EOF - ./fakeeditor "$@" - false - EOF -' - -test_expect_success '--edit with and without already replaced object' ' - test_must_fail env GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" && - GIT_EDITOR=./fakeeditor git replace --force --edit "$PARA3" && - git replace -l | grep "$PARA3" && - git cat-file commit "$PARA3" | grep "A fake Thor" && - git replace -d "$PARA3" && - GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" && - git replace -l | grep "$PARA3" && - git cat-file commit "$PARA3" | grep "A fake Thor" -' - -test_expect_success '--edit and change nothing or command failed' ' - git replace -d "$PARA3" && - test_must_fail env GIT_EDITOR=true git replace --edit "$PARA3" && - test_must_fail env GIT_EDITOR="./failingfakeeditor" git replace --edit "$PARA3" && - GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" && - git replace -l | grep "$PARA3" && - git cat-file commit "$PARA3" | grep "A fake Thor" -' - -test_expect_success 'replace ref cleanup' ' - test -n "$(git replace)" && - git replace -d $(git replace) && - test -z "$(git replace)" -' - -test_expect_success '--graft with and without already replaced object' ' - git log --oneline >log && - test_line_count = 7 log && - git replace --graft $HASH5 && - git log --oneline >log && - test_line_count = 3 log && - commit_has_parents $HASH5 && - test_must_fail git replace --graft $HASH5 $HASH4 $HASH3 && - git replace --force -g $HASH5 $HASH4 $HASH3 && - commit_has_parents $HASH5 $HASH4 $HASH3 && - git replace -d $HASH5 -' - -test_expect_success '--graft using a tag as the new parent' ' - git tag new_parent $HASH5 && - git replace --graft $HASH7 new_parent && - commit_has_parents $HASH7 $HASH5 && - git replace -d $HASH7 && - git tag -a -m "annotated new parent tag" annotated_new_parent $HASH5 && - git replace --graft $HASH7 annotated_new_parent && - commit_has_parents $HASH7 $HASH5 && - git replace -d $HASH7 -' - -test_expect_success '--graft using a tag as the replaced object' ' - git tag replaced_object $HASH7 && - git replace --graft replaced_object $HASH5 && - commit_has_parents $HASH7 $HASH5 && - git replace -d $HASH7 && - git tag -a -m "annotated replaced object tag" annotated_replaced_object $HASH7 && - git replace --graft annotated_replaced_object $HASH5 && - commit_has_parents $HASH7 $HASH5 && - git replace -d $HASH7 -' - -test_expect_success GPG 'set up a signed commit' ' - echo "line 17" >>hello && - echo "line 18" >>hello && - git add hello && - test_tick && - git commit --quiet -S -m "hello: 2 more lines in a signed commit" && - HASH8=$(git rev-parse --verify HEAD) && - git verify-commit $HASH8 -' - -test_expect_success GPG '--graft with a signed commit' ' - git cat-file commit $HASH8 >orig && - git replace --graft $HASH8 && - git cat-file commit $HASH8 >repl && - commit_has_parents $HASH8 && - test_must_fail git verify-commit $HASH8 && - sed -n -e "/^tree /p" -e "/^author /p" -e "/^committer /p" orig >expected && - echo >>expected && - sed -e "/^$/q" repl >actual && - test_cmp expected actual && - git replace -d $HASH8 -' - -test_expect_success GPG 'set up a merge commit with a mergetag' ' - git reset --hard HEAD && - git checkout -b test_branch HEAD~2 && - echo "line 1 from test branch" >>hello && - echo "line 2 from test branch" >>hello && - git add hello && - test_tick && - git commit -m "hello: 2 more lines from a test branch" && - HASH9=$(git rev-parse --verify HEAD) && - git tag -s -m "tag for testing with a mergetag" test_tag HEAD && - git checkout master && - git merge -s ours test_tag && - HASH10=$(git rev-parse --verify HEAD) && - git cat-file commit $HASH10 | grep "^mergetag object" -' - -test_expect_success GPG '--graft on a commit with a mergetag' ' - test_must_fail git replace --graft $HASH10 $HASH8^1 && - git replace --graft $HASH10 $HASH8^1 $HASH9 && - git replace -d $HASH10 -' - -test_expect_success '--convert-graft-file' ' - git checkout -b with-graft-file && - test_commit root2 && - git reset --hard root2^ && - test_commit root1 && - test_commit after-root1 && - test_tick && - git merge -m merge-root2 root2 && - - : add and convert graft file && - printf "%s\n%s %s\n\n# comment\n%s\n" \ - $(git rev-parse HEAD^^ HEAD^ HEAD^^ HEAD^2) \ - >.git/info/grafts && - git status 2>stderr && - test_i18ngrep "hint:.*grafts is deprecated" stderr && - git replace --convert-graft-file 2>stderr && - test_i18ngrep ! "hint:.*grafts is deprecated" stderr && - test_path_is_missing .git/info/grafts && - - : verify that the history is now "grafted" && - git rev-list HEAD >out && - test_line_count = 4 out && - - : create invalid graft file and verify that it is not deleted && - test_when_finished "rm -f .git/info/grafts" && - echo $EMPTY_BLOB $EMPTY_TREE >.git/info/grafts && - test_must_fail git replace --convert-graft-file 2>err && - test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" err && - test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" .git/info/grafts -' - -test_done |