[PATCHv2] Make git-clone respect branch.autosetuprebase

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Pat Notz <pknotz@xxxxxxxxxx>

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>
---
 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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux