251 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='basic work tree status reporting'
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| test_expect_success setup '
 | |
| 	git config --global advice.statusuoption false &&
 | |
| 	test_commit A &&
 | |
| 	test_commit B oneside added &&
 | |
| 	git checkout A^0 &&
 | |
| 	test_commit C oneside created
 | |
| '
 | |
| 
 | |
| test_expect_success 'A/A conflict' '
 | |
| 	git checkout B^0 &&
 | |
| 	test_must_fail git merge C
 | |
| '
 | |
| 
 | |
| test_expect_success 'Report path with conflict' '
 | |
| 	git diff --cached --name-status >actual &&
 | |
| 	echo "U	oneside" >expect &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'Report new path with conflict' '
 | |
| 	git diff --cached --name-status HEAD^ >actual &&
 | |
| 	echo "U	oneside" >expect &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'M/D conflict does not segfault' '
 | |
| 	cat >expect <<EOF &&
 | |
| On branch side
 | |
| You have unmerged paths.
 | |
|   (fix conflicts and run "git commit")
 | |
|   (use "git merge --abort" to abort the merge)
 | |
| 
 | |
| Unmerged paths:
 | |
|   (use "git add/rm <file>..." as appropriate to mark resolution)
 | |
| 	deleted by us:   foo
 | |
| 
 | |
| no changes added to commit (use "git add" and/or "git commit -a")
 | |
| EOF
 | |
| 	mkdir mdconflict &&
 | |
| 	(
 | |
| 		cd mdconflict &&
 | |
| 		git init &&
 | |
| 		test_commit initial foo "" &&
 | |
| 		test_commit modify foo foo &&
 | |
| 		git checkout -b side HEAD^ &&
 | |
| 		git rm foo &&
 | |
| 		git commit -m delete &&
 | |
| 		test_must_fail git merge master &&
 | |
| 		test_must_fail git commit --dry-run >../actual &&
 | |
| 		test_i18ncmp ../expect ../actual &&
 | |
| 		git status >../actual &&
 | |
| 		test_i18ncmp ../expect ../actual
 | |
| 	)
 | |
| '
 | |
| 
 | |
| test_expect_success 'rename & unmerged setup' '
 | |
| 	git rm -f -r . &&
 | |
| 	cat "$TEST_DIRECTORY/README" >ONE &&
 | |
| 	git add ONE &&
 | |
| 	test_tick &&
 | |
| 	git commit -m "One commit with ONE" &&
 | |
| 
 | |
| 	echo Modified >TWO &&
 | |
| 	cat ONE >>TWO &&
 | |
| 	cat ONE >>THREE &&
 | |
| 	git add TWO THREE &&
 | |
| 	sha1=$(git rev-parse :ONE) &&
 | |
| 	git rm --cached ONE &&
 | |
| 	(
 | |
| 		echo "100644 $sha1 1	ONE" &&
 | |
| 		echo "100644 $sha1 2	ONE" &&
 | |
| 		echo "100644 $sha1 3	ONE"
 | |
| 	) | git update-index --index-info &&
 | |
| 	echo Further >>THREE
 | |
| '
 | |
| 
 | |
| test_expect_success 'rename & unmerged status' '
 | |
| 	git status -suno >actual &&
 | |
| 	cat >expect <<-EOF &&
 | |
| 	UU ONE
 | |
| 	AM THREE
 | |
| 	A  TWO
 | |
| 	EOF
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git diff-index --cached shows 2 added + 1 unmerged' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	U	ONE
 | |
| 	A	THREE
 | |
| 	A	TWO
 | |
| 	EOF
 | |
| 	git diff-index --cached --name-status HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git diff-index --cached -M shows 2 added + 1 unmerged' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	U	ONE
 | |
| 	A	THREE
 | |
| 	A	TWO
 | |
| 	EOF
 | |
| 	git diff-index --cached -M --name-status HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'git diff-index --cached -C shows 2 copies + 1 unmerged' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	U	ONE
 | |
| 	C	ONE	THREE
 | |
| 	C	ONE	TWO
 | |
| 	EOF
 | |
| 	git diff-index --cached -C --name-status HEAD |
 | |
| 	sed "s/^C[0-9]*/C/g" >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| 
 | |
| test_expect_success 'status when conflicts with add and rm advice (deleted by them)' '
 | |
| 	git reset --hard &&
 | |
| 	git checkout master &&
 | |
| 	test_commit init main.txt init &&
 | |
| 	git checkout -b second_branch &&
 | |
| 	git rm main.txt &&
 | |
| 	git commit -m "main.txt deleted on second_branch" &&
 | |
| 	test_commit second conflict.txt second &&
 | |
| 	git checkout master &&
 | |
| 	test_commit on_second main.txt on_second &&
 | |
| 	test_commit master conflict.txt master &&
 | |
| 	test_must_fail git merge second_branch &&
 | |
| 	cat >expected <<\EOF &&
 | |
