t / t3413-rebase-hook.shon commit Merge branch 'cb/maint-no-double-merge' (0a17b2c)
   1#!/bin/sh
   2
   3test_description='git rebase with its hook(s)'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8        echo hello >file &&
   9        git add file &&
  10        test_tick &&
  11        git commit -m initial &&
  12        echo goodbye >file &&
  13        git add file &&
  14        test_tick &&
  15        git commit -m second &&
  16        git checkout -b side HEAD^ &&
  17        echo world >git &&
  18        git add git &&
  19        test_tick &&
  20        git commit -m side &&
  21        git checkout master &&
  22        git log --pretty=oneline --abbrev-commit --graph --all &&
  23        git branch test side
  24'
  25
  26test_expect_success 'rebase' '
  27        git checkout test &&
  28        git reset --hard side &&
  29        git rebase master &&
  30        test "z$(cat git)" = zworld
  31'
  32
  33test_expect_success 'rebase -i' '
  34        git checkout test &&
  35        git reset --hard side &&
  36        EDITOR=true git rebase -i master &&
  37        test "z$(cat git)" = zworld
  38'
  39
  40test_expect_success 'setup pre-rebase hook' '
  41        mkdir -p .git/hooks &&
  42        cat >.git/hooks/pre-rebase <<EOF &&
  43#!$SHELL_PATH
  44echo "\$1,\$2" >.git/PRE-REBASE-INPUT
  45EOF
  46        chmod +x .git/hooks/pre-rebase
  47'
  48
  49test_expect_success 'pre-rebase hook gets correct input (1)' '
  50        git checkout test &&
  51        git reset --hard side &&
  52        git rebase master &&
  53        test "z$(cat git)" = zworld &&
  54        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,
  55
  56'
  57
  58test_expect_success 'pre-rebase hook gets correct input (2)' '
  59        git checkout test &&
  60        git reset --hard side &&
  61        git rebase master test &&
  62        test "z$(cat git)" = zworld &&
  63        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test
  64'
  65
  66test_expect_success 'pre-rebase hook gets correct input (3)' '
  67        git checkout test &&
  68        git reset --hard side &&
  69        git checkout master &&
  70        git rebase master test &&
  71        test "z$(cat git)" = zworld &&
  72        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test
  73'
  74
  75test_expect_success 'pre-rebase hook gets correct input (4)' '
  76        git checkout test &&
  77        git reset --hard side &&
  78        EDITOR=true git rebase -i master &&
  79        test "z$(cat git)" = zworld &&
  80        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,
  81
  82'
  83
  84test_expect_success 'pre-rebase hook gets correct input (5)' '
  85        git checkout test &&
  86        git reset --hard side &&
  87        EDITOR=true git rebase -i master test &&
  88        test "z$(cat git)" = zworld &&
  89        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test
  90'
  91
  92test_expect_success 'pre-rebase hook gets correct input (6)' '
  93        git checkout test &&
  94        git reset --hard side &&
  95        git checkout master &&
  96        EDITOR=true git rebase -i master test &&
  97        test "z$(cat git)" = zworld &&
  98        test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test
  99'
 100
 101test_expect_success 'setup pre-rebase hook that fails' '
 102        mkdir -p .git/hooks &&
 103        cat >.git/hooks/pre-rebase <<EOF &&
 104#!$SHELL_PATH
 105false
 106EOF
 107        chmod +x .git/hooks/pre-rebase
 108'
 109
 110test_expect_success 'pre-rebase hook stops rebase (1)' '
 111        git checkout test &&
 112        git reset --hard side &&
 113        test_must_fail git rebase master &&
 114        test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
 115        test 0 = $(git rev-list HEAD...side | wc -l)
 116'
 117
 118test_expect_success 'pre-rebase hook stops rebase (2)' '
 119        git checkout test &&
 120        git reset --hard side &&
 121        (
 122                EDITOR=:
 123                export EDITOR
 124                test_must_fail git rebase -i master
 125        ) &&
 126        test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
 127        test 0 = $(git rev-list HEAD...side | wc -l)
 128'
 129
 130test_expect_success 'rebase --no-verify overrides pre-rebase (1)' '
 131        git checkout test &&
 132        git reset --hard side &&
 133        git rebase --no-verify master &&
 134        test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
 135        test "z$(cat git)" = zworld
 136'
 137
 138test_expect_success 'rebase --no-verify overrides pre-rebase (2)' '
 139        git checkout test &&
 140        git reset --hard side &&
 141        EDITOR=true git rebase --no-verify -i master &&
 142        test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
 143        test "z$(cat git)" = zworld
 144'
 145
 146test_done