commit: move post-rewrite code to libgit
Move run_rewrite_hook() from bulitin/commit.c to sequencer.c so it can be shared with other commands and add a new function commit_post_rewrite() based on the code in builtin/commit.c that encapsulates rewriting notes and running the post-rewrite hook. Once the sequencer learns how to create commits without forking 'git commit' these functions will be used when squashing commits. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0505d604c9
commit
a87a6f3c98
@ -31,9 +31,7 @@
|
||||
#include "gpg-interface.h"
|
||||
#include "column.h"
|
||||
#include "sequencer.h"
|
||||
#include "notes-utils.h"
|
||||
#include "mailmap.h"
|
||||
#include "sigchain.h"
|
||||
|
||||
static const char * const builtin_commit_usage[] = {
|
||||
N_("git commit [<options>] [--] <pathspec>..."),
|
||||
@ -1478,37 +1476,6 @@ static int git_commit_config(const char *k, const char *v, void *cb)
|
||||
return git_status_config(k, v, s);
|
||||
}
|
||||
|
||||
static int run_rewrite_hook(const struct object_id *oldoid,
|
||||
const struct object_id *newoid)
|
||||
{
|
||||
struct child_process proc = CHILD_PROCESS_INIT;
|
||||
const char *argv[3];
|
||||
int code;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
argv[0] = find_hook("post-rewrite");
|
||||
if (!argv[0])
|
||||
return 0;
|
||||
|
||||
argv[1] = "amend";
|
||||
argv[2] = NULL;
|
||||
|
||||
proc.argv = argv;
|
||||
proc.in = -1;
|
||||
proc.stdout_to_stderr = 1;
|
||||
|
||||
code = start_command(&proc);
|
||||
if (code)
|
||||
return code;
|
||||
strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
|
||||
sigchain_push(SIGPIPE, SIG_IGN);
|
||||
write_in_full(proc.in, sb.buf, sb.len);
|
||||
close(proc.in);
|
||||
strbuf_release(&sb);
|
||||
sigchain_pop(SIGPIPE);
|
||||
return finish_command(&proc);
|
||||
}
|
||||
|
||||
int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
|
||||
{
|
||||
struct argv_array hook_env = ARGV_ARRAY_INIT;
|
||||
@ -1739,14 +1706,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
|
||||
rerere(0);
|
||||
run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
|
||||
if (amend && !no_post_rewrite) {
|
||||
struct notes_rewrite_cfg *cfg;
|
||||
cfg = init_copy_notes_for_rewrite("amend");
|
||||
if (cfg) {
|
||||
/* we are amending, so current_head is not NULL */
|
||||
copy_note_for_rewrite(cfg, ¤t_head->object.oid, &oid);
|
||||
finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
|
||||
}
|
||||
run_rewrite_hook(¤t_head->object.oid, &oid);
|
||||
commit_post_rewrite(current_head, &oid);
|
||||
}
|
||||
if (!quiet)
|
||||
print_summary(prefix, &oid, !current_head);
|
||||
|
47
sequencer.c
47
sequencer.c
@ -21,6 +21,8 @@
|
||||
#include "log-tree.h"
|
||||
#include "wt-status.h"
|
||||
#include "hashmap.h"
|
||||
#include "notes-utils.h"
|
||||
#include "sigchain.h"
|
||||
|
||||
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
|
||||
|
||||
@ -789,6 +791,51 @@ int update_head_with_reflog(const struct commit *old_head,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int run_rewrite_hook(const struct object_id *oldoid,
|
||||
const struct object_id *newoid)
|
||||
{
|
||||
struct child_process proc = CHILD_PROCESS_INIT;
|
||||
const char *argv[3];
|
||||
int code;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
argv[0] = find_hook("post-rewrite");
|
||||
if (!argv[0])
|
||||
return 0;
|
||||
|
||||
argv[1] = "amend";
|
||||
argv[2] = NULL;
|
||||
|
||||
proc.argv = argv;
|
||||
proc.in = -1;
|
||||
proc.stdout_to_stderr = 1;
|
||||
|
||||
code = start_command(&proc);
|
||||
if (code)
|
||||
return code;
|
||||
strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
|
||||
sigchain_push(SIGPIPE, SIG_IGN);
|
||||
write_in_full(proc.in, sb.buf, sb.len);
|
||||
close(proc.in);
|
||||
strbuf_release(&sb);
|
||||
sigchain_pop(SIGPIPE);
|
||||
return finish_command(&proc);
|
||||
}
|
||||
|
||||
void commit_post_rewrite(const struct commit *old_head,
|
||||
const struct object_id *new_head)
|
||||
{
|
||||
struct notes_rewrite_cfg *cfg;
|
||||
|
||||
cfg = init_copy_notes_for_rewrite("amend");
|
||||
if (cfg) {
|
||||
/* we are amending, so old_head is not NULL */
|
||||
copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
|
||||
finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
|
||||
}
|
||||
run_rewrite_hook(&old_head->object.oid, new_head);
|
||||
}
|
||||
|
||||
static int is_original_commit_empty(struct commit *commit)
|
||||
{
|
||||
const struct object_id *ptree_oid;
|
||||
|
@ -73,4 +73,6 @@ int update_head_with_reflog(const struct commit *old_head,
|
||||
const struct object_id *new_head,
|
||||
const char *action, const struct strbuf *msg,
|
||||
struct strbuf *err);
|
||||
void commit_post_rewrite(const struct commit *current_head,
|
||||
const struct object_id *new_head);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user