#!/bin/sh

test_description='Basic subproject functionality'
. ./test-lib.sh

test_expect_success 'Super project creation' \
    ': >Makefile &&
    git add Makefile &&
    git commit -m "Superproject created"'


cat >expected <<EOF
:000000 160000 00000... A	sub1
:000000 160000 00000... A	sub2
EOF
test_expect_success 'create subprojects' \
    'mkdir sub1 &&
    ( cd sub1 && git init && : >Makefile && git add * &&
    git commit -q -m "subproject 1" ) &&
    mkdir sub2 &&
    ( cd sub2 && git init && : >Makefile && git add * &&
    git commit -q -m "subproject 2" ) &&
    git update-index --add sub1 &&
    git add sub2 &&
    git commit -q -m "subprojects added" &&
    git diff-tree --abbrev=5 HEAD^ HEAD |cut -d" " -f-3,5- >current &&
    test_cmp expected current'

git branch save HEAD

test_expect_success 'check if fsck ignores the subprojects' \
    'git fsck --full'

test_expect_success 'check if commit in a subproject detected' \
    '( cd sub1 &&
    echo "all:" >>Makefile &&
    echo "	true" >>Makefile &&
    git commit -q -a -m "make all" ) && {
        git diff-files --exit-code
	test $? = 1
    }'

test_expect_success 'check if a changed subproject HEAD can be committed' \
    'git commit -q -a -m "sub1 changed" && {
	git diff-tree --exit-code HEAD^ HEAD
	test $? = 1
    }'

test_expect_success 'check if diff-index works for subproject elements' \
    'git diff-index --exit-code --cached save -- sub1
    test $? = 1'

test_expect_success 'check if diff-tree works for subproject elements' \
    'git diff-tree --exit-code HEAD^ HEAD -- sub1
    test $? = 1'

test_expect_success 'check if git diff works for subproject elements' \
    'git diff --exit-code HEAD^ HEAD
    test $? = 1'

test_expect_success 'check if clone works' \
    'git ls-files -s >expected &&
    git clone -l -s . cloned &&
    ( cd cloned && git ls-files -s ) >current &&
    test_cmp expected current'

test_expect_success 'removing and adding subproject' \
    'git update-index --force-remove -- sub2 &&
    mv sub2 sub3 &&
    git add sub3 &&
    git commit -q -m "renaming a subproject" && {
	git diff -M --name-status --exit-code HEAD^ HEAD
	test $? = 1
    }'

# the index must contain the object name the HEAD of the
# subproject sub1 was at the point "save"
test_expect_success 'checkout in superproject' \
    'git checkout save &&
    git diff-index --exit-code --raw --cached save -- sub1'

# just interesting what happened...
# git diff --name-status -M save master

test_done
