diff options
Diffstat (limited to 'spec/fixtures/test.git/git/hooks')
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/applypatch-msg.sample | 15 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/commit-msg.sample | 24 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample | 114 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/post-update.sample | 8 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/pre-applypatch.sample | 14 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/pre-commit.sample | 49 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/pre-push.sample | 53 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/pre-rebase.sample | 169 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/pre-receive.sample | 24 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample | 42 | ||||
-rwxr-xr-x | spec/fixtures/test.git/git/hooks/update.sample | 128 |
11 files changed, 640 insertions, 0 deletions
diff --git a/spec/fixtures/test.git/git/hooks/applypatch-msg.sample b/spec/fixtures/test.git/git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/applypatch-msg.sample | |||
@@ -0,0 +1,15 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to check the commit log message taken by | ||
4 | # applypatch from an e-mail message. | ||
5 | # | ||
6 | # The hook should exit with non-zero status after issuing an | ||
7 | # appropriate message if it wants to stop the commit. The hook is | ||
8 | # allowed to edit the commit message file. | ||
9 | # | ||
10 | # To enable this hook, rename this file to "applypatch-msg". | ||
11 | |||
12 | . git-sh-setup | ||
13 | commitmsg="$(git rev-parse --git-path hooks/commit-msg)" | ||
14 | test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} | ||
15 | : | ||
diff --git a/spec/fixtures/test.git/git/hooks/commit-msg.sample b/spec/fixtures/test.git/git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/commit-msg.sample | |||
@@ -0,0 +1,24 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to check the commit log message. | ||
4 | # Called by "git commit" with one argument, the name of the file | ||
5 | # that has the commit message. The hook should exit with non-zero | ||
6 | # status after issuing an appropriate message if it wants to stop the | ||
7 | # commit. The hook is allowed to edit the commit message file. | ||
8 | # | ||
9 | # To enable this hook, rename this file to "commit-msg". | ||
10 | |||
11 | # Uncomment the below to add a Signed-off-by line to the message. | ||
12 | # Doing this in a hook is a bad idea in general, but the prepare-commit-msg | ||
13 | # hook is more suited to it. | ||
14 | # | ||
15 | # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||
16 | # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" | ||
17 | |||
18 | # This example catches duplicate Signed-off-by lines. | ||
19 | |||
20 | test "" = "$(grep '^Signed-off-by: ' "$1" | | ||
21 | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { | ||
22 | echo >&2 Duplicate Signed-off-by lines. | ||
23 | exit 1 | ||
24 | } | ||
diff --git a/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..e673bb3 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample | |||
@@ -0,0 +1,114 @@ | |||
1 | #!/usr/bin/perl | ||
2 | |||
3 | use strict; | ||
4 | use warnings; | ||
5 | use IPC::Open2; | ||
6 | |||
7 | # An example hook script to integrate Watchman | ||
8 | # (https://facebook.github.io/watchman/) with git to speed up detecting | ||
9 | # new and modified files. | ||
10 | # | ||
11 | # The hook is passed a version (currently 1) and a time in nanoseconds | ||
12 | # formatted as a string and outputs to stdout all files that have been | ||
13 | # modified since the given time. Paths must be relative to the root of | ||
14 | # the working tree and separated by a single NUL. | ||
15 | # | ||
16 | # To enable this hook, rename this file to "query-watchman" and set | ||
17 | # 'git config core.fsmonitor .git/hooks/query-watchman' | ||
18 | # | ||
19 | my ($version, $time) = @ARGV; | ||
20 | |||
21 | # Check the hook interface version | ||
22 | |||
23 | if ($version == 1) { | ||
24 | # convert nanoseconds to seconds | ||
25 | $time = int $time / 1000000000; | ||
26 | } else { | ||
27 | die "Unsupported query-fsmonitor hook version '$version'.\n" . | ||
28 | "Falling back to scanning...\n"; | ||
29 | } | ||
30 | |||
31 | my $git_work_tree; | ||
32 | if ($^O =~ 'msys' || $^O =~ 'cygwin') { | ||
33 | $git_work_tree = Win32::GetCwd(); | ||
34 | $git_work_tree =~ tr/\\/\//; | ||
35 | } else { | ||
36 | require Cwd; | ||
37 | $git_work_tree = Cwd::cwd(); | ||
38 | } | ||
39 | |||
40 | my $retry = 1; | ||
41 | |||
42 | launch_watchman(); | ||
43 | |||
44 | sub launch_watchman { | ||
45 | |||
46 | my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') | ||
47 | or die "open2() failed: $!\n" . | ||
48 | "Falling back to scanning...\n"; | ||
49 | |||
50 | # In the query expression below we're asking for names of files that | ||
51 | # changed since $time but were not transient (ie created after | ||
52 | # $time but no longer exist). | ||
53 | # | ||
54 | # To accomplish this, we're using the "since" generator to use the | ||
55 | # recency index to select candidate nodes and "fields" to limit the | ||
56 | # output to file names only. Then we're using the "expression" term to | ||
57 | # further constrain the results. | ||
58 | # | ||
59 | # The category of transient files that we want to ignore will have a | ||
60 | # creation clock (cclock) newer than $time_t value and will also not | ||
61 | # currently exist. | ||
62 | |||
63 | my $query = <<" END"; | ||
64 | ["query", "$git_work_tree", { | ||
65 | "since": $time, | ||
66 | "fields": ["name"], | ||
67 | "expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]] | ||
68 | }] | ||
69 | END | ||
70 | |||
71 | print CHLD_IN $query; | ||
72 | close CHLD_IN; | ||
73 | my $response = do {local $/; <CHLD_OUT>}; | ||
74 | |||
75 | die "Watchman: command returned no output.\n" . | ||
76 | "Falling back to scanning...\n" if $response eq ""; | ||
77 | die "Watchman: command returned invalid output: $response\n" . | ||
78 | "Falling back to scanning...\n" unless $response =~ /^\{/; | ||
79 | |||
80 | my $json_pkg; | ||
81 | eval { | ||
82 | require JSON::XS; | ||
83 | $json_pkg = "JSON::XS"; | ||
84 | 1; | ||
85 | } or do { | ||
86 | require JSON::PP; | ||
87 | $json_pkg = "JSON::PP"; | ||
88 | }; | ||
89 | |||
90 | my $o = $json_pkg->new->utf8->decode($response); | ||
91 | |||
92 | if ($retry > 0 and $o->{error} and $o->{error} =~ m/unable to resolve root .* directory (.*) is not watched/) { | ||
93 | print STDERR "Adding '$git_work_tree' to watchman's watch list.\n"; | ||
94 | $retry--; | ||
95 | qx/watchman watch "$git_work_tree"/; | ||
96 | die "Failed to make watchman watch '$git_work_tree'.\n" . | ||
97 | "Falling back to scanning...\n" if $? != 0; | ||
98 | |||
99 | # Watchman will always return all files on the first query so | ||
100 | # return the fast "everything is dirty" flag to git and do the | ||
101 | # Watchman query just to get it over with now so we won't pay | ||
102 | # the cost in git to look up each individual file. | ||
103 | print "/\0"; | ||
104 | eval { launch_watchman() }; | ||
105 | exit 0; | ||
106 | } | ||
107 | |||
108 | die "Watchman: $o->{error}.\n" . | ||
109 | "Falling back to scanning...\n" if $o->{error}; | ||
110 | |||
111 | binmode STDOUT, ":utf8"; | ||
112 | local $, = "\0"; | ||
113 | print @{$o->{files}}; | ||
114 | } | ||
diff --git a/spec/fixtures/test.git/git/hooks/post-update.sample b/spec/fixtures/test.git/git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/post-update.sample | |||
@@ -0,0 +1,8 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to prepare a packed repository for use over | ||
4 | # dumb transports. | ||
5 | # | ||
6 | # To enable this hook, rename this file to "post-update". | ||
7 | |||
8 | exec git update-server-info | ||
diff --git a/spec/fixtures/test.git/git/hooks/pre-applypatch.sample b/spec/fixtures/test.git/git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/pre-applypatch.sample | |||
@@ -0,0 +1,14 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to verify what is about to be committed | ||
4 | # by applypatch from an e-mail message. | ||
5 | # | ||
6 | # The hook should exit with non-zero status after issuing an | ||
7 | # appropriate message if it wants to stop the commit. | ||
8 | # | ||
9 | # To enable this hook, rename this file to "pre-applypatch". | ||
10 | |||
11 | . git-sh-setup | ||
12 | precommit="$(git rev-parse --git-path hooks/pre-commit)" | ||
13 | test -x "$precommit" && exec "$precommit" ${1+"$@"} | ||
14 | : | ||
diff --git a/spec/fixtures/test.git/git/hooks/pre-commit.sample b/spec/fixtures/test.git/git/hooks/pre-commit.sample new file mode 100755 index 0000000..6a75641 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/pre-commit.sample | |||
@@ -0,0 +1,49 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to verify what is about to be committed. | ||
4 | # Called by "git commit" with no arguments. The hook should | ||
5 | # exit with non-zero status after issuing an appropriate message if | ||
6 | # it wants to stop the commit. | ||
7 | # | ||
8 | # To enable this hook, rename this file to "pre-commit". | ||
9 | |||
10 | if git rev-parse --verify HEAD >/dev/null 2>&1 | ||
11 | then | ||
12 | against=HEAD | ||
13 | else | ||
14 | # Initial commit: diff against an empty tree object | ||
15 | against=$(git hash-object -t tree /dev/null) | ||
16 | fi | ||
17 | |||
18 | # If you want to allow non-ASCII filenames set this variable to true. | ||
19 | allownonascii=$(git config --bool hooks.allownonascii) | ||
20 | |||
21 | # Redirect output to stderr. | ||
22 | exec 1>&2 | ||
23 | |||
24 | # Cross platform projects tend to avoid non-ASCII filenames; prevent | ||
25 | # them from being added to the repository. We exploit the fact that the | ||
26 | # printable range starts at the space character and ends with tilde. | ||
27 | if [ "$allownonascii" != "true" ] && | ||
28 | # Note that the use of brackets around a tr range is ok here, (it's | ||
29 | # even required, for portability to Solaris 10's /usr/bin/tr), since | ||
30 | # the square bracket bytes happen to fall in the designated range. | ||
31 | test $(git diff --cached --name-only --diff-filter=A -z $against | | ||
32 | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 | ||
33 | then | ||
34 | cat <<\EOF | ||
35 | Error: Attempt to add a non-ASCII file name. | ||
36 | |||
37 | This can cause problems if you want to work with people on other platforms. | ||
38 | |||
39 | To be portable it is advisable to rename the file. | ||
40 | |||
41 | If you know what you are doing you can disable this check using: | ||
42 | |||
43 | git config hooks.allownonascii true | ||
44 | EOF | ||
45 | exit 1 | ||
46 | fi | ||
47 | |||
48 | # If there are whitespace errors, print the offending file names and fail. | ||
49 | exec git diff-index --check --cached $against -- | ||
diff --git a/spec/fixtures/test.git/git/hooks/pre-push.sample b/spec/fixtures/test.git/git/hooks/pre-push.sample new file mode 100755 index 0000000..6187dbf --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/pre-push.sample | |||
@@ -0,0 +1,53 @@ | |||
1 | #!/bin/sh | ||
2 | |||
3 | # An example hook script to verify what is about to be pushed. Called by "git | ||
4 | # push" after it has checked the remote status, but before anything has been | ||
5 | # pushed. If this script exits with a non-zero status nothing will be pushed. | ||
6 | # | ||
7 | # This hook is called with the following parameters: | ||
8 | # | ||
9 | # $1 -- Name of the remote to which the push is being done | ||
10 | # $2 -- URL to which the push is being done | ||
11 | # | ||
12 | # If pushing without using a named remote those arguments will be equal. | ||
13 | # | ||
14 | # Information about the commits which are being pushed is supplied as lines to | ||
15 | # the standard input in the form: | ||
16 | # | ||
17 | # <local ref> <local sha1> <remote ref> <remote sha1> | ||
18 | # | ||
19 | # This sample shows how to prevent push of commits where the log message starts | ||
20 | # with "WIP" (work in progress). | ||
21 | |||
22 | remote="$1" | ||
23 | url="$2" | ||
24 | |||
25 | z40=0000000000000000000000000000000000000000 | ||
26 | |||
27 | while read local_ref local_sha remote_ref remote_sha | ||
28 | do | ||
29 | if [ "$local_sha" = $z40 ] | ||
30 | then | ||
31 | # Handle delete | ||
32 | : | ||
33 | else | ||
34 | if [ "$remote_sha" = $z40 ] | ||
35 | then | ||
36 | # New branch, examine all commits | ||
37 | range="$local_sha" | ||
38 | else | ||
39 | # Update to existing branch, examine new commits | ||
40 | range="$remote_sha..$local_sha" | ||
41 | fi | ||
42 | |||
43 | # Check for WIP commit | ||
44 | commit=`git rev-list -n 1 --grep '^WIP' "$range"` | ||
45 | if [ -n "$commit" ] | ||
46 | then | ||
47 | echo >&2 "Found WIP commit in $local_ref, not pushing" | ||
48 | exit 1 | ||
49 | fi | ||
50 | fi | ||
51 | done | ||
52 | |||
53 | exit 0 | ||
diff --git a/spec/fixtures/test.git/git/hooks/pre-rebase.sample b/spec/fixtures/test.git/git/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/pre-rebase.sample | |||
@@ -0,0 +1,169 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # Copyright (c) 2006, 2008 Junio C Hamano | ||
4 | # | ||
5 | # The "pre-rebase" hook is run just before "git rebase" starts doing | ||
6 | # its job, and can prevent the command from running by exiting with | ||
7 | # non-zero status. | ||
8 | # | ||
9 | # The hook is called with the following parameters: | ||
10 | # | ||
11 | # $1 -- the upstream the series was forked from. | ||
12 | # $2 -- the branch being rebased (or empty when rebasing the current branch). | ||
13 | # | ||
14 | # This sample shows how to prevent topic branches that are already | ||
15 | # merged to 'next' branch from getting rebased, because allowing it | ||
16 | # would result in rebasing already published history. | ||
17 | |||
18 | publish=next | ||
19 | basebranch="$1" | ||
20 | if test "$#" = 2 | ||
21 | then | ||
22 | topic="refs/heads/$2" | ||
23 | else | ||
24 | topic=`git symbolic-ref HEAD` || | ||
25 | exit 0 ;# we do not interrupt rebasing detached HEAD | ||
26 | fi | ||
27 | |||
28 | case "$topic" in | ||
29 | refs/heads/??/*) | ||
30 | ;; | ||
31 | *) | ||
32 | exit 0 ;# we do not interrupt others. | ||
33 | ;; | ||
34 | esac | ||
35 | |||
36 | # Now we are dealing with a topic branch being rebased | ||
37 | # on top of master. Is it OK to rebase it? | ||
38 | |||
39 | # Does the topic really exist? | ||
40 | git show-ref -q "$topic" || { | ||
41 | echo >&2 "No such branch $topic" | ||
42 | exit 1 | ||
43 | } | ||
44 | |||
45 | # Is topic fully merged to master? | ||
46 | not_in_master=`git rev-list --pretty=oneline ^master "$topic"` | ||
47 | if test -z "$not_in_master" | ||
48 | then | ||
49 | echo >&2 "$topic is fully merged to master; better remove it." | ||
50 | exit 1 ;# we could allow it, but there is no point. | ||
51 | fi | ||
52 | |||
53 | # Is topic ever merged to next? If so you should not be rebasing it. | ||
54 | only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` | ||
55 | only_next_2=`git rev-list ^master ${publish} | sort` | ||
56 | if test "$only_next_1" = "$only_next_2" | ||
57 | then | ||
58 | not_in_topic=`git rev-list "^$topic" master` | ||
59 | if test -z "$not_in_topic" | ||
60 | then | ||
61 | echo >&2 "$topic is already up to date with master" | ||
62 | exit 1 ;# we could allow it, but there is no point. | ||
63 | else | ||
64 | exit 0 | ||
65 | fi | ||
66 | else | ||
67 | not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` | ||
68 | /usr/bin/perl -e ' | ||
69 | my $topic = $ARGV[0]; | ||
70 | my $msg = "* $topic has commits already merged to public branch:\n"; | ||
71 | my (%not_in_next) = map { | ||
72 | /^([0-9a-f]+) /; | ||
73 | ($1 => 1); | ||
74 | } split(/\n/, $ARGV[1]); | ||
75 | for my $elem (map { | ||
76 | /^([0-9a-f]+) (.*)$/; | ||
77 | [$1 => $2]; | ||
78 | } split(/\n/, $ARGV[2])) { | ||
79 | if (!exists $not_in_next{$elem->[0]}) { | ||
80 | if ($msg) { | ||
81 | print STDERR $msg; | ||
82 | undef $msg; | ||
83 | } | ||
84 | print STDERR " $elem->[1]\n"; | ||
85 | } | ||
86 | } | ||
87 | ' "$topic" "$not_in_next" "$not_in_master" | ||
88 | exit 1 | ||
89 | fi | ||
90 | |||
91 | <<\DOC_END | ||
92 | |||
93 | This sample hook safeguards topic branches that have been | ||
94 | published from being rewound. | ||
95 | |||
96 | The workflow assumed here is: | ||
97 | |||
98 | * Once a topic branch forks from "master", "master" is never | ||
99 | merged into it again (either directly or indirectly). | ||
100 | |||
101 | * Once a topic branch is fully cooked and merged into "master", | ||
102 | it is deleted. If you need to build on top of it to correct | ||
103 | earlier mistakes, a new topic branch is created by forking at | ||
104 | the tip of the "master". This is not strictly necessary, but | ||
105 | it makes it easier to keep your history simple. | ||
106 | |||
107 | * Whenever you need to test or publish your changes to topic | ||
108 | branches, merge them into "next" branch. | ||
109 | |||
110 | The script, being an example, hardcodes the publish branch name | ||
111 | to be "next", but it is trivial to make it configurable via | ||
112 | $GIT_DIR/config mechanism. | ||
113 | |||
114 | With this workflow, you would want to know: | ||
115 | |||
116 | (1) ... if a topic branch has ever been merged to "next". Young | ||
117 | topic branches can have stupid mistakes you would rather | ||
118 | clean up before publishing, and things that have not been | ||
119 | merged into other branches can be easily rebased without | ||
120 | affecting other people. But once it is published, you would | ||
121 | not want to rewind it. | ||
122 | |||
123 | (2) ... if a topic branch has been fully merged to "master". | ||
124 | Then you can delete it. More importantly, you should not | ||
125 | build on top of it -- other people may already want to | ||
126 | change things related to the topic as patches against your | ||
127 | "master", so if you need further changes, it is better to | ||
128 | fork the topic (perhaps with the same name) afresh from the | ||
129 | tip of "master". | ||
130 | |||
131 | Let's look at this example: | ||
132 | |||
133 | o---o---o---o---o---o---o---o---o---o "next" | ||
134 | / / / / | ||
135 | / a---a---b A / / | ||
136 | / / / / | ||
137 | / / c---c---c---c B / | ||
138 | / / / \ / | ||
139 | / / / b---b C \ / | ||
140 | / / / / \ / | ||
141 | ---o---o---o---o---o---o---o---o---o---o---o "master" | ||
142 | |||
143 | |||
144 | A, B and C are topic branches. | ||
145 | |||
146 | * A has one fix since it was merged up to "next". | ||
147 | |||
148 | * B has finished. It has been fully merged up to "master" and "next", | ||
149 | and is ready to be deleted. | ||
150 | |||
151 | * C has not merged to "next" at all. | ||
152 | |||
153 | We would want to allow C to be rebased, refuse A, and encourage | ||
154 | B to be deleted. | ||
155 | |||
156 | To compute (1): | ||
157 | |||
158 | git rev-list ^master ^topic next | ||
159 | git rev-list ^master next | ||
160 | |||
161 | if these match, topic has not merged in next at all. | ||
162 | |||
163 | To compute (2): | ||
164 | |||
165 | git rev-list master..topic | ||
166 | |||
167 | if this is empty, it is fully merged to "master". | ||
168 | |||
169 | DOC_END | ||
diff --git a/spec/fixtures/test.git/git/hooks/pre-receive.sample b/spec/fixtures/test.git/git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/pre-receive.sample | |||
@@ -0,0 +1,24 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to make use of push options. | ||
4 | # The example simply echoes all push options that start with 'echoback=' | ||
5 | # and rejects all pushes when the "reject" push option is used. | ||
6 | # | ||
7 | # To enable this hook, rename this file to "pre-receive". | ||
8 | |||
9 | if test -n "$GIT_PUSH_OPTION_COUNT" | ||
10 | then | ||
11 | i=0 | ||
12 | while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" | ||
13 | do | ||
14 | eval "value=\$GIT_PUSH_OPTION_$i" | ||
15 | case "$value" in | ||
16 | echoback=*) | ||
17 | echo "echo from the pre-receive-hook: ${value#*=}" >&2 | ||
18 | ;; | ||
19 | reject) | ||
20 | exit 1 | ||
21 | esac | ||
22 | i=$((i + 1)) | ||
23 | done | ||
24 | fi | ||
diff --git a/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample b/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample | |||
@@ -0,0 +1,42 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to prepare the commit log message. | ||
4 | # Called by "git commit" with the name of the file that has the | ||
5 | # commit message, followed by the description of the commit | ||
6 | # message's source. The hook's purpose is to edit the commit | ||
7 | # message file. If the hook fails with a non-zero status, | ||
8 | # the commit is aborted. | ||
9 | # | ||
10 | # To enable this hook, rename this file to "prepare-commit-msg". | ||
11 | |||
12 | # This hook includes three examples. The first one removes the | ||
13 | # "# Please enter the commit message..." help message. | ||
14 | # | ||
15 | # The second includes the output of "git diff --name-status -r" | ||
16 | # into the message, just before the "git status" output. It is | ||
17 | # commented because it doesn't cope with --amend or with squashed | ||
18 | # commits. | ||
19 | # | ||
20 | # The third example adds a Signed-off-by line to the message, that can | ||
21 | # still be edited. This is rarely a good idea. | ||
22 | |||
23 | COMMIT_MSG_FILE=$1 | ||
24 | COMMIT_SOURCE=$2 | ||
25 | SHA1=$3 | ||
26 | |||
27 | /usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" | ||
28 | |||
29 | # case "$COMMIT_SOURCE,$SHA1" in | ||
30 | # ,|template,) | ||
31 | # /usr/bin/perl -i.bak -pe ' | ||
32 | # print "\n" . `git diff --cached --name-status -r` | ||
33 | # if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; | ||
34 | # *) ;; | ||
35 | # esac | ||
36 | |||
37 | # SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||
38 | # git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" | ||
39 | # if test -z "$COMMIT_SOURCE" | ||
40 | # then | ||
41 | # /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" | ||
42 | # fi | ||
diff --git a/spec/fixtures/test.git/git/hooks/update.sample b/spec/fixtures/test.git/git/hooks/update.sample new file mode 100755 index 0000000..80ba941 --- /dev/null +++ b/spec/fixtures/test.git/git/hooks/update.sample | |||
@@ -0,0 +1,128 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # An example hook script to block unannotated tags from entering. | ||
4 | # Called by "git receive-pack" with arguments: refname sha1-old sha1-new | ||
5 | # | ||
6 | # To enable this hook, rename this file to "update". | ||
7 | # | ||
8 | # Config | ||
9 | # ------ | ||
10 | # hooks.allowunannotated | ||
11 | # This boolean sets whether unannotated tags will be allowed into the | ||
12 | # repository. By default they won't be. | ||
13 | # hooks.allowdeletetag | ||
14 | # This boolean sets whether deleting tags will be allowed in the | ||
15 | # repository. By default they won't be. | ||
16 | # hooks.allowmodifytag | ||
17 | # This boolean sets whether a tag may be modified after creation. By default | ||
18 | # it won't be. | ||
19 | # hooks.allowdeletebranch | ||
20 | # This boolean sets whether deleting branches will be allowed in the | ||
21 | # repository. By default they won't be. | ||
22 | # hooks.denycreatebranch | ||
23 | # This boolean sets whether remotely creating branches will be denied | ||
24 | # in the repository. By default this is allowed. | ||
25 | # | ||
26 | |||
27 | # --- Command line | ||
28 | refname="$1" | ||
29 | oldrev="$2" | ||
30 | newrev="$3" | ||
31 | |||
32 | # --- Safety check | ||
33 | if [ -z "$GIT_DIR" ]; then | ||
34 | echo "Don't run this script from the command line." >&2 | ||
35 | echo " (if you want, you could supply GIT_DIR then run" >&2 | ||
36 | echo " $0 <ref> <oldrev> <newrev>)" >&2 | ||
37 | exit 1 | ||
38 | fi | ||
39 | |||
40 | if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then | ||
41 | echo "usage: $0 <ref> <oldrev> <newrev>" >&2 | ||
42 | exit 1 | ||
43 | fi | ||
44 | |||
45 | # --- Config | ||
46 | allowunannotated=$(git config --bool hooks.allowunannotated) | ||
47 | allowdeletebranch=$(git config --bool hooks.allowdeletebranch) | ||
48 | denycreatebranch=$(git config --bool hooks.denycreatebranch) | ||
49 | allowdeletetag=$(git config --bool hooks.allowdeletetag) | ||
50 | allowmodifytag=$(git config --bool hooks.allowmodifytag) | ||
51 | |||
52 | # check for no description | ||
53 | projectdesc=$(sed -e '1q' "$GIT_DIR/description") | ||
54 | case "$projectdesc" in | ||
55 | "Unnamed repository"* | "") | ||
56 | echo "*** Project description file hasn't been set" >&2 | ||
57 | exit 1 | ||
58 | ;; | ||
59 | esac | ||
60 | |||
61 | # --- Check types | ||
62 | # if $newrev is 0000...0000, it's a commit to delete a ref. | ||
63 | zero="0000000000000000000000000000000000000000" | ||
64 | if [ "$newrev" = "$zero" ]; then | ||
65 | newrev_type=delete | ||
66 | else | ||
67 | newrev_type=$(git cat-file -t $newrev) | ||
68 | fi | ||
69 | |||
70 | case "$refname","$newrev_type" in | ||
71 | refs/tags/*,commit) | ||
72 | # un-annotated tag | ||
73 | short_refname=${refname##refs/tags/} | ||
74 | if [ "$allowunannotated" != "true" ]; then | ||
75 | echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 | ||
76 | echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 | ||
77 | exit 1 | ||
78 | fi | ||
79 | ;; | ||
80 | refs/tags/*,delete) | ||
81 | # delete tag | ||
82 | if [ "$allowdeletetag" != "true" ]; then | ||
83 | echo "*** Deleting a tag is not allowed in this repository" >&2 | ||
84 | exit 1 | ||
85 | fi | ||
86 | ;; | ||
87 | refs/tags/*,tag) | ||
88 | # annotated tag | ||
89 | if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 | ||
90 | then | ||
91 | echo "*** Tag '$refname' already exists." >&2 | ||
92 | echo "*** Modifying a tag is not allowed in this repository." >&2 | ||
93 | exit 1 | ||
94 | fi | ||
95 | ;; | ||
96 | refs/heads/*,commit) | ||
97 | # branch | ||
98 | if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then | ||
99 | echo "*** Creating a branch is not allowed in this repository" >&2 | ||
100 | exit 1 | ||
101 | fi | ||
102 | ;; | ||
103 | refs/heads/*,delete) | ||
104 | # delete branch | ||
105 | if [ "$allowdeletebranch" != "true" ]; then | ||
106 | echo "*** Deleting a branch is not allowed in this repository" >&2 | ||
107 | exit 1 | ||
108 | fi | ||
109 | ;; | ||
110 | refs/remotes/*,commit) | ||
111 | # tracking branch | ||
112 | ;; | ||
113 | refs/remotes/*,delete) | ||
114 | # delete tracking branch | ||
115 | if [ "$allowdeletebranch" != "true" ]; then | ||
116 | echo "*** Deleting a tracking branch is not allowed in this repository" >&2 | ||
117 | exit 1 | ||
118 | fi | ||
119 | ;; | ||
120 | *) | ||
121 | # Anything else (is there anything else?) | ||
122 | echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 | ||
123 | exit 1 | ||
124 | ;; | ||
125 | esac | ||
126 | |||
127 | # --- Finished | ||
128 | exit 0 | ||