Commit 0adb06065b944e755933e11ed9ac7ce544b55d33

Ben Straub 2014-02-04T15:32:57

Fix reflog message when creating commits

diff --git a/src/commit.c b/src/commit.c
index da7c499..b9c21f3 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -111,8 +111,27 @@ int git_commit_create_from_ids(
 
 	git_buf_free(&commit);
 
-	if (update_ref != NULL)
-		return git_reference__update_terminal(repo, update_ref, oid, NULL, NULL);
+	if (update_ref != NULL) {
+		int error;
+		git_commit *c;
+		const char *shortmsg;
+		git_buf reflog_msg = GIT_BUF_INIT;
+
+		if (git_commit_lookup(&c, repo, oid) < 0)
+			goto on_error;
+
+		shortmsg = git_commit_summary(c);
+		git_buf_printf(&reflog_msg, "commit%s: %s",
+				git_commit_parentcount(c) == 0 ? " (initial)" : "",
+				shortmsg);
+		git_commit_free(c);
+
+		error = git_reference__update_terminal(repo, update_ref, oid,
+				committer, git_buf_cstr(&reflog_msg));
+
+		git_buf_free(&reflog_msg);
+		return error;
+	}
 
 	return 0;
 
diff --git a/tests/commit/write.c b/tests/commit/write.c
index 8e5b67f..b1cdf44 100644
--- a/tests/commit/write.c
+++ b/tests/commit/write.c
@@ -7,6 +7,8 @@ static const char *commit_message = "This commit has been created in memory\n\
 static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
 static const char *root_commit_message = "This is a root commit\n\
    This is a root commit and should be the only one in this branch\n";
+static const char *root_reflog_message = "commit (initial): This is a root commit \
+   This is a root commit and should be the only one in this branch";
 static char *head_old;
 static git_reference *head, *branch;
 static git_commit *commit;
@@ -101,6 +103,8 @@ void test_commit_write__root(void)
 	git_signature *author, *committer;
 	const char *branch_name = "refs/heads/root-commit-branch";
 	git_tree *tree;
+	git_reflog *log;
+	const git_reflog_entry *entry;
 
 	git_oid_fromstr(&tree_id, tree_oid);
 	cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id));
@@ -130,7 +134,6 @@ void test_commit_write__root(void)
 		0));
 
 	git_object_free((git_object *)tree);
-	git_signature_free(committer);
 	git_signature_free(author);
 
 	/*
@@ -144,4 +147,14 @@ void test_commit_write__root(void)
 	branch_oid = git_reference_target(branch);
 	cl_git_pass(git_oid_cmp(branch_oid, &commit_id));
 	cl_assert_equal_s(root_commit_message, git_commit_message(commit));
+
+	cl_git_pass(git_reflog_read(&log, g_repo, branch_name));
+	cl_assert_equal_i(1, git_reflog_entrycount(log));
+	entry = git_reflog_entry_byindex(log, 0);
+	cl_assert_equal_s(committer->email, git_reflog_entry_committer(entry)->email);
+	cl_assert_equal_s(committer->name, git_reflog_entry_committer(entry)->name);
+	cl_assert_equal_s(root_reflog_message, git_reflog_entry_message(entry));
+
+	git_signature_free(committer);
+	git_reflog_free(log);
 }