#!/bin/sh global test_description := ''Basic subproject functionality'' source ./test-lib.sh test_expect_success 'setup: create superproject' ' : >Makefile && git add Makefile && git commit -m "Superproject created" ' test_expect_success 'setup: 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 && git branch save HEAD && cat >expected <<-\EOF && :000000 160000 00000... A sub1 :000000 160000 00000... A sub2 EOF test_cmp expected current ' 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" ) && test_expect_code 1 git diff-files --exit-code ' test_expect_success 'check if a changed subproject HEAD can be committed' ' git commit -q -a -m "sub1 changed" && test_expect_code 1 git diff-tree --exit-code HEAD^ HEAD ' test_expect_success 'check if diff-index works for subproject elements' ' test_expect_code 1 git diff-index --exit-code --cached save -- sub1 ' test_expect_success 'check if diff-tree works for subproject elements' ' test_expect_code 1 git diff-tree --exit-code HEAD^ HEAD -- sub1 ' test_expect_success 'check if git diff works for subproject elements' ' test_expect_code 1 git diff --exit-code HEAD^ HEAD ' 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" && test_expect_code 1 git diff -M --name-status --exit-code HEAD^ HEAD ' # 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 (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Basic subproject functionality">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"setup: create superproject">)} { (SQ <"\n"> <"\t: >Makefile &&\n"> <"\tgit add Makefile &&\n"> <"\tgit commit -m \"Superproject created\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: create subprojects">)} { (SQ <"\n"> <"\tmkdir sub1 &&\n"> <"\t( cd sub1 && git init && : >Makefile && git add * &&\n"> <"\tgit commit -q -m \"subproject 1\" ) &&\n"> <"\tmkdir sub2 &&\n"> <"\t( cd sub2 && git init && : >Makefile && git add * &&\n"> <"\tgit commit -q -m \"subproject 2\" ) &&\n"> <"\tgit update-index --add sub1 &&\n"> <"\tgit add sub2 &&\n"> <"\tgit commit -q -m \"subprojects added\" &&\n"> <"\tgit diff-tree --abbrev=5 HEAD^ HEAD |cut -d\" \" -f-3,5- >current &&\n"> <"\tgit branch save HEAD &&\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\t:000000 160000 00000... A\tsub1\n"> <"\t:000000 160000 00000... A\tsub2\n"> <"\tEOF\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"check if fsck ignores the subprojects">)} {(SQ <"\n"> <"\tgit fsck --full\n">)} ) (C {(test_expect_success)} {(SQ <"check if commit in a subproject detected">)} { (SQ <"\n"> <"\t( cd sub1 &&\n"> <"\techo \"all:\" >>Makefile &&\n"> <"\techo \"\ttrue\" >>Makefile &&\n"> <"\tgit commit -q -a -m \"make all\" ) &&\n"> <"\ttest_expect_code 1 git diff-files --exit-code\n"> ) } ) (C {(test_expect_success)} {(SQ <"check if a changed subproject HEAD can be committed">)} { (SQ <"\n"> <"\tgit commit -q -a -m \"sub1 changed\" &&\n"> <"\ttest_expect_code 1 git diff-tree --exit-code HEAD^ HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"check if diff-index works for subproject elements">)} {(SQ <"\n"> <"\ttest_expect_code 1 git diff-index --exit-code --cached save -- sub1\n">)} ) (C {(test_expect_success)} {(SQ <"check if diff-tree works for subproject elements">)} {(SQ <"\n"> <"\ttest_expect_code 1 git diff-tree --exit-code HEAD^ HEAD -- sub1\n">)} ) (C {(test_expect_success)} {(SQ <"check if git diff works for subproject elements">)} {(SQ <"\n"> <"\ttest_expect_code 1 git diff --exit-code HEAD^ HEAD\n">)} ) (C {(test_expect_success)} {(SQ <"check if clone works">)} { (SQ <"\n"> <"\tgit ls-files -s >expected &&\n"> <"\tgit clone -l -s . cloned &&\n"> <"\t( cd cloned && git ls-files -s ) >current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"removing and adding subproject">)} { (SQ <"\n"> <"\tgit update-index --force-remove -- sub2 &&\n"> <"\tmv sub2 sub3 &&\n"> <"\tgit add sub3 &&\n"> <"\tgit commit -q -m \"renaming a subproject\" &&\n"> <"\ttest_expect_code 1 git diff -M --name-status --exit-code HEAD^ HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout in superproject">)} { (SQ <"\n"> <"\tgit checkout save &&\n"> <"\tgit diff-index --exit-code --raw --cached save -- sub1\n"> ) } ) (C {(test_done)}) ] )