| On branch master
 | |
| You have unmerged paths.
 | |
|   (fix conflicts and run "git commit")
 | |
|   (use "git merge --abort" to abort the merge)
 | |
| 
 | |
| Unmerged paths:
 | |
|   (use "git add/rm <file>..." as appropriate to mark resolution)
 | |
| 	both added:      conflict.txt
 | |
| 	deleted by them: main.txt
 | |
| 
 | |
| no changes added to commit (use "git add" and/or "git commit -a")
 | |
| EOF
 | |
| 	git status --untracked-files=no >actual &&
 | |
| 	test_i18ncmp expected actual
 | |
| '
 | |
| 
 | |
| 
 | |
| test_expect_success 'prepare for conflicts' '
 | |
| 	git reset --hard &&
 | |
| 	git checkout -b conflict &&
 | |
| 	test_commit one main.txt one &&
 | |
| 	git branch conflict_second &&
 | |
| 	git mv main.txt sub_master.txt &&
 | |
| 	git commit -m "main.txt renamed in sub_master.txt" &&
 | |
| 	git checkout conflict_second &&
 | |
| 	git mv main.txt sub_second.txt &&
 | |
| 	git commit -m "main.txt renamed in sub_second.txt"
 | |
| '
 | |
| 
 | |
| 
 | |
| test_expect_success 'status when conflicts with add and rm advice (both deleted)' '
 | |
| 	test_must_fail git merge conflict &&
 | |
| 	cat >expected <<\EOF &&
 | |
| On branch conflict_second
 | |
| You have unmerged paths.
 | |
|   (fix conflicts and run "git commit")
 | |
|   (use "git merge --abort" to abort the merge)
 | |
| 
 | |
| Unmerged paths:
 | |
|   (use "git add/rm <file>..." as appropriate to mark resolution)
 | |
| 	both deleted:    main.txt
 | |
| 	added by them:   sub_master.txt
 | |
| 	added by us:     sub_second.txt
 | |
| 
 | |
| no changes added to commit (use "git add" and/or "git commit -a")
 | |
| EOF
 | |
| 	git status --untracked-files=no >actual &&
 | |
| 	test_i18ncmp expected actual
 | |
| '
 | |
| 
 | |
| 
 | |
| test_expect_success 'status when conflicts with only rm advice (both deleted)' '
 | |
| 	git reset --hard conflict_second &&
 | |
| 	test_must_fail git merge conflict &&
 | |
| 	git add sub_master.txt &&
 | |
| 	git add sub_second.txt &&
 | |
| 	cat >expected <<\EOF &&
 | |
| On branch conflict_second
 | |
| You have unmerged paths.
 | |
|   (fix conflicts and run "git commit")
 | |
|   (use "git merge --abort" to abort the merge)
 | |
| 
 | |
| Changes to be committed:
 | |
| 	new file:   sub_master.txt
 | |
| 
 | |
| Unmerged paths:
 | |
|   (use "git rm <file>..." to mark resolution)
 | |
| 	both deleted:    main.txt
 | |
| 
 | |
| Untracked files not listed (use -u option to show untracked files)
 | |
| EOF
 | |
| 	git status --untracked-files=no >actual &&
 | |
| 	test_i18ncmp expected actual &&
 | |
| 	git reset --hard &&
 | |
| 	git checkout master
 | |
| '
 | |
| 
 | |
| test_expect_success 'status --branch with detached HEAD' '
 | |
| 	git reset --hard &&
 | |
| 	git checkout master^0 &&
 | |
| 	git status --branch --porcelain >actual &&
 | |
| 	cat >expected <<-EOF &&
 | |
| 	## HEAD (no branch)
 | |
| 	?? .gitconfig
 | |
| 	?? actual
 | |
| 	?? expect
 | |
| 	?? expected
 | |
| 	?? mdconflict/
 | |
| 	EOF
 | |
| 	test_i18ncmp expected actual
 | |
| '
 | |
| 
 | |
| ## Duplicate the above test and verify --porcelain=v1 arg parsing.
 | |
| test_expect_success 'status --porcelain=v1 --branch with detached HEAD' '
 | |
| 	git reset --hard &&
 | |
| 	git checkout master^0 &&
 | |
| 	git status --branch --porcelain=v1 >actual &&
 | |
| 	cat >expected <<-EOF &&
 | |
| 	## HEAD (no branch)
 | |
| 	?? .gitconfig
 | |
| 	?? actual
 | |
| 	?? expect
 | |
| 	?? expected
 | |
| 	?? mdconflict/
 | |
| 	EOF
 | |
| 	test_i18ncmp expected actual
 | |
| '
 | |
| 
 | |
| ## Verify parser error on invalid --porcelain argument.
 | |
| test_expect_success 'status --porcelain=bogus' '
 | |
| 	test_must_fail git status --porcelain=bogus
 | |
| '
 | |
| 
 | |
| test_done
 |