Skip to content

Commit

Permalink
Ignore dirty submodule states during rebase and stash
Browse files Browse the repository at this point in the history
When rebasing or stashing, chances are that you do not care about
dirty submodules, since they are not updated by those actions anyway.
So ignore the submodules' states.

Note: the submodule states -- as committed in the superproject --
will still be stashed and rebased, it is _just_ the state of the
submodule in the working tree which is ignored.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed May 15, 2008
1 parent 5fdeacb commit 6848d58
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 12 deletions.
11 changes: 6 additions & 5 deletions git-rebase--interactive.sh
Expand Up @@ -56,9 +56,9 @@ output () {
require_clean_work_tree () {
# test if working tree is dirty
git rev-parse --verify HEAD > /dev/null &&
git update-index --refresh &&
git diff-files --quiet &&
git diff-index --cached --quiet HEAD -- ||
git update-index --ignore-submodules --refresh &&
git diff-files --quiet --ignore-submodules &&
git diff-index --cached --quiet HEAD --ignore-submodules -- ||
die "Working tree is dirty"
}

Expand Down Expand Up @@ -377,11 +377,12 @@ do
# Sanity check
git rev-parse --verify HEAD >/dev/null ||
die "Cannot read HEAD"
git update-index --refresh && git diff-files --quiet ||
git update-index --ignore-submodules --refresh &&
git diff-files --quiet --ignore-submodules ||
die "Working tree is dirty"

# do we have anything to commit?
if git diff-index --cached --quiet HEAD --
if git diff-index --cached --quiet --ignore-submodules HEAD --
then
: Nothing to commit -- skip this
else
Expand Down
8 changes: 4 additions & 4 deletions git-rebase.sh
Expand Up @@ -60,7 +60,7 @@ continue_merge () {
fi

cmt=`cat "$dotest/current"`
if ! git diff-index --quiet HEAD --
if ! git diff-index --quiet --ignore-submodules HEAD --
then
if ! git commit --no-verify -C "$cmt"
then
Expand Down Expand Up @@ -150,7 +150,7 @@ while test $# != 0
do
case "$1" in
--continue)
git diff-files --quiet || {
git diff-files --quiet --ignore-submodules || {
echo "You must edit all merge conflicts and then"
echo "mark them as resolved using git add"
exit 1
Expand Down Expand Up @@ -282,8 +282,8 @@ else
fi

# The tree must be really really clean.
git update-index --refresh || exit
diff=$(git diff-index --cached --name-status -r HEAD --)
git update-index --ignore-submodules --refresh || exit
diff=$(git diff-index --cached --name-status -r --ignore-submodules HEAD --)
case "$diff" in
?*) echo "cannot rebase: your index is not up-to-date"
echo "$diff"
Expand Down
6 changes: 3 additions & 3 deletions git-stash.sh
Expand Up @@ -15,8 +15,8 @@ trap 'rm -f "$TMP-*"' 0
ref_stash=refs/stash

no_changes () {
git diff-index --quiet --cached HEAD -- &&
git diff-files --quiet
git diff-index --quiet --cached HEAD --ignore-submodules -- &&
git diff-files --quiet --ignore-submodules
}

clear_stash () {
Expand Down Expand Up @@ -130,7 +130,7 @@ show_stash () {
}

apply_stash () {
git diff-files --quiet ||
git diff-files --quiet --ignore-submodules ||
die 'Cannot restore on top of a dirty state'

unstash_index=
Expand Down
92 changes: 92 additions & 0 deletions t/t7402-submodule-rebase.sh
@@ -0,0 +1,92 @@
#!/bin/sh
#
# Copyright (c) 2008 Johannes Schindelin
#

test_description='Test rebasing and stashing with dirty submodules'

. ./test-lib.sh

test_expect_success setup '
echo file > file &&
git add file &&
test_tick &&
git commit -m initial &&
git clone . submodule &&
git add submodule &&
test_tick &&
git commit -m submodule &&
echo second line >> file &&
(cd submodule && git pull) &&
test_tick &&
git commit -m file-and-submodule -a
'

test_expect_success 'rebase with a dirty submodule' '
(cd submodule &&
echo 3rd line >> file &&
test_tick &&
git commit -m fork -a) &&
echo unrelated >> file2 &&
git add file2 &&
test_tick &&
git commit -m unrelated file2 &&
echo other line >> file &&
test_tick &&
git commit -m update file &&
CURRENT=$(cd submodule && git rev-parse HEAD) &&
EXPECTED=$(git rev-parse HEAD~2:submodule) &&
GIT_TRACE=1 git rebase --onto HEAD~2 HEAD^ &&
STORED=$(git rev-parse HEAD:submodule) &&
test $EXPECTED = $STORED &&
test $CURRENT = $(cd submodule && git rev-parse HEAD)
'

cat > fake-editor.sh << \EOF
#!/bin/sh
echo $EDITOR_TEXT
EOF
chmod a+x fake-editor.sh

test_expect_success 'interactive rebase with a dirty submodule' '
test submodule = $(git diff --name-only) &&
HEAD=$(git rev-parse HEAD) &&
GIT_EDITOR="\"$(pwd)/fake-editor.sh\"" EDITOR_TEXT="pick $HEAD" \
git rebase -i HEAD^ &&
test submodule = $(git diff --name-only)
'

test_expect_success 'rebase with dirty file and submodule fails' '
echo yet another line >> file &&
test_tick &&
git commit -m next file &&
echo rewrite > file &&
test_tick &&
git commit -m rewrite file &&
echo dirty > file &&
! git rebase --onto HEAD~2 HEAD^
'

test_expect_success 'stash with a dirty submodule' '
echo new > file &&
CURRENT=$(cd submodule && git rev-parse HEAD) &&
git stash &&
test new != $(cat file) &&
test submodule = $(git diff --name-only) &&
test $CURRENT = $(cd submodule && git rev-parse HEAD) &&
git stash apply &&
test new = $(cat file) &&
test $CURRENT = $(cd submodule && git rev-parse HEAD)
'

test_done

0 comments on commit 6848d58

Please sign in to comment.