Commit 92e87dd74974ccad8e0dbd8dd212bfc514ba441d

Edward Thomson 2015-02-13T10:44:19

rebase: provide NULL `exec` on non-EXEC operations Users may want to try to pay attention to the `exec` field on all rebase operations.

diff --git a/src/rebase.c b/src/rebase.c
index 2e80592..229b18a 100644
--- a/src/rebase.c
+++ b/src/rebase.c
@@ -168,10 +168,31 @@ GIT_INLINE(int) rebase_readoid(
 	return 0;
 }
 
+static git_rebase_operation *rebase_operation_alloc(
+	git_rebase *rebase,
+	git_rebase_operation_t type,
+	git_oid *id,
+	const char *exec)
+{
+	git_rebase_operation *operation;
+
+	assert((type == GIT_REBASE_OPERATION_EXEC) == !id);
+	assert((type == GIT_REBASE_OPERATION_EXEC) == !!exec);
+
+	if ((operation = git_array_alloc(rebase->operations)) == NULL)
+		return NULL;
+
+	operation->type = type;
+	git_oid_cpy((git_oid *)&operation->id, id);
+	operation->exec = exec;
+
+	return operation;
+}
+
 static int rebase_open_merge(git_rebase *rebase)
 {
 	git_buf state_path = GIT_BUF_INIT, buf = GIT_BUF_INIT, cmt = GIT_BUF_INIT;
-	git_oid current_id = {{0}};
+	git_oid id;
 	git_rebase_operation *operation;
 	size_t i, msgnum = 0, end;
 	int error;
@@ -194,7 +215,7 @@ static int rebase_open_merge(git_rebase *rebase)
 		goto done;
 
 	/* Read 'current' if it exists */
-	if ((error = rebase_readoid(&current_id, &buf, &state_path, CURRENT_FILE)) < 0 &&
+	if ((error = rebase_readoid(&id, &buf, &state_path, CURRENT_FILE)) < 0 &&
 		error != GIT_ENOTFOUND)
 		goto done;
 
@@ -203,14 +224,14 @@ static int rebase_open_merge(git_rebase *rebase)
 	GITERR_CHECK_ARRAY(rebase->operations);
 
 	for (i = 0; i < end; i++) {
-		operation = git_array_alloc(rebase->operations);
-		GITERR_CHECK_ALLOC(operation);
-
 		git_buf_clear(&cmt);
 
 		if ((error = git_buf_printf(&cmt, "cmt.%" PRIuZ, (i+1))) < 0 ||
-			(error = rebase_readoid((git_oid *)&operation->id, &buf, &state_path, cmt.ptr)) < 0)
+			(error = rebase_readoid(&id, &buf, &state_path, cmt.ptr)) < 0)
 			goto done;
+
+		operation = rebase_operation_alloc(rebase, GIT_REBASE_OPERATION_PICK, &id, NULL);
+		GITERR_CHECK_ALLOC(operation);
 	}
 
 	/* Read 'onto_name' */
@@ -553,9 +574,7 @@ static int rebase_init_operations(
 		if (merge)
 			continue;
 
-		operation = git_array_alloc(rebase->operations);
-		operation->type = GIT_REBASE_OPERATION_PICK;
-		git_oid_cpy((git_oid *)&operation->id, &id);
+		operation = rebase_operation_alloc(rebase, GIT_REBASE_OPERATION_PICK, &id, NULL);
 	}
 
 	error = 0;
diff --git a/tests/rebase/iterator.c b/tests/rebase/iterator.c
index ddf4413..8117a09 100644
--- a/tests/rebase/iterator.c
+++ b/tests/rebase/iterator.c
@@ -42,6 +42,7 @@ static void test_operations(git_rebase *rebase, size_t expected_current)
 		operation = git_rebase_operation_byindex(rebase, i);
 		cl_assert_equal_i(GIT_REBASE_OPERATION_PICK, operation->type);
 		cl_assert_equal_oid(&expected_oid[i], &operation->id);
+		cl_assert_equal_p(NULL, operation->exec);
 	}
 }