Ilya Bobyr wrote: > On 4/20/2014 7:23 PM, Felipe Contreras wrote: > > [...] > > > > diff --git a/branch.c b/branch.c > > index 660097b..c2058d1 100644 > > --- a/branch.c > > +++ b/branch.c > > @@ -4,6 +4,7 @@ > > #include "refs.h" > > #include "remote.h" > > #include "commit.h" > > +#include "run-command.h" > > > > struct tracking { > > struct refspec spec; > > @@ -304,6 +305,11 @@ void create_branch(const char *head, > > if (real_ref && track) > > setup_tracking(ref.buf + 11, real_ref, track, quiet); > > > > + if (run_hook_le(NULL, "update-branch", ref.buf + 11, sha1_to_hex(sha1), NULL)) { > > + unlock_ref(lock); > > lock is NULL if dont_change_ref is true. unlock_ref() would crash in > that case. > You may want to add a test for that. That should be easy to fix. > > + die("hook 'update-branch' returned error"); > > + } > > + > > if (!dont_change_ref) > > if (write_ref_sha1(lock, sha1, msg) < 0) > > die_errno(_("Failed to write ref")); > > diff --git a/builtin/clone.c b/builtin/clone.c > > index 9b3c04d..6ec96e5 100644 > > --- a/builtin/clone.c > > +++ b/builtin/clone.c > > @@ -581,9 +581,10 @@ static void update_remote_refs(const struct ref *refs, > > } > > } > > > > -static void update_head(const struct ref *our, const struct ref *remote, > > +static int update_head(const struct ref *our, const struct ref *remote, > > const char *msg) > > { > > + int err = 0; > > if (our && starts_with(our->name, "refs/heads/")) { > > /* Local default branch link */ > > create_symref("HEAD", our->name, NULL); > > @@ -591,6 +592,7 @@ static void update_head(const struct ref *our, const struct ref *remote, > > const char *head = skip_prefix(our->name, "refs/heads/"); > > update_ref(msg, "HEAD", our->old_sha1, NULL, 0, DIE_ON_ERR); > > install_branch_config(0, head, option_origin, our->name); > > + err = run_hook_le(NULL, "update-branch", head, sha1_to_hex(our->old_sha1), NULL); > > This is happening after the branch is updated and a config section for > it is created. I see that now, however, I cannot find where in builtin/clone.c is the branch ref actually updated. Worst, I don't see how I could possibly configure a hook to be triggered when cloning, so I cannot test. > > } > > } else if (our) { > > struct commit *c = lookup_commit_reference(our->old_sha1); > > @@ -606,6 +608,7 @@ static void update_head(const struct ref *our, const struct ref *remote, > > update_ref(msg, "HEAD", remote->old_sha1, > > NULL, REF_NODEREF, DIE_ON_ERR); > > } > > + return err; > > } > > > > static int checkout(void) > > @@ -987,7 +990,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) > > update_remote_refs(refs, mapped_refs, remote_head_points_at, > > branch_top.buf, reflog_msg.buf, transport, !is_local); > > > > - update_head(our_head_points_at, remote_head, reflog_msg.buf); > > + err = update_head(our_head_points_at, remote_head, reflog_msg.buf); > > > > transport_unlock_pack(transport); > > transport_disconnect(transport); > > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > > index 1c41cbd..084dc36 100644 > > --- a/git-rebase--interactive.sh > > +++ b/git-rebase--interactive.sh > > @@ -631,7 +631,11 @@ do_next () { > > git update-ref -m "$message" $head_name $newhead $orig_head && > > git symbolic-ref \ > > -m "$GIT_REFLOG_ACTION: returning to $head_name" \ > > - HEAD $head_name > > + HEAD $head_name && > > + if test -x "$GIT_DIR"/hooks/update-branch; then > > + "$GIT_DIR"/hooks/update-branch $branch_name \ > > + $newhead $onto > > + fi > > It looks like this is also after the branch was already updated. This and the one below should be easy to fix. -- Felipe Contreras -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html