3a2ae7b55d5da162c73156ebd5d05016ce32782d
1#!/bin/sh
2
3test_description='git rebase tests for -Xsubtree
4
5This test runs git rebase and tests the subtree strategy.
6'
7. ./test-lib.sh
8. "$TEST_DIRECTORY"/lib-rebase.sh
9
10commit_message() {
11 git log --pretty=format:%s -1 "$1"
12}
13
14# There are a few bugs in the rebase with regards to the subtree strategy, and
15# this test script tries to document them. First, the following commit history
16# is generated (the onelines are shown, time flows from left to right):
17#
18# master1 - master2 - master3
19# \
20# README ---------------------- Add subproject master - master4 - files_subtree/master5
21#
22# Where the merge moves the files master[123].t into the subdirectory
23# files_subtree/ and master4 as well as files_subtree/master5 add files to that
24# directory directly.
25#
26# Then, in subsequent test cases, `git filter-branch` is used to distill just
27# the commits that touch files_subtree/. To give it a final pre-rebase touch,
28# an empty commit is added on top. The pre-rebase commit history looks like
29# this:
30#
31# Add subproject master - master4 - files_subtree/master5 - Empty commit
32#
33# where the root commit adds three files: master1.t, master2.t and master3.t.
34#
35# This commit history is then rebased onto `master3` with the
36# `-Xsubtree=files_subtree` option in three different ways:
37#
38# 1. using `--preserve-merges`
39# 2. using `--preserve-merges` and --keep-empty
40# 3. without specifying a rebase backend
41
42test_expect_success 'setup' '
43 test_commit README &&
44 mkdir files &&
45 (
46 cd files &&
47 git init &&
48 test_commit master1 &&
49 test_commit master2 &&
50 test_commit master3
51 ) &&
52 git fetch files master &&
53 git branch files-master FETCH_HEAD &&
54 git read-tree --prefix=files_subtree files-master &&
55 git checkout -- files_subtree &&
56 tree=$(git write-tree) &&
57 head=$(git rev-parse HEAD) &&
58 rev=$(git rev-parse --verify files-master^0) &&
59 commit=$(git commit-tree -p $head -p $rev -m "Add subproject master" $tree) &&
60 git update-ref HEAD $commit &&
61 (
62 cd files_subtree &&
63 test_commit master4
64 ) &&
65 test_commit files_subtree/master5
66'
67
68# FAILURE: Does not preserve master4.
69test_expect_failure REBASE_P \
70 'Rebase -Xsubtree --preserve-merges --onto commit 4' '
71 reset_rebase &&
72 git checkout -b rebase-preserve-merges-4 master &&
73 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
74 git commit -m "Empty commit" --allow-empty &&
75 git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master &&
76 verbose test "$(commit_message HEAD~)" = "files_subtree/master4"
77'
78
79# FAILURE: Does not preserve master5.
80test_expect_failure REBASE_P \
81 'Rebase -Xsubtree --preserve-merges --onto commit 5' '
82 reset_rebase &&
83 git checkout -b rebase-preserve-merges-5 master &&
84 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
85 git commit -m "Empty commit" --allow-empty &&
86 git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master &&
87 verbose test "$(commit_message HEAD)" = "files_subtree/master5"
88'
89
90# FAILURE: Does not preserve master4.
91test_expect_failure REBASE_P \
92 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 4' '
93 reset_rebase &&
94 git checkout -b rebase-keep-empty-4 master &&
95 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
96 git commit -m "Empty commit" --allow-empty &&
97 git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
98 verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
99'
100
101# FAILURE: Does not preserve master5.
102test_expect_failure REBASE_P \
103 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 5' '
104 reset_rebase &&
105 git checkout -b rebase-keep-empty-5 master &&
106 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
107 git commit -m "Empty commit" --allow-empty &&
108 git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
109 verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
110'
111
112# FAILURE: Does not preserve Empty.
113test_expect_failure REBASE_P \
114 'Rebase -Xsubtree --keep-empty --preserve-merges --onto empty commit' '
115 reset_rebase &&
116 git checkout -b rebase-keep-empty-empty master &&
117 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
118 git commit -m "Empty commit" --allow-empty &&
119 git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
120 verbose test "$(commit_message HEAD)" = "Empty commit"
121'
122
123# FAILURE: fatal: Could not parse object
124test_expect_failure 'Rebase -Xsubtree --onto commit 4' '
125 reset_rebase &&
126 git checkout -b rebase-onto-4 master &&
127 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
128 git commit -m "Empty commit" --allow-empty &&
129 git rebase -Xsubtree=files_subtree --onto files-master master &&
130 verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
131'
132
133# FAILURE: fatal: Could not parse object
134test_expect_failure 'Rebase -Xsubtree --onto commit 5' '
135 reset_rebase &&
136 git checkout -b rebase-onto-5 master &&
137 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
138 git commit -m "Empty commit" --allow-empty &&
139 git rebase -Xsubtree=files_subtree --onto files-master master &&
140 verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
141'
142# FAILURE: fatal: Could not parse object
143test_expect_failure 'Rebase -Xsubtree --onto empty commit' '
144 reset_rebase &&
145 git checkout -b rebase-onto-empty master &&
146 git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
147 git commit -m "Empty commit" --allow-empty &&
148 git rebase -Xsubtree=files_subtree --onto files-master master &&
149 verbose test "$(commit_message HEAD)" = "Empty commit"
150'
151
152test_done