зеркало из https://github.com/microsoft/git.git
commit --amend: invoke post-rewrite hook
The rough structure of run_rewrite_hook() comes from run_receive_hook() in receive-pack. We introduce a --no-post-rewrite option and use it to avoid the hook when called from git-rebase -i 'edit'. The next patch will add full support in git-rebase, and we only want to invoke the hook once. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
c0fc686911
Коммит
6f6bee3ba9
|
@ -66,6 +66,7 @@ static char *edit_message, *use_message;
|
|||
static char *author_name, *author_email, *author_date;
|
||||
static int all, edit_flag, also, interactive, only, amend, signoff;
|
||||
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
|
||||
static int no_post_rewrite;
|
||||
static char *untracked_files_arg, *force_date;
|
||||
/*
|
||||
* The default commit message cleanup mode will remove the lines
|
||||
|
@ -137,6 +138,7 @@ static struct option builtin_commit_options[] = {
|
|||
OPT_BOOLEAN('z', "null", &null_termination,
|
||||
"terminate entries with NUL"),
|
||||
OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
|
||||
OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
|
||||
{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
||||
OPT_BOOLEAN(0, "allow-empty", &allow_empty, "ok to record an empty change"),
|
||||
/* end commit contents options */
|
||||
|
@ -1160,6 +1162,40 @@ static int git_commit_config(const char *k, const char *v, void *cb)
|
|||
return git_status_config(k, v, s);
|
||||
}
|
||||
|
||||
static const char post_rewrite_hook[] = "hooks/post-rewrite";
|
||||
|
||||
static int run_rewrite_hook(const unsigned char *oldsha1,
|
||||
const unsigned char *newsha1)
|
||||
{
|
||||
/* oldsha1 SP newsha1 LF NUL */
|
||||
static char buf[2*40 + 3];
|
||||
struct child_process proc;
|
||||
const char *argv[3];
|
||||
int code;
|
||||
size_t n;
|
||||
|
||||
if (access(git_path(post_rewrite_hook), X_OK) < 0)
|
||||
return 0;
|
||||
|
||||
argv[0] = git_path(post_rewrite_hook);
|
||||
argv[1] = "amend";
|
||||
argv[2] = NULL;
|
||||
|
||||
memset(&proc, 0, sizeof(proc));
|
||||
proc.argv = argv;
|
||||
proc.in = -1;
|
||||
proc.stdout_to_stderr = 1;
|
||||
|
||||
code = start_command(&proc);
|
||||
if (code)
|
||||
return code;
|
||||
n = snprintf(buf, sizeof(buf), "%s %s\n",
|
||||
sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
|
||||
write_in_full(proc.in, buf, n);
|
||||
close(proc.in);
|
||||
return finish_command(&proc);
|
||||
}
|
||||
|
||||
int cmd_commit(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
@ -1303,6 +1339,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
|
|||
|
||||
rerere(0);
|
||||
run_hook(get_index_file(), "post-commit", NULL);
|
||||
if (amend && !no_post_rewrite) {
|
||||
run_rewrite_hook(head_sha1, commit_sha1);
|
||||
}
|
||||
if (!quiet)
|
||||
print_summary(prefix, commit_sha1);
|
||||
|
||||
|
|
|
@ -445,7 +445,7 @@ do_next () {
|
|||
mark_action_done
|
||||
pick_one $sha1 ||
|
||||
die_with_patch $sha1 "Could not apply $sha1... $rest"
|
||||
git commit --amend
|
||||
git commit --amend --no-post-rewrite
|
||||
;;
|
||||
edit|e)
|
||||
comment_for_reflog edit
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2010 Thomas Rast
|
||||
#
|
||||
|
||||
test_description='Test the post-rewrite hook.'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
test_commit A foo A &&
|
||||
test_commit B foo B &&
|
||||
test_commit C foo C &&
|
||||
test_commit D foo D
|
||||
'
|
||||
|
||||
mkdir .git/hooks
|
||||
|
||||
cat >.git/hooks/post-rewrite <<EOF
|
||||
#!/bin/sh
|
||||
echo \$@ > "$TRASH_DIRECTORY"/post-rewrite.args
|
||||
cat > "$TRASH_DIRECTORY"/post-rewrite.data
|
||||
EOF
|
||||
chmod u+x .git/hooks/post-rewrite
|
||||
|
||||
clear_hook_input () {
|
||||
rm -f post-rewrite.args post-rewrite.data
|
||||
}
|
||||
|
||||
verify_hook_input () {
|
||||
test_cmp "$TRASH_DIRECTORY"/post-rewrite.args expected.args &&
|
||||
test_cmp "$TRASH_DIRECTORY"/post-rewrite.data expected.data
|
||||
}
|
||||
|
||||
test_expect_success 'git commit --amend' '
|
||||
clear_hook_input &&
|
||||
echo "D new message" > newmsg &&
|
||||
oldsha=$(git rev-parse HEAD^0) &&
|
||||
git commit -Fnewmsg --amend &&
|
||||
echo amend > expected.args &&
|
||||
echo $oldsha $(git rev-parse HEAD^0) > expected.data &&
|
||||
verify_hook_input
|
||||
'
|
||||
|
||||
test_expect_success 'git commit --amend --no-post-rewrite' '
|
||||
clear_hook_input &&
|
||||
echo "D new message again" > newmsg &&
|
||||
git commit --no-post-rewrite -Fnewmsg --amend &&
|
||||
test ! -f post-rewrite.args &&
|
||||
test ! -f post-rewrite.data
|
||||
'
|
||||
|
||||
test_done
|
Загрузка…
Ссылка в новой задаче