331 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			331 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
#!/bin/sh
 | 
						|
 | 
						|
test_description='test for-each-refs usage of ref-filter APIs'
 | 
						|
 | 
						|
. ./test-lib.sh
 | 
						|
. "$TEST_DIRECTORY"/lib-gpg.sh
 | 
						|
 | 
						|
test_expect_success 'setup some history and refs' '
 | 
						|
	test_commit one &&
 | 
						|
	test_commit two &&
 | 
						|
	test_commit three &&
 | 
						|
	git checkout -b side &&
 | 
						|
	test_commit four &&
 | 
						|
	git tag -m "An annotated tag" annotated-tag &&
 | 
						|
	git tag -m "Annonated doubly" doubly-annotated-tag annotated-tag &&
 | 
						|
 | 
						|
	# Note that these "signed" tags might not actually be signed.
 | 
						|
	# Tests which care about the distinction should be marked
 | 
						|
	# with the GPG prereq.
 | 
						|
	if test_have_prereq GPG
 | 
						|
	then
 | 
						|
		sign=-s
 | 
						|
	else
 | 
						|
		sign=
 | 
						|
	fi &&
 | 
						|
	git tag $sign -m "A signed tag" signed-tag &&
 | 
						|
	git tag $sign -m "Signed doubly" doubly-signed-tag signed-tag &&
 | 
						|
 | 
						|
	git checkout master &&
 | 
						|
	git update-ref refs/odd/spot master
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'filtering with --points-at' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	refs/heads/master
 | 
						|
	refs/odd/spot
 | 
						|
	refs/tags/three
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname)" --points-at=master >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'check signed tags with --points-at' '
 | 
						|
	sed -e "s/Z$//" >expect <<-\EOF &&
 | 
						|
	refs/heads/side Z
 | 
						|
	refs/tags/annotated-tag four
 | 
						|
	refs/tags/four Z
 | 
						|
	refs/tags/signed-tag four
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'filtering with --merged' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	refs/heads/master
 | 
						|
	refs/odd/spot
 | 
						|
	refs/tags/one
 | 
						|
	refs/tags/three
 | 
						|
	refs/tags/two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname)" --merged=master >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'filtering with --no-merged' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	refs/heads/side
 | 
						|
	refs/tags/annotated-tag
 | 
						|
	refs/tags/doubly-annotated-tag
 | 
						|
	refs/tags/doubly-signed-tag
 | 
						|
	refs/tags/four
 | 
						|
	refs/tags/signed-tag
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname)" --no-merged=master >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'filtering with --contains' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	refs/heads/master
 | 
						|
	refs/heads/side
 | 
						|
	refs/odd/spot
 | 
						|
	refs/tags/annotated-tag
 | 
						|
	refs/tags/doubly-annotated-tag
 | 
						|
	refs/tags/doubly-signed-tag
 | 
						|
	refs/tags/four
 | 
						|
	refs/tags/signed-tag
 | 
						|
	refs/tags/three
 | 
						|
	refs/tags/two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname)" --contains=two >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success '%(color) must fail' '
 | 
						|
	test_must_fail git for-each-ref --format="%(color)%(refname)"
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'left alignment is default' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	refname is refs/heads/master  |refs/heads/master
 | 
						|
	refname is refs/heads/side    |refs/heads/side
 | 
						|
	refname is refs/odd/spot      |refs/odd/spot
 | 
						|
	refname is refs/tags/annotated-tag|refs/tags/annotated-tag
 | 
						|
	refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
 | 
						|
	refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
 | 
						|
	refname is refs/tags/four     |refs/tags/four
 | 
						|
	refname is refs/tags/one      |refs/tags/one
 | 
						|
	refname is refs/tags/signed-tag|refs/tags/signed-tag
 | 
						|
	refname is refs/tags/three    |refs/tags/three
 | 
						|
	refname is refs/tags/two      |refs/tags/two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'middle alignment' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	| refname is refs/heads/master |refs/heads/master
 | 
						|
	|  refname is refs/heads/side  |refs/heads/side
 | 
						|
	|   refname is refs/odd/spot   |refs/odd/spot
 | 
						|
	|refname is refs/tags/annotated-tag|refs/tags/annotated-tag
 | 
						|
	|refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
 | 
						|
	|refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
 | 
						|
	|  refname is refs/tags/four   |refs/tags/four
 | 
						|
	|   refname is refs/tags/one   |refs/tags/one
 | 
						|
	|refname is refs/tags/signed-tag|refs/tags/signed-tag
 | 
						|
	|  refname is refs/tags/three  |refs/tags/three
 | 
						|
	|   refname is refs/tags/two   |refs/tags/two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'right alignment' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	|  refname is refs/heads/master|refs/heads/master
 | 
						|
	|    refname is refs/heads/side|refs/heads/side
 | 
						|
	|      refname is refs/odd/spot|refs/odd/spot
 | 
						|
	|refname is refs/tags/annotated-tag|refs/tags/annotated-tag
 | 
						|
	|refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
 | 
						|
	|refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
 | 
						|
	|     refname is refs/tags/four|refs/tags/four
 | 
						|
	|      refname is refs/tags/one|refs/tags/one
 | 
						|
	|refname is refs/tags/signed-tag|refs/tags/signed-tag
 | 
						|
	|    refname is refs/tags/three|refs/tags/three
 | 
						|
	|      refname is refs/tags/two|refs/tags/two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
