Commit 94c988f6d6f4930ee4c120f6ce7932b5e49637be

Edward Thomson 2015-04-20T17:19:08

rebase: include checkout opts within rebase opts

diff --git a/include/git2/rebase.h b/include/git2/rebase.h
index 370792f..b85f7e2 100644
--- a/include/git2/rebase.h
+++ b/include/git2/rebase.h
@@ -55,7 +55,7 @@ typedef struct {
 	 * and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in
 	 * `abort` to match git semantics.
 	 */
-	git_checkout_options *checkout_options;
+	git_checkout_options checkout_options;
 } git_rebase_options;
 
 /**
@@ -100,7 +100,8 @@ typedef enum {
 } git_rebase_operation_t;
 
 #define GIT_REBASE_OPTIONS_VERSION 1
-#define GIT_REBASE_OPTIONS_INIT {GIT_REBASE_OPTIONS_VERSION}
+#define GIT_REBASE_OPTIONS_INIT \
+	{GIT_REBASE_OPTIONS_VERSION, 0, NULL, GIT_CHECKOUT_OPTIONS_INIT}
 
 /** Indicates that a rebase operation is not (yet) in progress. */
 #define GIT_REBASE_NO_OPERATION SIZE_MAX
diff --git a/src/rebase.c b/src/rebase.c
index 5f1ba56..b636e79 100644
--- a/src/rebase.c
+++ b/src/rebase.c
@@ -58,7 +58,6 @@ struct git_rebase {
 	git_repository *repo;
 
 	git_rebase_options options;
-	git_checkout_options checkout_options;
 
 	git_rebase_type_t type;
 	char *state_path;
@@ -264,20 +263,13 @@ static git_rebase *rebase_alloc(const git_rebase_options *rebase_opts)
 	else
 		git_rebase_init_options(&rebase->options, GIT_REBASE_OPTIONS_VERSION);
 
-	if (rebase_opts && rebase_opts->checkout_options)
-		memcpy(&rebase->checkout_options, rebase_opts->checkout_options, sizeof(git_checkout_options));
-	else
-		git_checkout_init_options(&rebase->checkout_options, GIT_CHECKOUT_OPTIONS_VERSION);
-
 	if (rebase_opts && rebase_opts->rewrite_notes_ref) {
 		if ((rebase->options.rewrite_notes_ref = git__strdup(rebase_opts->rewrite_notes_ref)) == NULL)
 			return NULL;
 	}
 
-	rebase->options.checkout_options = NULL;
-
-	if ((rebase->checkout_options.checkout_strategy & (GIT_CHECKOUT_SAFE | GIT_CHECKOUT_FORCE)) == 0)
-		rebase->checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE;
+	if ((rebase->options.checkout_options.checkout_strategy & (GIT_CHECKOUT_SAFE | GIT_CHECKOUT_FORCE)) == 0)
+		rebase->options.checkout_options.checkout_strategy = GIT_CHECKOUT_SAFE;
 
 	return rebase;
 }
@@ -287,7 +279,7 @@ static int rebase_check_versions(const git_rebase_options *given_opts)
 	GITERR_CHECK_VERSION(given_opts, GIT_REBASE_OPTIONS_VERSION, "git_rebase_options");
 
 	if (given_opts)
-		GITERR_CHECK_VERSION(given_opts->checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, "git_checkout_options");
+		GITERR_CHECK_VERSION(&given_opts->checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, "git_checkout_options");
 
 	return 0;
 }
@@ -701,7 +693,7 @@ int git_rebase_init(
 		(error = git_buf_printf(&reflog,
 			"rebase: checkout %s", rebase_onto_name(onto))) < 0 ||
 		(error = git_checkout_tree(
-			repo, (git_object *)onto_commit, &rebase->checkout_options)) < 0 ||
+			repo, (git_object *)onto_commit, &rebase->options.checkout_options)) < 0 ||
 		(error = git_reference_create(&head_ref, repo, GIT_HEAD_FILE,
 			git_annotated_commit_id(onto), 1, reflog.ptr)) < 0)
 		goto done;
@@ -726,7 +718,7 @@ static void normalize_checkout_options_for_apply(
 	git_rebase *rebase,
 	git_commit *current_commit)
 {
-	memcpy(checkout_opts, &rebase->checkout_options, sizeof(git_checkout_options));
+	memcpy(checkout_opts, &rebase->options.checkout_options, sizeof(git_checkout_options));
 
 	if (!checkout_opts->ancestor_label)
 		checkout_opts->ancestor_label = "ancestor";
@@ -969,7 +961,7 @@ int git_rebase_abort(git_rebase *rebase)
 	if ((error = git_commit_lookup(
 			&orig_head_commit, rebase->repo, &rebase->orig_head_id)) < 0 ||
 		(error = git_reset(rebase->repo, (git_object *)orig_head_commit,
-			GIT_RESET_HARD, &rebase->checkout_options)) < 0)
+			GIT_RESET_HARD, &rebase->options.checkout_options)) < 0)
 		goto done;
 
 	error = rebase_cleanup(rebase);
diff --git a/tests/rebase/merge.c b/tests/rebase/merge.c
index 4371f1f..12f0de5 100644
--- a/tests/rebase/merge.c
+++ b/tests/rebase/merge.c
@@ -533,7 +533,8 @@ void test_rebase_merge__custom_checkout_options(void)
 	checkout_options.progress_cb = rebase_checkout_progress_cb;
 	checkout_options.progress_payload = &called;
 
-	rebase_options.checkout_options = &checkout_options;
+	memcpy(&rebase_options.checkout_options, &checkout_options,
+		sizeof(git_checkout_options));
 
 	cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
 	cl_git_pass(git_reference_lookup(&upstream_ref, repo, "refs/heads/master"));