#!/bin/sh
test_description='test wildcards and literals with git add/commit (subshell style)'

. ./test-lib.sh

test_have_prereq BSLASHPSPEC || {
	skip_all='skipping: needs BSLASHPSPEC (backslashes in pathspecs)'
	test_done
}

prepare_test_files () {
	for f in "*" "**" "?" "[abc]" "a" "f*" "f**" "f?z" "foo*bar" "hello?world" "hello_world"
	do
		>"$f" || return
	done
}

test_expect_success 'add wildcard *' '
	git init test-asterisk &&
	(
		cd test-asterisk &&
		prepare_test_files &&
		git add "*" &&
		cat >expect <<-EOF &&
		*
		**
		?
		[abc]
		a
		f*
		f**
		f?z
		foo*bar
		hello?world
		hello_world
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal \*' '
	git init test-asterisk-literal &&
	(
		cd test-asterisk-literal &&
		prepare_test_files &&
		git add "\*" &&
		cat >expect <<-EOF &&
		*
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard **' '
	git init test-dstar &&
	(
		cd test-dstar &&
		prepare_test_files &&
		git add "**" &&
		cat >expect <<-EOF &&
		*
		**
		?
		[abc]
		a
		f*
		f**
		f?z
		foo*bar
		hello?world
		hello_world
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard ?' '
	git init test-qmark &&
	(
		cd test-qmark &&
		prepare_test_files &&
		git add "?" &&
		cat >expect <<-\EOF | sort &&
		*
		?
		a
		EOF
		git ls-files | sort >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard [abc]' '
	git init test-brackets &&
	(
		cd test-brackets &&
		prepare_test_files &&
		git add "[abc]" &&
		cat >expect <<-\EOF | sort &&
		[abc]
		a
		EOF
		git ls-files | sort >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard f*' '
	git init test-f-wild &&
	(
		cd test-f-wild &&
		prepare_test_files &&
		git add "f*" &&
		cat >expect <<-\EOF | sort &&
		f*
		f**
		f?z
		foo*bar
		EOF
		git ls-files | sort >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal f\*' '
	git init test-f-lit &&
	(
		cd test-f-lit &&
		prepare_test_files &&
		git add "f\*" &&
		cat >expect <<-\EOF &&
		f*
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard f**' '
	git init test-fdstar &&
	(
		cd test-fdstar &&
		prepare_test_files &&
		git add "f**" &&
		cat >expect <<-\EOF | sort &&
		f*
		f**
		f?z
		foo*bar
		EOF
		git ls-files | sort >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal f\*\*' '
	git init test-fdstar-lit &&
	(
		cd test-fdstar-lit &&
		prepare_test_files &&
		git add "f\*\*" &&
		cat >expect <<-\EOF &&
		f**
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard f?z' '
	git init test-fqz &&
	(
		cd test-fqz &&
		prepare_test_files &&
		git add "f?z" &&
		cat >expect <<-\EOF &&
		f?z
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal \?' '
	git init test-q-lit &&
	(
		cd test-q-lit &&
		prepare_test_files &&
		git add "\?" &&
		cat >expect <<-\EOF &&
		?
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard foo*bar' '
	git init test-foobar &&
	(
		cd test-foobar &&
		prepare_test_files &&
		git add "foo*bar" &&
		cat >expect <<-\EOF &&
		foo*bar
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add wildcard hello?world' '
	git init test-hellowild &&
	(
		cd test-hellowild &&
		prepare_test_files &&
		git add "hello?world" &&
		cat >expect <<-\EOF &&
		hello?world
		hello_world
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal hello\?world' '
	git init test-hellolit &&
	(
		cd test-hellolit &&
		prepare_test_files &&
		git add "hello\?world" &&
		cat >expect <<-\EOF &&
		hello?world
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'add literal \[abc\]' '
	git init test-brackets-lit &&
	(
		cd test-brackets-lit &&
		prepare_test_files &&
		git add "\[abc\]" &&
		cat >expect <<-\EOF &&
		[abc]
		EOF
		git ls-files >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: wildcard *' '
	git init test-c-asterisk &&
	(
		cd test-c-asterisk &&
		prepare_test_files &&
		git add . &&
		git commit -m "c1" -- "*" &&
		cat >expect <<-EOF &&
		*
		**
		?
		[abc]
		a
		f*
		f**
		f?z
		foo*bar
		hello?world
		hello_world
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: literal \*' '
	git init test-c-asterisk-lit &&
	(
		cd test-c-asterisk-lit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c2" -- "\*" &&
		cat >expect <<-EOF &&
		*
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: wildcard f*' '
	git init test-c-fwild &&
	(
		cd test-c-fwild &&
		prepare_test_files &&
		git add . &&
		git commit -m "c3" -- "f*" &&
		cat >expect <<-EOF &&
		f*
		f**
		f?z
		foo*bar
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: literal f\*' '
	git init test-c-flit &&
	(
		cd test-c-flit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c4" -- "f\*" &&
		cat >expect <<-EOF &&
		f*
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: wildcard f**' '
	git init test-c-pathlimit &&
	(
		cd test-c-pathlimit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c5" -- "f**" &&
		cat >expect <<-EOF &&
		f*
		f**
		f?z
		foo*bar
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: literal f\*\*' '
	git init test-c-fdstar-lit &&
	(
		cd test-c-fdstar-lit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c6" -- "f\*\*" &&
		cat >expect <<-EOF &&
		f**
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: wildcard ?' '
	git init test-c-qwild &&
	(
		cd test-c-qwild &&
		prepare_test_files &&
		git add . &&
		git commit -m "c7" -- "?" &&
		cat >expect <<-EOF &&
		*
		?
		a
		EOF
		git ls-tree -r --name-only HEAD | sort >actual &&
		sort expect >expect.sorted &&
		test_cmp expect.sorted actual
	)
'

test_expect_success 'commit: literal \?' '
	git init test-c-qlit &&
	(
		cd test-c-qlit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c8" -- "\?" &&
		cat >expect <<-EOF &&
		?
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'commit: wildcard hello?world' '
	git init test-c-hellowild &&
	(
		cd test-c-hellowild &&
		prepare_test_files &&
		git add . &&
		git commit -m "c9" -- "hello?world"  &&
		cat >expect <<-EOF &&
		hello?world
		hello_world
		EOF
		git ls-tree -r --name-only HEAD | sort >actual &&
		sort expect >expect.sorted &&
		test_cmp expect.sorted actual
	)
'

test_expect_success 'commit: literal hello\?world' '
	git init test-c-hellolit &&
	(
		cd test-c-hellolit &&
		prepare_test_files &&
		git add . &&
		git commit -m "c10" -- "hello\?world" &&
		cat >expect <<-EOF &&
		hello?world
		EOF
		git ls-tree -r --name-only HEAD >actual &&
		test_cmp expect actual
	)
'

test_done
