From: Thomas Rast <trast@student.ethz.ch>
To: <git@vger.kernel.org>
Cc: Johannes Sixt <j6t@kdbg.org>, Johan Herland <johan@herland.net>
Subject: [RFC PATCH v2 02/11] commit --amend: invoke post-rewrite hook
Date: Wed, 17 Feb 2010 00:25:58 +0100 [thread overview]
Message-ID: <297ce521ac8fa25ae00cbe8cf0a77d4fb9ee266d.1266361759.git.trast@student.ethz.ch> (raw)
In-Reply-To: <cover.1266361759.git.trast@student.ethz.ch>
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>
---
builtin-commit.c | 43 ++++++++++++++++++++++++++++++++++
git-rebase--interactive.sh | 2 +-
t/t5407-post-rewrite-hook.sh | 52 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 96 insertions(+), 1 deletions(-)
create mode 100755 t/t5407-post-rewrite-hook.sh
diff --git a/builtin-commit.c b/builtin-commit.c
index 55676fd..9b67649 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -66,6 +66,7 @@
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 int opt_parse_m(const struct option *opt, const char *arg, int unset)
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,13 @@ 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) {
+ struct commit *commit;
+ commit = lookup_commit(head_sha1);
+ if (!commit || parse_commit(commit))
+ die("HEAD commit disappeared right under my eyes?");
+ run_rewrite_hook(commit->object.sha1, commit_sha1);
+ }
if (!quiet)
print_summary(prefix, commit_sha1);
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 3e4fd14..5735859 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -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
diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
new file mode 100755
index 0000000..1020af9
--- /dev/null
+++ b/t/t5407-post-rewrite-hook.sh
@@ -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
--
1.7.0.53.g5c2e6.dirty
next prev parent reply other threads:[~2010-02-16 23:27 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-14 16:17 [RFC PATCH 0/6] post-rewrite hook and copying notes Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 1/6] Documentation: document post-rewrite hook Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 2/6] commit --amend: invoke " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 3/6] filter-branch: " Thomas Rast
2010-02-15 20:36 ` Johannes Sixt
2010-02-14 16:17 ` [RFC PATCH 4/6] rebase: " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 5/6] rebase -i: " Thomas Rast
2010-02-14 16:17 ` [RFC PATCH 6/6] contrib: add a hook that copies notes over rewrites Thomas Rast
2010-02-14 16:21 ` Thomas Rast
2010-02-14 21:46 ` [PATCH] WIP: git notes copy --stdin Thomas Rast
2010-02-15 1:25 ` Johan Herland
2010-02-16 23:25 ` [RFC PATCH v2 00/11] post-rewrite / automatic notes copying Thomas Rast
2010-02-16 23:25 ` [RFC PATCH v2 01/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-16 23:59 ` Junio C Hamano
2010-02-17 0:18 ` Thomas Rast
2010-02-17 0:29 ` Junio C Hamano
2010-02-16 23:25 ` Thomas Rast [this message]
2010-02-16 23:25 ` [RFC PATCH v2 03/11] rebase: invoke " Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 04/11] rebase -i: " Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 05/11] notes: clean up t3301 Thomas Rast
2010-02-16 23:52 ` Junio C Hamano
2010-02-16 23:26 ` [RFC PATCH v2 06/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 07/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-16 23:58 ` Junio C Hamano
2010-02-17 0:09 ` Thomas Rast
2010-02-17 0:18 ` Junio C Hamano
2010-02-20 14:58 ` [WIP/RFC PATCH] Support showing notes from more than one notes tree Thomas Rast
2010-02-20 15:23 ` Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 08/11] rebase: support automatic notes copying Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 09/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 10/11] filter-branch: invoke post-rewrite hook Thomas Rast
2010-02-16 23:26 ` [RFC PATCH v2 11/11] filter-branch: learn how to filter notes Thomas Rast
2010-02-17 19:59 ` Johannes Sixt
2010-02-17 23:06 ` Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 00/12] several notes refs, post-rewrite, notes rewriting Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 01/12] Support showing notes from more than one notes tree Thomas Rast
2010-02-21 3:06 ` Junio C Hamano
2010-02-20 22:16 ` [RFC PATCH v3 02/12] Documentation: document post-rewrite hook Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 03/12] commit --amend: invoke " Thomas Rast
2010-02-21 3:12 ` Junio C Hamano
2010-02-20 22:16 ` [RFC PATCH v3 04/12] rebase: " Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 05/12] rebase -i: " Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 06/12] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-21 3:31 ` Junio C Hamano
2010-02-20 22:16 ` [RFC PATCH v3 07/12] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-21 3:34 ` Junio C Hamano
2010-02-20 22:16 ` [RFC PATCH v3 08/12] rebase: support automatic notes copying Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 09/12] commit --amend: copy notes to the new commit Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 10/12] filter-branch: invoke post-rewrite hook Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 11/12] filter-branch: learn how to filter notes Thomas Rast
2010-02-20 22:16 ` [RFC PATCH v3 12/12] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-21 3:47 ` [RFC PATCH v3 00/12] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-21 6:14 ` Thomas Rast
2010-02-22 0:18 ` Junio C Hamano
2010-02-22 0:10 ` [PATCH v4 00/11] " Thomas Rast
2010-02-22 0:10 ` [PATCH v4 01/11] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-02-22 0:10 ` [PATCH v4 02/11] Support showing notes from more than one notes tree Thomas Rast
2010-02-22 23:20 ` Junio C Hamano
2010-02-22 23:25 ` Thomas Rast
2010-02-23 0:21 ` Junio C Hamano
2010-02-22 0:10 ` [PATCH v4 03/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-22 0:10 ` [PATCH v4 04/11] commit --amend: invoke " Thomas Rast
2010-02-22 0:10 ` [PATCH v4 05/11] rebase: " Thomas Rast
2010-02-22 0:10 ` [PATCH v4 06/11] rebase -i: " Thomas Rast
2010-02-22 0:10 ` [PATCH v4 07/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-22 0:10 ` [PATCH v4 08/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-22 0:10 ` [PATCH v4 09/11] rebase: support automatic notes copying Thomas Rast
2010-02-22 0:10 ` [PATCH v4 10/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-22 0:10 ` [PATCH v4 11/11] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-22 0:25 ` [PATCH v4 00/11] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-22 0:32 ` Thomas Rast
2010-02-23 0:42 ` [PATCH v5 " Thomas Rast
2010-02-23 0:42 ` [PATCH v5 01/11] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-02-23 0:42 ` [PATCH v5 02/11] Support showing notes from more than one notes tree Thomas Rast
2010-02-23 1:47 ` Junio C Hamano
2010-02-23 17:10 ` Thomas Rast
2010-02-23 17:34 ` [PATCH] format-patch: learn to fill comment section of email from notes Thomas Rast
2010-02-23 17:34 ` [PATCH] BROKEN -- " Thomas Rast
2010-02-23 17:37 ` Thomas Rast
2010-02-24 7:45 ` Stephen Boyd
2010-02-23 21:56 ` [PATCH] " Junio C Hamano
2010-03-10 14:08 ` Thomas Rast
2010-02-23 0:42 ` [PATCH v5 03/11] Documentation: document post-rewrite hook Thomas Rast
2010-02-23 0:42 ` [PATCH v5 04/11] commit --amend: invoke " Thomas Rast
2010-02-23 0:42 ` [PATCH v5 05/11] rebase: " Thomas Rast
2010-02-23 0:42 ` [PATCH v5 06/11] rebase -i: " Thomas Rast
2010-02-24 6:15 ` Junio C Hamano
2010-02-23 0:42 ` [PATCH v5 07/11] notes: implement 'git notes copy --stdin' Thomas Rast
2010-02-23 0:42 ` [PATCH v5 08/11] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-02-23 0:42 ` [PATCH v5 09/11] rebase: support automatic notes copying Thomas Rast
2010-02-25 3:58 ` Junio C Hamano
2010-03-10 14:03 ` [PATCH v6 00/13] several notes refs, post-rewrite, notes rewriting Thomas Rast
2010-03-10 14:03 ` [PATCH v6 01/13] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-03-11 8:55 ` Johan Herland
2010-03-10 14:03 ` [PATCH v6 02/13] Support showing notes from more than one notes tree Thomas Rast
2010-03-11 10:03 ` Johan Herland
2010-03-12 17:04 ` [PATCH v7 00/13] tr/display-notes Thomas Rast
2010-03-12 17:04 ` [PATCH v7 01/13] test-lib: unset GIT_NOTES_REF to stop it from influencing tests Thomas Rast
2010-03-12 17:04 ` [PATCH v7 02/13] Support showing notes from more than one notes tree Thomas Rast
2010-03-12 17:04 ` [PATCH v7 03/13] Documentation: document post-rewrite hook Thomas Rast
2010-03-12 17:04 ` [PATCH v7 04/13] commit --amend: invoke " Thomas Rast
2010-03-12 17:04 ` [PATCH v7 05/13] rebase: " Thomas Rast
2010-03-12 17:04 ` [PATCH v7 06/13] rebase -i: " Thomas Rast
2010-03-12 17:04 ` [PATCH v7 07/13] notes: implement 'git notes copy --stdin' Thomas Rast
2010-06-14 23:40 ` [PATCH] notes: Initialize variable to appease Sun Studio Ævar Arnfjörð Bjarmason
2010-06-19 4:52 ` Junio C Hamano
2010-06-19 11:58 ` Ævar Arnfjörð Bjarmason
2010-06-21 20:53 ` Ramsay Jones
2010-03-12 17:04 ` [PATCH v7 08/13] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-03-12 17:04 ` [PATCH v7 09/13] rebase: support automatic notes copying Thomas Rast
2010-03-12 17:04 ` [PATCH v7 10/13] commit --amend: copy notes to the new commit Thomas Rast
2010-03-12 17:04 ` [PATCH v7 11/13] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-03-12 17:04 ` [PATCH v7 12/13] notes: track whether notes_trees were changed at all Thomas Rast
2010-03-12 17:04 ` [PATCH v7 13/13] git-notes(1): add a section about the meaning of history Thomas Rast
2010-03-10 14:03 ` [PATCH v6 03/13] Documentation: document post-rewrite hook Thomas Rast
2010-03-10 14:05 ` [PATCH v6 04/13] commit --amend: invoke " Thomas Rast
2010-03-10 14:05 ` [PATCH v6 05/13] rebase: " Thomas Rast
2010-03-10 14:05 ` [PATCH v6 06/13] rebase -i: " Thomas Rast
2010-03-10 14:05 ` [PATCH v6 07/13] notes: implement 'git notes copy --stdin' Thomas Rast
2010-03-11 10:30 ` Johan Herland
2010-03-10 14:05 ` [PATCH v6 08/13] notes: implement helpers needed for note copying during rewrite Thomas Rast
2010-03-11 10:50 ` Johan Herland
2010-03-10 14:05 ` [PATCH v6 09/13] rebase: support automatic notes copying Thomas Rast
2010-03-10 14:05 ` [PATCH v6 10/13] commit --amend: copy notes to the new commit Thomas Rast
2010-03-10 14:05 ` [PATCH v6 11/13] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-03-11 10:56 ` Johan Herland
2010-03-10 14:05 ` [PATCH v6 12/13] notes: track whether notes_trees were changed at all Thomas Rast
2010-03-11 10:58 ` Johan Herland
2010-03-10 14:06 ` [PATCH v6 13/13] git-notes(1): add a section about the meaning of history Thomas Rast
2010-03-11 10:59 ` Johan Herland
2010-03-10 21:23 ` [PATCH v6 00/13] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-23 0:42 ` [PATCH v5 10/11] commit --amend: copy notes to the new commit Thomas Rast
2010-02-23 0:42 ` [PATCH v5 11/11] notes: add shorthand --ref to override GIT_NOTES_REF Thomas Rast
2010-02-23 0:49 ` [PATCH v5 00/11] several notes refs, post-rewrite, notes rewriting Junio C Hamano
2010-02-23 0:49 ` Thomas Rast
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=297ce521ac8fa25ae00cbe8cf0a77d4fb9ee266d.1266361759.git.trast@student.ethz.ch \
--to=trast@student.ethz.ch \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=johan@herland.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public 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).