git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / code / Atom feed
1784bcb584c2684b471ee77054a3c6c6f2e57157 blob 4245 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
 
#!/bin/sh
#
# Copyright (c) 2020 Jiang Xin
#

test_description='Test proc-receive hook'

. ./test-lib.sh

# Create commits in <repo> and assign each commit's oid to shell variables
# given in the arguments (A, B, and C). E.g.:
#
#     create_commits_in <repo> A B C
#
# NOTE: Never calling this function from a subshell since variable
# assignments will disappear when subshell exits.
create_commits_in () {
	repo="$1" &&
	if ! parent=$(git -C "$repo" rev-parse HEAD^{})
	then
		parent=
	fi &&
	T=$(git -C "$repo" write-tree) &&
	shift &&
	while test $# -gt 0
	do
		name=$1 &&
		test_tick &&
		if test -z "$parent"
		then
			oid=$(echo $name | git -C "$repo" commit-tree $T)
		else
			oid=$(echo $name | git -C "$repo" commit-tree -p $parent $T)
		fi &&
		eval $name=$oid &&
		parent=$oid &&
		shift ||
		return 1
	done &&
	git -C "$repo" update-ref refs/heads/master $oid
}

# Format the output of git-push, git-show-ref and other commands to make a
# user-friendly and stable text.  We can easily prepare the expect text
# without having to worry about future changes of the commit ID and spaces
# of the output.  We also replce single quotes with double quotes, because
# it is boring to prepare unquoted single quotes in expect txt.
make_user_friendly_and_stable_output () {
	sed \
		-e "s/  *\$//" \
		-e "s/   */ /g" \
		-e "s/'/\"/g" \
		-e "s/$A/<COMMIT-A>/g" \
		-e "s/$B/<COMMIT-B>/g" \
		-e "s/$TAG/<TAG-v123>/g" \
		-e "s/$ZERO_OID/<ZERO-OID>/g" \
		-e "s/[0-9a-f]\{7,\}/<OID>/g"
}

# Refs of upstream : master(B)  next(A)
# Refs of workbench: master(A)           tags/v123
test_expect_success "setup" '
	git init --bare upstream &&
	git init workbench &&
	create_commits_in workbench A B &&
	(
		cd workbench &&
		# Try to make a stable fixed width for abbreviated commit ID,
		# this fixed-width oid will be replaced with "<OID>".
		git config core.abbrev 7 &&
		git remote add origin ../upstream &&
		git update-ref refs/heads/master $A &&
		git tag -m "v123" v123 $A &&
		git push origin \
			$B:refs/heads/master \
			$A:refs/heads/next
	) &&
	TAG=$(git -C workbench rev-parse v123) &&

	# setup pre-receive hook
	cat >upstream/hooks/pre-receive <<-\EOF &&
	#!/bin/sh

	echo >&2 "# pre-receive hook"

	while read old new ref
	do
		echo >&2 "pre-receive< $old $new $ref"
	done
	EOF

	# setup post-receive hook
	cat >upstream/hooks/post-receive <<-\EOF &&
	#!/bin/sh

	echo >&2 "# post-receive hook"

	while read old new ref
	do
		echo >&2 "post-receive< $old $new $ref"
	done
	EOF

	chmod a+x \
		upstream/hooks/pre-receive \
		upstream/hooks/post-receive
'

# Refs of upstream : master(B)  next(A)
# Refs of workbench: master(A)           tags/v123
# git-push -f      : master(A)  NULL     tags/v123  refs/review/master/topic(A)  a/b/c(A)
test_expect_success "normal git-push command" '
	git -C workbench push -f origin \
		refs/tags/v123 \
		:refs/heads/next \
		HEAD:refs/heads/master \
		HEAD:refs/review/master/topic \
		HEAD:refs/heads/a/b/c \
		>out 2>&1 &&
	make_user_friendly_and_stable_output <out >actual &&
	cat >expect <<-EOF &&
	remote: # pre-receive hook
	remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/master
	remote: pre-receive< <COMMIT-A> <ZERO-OID> refs/heads/next
	remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123
	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/review/master/topic
	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c
	remote: # post-receive hook
	remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/master
	remote: post-receive< <COMMIT-A> <ZERO-OID> refs/heads/next
	remote: post-receive< <ZERO-OID> <TAG-v123> refs/tags/v123
	remote: post-receive< <ZERO-OID> <COMMIT-A> refs/review/master/topic
	remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c
	To ../upstream
	 + <OID>...<OID> HEAD -> master (forced update)
	 - [deleted] next
	 * [new tag] v123 -> v123
	 * [new reference] HEAD -> refs/review/master/topic
	 * [new branch] HEAD -> a/b/c
	EOF
	test_cmp expect actual &&
	git -C upstream show-ref >out &&
	make_user_friendly_and_stable_output <out >actual &&
	cat >expect <<-EOF &&
	<COMMIT-A> refs/heads/a/b/c
	<COMMIT-A> refs/heads/master
	<COMMIT-A> refs/review/master/topic
	<TAG-v123> refs/tags/v123
	EOF
	test_cmp expect actual
'

test_done
debug log:

solving 1784bcb584 ...
found 1784bcb584 in https://public-inbox.org/git/20200330165754.19195-2-worldhello.net@gmail.com/ ||
	https://public-inbox.org/git/20200404134345.10655-2-worldhello.net@gmail.com/ ||
	https://public-inbox.org/git/20200403160838.6252-2-worldhello.net@gmail.com/ ||
	https://public-inbox.org/git/20200402163520.1338-2-worldhello.net@gmail.com/

applying [1/4] https://public-inbox.org/git/20200330165754.19195-2-worldhello.net@gmail.com/
diff --git a/t/t5411-proc-receive-hook.sh b/t/t5411-proc-receive-hook.sh
new file mode 100755
index 0000000000..1784bcb584

Checking patch t/t5411-proc-receive-hook.sh...
Applied patch t/t5411-proc-receive-hook.sh cleanly.

skipping https://public-inbox.org/git/20200404134345.10655-2-worldhello.net@gmail.com/ for 1784bcb584
skipping https://public-inbox.org/git/20200403160838.6252-2-worldhello.net@gmail.com/ for 1784bcb584
skipping https://public-inbox.org/git/20200402163520.1338-2-worldhello.net@gmail.com/ for 1784bcb584
index at:
100755 1784bcb584c2684b471ee77054a3c6c6f2e57157	t/t5411-proc-receive-hook.sh

Code repositories for project(s) associated with this inbox:

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).