When git-clone creates an initial branch it was not checking the branch.autosetuprebase configuration option (which may exist in ~/.gitconfig). Added function to branch.c to handle autorebase configuration setup. Signed-off-by: Pat Notz <pknotz@xxxxxxxxxx> --- Sorry, the PATCHv2 email had a stray "From:..." line. branch.c | 23 ++++++++++++++++------- branch.h | 9 +++++++++ builtin-clone.c | 3 +++ t/t5601-clone.sh | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/branch.c b/branch.c index 1f00e44..ee8b69d 100644 --- a/branch.c +++ b/branch.c @@ -32,21 +32,33 @@ static int find_tracked_branch(struct remote *remote, void *priv) return 0; } -static int should_setup_rebase(const struct tracking *tracking) +static int should_setup_rebase(const char * remote) { switch (autorebase) { case AUTOREBASE_NEVER: return 0; case AUTOREBASE_LOCAL: - return tracking->remote == NULL; + return remote == NULL; case AUTOREBASE_REMOTE: - return tracking->remote != NULL; + return remote != NULL; case AUTOREBASE_ALWAYS: return 1; } return 0; } +int setup_autorebase(const char *local, const char *remote_tracked_branch) +{ + if (should_setup_rebase(remote_tracked_branch)) { + struct strbuf key = STRBUF_INIT; + strbuf_addf(&key, "branch.%s.rebase", local); + git_config_set(key.buf, "true"); + strbuf_release(&key); + return 1; + } + return 0; +} + /* * This is called when new_ref is branched off of orig_ref, and tries * to infer the settings for branch.<new_ref>.{remote,merge} from the @@ -86,11 +98,8 @@ static int setup_tracking(const char *new_ref, const char *orig_ref, git_config_set(key, tracking.src ? tracking.src : orig_ref); printf("Branch %s set up to track %s branch %s.\n", new_ref, tracking.remote ? "remote" : "local", orig_ref); - if (should_setup_rebase(&tracking)) { - sprintf(key, "branch.%s.rebase", new_ref); - git_config_set(key, "true"); + if (setup_autorebase(new_ref, tracking.remote)) printf("This branch will rebase on pull.\n"); - } free(tracking.src); return 0; diff --git a/branch.h b/branch.h index 9f0c2a2..b332c09 100644 --- a/branch.h +++ b/branch.h @@ -21,4 +21,13 @@ void create_branch(const char *head, const char *name, const char *start_name, */ void remove_branch_state(void); +/* + * Used when creating a new branch to properly setup the autorebase flag + * in the git-config file. If the new branch ("local") is created from + * a remote branch then remote_tracked_branch should be non-NULL. If + * the new branch is being created from another local branch then + * remote_tracked_branch should be NULL. + */ +int setup_autorebase(const char *local, const char *remote_tracked_branch); + #endif diff --git a/builtin-clone.c b/builtin-clone.c index c338910..587c834 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -17,6 +17,7 @@ #include "unpack-trees.h" #include "transport.h" #include "strbuf.h" +#include "branch.h" #include "dir.h" #include "pack-refs.h" #include "sigchain.h" @@ -360,6 +361,8 @@ static void install_branch_config(const char *local, strbuf_reset(&key); strbuf_addf(&key, "branch.%s.merge", local); git_config_set(key.buf, remote); + if (setup_autorebase(local, remote)) + printf("Default branch '%s' will rebase on pull.\n", local); strbuf_release(&key); } diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 44793f2..0f8b43c 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -159,4 +159,18 @@ test_expect_success 'clone a void' ' test_cmp target-6/.git/config target-7/.git/config ' +test_expect_success 'clone respects global branch.autosetuprebase' ' + HOME="`pwd`" && + export HOME && + test_config="$HOME"/.gitconfig && + unset GIT_CONFIG_NOGLOBAL && + git config -f "$test_config" branch.autosetuprebase remote && + rm -fr dst && + git clone src dst && + cd dst && + expected="ztrue" && + actual="z$(git config branch.master.rebase)" && + test $expected = $actual +' + test_done -- 1.6.1.2 -- 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