cat >expect <<-\EOF
 | 
						|
|       refname is refs/heads/master       |refs/heads/master
 | 
						|
|        refname is refs/heads/side        |refs/heads/side
 | 
						|
|         refname is refs/odd/spot         |refs/odd/spot
 | 
						|
|    refname is refs/tags/annotated-tag    |refs/tags/annotated-tag
 | 
						|
|refname is refs/tags/doubly-annotated-tag |refs/tags/doubly-annotated-tag
 | 
						|
|  refname is refs/tags/doubly-signed-tag  |refs/tags/doubly-signed-tag
 | 
						|
|        refname is refs/tags/four         |refs/tags/four
 | 
						|
|         refname is refs/tags/one         |refs/tags/one
 | 
						|
|     refname is refs/tags/signed-tag      |refs/tags/signed-tag
 | 
						|
|        refname is refs/tags/three        |refs/tags/three
 | 
						|
|         refname is refs/tags/two         |refs/tags/two
 | 
						|
EOF
 | 
						|
 | 
						|
test_align_permutations() {
 | 
						|
	while read -r option
 | 
						|
	do
 | 
						|
		test_expect_success "align:$option" '
 | 
						|
			git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual &&
 | 
						|
			test_cmp expect actual
 | 
						|
		'
 | 
						|
	done
 | 
						|
}
 | 
						|
 | 
						|
test_align_permutations <<-\EOF
 | 
						|
	middle,42
 | 
						|
	42,middle
 | 
						|
	position=middle,42
 | 
						|
	42,position=middle
 | 
						|
	middle,width=42
 | 
						|
	width=42,middle
 | 
						|
	position=middle,width=42
 | 
						|
	width=42,position=middle
 | 
						|
EOF
 | 
						|
 | 
						|
# Last one wins (silently) when multiple arguments of the same type are given
 | 
						|
 | 
						|
test_align_permutations <<-\EOF
 | 
						|
	32,width=42,middle
 | 
						|
	width=30,42,middle
 | 
						|
	width=42,position=right,middle
 | 
						|
	42,right,position=middle
 | 
						|
EOF
 | 
						|
 | 
						|
# Individual atoms inside %(align:...) and %(end) must not be quoted.
 | 
						|
 | 
						|
