@@ -9,6 +9,7 @@
#include "config.h"
#include "diff.h"
#include "dir.h"
+#include "hook.h"
#include "ll-merge.h"
#include "lockfile.h"
#include "merge-recursive.h"
@@ -106,13 +107,19 @@ struct branch_info {
static int post_checkout_hook(struct commit *old_commit, struct commit *new_commit,
int changed)
{
- return run_hook_le(NULL, "post-checkout",
- oid_to_hex(old_commit ? &old_commit->object.oid : null_oid()),
- oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()),
- changed ? "1" : "0", NULL);
+ struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
+ int rc;
+
/* "new_commit" can be NULL when checking out from the index before
a commit exists. */
-
+ strvec_pushl(&opt.args,
+ oid_to_hex(old_commit ? &old_commit->object.oid : null_oid()),
+ oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()),
+ changed ? "1" : "0",
+ NULL);
+ rc = run_hooks("post-checkout", &opt);
+ run_hooks_opt_clear(&opt);
+ return rc;
}
static int update_some(const struct object_id *oid, struct strbuf *base,
@@ -32,6 +32,7 @@
#include "connected.h"
#include "packfile.h"
#include "list-objects-filter-options.h"
+#include "hook.h"
/*
* Overall FIXMEs:
@@ -775,6 +776,7 @@ static int checkout(int submodule_progress)
struct tree *tree;
struct tree_desc t;
int err = 0;
+ struct run_hooks_opt hook_opt = RUN_HOOKS_OPT_INIT;
if (option_no_checkout)
return 0;
@@ -820,8 +822,9 @@ static int checkout(int submodule_progress)
if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
die(_("unable to write new index file"));
- err |= run_hook_le(NULL, "post-checkout", oid_to_hex(null_oid()),
- oid_to_hex(&oid), "1", NULL);
+ strvec_pushl(&hook_opt.args, oid_to_hex(null_oid()), oid_to_hex(&oid), "1", NULL);
+ err |= run_hooks("post-checkout", &hook_opt);
+ run_hooks_opt_clear(&hook_opt);
if (!err && (option_recurse_submodules.nr > 0)) {
struct strvec args = STRVEC_INIT;
@@ -382,22 +382,20 @@ static int add_worktree(const char *path, const char *refname,
* is_junk is cleared, but do return appropriate code when hook fails.
*/
if (!ret && opts->checkout) {
- const char *hook = find_hook("post-checkout");
- if (hook) {
- const char *env[] = { "GIT_DIR", "GIT_WORK_TREE", NULL };
- cp.git_cmd = 0;
- cp.no_stdin = 1;
- cp.stdout_to_stderr = 1;
- cp.dir = path;
- cp.env = env;
- cp.argv = NULL;
- cp.trace2_hook_name = "post-checkout";
- strvec_pushl(&cp.args, absolute_path(hook),
- oid_to_hex(null_oid()),
- oid_to_hex(&commit->object.oid),
- "1", NULL);
- ret = run_command(&cp);
- }
+ struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
+
+ strvec_pushl(&opt.env, "GIT_DIR", "GIT_WORK_TREE", NULL);
+ strvec_pushl(&opt.args,
+ oid_to_hex(null_oid()),
+ oid_to_hex(&commit->object.oid),
+ "1",
+ NULL);
+ opt.dir = path;
+ opt.absolute_path = 1;
+
+ ret = run_hooks("post-checkout", &opt);
+
+ run_hooks_opt_clear(&opt);
}
strvec_clear(&child_env);
@@ -62,6 +62,7 @@ static int pick_next_hook(struct child_process *cp,
cp->env = hook_cb->options->env.v;
cp->stdout_to_stderr = 1;
cp->trace2_hook_name = hook_cb->hook_name;
+ cp->dir = hook_cb->options->dir;
/* add command */
strvec_push(&cp->args, run_me->hook_path);
@@ -111,6 +112,7 @@ static int notify_hook_finished(int result,
int run_found_hooks(const char *hook_name, const char *hook_path,
struct run_hooks_opt *options)
{
+ struct strbuf abs_path = STRBUF_INIT;
struct hook my_hook = {
.hook_path = hook_path,
};
@@ -119,6 +121,10 @@ int run_found_hooks(const char *hook_name, const char *hook_path,
.hook_name = hook_name,
.options = options,
};
+ if (options->absolute_path) {
+ strbuf_add_absolute_path(&abs_path, hook_path);
+ my_hook.hook_path = abs_path.buf;
+ }
cb_data.run_me = &my_hook;
if (options->jobs != 1)
@@ -131,6 +137,8 @@ int run_found_hooks(const char *hook_name, const char *hook_path,
&cb_data,
"hook",
hook_name);
+ if (options->absolute_path)
+ strbuf_release(&abs_path);
return cb_data.rc;
}
@@ -19,6 +19,15 @@ struct run_hooks_opt
/* Number of threads to parallelize across */
int jobs;
+
+ /* Resolve and run the "absolute_path(hook)" instead of
+ * "hook". Used for "git worktree" hooks
+ */
+ int absolute_path;
+
+ /* Path to initial working directory for subprocess */
+ const char *dir;
+
};
#define RUN_HOOKS_OPT_INIT { \
@@ -27,6 +27,7 @@
#include "progress.h"
#include "sparse-index.h"
#include "csum-file.h"
+#include "hook.h"
/* Mask for the name length in ce_flags in the on-disk index */
@@ -7,6 +7,7 @@
#include "tree-walk.h"
#include "tree.h"
#include "unpack-trees.h"
+#include "hook.h"
int reset_head(struct repository *r, struct object_id *oid, const char *action,
const char *switch_to_branch, unsigned flags,
@@ -126,10 +127,16 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action,
ret = create_symref("HEAD", switch_to_branch,
reflog_head);
}
- if (run_hook)
- run_hook_le(NULL, "post-checkout",
- oid_to_hex(orig ? orig : null_oid()),
- oid_to_hex(oid), "1", NULL);
+ if (run_hook) {
+ struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
+ strvec_pushl(&opt.args,
+ oid_to_hex(orig ? orig : null_oid()),
+ oid_to_hex(oid),
+ "1",
+ NULL);
+ run_hooks("post-checkout", &opt);
+ run_hooks_opt_clear(&opt);
+ }
leave_reset_head:
strbuf_release(&msg);