test_expect_success 'alignment with format quote' "
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	|'      '\''master| A U Thor'\''      '|
 | 
						|
	|'       '\''side| A U Thor'\''       '|
 | 
						|
	|'     '\''odd/spot| A U Thor'\''     '|
 | 
						|
	|'      '\''annotated-tag| '\''       '|
 | 
						|
	|'   '\''doubly-annotated-tag| '\''   '|
 | 
						|
	|'    '\''doubly-signed-tag| '\''     '|
 | 
						|
	|'       '\''four| A U Thor'\''       '|
 | 
						|
	|'       '\''one| A U Thor'\''        '|
 | 
						|
	|'        '\''signed-tag| '\''        '|
 | 
						|
	|'      '\''three| A U Thor'\''       '|
 | 
						|
	|'       '\''two| A U Thor'\''        '|
 | 
						|
	EOF
 | 
						|
	git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
"
 | 
						|
 | 
						|
test_expect_success 'nested alignment with quote formatting' "
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	|'         master               '|
 | 
						|
	|'           side               '|
 | 
						|
	|'       odd/spot               '|
 | 
						|
	|'  annotated-tag               '|
 | 
						|
	|'doubly-annotated-tag          '|
 | 
						|
	|'doubly-signed-tag             '|
 | 
						|
	|'           four               '|
 | 
						|
	|'            one               '|
 | 
						|
	|'     signed-tag               '|
 | 
						|
	|'          three               '|
 | 
						|
	|'            two               '|
 | 
						|
	EOF
 | 
						|
	git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
"
 | 
						|
 | 
						|
test_expect_success 'check `%(contents:lines=1)`' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	master |three
 | 
						|
	side |four
 | 
						|
	odd/spot |three
 | 
						|
	annotated-tag |An annotated tag
 | 
						|
	doubly-annotated-tag |Annonated doubly
 | 
						|
	doubly-signed-tag |Signed doubly
 | 
						|
	four |four
 | 
						|
	one |one
 | 
						|
	signed-tag |A signed tag
 | 
						|
	three |three
 | 
						|
	two |two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'check `%(contents:lines=0)`' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	master |
 | 
						|
	side |
 | 
						|
	odd/spot |
 | 
						|
	annotated-tag |
 | 
						|
	doubly-annotated-tag |
 | 
						|
	doubly-signed-tag |
 | 
						|
	four |
 | 
						|
	one |
 | 
						|
	signed-tag |
 | 
						|
	three |
 | 
						|
	two |
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'check `%(contents:lines=99999)`' '
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	master |three
 | 
						|
	side |four
 | 
						|
	odd/spot |three
 | 
						|
	annotated-tag |An annotated tag
 | 
						|
	doubly-annotated-tag |Annonated doubly
 | 
						|
	doubly-signed-tag |Signed doubly
 | 
						|
	four |four
 | 
						|
	one |one
 | 
						|
	signed-tag |A signed tag
 | 
						|
	three |three
 | 
						|
	two |two
 | 
						|
	EOF
 | 
						|
	git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual &&
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success '`%(contents:lines=-1)` should fail' '
 | 
						|
	test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)"
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'setup for version sort' '
 | 
						|
	test_commit foo1.3 &&
 | 
						|
	test_commit foo1.6 &&
 | 
						|
	test_commit foo1.10
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'version sort' '
 | 
						|
	git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	foo1.3
 | 
						|
	foo1.6
 | 
						|
	foo1.10
 | 
						|
	EOF
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'version sort (shortened)' '
 | 
						|
	git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	foo1.3
 | 
						|
	foo1.6
 | 
						|
	foo1.10
 | 
						|
	EOF
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'reverse version sort' '
 | 
						|
	git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
 | 
						|
	cat >expect <<-\EOF &&
 | 
						|
	foo1.10
 | 
						|
	foo1.6
 | 
						|
	foo1.3
 | 
						|
	EOF
 | 
						|
	test_cmp expect actual
 | 
						|
'
 | 
						|
 | 
						|
test_done
 |